OCIObjectStorage.py 6.3 KB

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