OCIObjectStorage.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : OCIObjectStorage.py
  4. @Time : 2024/4/10 15:06
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import logging
  10. import oci
  11. from AnsjerPush.config import OCI_CONFIG, OCI_NAMESPACE_NAME
  12. LOGGER = logging.getLogger('time')
  13. class OCIObjectStorage:
  14. # Create a default oci_config using DEFAULT profile in default location
  15. # Refer to
  16. # https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File
  17. # for more info
  18. def __init__(self, region):
  19. # Initialize service client with default oci_config file
  20. self.object_storage_client = oci.object_storage.ObjectStorageClient(OCI_CONFIG[region])
  21. def create_ereauthenticated_request(self, bucket_name, name, object_name, time_expires):
  22. """
  23. 创建特定于桶的预认证请求。
  24. api:https://docs.oracle.com/en-us/iaas/api/#/en/objectstorage/20160918/PreauthenticatedRequest/CreatePreauthenticatedRequest
  25. @param bucket_name: 存储桶名称
  26. @param name: 请求名称 是创建的预授权链接的名称,是方便管理用的,不会影响功能。比如对每个桶分别创建链接,如果要删除或者查看,可以根据name看出来是对哪个桶的链接。
  27. @param object_name: 对象名
  28. @param time_expires: 失效时间 需要datetime类型格式 例如:datetime.utcnow() + timedelta(minutes=30)
  29. @return: 预认证请求URL
  30. """
  31. try:
  32. object_storage_client = self.object_storage_client
  33. # Send the request to service, some parameters are not required, see API
  34. # doc for more info
  35. response = object_storage_client.create_preauthenticated_request(
  36. namespace_name=OCI_NAMESPACE_NAME,
  37. bucket_name=bucket_name,
  38. create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
  39. name=name,
  40. access_type="AnyObjectWrite",
  41. time_expires=time_expires,
  42. bucket_listing_action="Deny",
  43. object_name=object_name))
  44. assert response.status == 200
  45. return response.data
  46. except Exception as e:
  47. LOGGER.error('OCI创建预认证URL异常errLine={errLine}, errMsg={errMsg}'
  48. .format(errLine=e.__traceback__.tb_lineno, errMsg=repr(e)))
  49. return None
  50. def get_preauthenticated_request_url(self, bucket_name, name, object_name, time_expires, access_type='ObjectRead'):
  51. """
  52. 获取指定对象预认证请求URL。
  53. @param bucket_name: 存储桶名称
  54. @param name: 请求名称 是创建的预授权链接的名称,是方便管理用的,不会影响功能。比如对每个桶分别创建链接,如果要删除或者查看,可以根据name看出来是对哪个桶的链接。
  55. @param object_name: 对象名
  56. @param access_type: 类型
  57. @param time_expires: 失效时间 需要datetime类型格式 例如:datetime.utcnow() + timedelta(minutes=30)
  58. @return: 预认证请求URL
  59. """
  60. try:
  61. object_storage_client = self.object_storage_client
  62. # 创建预认证请求
  63. response = object_storage_client.create_preauthenticated_request(
  64. namespace_name=OCI_NAMESPACE_NAME,
  65. bucket_name=bucket_name,
  66. create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
  67. name=name,
  68. object_name=object_name,
  69. access_type=access_type,
  70. time_expires=time_expires
  71. )
  72. )
  73. assert response.status == 200
  74. return response.data
  75. except Exception as e:
  76. LOGGER.error('OCI获取预认证URL异常errLine={errLine}, errMsg={errMsg}'
  77. .format(errLine=e.__traceback__.tb_lineno, errMsg=repr(e)))
  78. return None
  79. def put_object(self, bucket_name, object_name, obj, content_type=None):
  80. """
  81. 上传对象
  82. @param bucket_name: 存储桶名称
  83. @param object_name: 对象名
  84. @param obj: 数据内容
  85. @param content_type: 文件类型
  86. @return: 可访问对象URL
  87. """
  88. try:
  89. object_storage_client = self.object_storage_client
  90. # 发送上传请求
  91. put_object_response = object_storage_client.put_object(
  92. namespace_name=OCI_NAMESPACE_NAME,
  93. bucket_name=bucket_name,
  94. object_name=object_name,
  95. put_object_body=obj,
  96. content_type=content_type
  97. )
  98. # 打印响应头信息
  99. assert put_object_response.status == 200
  100. except Exception as e:
  101. LOGGER.error('OCI上传对象异常errLine={errLine}, errMsg={errMsg}'
  102. .format(errLine=e.__traceback__.tb_lineno, errMsg=repr(e)))
  103. return None
  104. def delete_object(self, bucket_name, object_name, content_type=None):
  105. """
  106. 删除对象
  107. @param bucket_name: 存储桶名称
  108. @param object_name: 对象名
  109. @param content_type: 文件类型
  110. @return: 可访问对象URL
  111. """
  112. try:
  113. object_storage_client = self.object_storage_client
  114. # 发送删除请求
  115. object_storage_client.delete_object(
  116. namespace_name=OCI_NAMESPACE_NAME,
  117. bucket_name=bucket_name,
  118. object_name=object_name)
  119. except Exception as e:
  120. LOGGER.error('OCI删除对象异常errLine={errLine}, errMsg={errMsg}'
  121. .format(errLine=e.__traceback__.tb_lineno, errMsg=repr(e)))
  122. return None