You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2749 lines
98KB

  1. # -*- coding: utf-8 -*-
  2. """
  3. oss2.models
  4. ~~~~~~~~~~
  5. 该模块包含Python SDK API接口所需要的输入参数以及返回值类型。
  6. """
  7. from loguru import logger
  8. from . import utils
  9. from .utils import http_to_unixtime, make_progress_adapter, make_crc_adapter, b64encode_as_string, b64decode_from_string
  10. from .exceptions import ClientError, InconsistentError
  11. from .compat import urlunquote, to_string, urlquote
  12. from .select_response import SelectResponseAdapter
  13. from .headers import *
  14. import json
  15. import logging
  16. import copy
  17. from requests.structures import CaseInsensitiveDict
  18. class PartInfo(object):
  19. """表示分片信息的文件。
  20. 该文件既用于 :func:`list_parts <oss2.Bucket.list_parts>` 的输出,也用于 :func:`complete_multipart_upload
  21. <oss2.Bucket.complete_multipart_upload>` 的输入。
  22. :param int part_number: 分片号
  23. :param str etag: 分片的ETag
  24. :param int size: 分片的大小。用在 `list_parts` 的结果里,也用与分片对象做crc combine得到整个对象crc64值
  25. :param int last_modified: 该分片最后修改的时间戳,类型为int。参考 :ref:`unix_time`
  26. :param int part_crc: 该分片的crc64值
  27. """
  28. def __init__(self, part_number, etag, size=None, last_modified=None, part_crc=None):
  29. self.part_number = part_number
  30. self.etag = etag
  31. self.size = size
  32. self.last_modified = last_modified
  33. self.part_crc = part_crc
  34. class ContentCryptoMaterial(object):
  35. def __init__(self, cipher, wrap_alg, encrypted_key=None, encrypted_iv=None, mat_desc=None):
  36. self.cipher = cipher
  37. self.cek_alg = cipher.alg
  38. self.wrap_alg = wrap_alg
  39. self.encrypted_key = encrypted_key
  40. self.encrypted_iv = encrypted_iv
  41. self.mat_desc = mat_desc
  42. self.deprecated = False
  43. def to_object_meta(self, headers=None, multipart_upload_context=None):
  44. if not isinstance(headers, CaseInsensitiveDict):
  45. headers = CaseInsensitiveDict(headers)
  46. if 'content-md5' in headers:
  47. headers[OSS_CLIENT_SIDE_ENCRYPTION_UNENCRYPTED_CONTENT_MD5] = headers['content-md5']
  48. del headers['content-md5']
  49. if 'content-length' in headers:
  50. headers[OSS_CLIENT_SIDE_ENCRYPTION_UNENCRYPTED_CONTENT_LENGTH] = headers['content-length']
  51. del headers['content-length']
  52. headers[OSS_CLIENT_SIDE_ENCRYPTION_KEY] = b64encode_as_string(self.encrypted_key)
  53. headers[OSS_CLIENT_SIDE_ENCRYPTION_START] = b64encode_as_string(self.encrypted_iv)
  54. headers[OSS_CLIENT_SIDE_ENCRYPTION_CEK_ALG] = self.cek_alg
  55. headers[OSS_CLIENT_SIDE_ENCRYPTION_WRAP_ALG] = self.wrap_alg
  56. if multipart_upload_context and multipart_upload_context.data_size and multipart_upload_context.part_size:
  57. headers[OSS_CLIENT_SIDE_ENCRYPTION_DATA_SIZE] = str(multipart_upload_context.data_size)
  58. headers[OSS_CLIENT_SIDE_ENCRYPTION_PART_SIZE] = str(multipart_upload_context.part_size)
  59. if self.mat_desc:
  60. headers[OSS_CLIENT_SIDE_ENCRYTPION_MATDESC] = json.dumps(self.mat_desc)
  61. return headers
  62. def from_object_meta(self, headers):
  63. if not isinstance(headers, CaseInsensitiveDict):
  64. headers = CaseInsensitiveDict(headers)
  65. if DEPRECATED_CLIENT_SIDE_ENCRYPTION_KEY in headers:
  66. self.deprecated = True
  67. if self.deprecated:
  68. undecode_encrypted_key = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYPTION_KEY)
  69. undecode_encrypted_iv = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYPTION_START)
  70. cek_alg = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYPTION_CEK_ALG)
  71. wrap_alg = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYPTION_WRAP_ALG)
  72. mat_desc = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYTPION_MATDESC)
  73. if wrap_alg == "kms":
  74. self.encrypted_key = undecode_encrypted_key
  75. self.encrypted_iv = undecode_encrypted_iv
  76. wrap_alg = KMS_ALI_WRAP_ALGORITHM
  77. else:
  78. if undecode_encrypted_key:
  79. self.encrypted_key = b64decode_from_string(undecode_encrypted_key)
  80. if undecode_encrypted_iv:
  81. self.encrypted_iv = b64decode_from_string(undecode_encrypted_iv)
  82. wrap_alg = RSA_NONE_OAEPWithSHA1AndMGF1Padding
  83. if cek_alg == utils.AES_GCM:
  84. cek_alg = utils.AES_CTR
  85. else:
  86. undecode_encrypted_key = _hget(headers, OSS_CLIENT_SIDE_ENCRYPTION_KEY)
  87. undecode_encrypted_iv = _hget(headers, OSS_CLIENT_SIDE_ENCRYPTION_START)
  88. if undecode_encrypted_key:
  89. self.encrypted_key = b64decode_from_string(undecode_encrypted_key)
  90. if undecode_encrypted_iv:
  91. self.encrypted_iv = b64decode_from_string(undecode_encrypted_iv)
  92. cek_alg = _hget(headers, OSS_CLIENT_SIDE_ENCRYPTION_CEK_ALG)
  93. wrap_alg = _hget(headers, OSS_CLIENT_SIDE_ENCRYPTION_WRAP_ALG)
  94. mat_desc = _hget(headers, OSS_CLIENT_SIDE_ENCRYTPION_MATDESC)
  95. if mat_desc:
  96. self.mat_desc = json.loads(mat_desc)
  97. if cek_alg and cek_alg != self.cek_alg:
  98. logger.error("CEK algorithm or is inconsistent, object meta: cek_alg:{0}, material: cek_alg:{1}".
  99. format(cek_alg, self.cek_alg))
  100. err_msg = 'Data encryption/decryption algorithm is inconsistent'
  101. raise InconsistentError(err_msg, self)
  102. if wrap_alg and wrap_alg != self.wrap_alg:
  103. logger.error("WRAP algorithm or is inconsistent, object meta: wrap_alg:{0}, material: wrap_alg:{1}".
  104. format(wrap_alg, self.wrap_alg))
  105. err_msg = 'Envelope encryption/decryption algorithm is inconsistent'
  106. raise InconsistentError(err_msg, self)
  107. self.cek_alg = cek_alg
  108. self.wrap_alg = wrap_alg
  109. def is_unencrypted(self):
  110. if not self.encrypted_key and not self.encrypted_iv and not self.cek_alg and not self.wrap_alg:
  111. return True
  112. else:
  113. return False
  114. class MultipartUploadCryptoContext(object):
  115. def __init__(self, data_size=None, part_size=None, content_crypto_material=None):
  116. self.content_crypto_material = content_crypto_material
  117. self.data_size = data_size
  118. self.part_size = part_size
  119. def _hget(headers, key, converter=lambda x: x):
  120. if key in headers:
  121. return converter(headers[key])
  122. else:
  123. return None
  124. def _get_etag(headers):
  125. return _hget(headers, 'etag', lambda x: x.strip('"'))
  126. class RequestResult(object):
  127. def __init__(self, resp):
  128. #: HTTP响应
  129. self.resp = resp
  130. #: HTTP状态码
  131. self.status = resp.status
  132. #: HTTP头
  133. self.headers = resp.headers
  134. #: 请求ID,用于跟踪一个OSS请求。提交工单时,最后能够提供请求ID
  135. self.request_id = resp.request_id
  136. self.versionid = _hget(self.headers, 'x-oss-version-id')
  137. self.delete_marker = _hget(self.headers, 'x-oss-delete-marker', bool)
  138. class HeadObjectResult(RequestResult):
  139. def __init__(self, resp):
  140. super(HeadObjectResult, self).__init__(resp)
  141. #: 文件类型,可以是'Normal'、'Multipart'、'Appendable'等
  142. self.object_type = _hget(self.headers, OSS_OBJECT_TYPE)
  143. #: 文件最后修改时间,类型为int。参考 :ref:`unix_time` 。
  144. self.last_modified = _hget(self.headers, 'last-modified', http_to_unixtime)
  145. #: 文件的MIME类型
  146. self.content_type = _hget(self.headers, 'content-type')
  147. #: Content-Length,可能是None。
  148. self.content_length = _hget(self.headers, 'content-length', int)
  149. #: HTTP ETag
  150. self.etag = _get_etag(self.headers)
  151. #: 文件 server_crc
  152. self._server_crc = _hget(self.headers, 'x-oss-hash-crc64ecma', int)
  153. @property
  154. def server_crc(self):
  155. return self._server_crc
  156. class GetSelectObjectMetaResult(HeadObjectResult):
  157. def __init__(self, resp):
  158. super(GetSelectObjectMetaResult, self).__init__(resp)
  159. self.select_resp = SelectResponseAdapter(resp, None, None, False)
  160. for data in self.select_resp: # waiting the response body to finish
  161. pass
  162. self.csv_rows = self.select_resp.rows # to be compatible with previous version.
  163. self.csv_splits = self.select_resp.splits # to be compatible with previous version.
  164. self.rows = self.csv_rows
  165. self.splits = self.csv_splits
  166. class GetObjectMetaResult(RequestResult):
  167. def __init__(self, resp):
  168. super(GetObjectMetaResult, self).__init__(resp)
  169. #: 文件最后修改时间,类型为int。参考 :ref:`unix_time` 。
  170. self.last_modified = _hget(self.headers, 'last-modified', http_to_unixtime)
  171. #: Content-Length,文件大小,类型为int。
  172. self.content_length = _hget(self.headers, 'content-length', int)
  173. #: HTTP ETag
  174. self.etag = _get_etag(self.headers)
  175. class GetSymlinkResult(RequestResult):
  176. def __init__(self, resp):
  177. super(GetSymlinkResult, self).__init__(resp)
  178. #: 符号连接的目标文件
  179. self.target_key = urlunquote(_hget(self.headers, OSS_SYMLINK_TARGET))
  180. class GetObjectResult(HeadObjectResult):
  181. def __init__(self, resp, progress_callback=None, crc_enabled=False, crypto_provider=None, discard=0):
  182. super(GetObjectResult, self).__init__(resp)
  183. self.__crc_enabled = crc_enabled
  184. self.__crypto_provider = crypto_provider
  185. self.content_range = _hget(resp.headers, 'Content-Range')
  186. if self.content_range:
  187. byte_range = self._parse_range_str(self.content_range)
  188. if progress_callback:
  189. self.stream = make_progress_adapter(self.resp, progress_callback, self.content_length)
  190. else:
  191. self.stream = self.resp
  192. if self.__crc_enabled:
  193. self.stream = make_crc_adapter(self.stream, discard=discard)
  194. if self.__crypto_provider:
  195. content_crypto_material = ContentCryptoMaterial(self.__crypto_provider.cipher,
  196. self.__crypto_provider.wrap_alg)
  197. content_crypto_material.from_object_meta(resp.headers)
  198. if content_crypto_material.is_unencrypted():
  199. logger.info("The object is not encrypted, use crypto provider is not recommended")
  200. else:
  201. crypto_provider = self.__crypto_provider
  202. if content_crypto_material.mat_desc != self.__crypto_provider.mat_desc:
  203. logger.warning("The material description of the object and the provider is inconsistent")
  204. encryption_materials = self.__crypto_provider.get_encryption_materials(
  205. content_crypto_material.mat_desc)
  206. if encryption_materials:
  207. crypto_provider = self.__crypto_provider.reset_encryption_materials(encryption_materials)
  208. else:
  209. raise ClientError(
  210. 'There is no encryption materials match the material description of the object')
  211. plain_key = crypto_provider.decrypt_encrypted_key(content_crypto_material.encrypted_key)
  212. if content_crypto_material.deprecated:
  213. if content_crypto_material.wrap_alg == KMS_ALI_WRAP_ALGORITHM:
  214. plain_counter = int(
  215. crypto_provider.decrypt_encrypted_iv(content_crypto_material.encrypted_iv, True))
  216. else:
  217. plain_counter = int(crypto_provider.decrypt_encrypted_iv(content_crypto_material.encrypted_iv))
  218. else:
  219. plain_iv = crypto_provider.decrypt_encrypted_iv(content_crypto_material.encrypted_iv)
  220. offset = 0
  221. if self.content_range:
  222. start, end = crypto_provider.adjust_range(byte_range[0], byte_range[1])
  223. offset = content_crypto_material.cipher.calc_offset(start)
  224. cipher = copy.copy(content_crypto_material.cipher)
  225. if content_crypto_material.deprecated:
  226. cipher.initial_by_counter(plain_key, plain_counter + offset)
  227. else:
  228. cipher.initialize(plain_key, plain_iv, offset)
  229. self.stream = crypto_provider.make_decrypt_adapter(self.stream, cipher, discard)
  230. else:
  231. if OSS_CLIENT_SIDE_ENCRYPTION_KEY in resp.headers or DEPRECATED_CLIENT_SIDE_ENCRYPTION_KEY in resp.headers:
  232. logger.warning(
  233. "Using Bucket to get an encrypted object will return raw data, please confirm if you really want to do this")
  234. @staticmethod
  235. def _parse_range_str(content_range):
  236. # :param str content_range: sample 'bytes 0-128/1024'
  237. range_data = (content_range.split(' ', 2)[1]).split('/', 2)[0]
  238. range_start, range_end = range_data.split('-', 2)
  239. return int(range_start), int(range_end)
  240. def read(self, amt=None):
  241. return self.stream.read(amt)
  242. def close(self):
  243. self.resp.response.close()
  244. def __iter__(self):
  245. return iter(self.stream)
  246. def __enter__(self):
  247. return self
  248. def __exit__(self, exc_type, exc_val, exc_tb):
  249. self.close()
  250. @property
  251. def client_crc(self):
  252. if self.__crc_enabled:
  253. return self.stream.crc
  254. else:
  255. return None
  256. class SelectObjectResult(HeadObjectResult):
  257. def __init__(self, resp, progress_callback=None, crc_enabled=False):
  258. super(SelectObjectResult, self).__init__(resp)
  259. self.__crc_enabled = crc_enabled
  260. self.select_resp = SelectResponseAdapter(resp, progress_callback, None, enable_crc = self.__crc_enabled)
  261. def read(self):
  262. return self.select_resp.read()
  263. def close(self):
  264. self.resp.response.close()
  265. def __iter__(self):
  266. return iter(self.select_resp)
  267. def __next__(self):
  268. return self.select_resp.next()
  269. def __enter__(self):
  270. return self
  271. def __exit__(self, exc_type, exc_val, exc_tb):
  272. self.close()
  273. class PutObjectResult(RequestResult):
  274. def __init__(self, resp):
  275. super(PutObjectResult, self).__init__(resp)
  276. #: HTTP ETag
  277. self.etag = _get_etag(self.headers)
  278. #: 文件上传后,OSS上文件的CRC64值
  279. self.crc = _hget(resp.headers, OSS_HASH_CRC64_ECMA, int)
  280. class AppendObjectResult(RequestResult):
  281. def __init__(self, resp):
  282. super(AppendObjectResult, self).__init__(resp)
  283. #: HTTP ETag
  284. self.etag = _get_etag(self.headers)
  285. #: 本次追加写完成后,OSS上文件的CRC64值
  286. self.crc = _hget(resp.headers, OSS_HASH_CRC64_ECMA, int)
  287. #: 下次追加写的偏移
  288. self.next_position = _hget(resp.headers, OSS_NEXT_APPEND_POSITION, int)
  289. class BatchDeleteObjectVersion(object):
  290. def __init__(self, key=None, versionid=None):
  291. self.key = key or ''
  292. self.versionid = versionid or ''
  293. class BatchDeleteObjectVersionList(object):
  294. def __init__(self, object_version_list=None):
  295. self.object_version_list = object_version_list or []
  296. def append(self, object_version):
  297. self.object_version_list.append(object_version)
  298. def len(self):
  299. return len(self.object_version_list)
  300. class BatchDeleteObjectVersionResult(object):
  301. def __init__(self, key, versionid=None, delete_marker=None, delete_marker_versionid=None):
  302. self.key = key
  303. self.versionid = versionid or ''
  304. self.delete_marker = delete_marker or False
  305. self.delete_marker_versionid = delete_marker_versionid or ''
  306. class BatchDeleteObjectsResult(RequestResult):
  307. def __init__(self, resp):
  308. super(BatchDeleteObjectsResult, self).__init__(resp)
  309. #: 已经删除的文件名列表
  310. self.deleted_keys = []
  311. #:已经删除的带版本信息的文件信息列表
  312. self.delete_versions = []
  313. class InitMultipartUploadResult(RequestResult):
  314. def __init__(self, resp):
  315. super(InitMultipartUploadResult, self).__init__(resp)
  316. #: 新生成的Upload ID
  317. self.upload_id = None
  318. # 客户端加密Bucket关于Multipart文件的context
  319. # self.crypto_multipart_context = None
  320. class ListObjectsResult(RequestResult):
  321. def __init__(self, resp):
  322. super(ListObjectsResult, self).__init__(resp)
  323. #: True表示还有更多的文件可以罗列;False表示已经列举完毕。
  324. self.is_truncated = False
  325. #: 下一次罗列的分页标记符,即,可以作为 :func:`list_objects <oss2.Bucket.list_objects>` 的 `marker` 参数。
  326. self.next_marker = ''
  327. #: 本次罗列得到的文件列表。其中元素的类型为 :class:`SimplifiedObjectInfo` 。
  328. self.object_list = []
  329. #: 本次罗列得到的公共前缀列表,类型为str列表。
  330. self.prefix_list = []
  331. class ListObjectsV2Result(RequestResult):
  332. def __init__(self, resp):
  333. super(ListObjectsV2Result, self).__init__(resp)
  334. #: True表示还有更多的文件可以罗列;False表示已经列举完毕。
  335. self.is_truncated = False
  336. #: 下次罗列操作携带的token
  337. self.next_continuation_token = ''
  338. #: 本次罗列得到的文件列表。其中元素的类型为 :class:`SimplifiedObjectInfo` 。
  339. self.object_list = []
  340. #: 本次罗列得到的公共前缀列表,类型为str列表。
  341. self.prefix_list = []
  342. class SimplifiedObjectInfo(object):
  343. def __init__(self, key, last_modified, etag, type, size, storage_class, owner=None, restore_info=None):
  344. #: 文件名,或公共前缀名。
  345. self.key = key
  346. #: 文件的最后修改时间
  347. self.last_modified = last_modified
  348. #: HTTP ETag
  349. self.etag = etag
  350. #: 文件类型
  351. self.type = type
  352. #: 文件大小
  353. self.size = size
  354. #: 文件的存储类别,是一个字符串。
  355. self.storage_class = storage_class
  356. #: owner信息, 类型为: class:`Owner <oss2.models.Owner>`
  357. self.owner = owner
  358. #: Object的解冻状态。
  359. self.restore_info = restore_info
  360. def is_prefix(self):
  361. """如果是公共前缀,返回True;是文件,则返回False"""
  362. return self.last_modified is None
  363. OBJECT_ACL_DEFAULT = 'default'
  364. OBJECT_ACL_PRIVATE = 'private'
  365. OBJECT_ACL_PUBLIC_READ = 'public-read'
  366. OBJECT_ACL_PUBLIC_READ_WRITE = 'public-read-write'
  367. class GetObjectAclResult(RequestResult):
  368. def __init__(self, resp):
  369. super(GetObjectAclResult, self).__init__(resp)
  370. #: 文件的ACL,其值可以是 `OBJECT_ACL_DEFAULT`、`OBJECT_ACL_PRIVATE`、`OBJECT_ACL_PUBLIC_READ`或
  371. #: `OBJECT_ACL_PUBLIC_READ_WRITE`
  372. self.acl = ''
  373. class SimplifiedBucketInfo(object):
  374. """:func:`list_buckets <oss2.Service.list_objects>` 结果中的单个元素类型。"""
  375. def __init__(self, name, location, creation_date, extranet_endpoint, intranet_endpoint, storage_class, region=None, resource_group_id=None):
  376. #: Bucket名
  377. self.name = name
  378. #: Bucket的区域
  379. self.location = location
  380. #: Bucket的创建时间,类型为int。参考 :ref:`unix_time`。
  381. self.creation_date = creation_date
  382. #: Bucket访问的外网域名
  383. self.extranet_endpoint = extranet_endpoint
  384. #: 同区域ECS访问Bucket的内网域名
  385. self.intranet_endpoint = intranet_endpoint
  386. #: Bucket存储类型,支持“Standard”、“IA”、“Archive”、“ColdArchive”
  387. self.storage_class = storage_class
  388. #: Bucket所在地域
  389. self.region = region
  390. #: Bucket所属资源组ID
  391. self.resource_group_id = resource_group_id
  392. class ListBucketsResult(RequestResult):
  393. def __init__(self, resp):
  394. super(ListBucketsResult, self).__init__(resp)
  395. #: True表示还有更多的Bucket可以罗列;False表示已经列举完毕。
  396. self.is_truncated = False
  397. #: 下一次罗列的分页标记符,即,可以作为 :func:`list_buckets <oss2.Service.list_buckets>` 的 `marker` 参数。
  398. self.next_marker = ''
  399. #: 得到的Bucket列表,类型为 :class:`SimplifiedBucketInfo` 。
  400. self.buckets = []
  401. #: owner信息, 类型为: class:`Owner <oss2.models.Owner>`
  402. self.owner = Owner('', '')
  403. class MultipartUploadInfo(object):
  404. def __init__(self, key, upload_id, initiation_date):
  405. #: 文件名
  406. self.key = key
  407. #: 分片上传ID
  408. self.upload_id = upload_id
  409. #: 分片上传初始化的时间,类型为int。参考 :ref:`unix_time`
  410. self.initiation_date = initiation_date
  411. def is_prefix(self):
  412. """如果是公共前缀则返回True"""
  413. return self.upload_id is None
  414. class ListMultipartUploadsResult(RequestResult):
  415. def __init__(self, resp):
  416. super(ListMultipartUploadsResult, self).__init__(resp)
  417. #: True表示还有更多的为完成分片上传可以罗列;False表示已经列举完毕。
  418. self.is_truncated = False
  419. #: 文件名分页符
  420. self.next_key_marker = ''
  421. #: 分片上传ID分页符
  422. self.next_upload_id_marker = ''
  423. #: 分片上传列表。类型为`MultipartUploadInfo`列表。
  424. self.upload_list = []
  425. #: 公共前缀列表。类型为str列表。
  426. self.prefix_list = []
  427. class ListPartsResult(RequestResult):
  428. def __init__(self, resp):
  429. super(ListPartsResult, self).__init__(resp)
  430. # True表示还有更多的Part可以罗列;False表示已经列举完毕。
  431. self.is_truncated = False
  432. # 下一个分页符
  433. self.next_marker = ''
  434. # 罗列出的Part信息,类型为 `PartInfo` 列表。
  435. self.parts = []
  436. BUCKET_ACL_PRIVATE = 'private'
  437. BUCKET_ACL_PUBLIC_READ = 'public-read'
  438. BUCKET_ACL_PUBLIC_READ_WRITE = 'public-read-write'
  439. BUCKET_STORAGE_CLASS_STANDARD = 'Standard'
  440. BUCKET_STORAGE_CLASS_IA = 'IA'
  441. BUCKET_STORAGE_CLASS_ARCHIVE = 'Archive'
  442. BUCKET_STORAGE_CLASS_COLD_ARCHIVE = "ColdArchive"
  443. BUCKET_STORAGE_CLASS_DEEP_COLD_ARCHIVE = "DeepColdArchive"
  444. BUCKET_DATA_REDUNDANCY_TYPE_LRS = "LRS"
  445. BUCKET_DATA_REDUNDANCY_TYPE_ZRS = "ZRS"
  446. REDIRECT_TYPE_MIRROR = 'Mirror'
  447. REDIRECT_TYPE_EXTERNAL = 'External'
  448. REDIRECT_TYPE_INTERNAL = 'Internal'
  449. REDIRECT_TYPE_ALICDN = 'AliCDN'
  450. PAYER_BUCKETOWNER = 'BucketOwner'
  451. PAYER_REQUESTER = 'Requester'
  452. class GetBucketAclResult(RequestResult):
  453. def __init__(self, resp):
  454. super(GetBucketAclResult, self).__init__(resp)
  455. #: Bucket的ACL,其值可以是 `BUCKET_ACL_PRIVATE`、`BUCKET_ACL_PUBLIC_READ`或`BUCKET_ACL_PUBLIC_READ_WRITE`。
  456. self.acl = ''
  457. class GetBucketLocationResult(RequestResult):
  458. def __init__(self, resp):
  459. super(GetBucketLocationResult, self).__init__(resp)
  460. #: Bucket所在的数据中心
  461. self.location = ''
  462. class BucketLogging(object):
  463. """Bucket日志配置信息。
  464. :param str target_bucket: 存储日志到这个Bucket。
  465. :param str target_prefix: 生成的日志文件名加上该前缀。
  466. """
  467. def __init__(self, target_bucket, target_prefix):
  468. self.target_bucket = target_bucket
  469. self.target_prefix = target_prefix
  470. class GetBucketLoggingResult(RequestResult, BucketLogging):
  471. def __init__(self, resp):
  472. RequestResult.__init__(self, resp)
  473. BucketLogging.__init__(self, '', '')
  474. class BucketCreateConfig(object):
  475. def __init__(self, storage_class, data_redundancy_type=None):
  476. self.storage_class = storage_class
  477. self.data_redundancy_type = data_redundancy_type
  478. class BucketStat(object):
  479. def __init__(self, storage_size_in_bytes, object_count, multi_part_upload_count, live_channel_count,
  480. last_modified_time, standard_storage, standard_object_count, infrequent_access_storage,
  481. infrequent_access_real_storage, infrequent_access_object_count, archive_storage, archive_real_storage,
  482. archive_object_count, cold_archive_storage, cold_archive_real_storage, cold_archive_object_count):
  483. self.storage_size_in_bytes = storage_size_in_bytes
  484. self.object_count = object_count
  485. self.multi_part_upload_count = multi_part_upload_count
  486. #: bucket中live channel数量
  487. self.live_channel_count = live_channel_count
  488. #: 此次调用获取到的数据记录的时间点
  489. self.last_modified_time = last_modified_time
  490. #: 标准存储类型的存储量,单位字节
  491. self.standard_storage = standard_storage
  492. #: 标准存储类型的object数量
  493. self.standard_object_count = standard_object_count
  494. #: 低频存储类型的计费存储量(单个object不足64KB以64KB计算),单位字节
  495. self.infrequent_access_storage = infrequent_access_storage
  496. #: 低频存储类型的实际存储量,单位字节
  497. self.infrequent_access_real_storage = infrequent_access_real_storage
  498. #: 低频存储类型的object数量
  499. self.infrequent_access_object_count = infrequent_access_object_count
  500. #: 归档存储类型的计费存储量(单个object不足64KB以64KB计算),单位字节
  501. self.archive_storage = archive_storage
  502. #: 归档存储类型的实际存储量,单位字节
  503. self.archive_real_storage = archive_real_storage
  504. #: 归档存储类型的object数量
  505. self.archive_object_count = archive_object_count
  506. #: 冷归档存储类型的计费存储量(单个object不足64KB以64KB计算),单位字节
  507. self.cold_archive_storage = cold_archive_storage
  508. #: 冷归档存储类型的实际存储量,单位字节
  509. self.cold_archive_real_storage = cold_archive_real_storage
  510. #: 冷归档存储类型的object数量
  511. self.cold_archive_object_count = cold_archive_object_count
  512. class AccessControlList(object):
  513. def __init__(self, grant):
  514. self.grant = grant
  515. class Owner(object):
  516. def __init__(self, display_name, owner_id):
  517. self.display_name = display_name
  518. self.id = owner_id
  519. class BucketInfo(object):
  520. def __init__(self, name=None, owner=None, location=None, storage_class=None, intranet_endpoint=None,
  521. extranet_endpoint=None, creation_date=None, acl=None, data_redundancy_type=None, comment=None,
  522. bucket_encryption_rule=None, versioning_status=None, access_monitor=None,
  523. transfer_acceleration=None, cross_region_replication=None, resource_group_id=None):
  524. self.name = name
  525. self.owner = owner
  526. self.location = location
  527. self.storage_class = storage_class
  528. self.intranet_endpoint = intranet_endpoint
  529. self.extranet_endpoint = extranet_endpoint
  530. self.creation_date = creation_date
  531. self.acl = acl
  532. self.data_redundancy_type = data_redundancy_type
  533. self.comment = comment
  534. self.bucket_encryption_rule = bucket_encryption_rule
  535. self.versioning_status = versioning_status
  536. self.access_monitor = access_monitor
  537. self.transfer_acceleration = transfer_acceleration
  538. self.cross_region_replication = cross_region_replication
  539. self.resource_group_id = resource_group_id
  540. class GetBucketStatResult(RequestResult, BucketStat):
  541. def __init__(self, resp):
  542. RequestResult.__init__(self, resp)
  543. BucketStat.__init__(self, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
  544. class GetBucketInfoResult(RequestResult, BucketInfo):
  545. def __init__(self, resp):
  546. RequestResult.__init__(self, resp)
  547. BucketInfo.__init__(self)
  548. class BucketReferer(object):
  549. """Bucket防盗链设置。
  550. :param bool allow_empty_referer: 是否允许空的Referer。
  551. :param referers: Referer列表,每个元素是一个str。
  552. :param black_referers: BlackReferer列表,每个元素是一个str。
  553. """
  554. def __init__(self, allow_empty_referer, referers, allow_truncate_query_string=None, black_referers=None):
  555. self.allow_empty_referer = allow_empty_referer
  556. self.referers = referers
  557. self.allow_truncate_query_string = allow_truncate_query_string
  558. self.black_referers = black_referers
  559. class GetBucketRefererResult(RequestResult, BucketReferer):
  560. def __init__(self, resp):
  561. RequestResult.__init__(self, resp)
  562. BucketReferer.__init__(self, False, [], None, [])
  563. class Condition(object):
  564. """ 匹配规则
  565. :父节点: class `RoutingRule <oss2.models.RoutingRule>`
  566. :param key_prefix_equals: 匹配object的前缀,
  567. :type key_prefix_equals: string str
  568. :param http_err_code_return_equals: 匹配访问object时返回的status。
  569. :type http_err_code_return_equals: int
  570. :param include_header_list: 匹配指定的header
  571. :type include_header_list: list of :class:`ConditionInlcudeHeader`
  572. """
  573. def __init__(self, key_prefix_equals=None, http_err_code_return_equals=None, include_header_list=None):
  574. if (include_header_list is not None):
  575. if not isinstance(include_header_list, list):
  576. raise ClientError('class of include_header should be list')
  577. if len(include_header_list) > 5:
  578. raise ClientError('capacity of include_header_list should not > 5, please check!')
  579. self.key_prefix_equals = key_prefix_equals
  580. self.http_err_code_return_equals = http_err_code_return_equals
  581. self.include_header_list = include_header_list or []
  582. class ConditionInlcudeHeader(object):
  583. """ 指定匹配的header
  584. :父节点: class `Condition <oss2.models.Condition>`
  585. :param key: header key
  586. :type key: str
  587. :param key: header value
  588. :type key: str
  589. """
  590. def __init__(self, key=None, equals= None):
  591. self.key = key
  592. self.equals = equals
  593. class Redirect(object):
  594. """匹配规则之后执行的动作
  595. :父节点: class `RoutingRule <oss2.models.RoutingRule>`
  596. :param redirect_type: 跳转类型, 取值为Mirror, External, Internal, AliCDN其中一个。
  597. :type redirect_type: class: str
  598. :param pass_query_string: 执行跳转或者镜像回源时,是否要携带发起请求的请求参数,默认false。
  599. :type pass_query_string: bool
  600. :param replace_key_with: Redirect的时候object name将替换成这个值,可以支持变量(目前支持的变量是${key}
  601. 当RedirectType为Internal, External或者AliCDN时有效。
  602. :type replace_key_with: str
  603. :param replace_key_prefix_with: Redirect的时候object name的前缀将替换成这个值。如果前缀为空则将这个字符串插入在object namde的最前面。
  604. 当RedirectType为Internal, External或者AliCDN时有效。
  605. :type replace_key_prefix_with: str
  606. :param proto: 跳转时的协议,只能取值为http或者https。
  607. 当RedirectType为External或者AliCDN时有效。
  608. :type proto: class: str
  609. :param host_name: 跳转时的域名
  610. 当RedirectType为External或者AliCDN时有效。
  611. :type host_name: str
  612. :param http_redirect_code: 跳转时返回的状态码,取值为301、302或307。
  613. 当RedirectType为External或者AliCDN时有效。
  614. :type http_redirect_code: int (HTTP状态码)
  615. :mirror相关当参数只有当RedirectType为Mirror时有效。
  616. :param mirror_url: 镜像回源的源站地址,
  617. :type mirror_url: str
  618. :param mirror_url_slave: 镜像回源的备站地址
  619. :type mirror_url_slave: str
  620. :param mirror_url_probe: 主备切换模式的探测url,这个url需要代表主源站的健康程度,mirror_url_slave指定时,此项必须指定。
  621. :type mirror_url_probe: str
  622. :param mirror_pass_query_string: 作用同pass_query_string,默认false。
  623. :type mirror_pass_query_string: bool
  624. :param mirror_follow_redirect: 如果镜像回源获取的结果是3xx,是否要继续跳转到指定的Location获取数据。默认true。
  625. :type mirror_follow_redirect: bool
  626. :param mirror_check_md5: 是否要检查回源body的md5, 默认false。
  627. :type mirror_check_md5: bool
  628. :param mirror_headers: 指定匹配此规则后执行的动作。
  629. :type mirror_headers: class:`RedirectMirrorHeaders <oss2.models.RedirectMirrorHeaders>`
  630. """
  631. def __init__(self, redirect_type=None, pass_query_string= None, replace_key_with=None, replace_key_prefix_with=None,
  632. proto=None, host_name=None, http_redirect_code=None, mirror_url=None, mirror_url_slave=None,
  633. mirror_url_probe=None, mirror_pass_query_string=None, mirror_follow_redirect=None,
  634. mirror_check_md5=None, mirror_headers=None):
  635. if redirect_type not in [REDIRECT_TYPE_MIRROR, REDIRECT_TYPE_EXTERNAL, REDIRECT_TYPE_INTERNAL, REDIRECT_TYPE_ALICDN]:
  636. raise ClientError('redirect_type must be Internal, External, Mirror or AliCDN.')
  637. if redirect_type == REDIRECT_TYPE_INTERNAL:
  638. if any((host_name, proto, http_redirect_code)):
  639. raise ClientError('host_name, proto, http_redirect_code must be empty when redirect_type is Internal.')
  640. if redirect_type in [REDIRECT_TYPE_EXTERNAL, REDIRECT_TYPE_ALICDN]:
  641. if http_redirect_code is not None:
  642. if http_redirect_code < 300 or http_redirect_code > 399:
  643. raise ClientError("http_redirect_code must be a valid HTTP 3xx status code.")
  644. if redirect_type in [REDIRECT_TYPE_EXTERNAL, REDIRECT_TYPE_ALICDN, REDIRECT_TYPE_INTERNAL]:
  645. if all((replace_key_with, replace_key_prefix_with)):
  646. raise ClientError("replace_key_with or replace_key_prefix_with only choose one.")
  647. elif redirect_type == REDIRECT_TYPE_MIRROR:
  648. if any((proto, host_name, replace_key_with, replace_key_prefix_with, http_redirect_code)):
  649. raise ClientError('host_name, replace_key_with, replace_key_prefix_with, http_redirect_code and proto must be empty when redirect_type is Mirror.')
  650. if mirror_url is None:
  651. raise ClientError('mirror_url should not be None when redirect_type is Mirror.')
  652. if (not mirror_url.startswith('http://') and not mirror_url.startswith('https://')) or not mirror_url.endswith('/'):
  653. raise ClientError(r'mirror_url is invalid, should startwith "http://" or "https://", and endwith "/"')
  654. if mirror_url_slave is not None:
  655. if mirror_url_probe is None:
  656. raise ClientError('mirror_url_probe should not be none when mirror_url_slave is indicated')
  657. if (not mirror_url_slave.startswith('http://') and not mirror_url_slave.startswith('https://')) or not mirror_url_slave.endswith('/'):
  658. raise ClientError(r'mirror_url_salve is invalid, should startwith "http://" or "https://", and endwith "/"')
  659. self.redirect_type = redirect_type
  660. self.pass_query_string = pass_query_string
  661. self.replace_key_with = replace_key_with
  662. self.replace_key_prefix_with = replace_key_prefix_with
  663. self.proto = proto
  664. self.host_name = host_name
  665. self.http_redirect_code = http_redirect_code
  666. self.mirror_url = mirror_url
  667. self.mirror_url_slave = mirror_url_slave
  668. self.mirror_url_probe = mirror_url_probe
  669. self.mirror_pass_query_string = mirror_pass_query_string
  670. self.mirror_check_md5 = mirror_check_md5
  671. self.mirror_follow_redirect = mirror_follow_redirect
  672. self.mirror_headers = mirror_headers
  673. class RedirectMirrorHeaders(object):
  674. """指定镜像回源时携带的header
  675. :父节点: class `Redirect <oss2.models.Redirect>`
  676. :param pass_all: 是否透传请求中所有的header(除了保留的几个header以及以oss-/x-oss-/x-drs-开头的header)到源站。默认false
  677. :type pass_all: bool
  678. :param pass_list: 透传指定的header到源站,最多10个,只有在RedirectType为Mirror时生效
  679. :type pass_list: list of str
  680. :param remove_list: 禁止透传指定的header到源站,这个字段可以重复,最多10个
  681. :type remove_list: list of str
  682. :param set_list: 设置一个header传到源站,不管请求中是否携带这些指定的header,回源时都会设置这些header。
  683. 该容器可以重复,最多10组。只有在RedirectType为Mirror时生效。
  684. :type set_list: list of :class:`MirrorHeadersSet <oss2.models.MirrorHeadersSet>`
  685. """
  686. def __init__(self,pass_all=None, pass_list=None, remove_list=None, set_list=None):
  687. if pass_list is not None:
  688. if not isinstance(pass_list, list):
  689. raise ClientError('The type of pass_list should be list.')
  690. if len(pass_list) > 10:
  691. raise ClientError('The capacity of pass_list should not > 10!')
  692. if remove_list is not None:
  693. if not isinstance(remove_list, list):
  694. raise ClientError('The type of remove_list should be list.')
  695. if len(remove_list) > 10:
  696. raise ClientError('The capacity of remove_list should not > 10!')
  697. if set_list is not None:
  698. if not isinstance(set_list, list):
  699. raise ClientError('The type of set_list should be list.')
  700. if len(set_list) > 10:
  701. raise ClientError('The capacity of set_list should not > 10!')
  702. self.pass_all = pass_all
  703. self.pass_list = pass_list or []
  704. self.remove_list = remove_list or []
  705. self.set_list = set_list or []
  706. class MirrorHeadersSet(object):
  707. """父节点: class `RedirectMirrorHeaders <oss2.models.RedirectMirrorHeaders>`
  708. :param key:设置header的key,最多1024个字节,字符集与Pass相同。只有在RedirectType为Mirror时生效。
  709. :type key: str
  710. :param value:设置header的value,最多1024个字节,不能出现”\r\n” 。只有在RedirectType为Mirror时生效。
  711. :type value: str
  712. """
  713. def __init__(self, key=None, value=None):
  714. self.key = key
  715. self.value = value
  716. class RoutingRule(object):
  717. """设置静态网站托管模式中的跳转规则
  718. :param rule_num: RoutingRule的序号, 必须为正整数
  719. :type rule_num: int
  720. :param condition: 匹配条件
  721. :type condition: class:`Condition <oss2.models.Condition>`
  722. :param redirect: 指定匹配此规则后执行的动作
  723. :type redirect: class:`Redirect <oss2.models.Redirect>`
  724. """
  725. def __init__(self, rule_num=None, condition=None, redirect=None):
  726. if (rule_num is None) or (not isinstance(rule_num, int)) or (rule_num <= 0):
  727. raise ClientError('rule_num should be positive integer.')
  728. if(condition is None) or (redirect is None):
  729. raise ClientError('condition and redirect should be effective.')
  730. if(redirect.redirect_type == REDIRECT_TYPE_MIRROR) and condition.http_err_code_return_equals != 404:
  731. raise ClientError('http_err_code not match redirect_type, it should be 404!')
  732. self.rule_num = rule_num
  733. self.condition = condition
  734. self.redirect = redirect
  735. class BucketWebsite(object):
  736. """静态网站托管配置。
  737. :param str index_file: 索引页面文件
  738. :param str error_file: 404页面文件
  739. :param rules : list of class:`RoutingRule <oss2.models.RoutingRule>`
  740. """
  741. def __init__(self, index_file, error_file, rules=None):
  742. if rules is not None:
  743. if not isinstance(rules, list):
  744. raise ClientError('rules type should be list.')
  745. if len(rules) > 5:
  746. raise ClientError('capacity of rules should not be > 5.')
  747. self.index_file = index_file
  748. self.error_file = error_file
  749. self.rules = rules or []
  750. class GetBucketWebsiteResult(RequestResult, BucketWebsite):
  751. def __init__(self, resp):
  752. RequestResult.__init__(self, resp)
  753. BucketWebsite.__init__(self, '', '', [])
  754. class LifecycleExpiration(object):
  755. """过期删除操作。
  756. :param days: 表示在文件修改后过了这么多天,就会匹配规则,从而被删除
  757. :type days: int
  758. :param date: 表示在该日期之后,规则就一直生效。即每天都会对符合前缀的文件执行删除操作(如,删除),而不管文件是什么时候生成的。*不建议使用*
  759. :type date: `datetime.date`
  760. :param created_before_date: delete files if their last modified time earlier than created_before_date
  761. :type created_before_date: `datetime.date`
  762. :param expired_detete_marker: 真实文件删除之后是否自动移除删除标记,适用于多版本场景。
  763. :param expired_detete_marker: bool
  764. """
  765. def __init__(self, days=None, date=None, created_before_date=None, expired_detete_marker=None):
  766. not_none_fields = 0
  767. if days is not None:
  768. not_none_fields += 1
  769. if date is not None:
  770. not_none_fields += 1
  771. if created_before_date is not None:
  772. not_none_fields += 1
  773. if expired_detete_marker is not None:
  774. not_none_fields += 1
  775. if not_none_fields > 1:
  776. raise ClientError('More than one field(days, date and created_before_date, expired_detete_marker) has been specified')
  777. self.days = days
  778. self.date = date
  779. self.created_before_date = created_before_date
  780. self.expired_detete_marker = expired_detete_marker
  781. class AbortMultipartUpload(object):
  782. """删除parts
  783. :param days: 删除相对最后修改时间days天之后的parts
  784. :param created_before_date: 删除最后修改时间早于created_before_date的parts
  785. """
  786. def __init__(self, days=None, created_before_date=None):
  787. if days is not None and created_before_date is not None:
  788. raise ClientError('days and created_before_date should not be both specified')
  789. self.days = days
  790. self.created_before_date = created_before_date
  791. class StorageTransition(object):
  792. """transit objects
  793. :param days: 将相对最后修改时间days天之后的Object转储
  794. :param created_before_date: 将最后修改时间早于created_before_date的对象转储
  795. :param storage_class: 对象转储到OSS的目标存储类型
  796. :param bool is_access_time: 指定lifecycle rule是否基于atime。
  797. :param bool return_to_std_when_visit: 指定对象转到低频层后再次访问时是否回到标准层。
  798. :param bool allow_small_file: 指定是否将小于64 KB的Object转储为低频、归档、冷归档文件类型。
  799. """
  800. def __init__(self, days=None, created_before_date=None, storage_class=None, is_access_time=None, return_to_std_when_visit=None, allow_small_file=None):
  801. if days is not None and created_before_date is not None:
  802. raise ClientError('days and created_before_date should not be both specified')
  803. self.days = days
  804. self.created_before_date = created_before_date
  805. self.storage_class = storage_class
  806. self.is_access_time = is_access_time
  807. self.return_to_std_when_visit = return_to_std_when_visit
  808. self.allow_small_file = allow_small_file
  809. class NoncurrentVersionExpiration(object):
  810. """OSS何时将非当前版本的object删除
  811. :param noncurrent_days: 指定多少天之后删除
  812. :type noncurrent_days: int
  813. """
  814. def __init__(self, noncurrent_days):
  815. self.noncurrent_days = noncurrent_days
  816. class NoncurrentVersionStorageTransition(object):
  817. """生命周期内,OSS何时将指定Object的非当前版本转储为IA或者Archive存储类型。
  818. :param noncurrent_days: 多少天之后转存储
  819. :type noncurrent_days: int
  820. :param is_access_time: 指定lifecycle rule是否基于atime。
  821. :type is_access_time: bool
  822. :param return_to_std_when_visit: 指定对象转到低频层后再次访问时是否回到标准层。
  823. :type return_to_std_when_visit: bool
  824. :param allow_small_file: 指定是否将小于64 KB的Object转储为低频、归档、冷归档文件类型。
  825. :type allow_small_file: bool
  826. """
  827. def __init__(self, noncurrent_days, storage_class, is_access_time=None, return_to_std_when_visit=None, allow_small_file=None):
  828. self.noncurrent_days = noncurrent_days
  829. self.storage_class = storage_class
  830. self.is_access_time = is_access_time
  831. self.return_to_std_when_visit = return_to_std_when_visit
  832. self.allow_small_file = allow_small_file
  833. class LifecycleRule(object):
  834. """生命周期规则。
  835. :param id: 规则名
  836. :type id: str
  837. :param prefix: 只有文件名匹配该前缀的文件才适用本规则
  838. :type prefix: str
  839. :param expiration: 过期删除操作。
  840. :type expiration: :class:`LifecycleExpiration`
  841. :param status: 启用还是禁止该规则。可选值为 `LifecycleRule.ENABLED` 或 `LifecycleRule.DISABLED`
  842. :param storage_transitions: 存储类型转换规则
  843. :type storage_transitions: list of class:`StorageTransition <oss2.models.StorageTransition>`
  844. :param tagging: object tagging 规则
  845. :type tagging: :class:`Tagging <oss2.models.StorageTransition>`
  846. :param noncurrent_version_expiration: 指定Object非当前版本生命周期规则的过期属性。适用于多版本场景。
  847. :type noncurrent_version_expiration class:`NoncurrentVersionExpiration <oss2.models.NoncurrentVersionExpiration>`
  848. :param noncurrent_version_sotrage_transitions: 在有效生命周期中,OSS何时将指定Object的非当前版本转储为IA或者Archive存储类型,适用于多版本场景。
  849. :type noncurrent_version_sotrage_transitions: list of class:`NoncurrentVersionStorageTransition <oss2.models.NoncurrentVersionStorageTransition>`
  850. :param atime_base: last access time的时间戳
  851. :type atime_base: int
  852. :param filter: 规则的条件参数容器。
  853. :type filter class:`LifecycleFilter <oss2.models.LifecycleFilter>`
  854. """
  855. ENABLED = 'Enabled'
  856. DISABLED = 'Disabled'
  857. def __init__(self, id, prefix,
  858. status=ENABLED, expiration=None,
  859. abort_multipart_upload=None,
  860. storage_transitions=None, tagging=None,
  861. noncurrent_version_expiration=None,
  862. noncurrent_version_sotrage_transitions=None,
  863. atime_base=None,
  864. filter=None):
  865. self.id = id
  866. self.prefix = prefix
  867. self.status = status
  868. self.expiration = expiration
  869. self.abort_multipart_upload = abort_multipart_upload
  870. self.storage_transitions = storage_transitions
  871. self.tagging = tagging
  872. self.noncurrent_version_expiration = noncurrent_version_expiration
  873. self.noncurrent_version_sotrage_transitions = noncurrent_version_sotrage_transitions
  874. self.atime_base = atime_base
  875. self.filter = filter
  876. class BucketLifecycle(object):
  877. """Bucket的生命周期配置。
  878. :param rules: 规则列表,
  879. :type rules: list of :class:`LifecycleRule <oss2.models.LifecycleRule>`
  880. """
  881. def __init__(self, rules=None):
  882. self.rules = rules or []
  883. class GetBucketLifecycleResult(RequestResult, BucketLifecycle):
  884. def __init__(self, resp):
  885. RequestResult.__init__(self, resp)
  886. BucketLifecycle.__init__(self)
  887. class CorsRule(object):
  888. """CORS(跨域资源共享)规则。
  889. :param allowed_origins: 允许跨域访问的域。
  890. :type allowed_origins: list of str
  891. :param allowed_methods: 允许跨域访问的HTTP方法,如'GET'等。
  892. :type allowed_methods: list of str
  893. :param allowed_headers: 允许跨域访问的HTTP头部。
  894. :type allowed_headers: list of str
  895. """
  896. def __init__(self,
  897. allowed_origins=None,
  898. allowed_methods=None,
  899. allowed_headers=None,
  900. expose_headers=None,
  901. max_age_seconds=None):
  902. self.allowed_origins = allowed_origins or []
  903. self.allowed_methods = allowed_methods or []
  904. self.allowed_headers = allowed_headers or []
  905. self.expose_headers = expose_headers or []
  906. self.max_age_seconds = max_age_seconds
  907. class BucketCors(object):
  908. def __init__(self, rules=None):
  909. self.rules = rules or []
  910. class GetBucketCorsResult(RequestResult, BucketCors):
  911. def __init__(self, resp):
  912. RequestResult.__init__(self, resp)
  913. BucketCors.__init__(self)
  914. class LiveChannelInfoTarget(object):
  915. """Live channel中的Target节点,包含目标协议的一些参数。
  916. :param type: 协议,目前仅支持HLS。
  917. :type type: str
  918. :param frag_duration: HLS协议下生成的ts文件的期望时长,单位为秒。
  919. :type frag_duration: int
  920. :param frag_count: HLS协议下m3u8文件里ts文件的数量。
  921. :type frag_count: int"""
  922. def __init__(self,
  923. type = 'HLS',
  924. frag_duration = 5,
  925. frag_count = 3,
  926. playlist_name = ''):
  927. self.type = type
  928. self.frag_duration = frag_duration
  929. self.frag_count = frag_count
  930. self.playlist_name = playlist_name
  931. class LiveChannelInfo(object):
  932. """Live channel(直播频道)配置。
  933. :param status: 直播频道的状态,合法的值为"enabled"和"disabled"。
  934. :type status: str
  935. :param description: 直播频道的描述信息,最长为128字节。
  936. :type description: str
  937. :param target: 直播频道的推流目标节点,包含目标协议相关的参数。
  938. :type class:`LiveChannelInfoTarget <oss2.models.LiveChannelInfoTarget>`
  939. :param last_modified: 直播频道的最后修改时间,这个字段仅在`ListLiveChannel`时使用。
  940. :type last_modified: int, 参考 :ref:`unix_time`。
  941. :param name: 直播频道的名称。
  942. :type name: str
  943. :param play_url: 播放地址。
  944. :type play_url: str
  945. :param publish_url: 推流地址。
  946. :type publish_url: str"""
  947. def __init__(self,
  948. status = 'enabled',
  949. description = '',
  950. target = LiveChannelInfoTarget(),
  951. last_modified = None,
  952. name = None,
  953. play_url = None,
  954. publish_url = None):
  955. self.status = status
  956. self.description = description
  957. self.target = target
  958. self.last_modified = last_modified
  959. self.name = name
  960. self.play_url = play_url
  961. self.publish_url = publish_url
  962. class LiveChannelList(object):
  963. """List直播频道的结果。
  964. :param prefix: List直播频道使用的前缀。
  965. :type prefix: str
  966. :param marker: List直播频道使用的marker。
  967. :type marker: str
  968. :param max_keys: List时返回的最多的直播频道的条数。
  969. :type max_keys: int
  970. :param is_truncated: 本次List是否列举完所有的直播频道
  971. :type is_truncated: bool
  972. :param next_marker: 下一次List直播频道使用的marker。
  973. :type marker: str
  974. :param channels: List返回的直播频道列表
  975. :type channels: list,类型为 :class:`LiveChannelInfo`"""
  976. def __init__(self,
  977. prefix = '',
  978. marker = '',
  979. max_keys = 100,
  980. is_truncated = False,
  981. next_marker = ''):
  982. self.prefix = prefix
  983. self.marker = marker
  984. self.max_keys = max_keys
  985. self.is_truncated = is_truncated
  986. self.next_marker = next_marker
  987. self.channels = []
  988. class LiveChannelVideoStat(object):
  989. """LiveStat中的Video节点。
  990. :param width: 视频的宽度。
  991. :type width: int
  992. :param height: 视频的高度。
  993. :type height: int
  994. :param frame_rate: 帧率。
  995. :type frame_rate: int
  996. :param codec: 编码方式。
  997. :type codec: str
  998. :param bandwidth: 码率。
  999. :type bandwidth: int"""
  1000. def __init__(self,
  1001. width = 0,
  1002. height = 0,
  1003. frame_rate = 0,
  1004. codec = '',
  1005. bandwidth = 0):
  1006. self.width = width
  1007. self.height = height
  1008. self.frame_rate = frame_rate
  1009. self.codec = codec
  1010. self.bandwidth = bandwidth
  1011. class LiveChannelAudioStat(object):
  1012. """LiveStat中的Audio节点。
  1013. :param codec: 编码方式。
  1014. :type codec: str
  1015. :param sample_rate: 采样率。
  1016. :type sample_rate: int
  1017. :param bandwidth: 码率。
  1018. :type bandwidth: int"""
  1019. def __init__(self,
  1020. codec = '',
  1021. sample_rate = 0,
  1022. bandwidth = 0):
  1023. self.codec = codec
  1024. self.sample_rate = sample_rate
  1025. self.bandwidth = bandwidth
  1026. class LiveChannelStat(object):
  1027. """LiveStat结果。
  1028. :param status: 直播状态。
  1029. :type codec: str
  1030. :param remote_addr: 客户端的地址。
  1031. :type remote_addr: str
  1032. :param connected_time: 本次推流开始时间。
  1033. :type connected_time: int, unix time
  1034. :param video: 视频描述信息。
  1035. :type video: class:`LiveChannelVideoStat <oss2.models.LiveChannelVideoStat>`
  1036. :param audio: 音频描述信息。
  1037. :type audio: class:`LiveChannelAudioStat <oss2.models.LiveChannelAudioStat>`"""
  1038. def __init__(self,
  1039. status = '',
  1040. remote_addr = '',
  1041. connected_time = '',
  1042. video = None,
  1043. audio = None):
  1044. self.status = status
  1045. self.remote_addr = remote_addr
  1046. self.connected_time = connected_time
  1047. self.video = video
  1048. self.audio = audio
  1049. class LiveRecord(object):
  1050. """直播频道中的推流记录信息
  1051. :param start_time: 本次推流开始时间。
  1052. :type start_time: int,参考 :ref:`unix_time`。
  1053. :param end_time: 本次推流结束时间。
  1054. :type end_time: int, 参考 :ref:`unix_time`。
  1055. :param remote_addr: 推流时客户端的地址。
  1056. :type remote_addr: str"""
  1057. def __init__(self,
  1058. start_time = '',
  1059. end_time = '',
  1060. remote_addr = ''):
  1061. self.start_time = start_time
  1062. self.end_time = end_time
  1063. self.remote_addr = remote_addr
  1064. class LiveChannelHistory(object):
  1065. """直播频道下的推流记录。"""
  1066. def __init__(self):
  1067. self.records = []
  1068. class CreateLiveChannelResult(RequestResult, LiveChannelInfo):
  1069. def __init__(self, resp):
  1070. RequestResult.__init__(self, resp)
  1071. LiveChannelInfo.__init__(self)
  1072. class GetLiveChannelResult(RequestResult, LiveChannelInfo):
  1073. def __init__(self, resp):
  1074. RequestResult.__init__(self, resp)
  1075. LiveChannelInfo.__init__(self)
  1076. class ListLiveChannelResult(RequestResult, LiveChannelList):
  1077. def __init__(self, resp):
  1078. RequestResult.__init__(self, resp)
  1079. LiveChannelList.__init__(self)
  1080. class GetLiveChannelStatResult(RequestResult, LiveChannelStat):
  1081. def __init__(self, resp):
  1082. RequestResult.__init__(self, resp)
  1083. LiveChannelStat.__init__(self)
  1084. class GetLiveChannelHistoryResult(RequestResult, LiveChannelHistory):
  1085. def __init__(self, resp):
  1086. RequestResult.__init__(self, resp)
  1087. LiveChannelHistory.__init__(self)
  1088. class GetVodPlaylistResult(RequestResult):
  1089. def __init__(self, resp):
  1090. RequestResult.__init__(self, resp)
  1091. self.playlist = to_string(resp.read())
  1092. class ProcessObjectResult(RequestResult):
  1093. def __init__(self, resp):
  1094. RequestResult.__init__(self, resp)
  1095. self.bucket = ""
  1096. self.fileSize = 0
  1097. self.object = ""
  1098. self.process_status = ""
  1099. result = json.loads(to_string(resp.read()))
  1100. if 'bucket' in result:
  1101. self.bucket = result['bucket']
  1102. if 'fileSize' in result:
  1103. self.fileSize = result['fileSize']
  1104. if 'object' in result:
  1105. self.object = result['object']
  1106. if 'status' in result:
  1107. self.process_status = result['status']
  1108. _MAX_OBJECT_TAGGING_KEY_LENGTH=128
  1109. _MAX_OBJECT_TAGGING_VALUE_LENGTH=256
  1110. class Tagging(object):
  1111. def __init__(self, tagging_rules=None):
  1112. self.tag_set = tagging_rules or TaggingRule()
  1113. def __str__(self):
  1114. tag_str = ""
  1115. tagging_rule = self.tag_set.tagging_rule
  1116. for key in tagging_rule:
  1117. tag_str += key
  1118. tag_str += "#" + tagging_rule[key] + " "
  1119. return tag_str
  1120. class TaggingRule(object):
  1121. def __init__(self):
  1122. self.tagging_rule = dict()
  1123. def add(self, key, value):
  1124. if key is None or key == '':
  1125. raise ClientError("Tagging key should not be empty")
  1126. if len(key) > _MAX_OBJECT_TAGGING_KEY_LENGTH:
  1127. raise ClientError("Tagging key is too long")
  1128. if len(value) > _MAX_OBJECT_TAGGING_VALUE_LENGTH:
  1129. raise ClientError("Tagging value is too long")
  1130. self.tagging_rule[key] = value
  1131. def delete(self, key):
  1132. del self.tagging_rule[key]
  1133. def len(self):
  1134. return len(self.tagging_rule)
  1135. def to_query_string(self):
  1136. query_string = ''
  1137. for key in self.tagging_rule:
  1138. query_string += urlquote(key)
  1139. query_string += '='
  1140. query_string += urlquote(self.tagging_rule[key])
  1141. query_string += '&'
  1142. if len(query_string) == 0:
  1143. return ''
  1144. else:
  1145. query_string = query_string[:-1]
  1146. return query_string
  1147. class GetTaggingResult(RequestResult, Tagging):
  1148. def __init__(self, resp):
  1149. RequestResult.__init__(self, resp)
  1150. Tagging.__init__(self)
  1151. SERVER_SIDE_ENCRYPTION_AES256 = 'AES256'
  1152. SERVER_SIDE_ENCRYPTION_KMS = 'KMS'
  1153. SERVER_SIDE_ENCRYPTION_SM4 = 'SM4'
  1154. KMS_DATA_ENCRYPTION_SM4 = 'SM4'
  1155. class ServerSideEncryptionRule(object):
  1156. def __init__(self, sse_algorithm=None, kms_master_keyid=None, kms_data_encryption=None):
  1157. self.sse_algorithm = sse_algorithm
  1158. self.kms_master_keyid = kms_master_keyid
  1159. self.kms_data_encryption = kms_data_encryption
  1160. class GetServerSideEncryptionResult(RequestResult, ServerSideEncryptionRule):
  1161. def __init__(self, resp):
  1162. RequestResult.__init__(self, resp)
  1163. ServerSideEncryptionRule.__init__(self)
  1164. class ListObjectVersionsResult(RequestResult):
  1165. def __init__(self, resp):
  1166. super(ListObjectVersionsResult, self).__init__(resp)
  1167. #: True表示还有更多的文件可以罗列;False表示已经列举完毕。
  1168. self.is_truncated = False
  1169. #: 本次使用的分页标记符
  1170. self.key_marker = ''
  1171. #: 下一次罗列的分页标记符,即,可以作为 :func:`list_object_versions <oss2.Bucket.list_object_versions>` 的 `key_marker` 参数。
  1172. self.next_key_marker = ''
  1173. #: 本次使用的versionid分页标记符
  1174. self.versionid_marker = ''
  1175. #: 下一次罗列的versionid分页标记符,即,可以作为 :func:`list_object_versions <oss2.Bucket.list_object_versions>` 的 `versionid_marker` 参数。
  1176. self.next_versionid_marker = ''
  1177. self.name = ''
  1178. self.owner = ''
  1179. self.prefix = ''
  1180. self.max_keys = ''
  1181. self.delimiter = ''
  1182. #: 本次罗列得到的delete marker列表。其中元素的类型为 :class:`DeleteMarkerInfo` 。
  1183. self.delete_marker = []
  1184. #: 本次罗列得到的文件version列表。其中元素的类型为 :class:`ObjectVersionInfo` 。
  1185. self.versions = []
  1186. self.common_prefix = []
  1187. class DeleteMarkerInfo(object):
  1188. def __init__(self):
  1189. self.key = ''
  1190. self.versionid = ''
  1191. self.is_latest = False
  1192. self.last_modified = ''
  1193. self.owner = Owner('', '')
  1194. class ObjectVersionInfo(object):
  1195. def __init__(self):
  1196. self.key = ''
  1197. self.versionid = ''
  1198. self.is_latest = False
  1199. self.last_modified = ''
  1200. self.owner = Owner('', '')
  1201. self.type = ''
  1202. self.storage_class = ''
  1203. self.size = ''
  1204. self.etag = ''
  1205. self.restore_info = ''
  1206. BUCKET_VERSIONING_ENABLE = 'Enabled'
  1207. BUCKET_VERSIONING_SUSPEND = 'Suspended'
  1208. class BucketVersioningConfig(object):
  1209. def __init__(self, status=None):
  1210. self.status = status
  1211. class GetBucketVersioningResult(RequestResult, BucketVersioningConfig):
  1212. def __init__(self, resp):
  1213. RequestResult.__init__(self,resp)
  1214. BucketVersioningConfig.__init__(self)
  1215. class GetBucketPolicyResult(RequestResult):
  1216. def __init__(self, resp):
  1217. RequestResult.__init__(self, resp)
  1218. self.policy = to_string(resp.read())
  1219. class GetBucketRequestPaymentResult(RequestResult):
  1220. def __init__(self, resp):
  1221. RequestResult.__init__(self, resp)
  1222. self.payer = ''
  1223. class BucketQosInfo(object):
  1224. """bucket的Qos信息
  1225. :以下参数如果设置为0则表示完全禁止指定类型的访问,如果为-1则表示不单独限制
  1226. :param total_upload_bw: 总上传带宽, 单位Gbps
  1227. :type total_upload_bw: int
  1228. :param intranet_upload_bw: 内网上传带宽, 单位Gbps
  1229. :type intranet_upload_bw: int
  1230. :param extranet_upload_bw: 外网上传带宽, 单位Gbps
  1231. :type extranet_upload_bw: int
  1232. :param total_download_bw: 总下载带宽, 单位Gbps
  1233. :type total_download_bw: int
  1234. :param intranet_download_bw: 内外下载带宽, 单位Gbps
  1235. :type intranet_download_bw: int
  1236. :param extranet_download_bw: 外网下载带宽, 单位Gbps
  1237. :type extranet_download_bw: int
  1238. :param total_qps: 总qps, 单位请求数/s
  1239. :type total_qps: int
  1240. :param intranet_qps: 内网访问qps, 单位请求数/s
  1241. :type intranet_qps: int
  1242. :param extranet_qps: 外网访问qps, 单位请求数/s
  1243. :type extranet_qps: int
  1244. """
  1245. def __init__(self,
  1246. total_upload_bw = None,
  1247. intranet_upload_bw = None,
  1248. extranet_upload_bw = None,
  1249. total_download_bw = None,
  1250. intranet_download_bw = None,
  1251. extranet_download_bw = None,
  1252. total_qps = None,
  1253. intranet_qps = None,
  1254. extranet_qps = None):
  1255. self.total_upload_bw = total_upload_bw
  1256. self.intranet_upload_bw = intranet_upload_bw
  1257. self.extranet_upload_bw = extranet_upload_bw
  1258. self.total_download_bw = total_download_bw
  1259. self.intranet_download_bw = intranet_download_bw
  1260. self.extranet_download_bw = extranet_download_bw
  1261. self.total_qps = total_qps
  1262. self.intranet_qps = intranet_qps
  1263. self.extranet_qps = extranet_qps
  1264. class UserQosInfo(object):
  1265. """User的Qos信息
  1266. :param region: 查询的qos配置生效的区域
  1267. :type region: str
  1268. :以下参数如果为0则表示完全禁止指定类型的访问,如果为-1表示不单独限制
  1269. :param total_upload_bw: 总上传带宽, 单位Gbps
  1270. :type total_upload_bw: int
  1271. :param intranet_upload_bw: 内网上传带宽, 单位:Gbps
  1272. :type intranet_upload_bw: int
  1273. :param extranet_upload_bw: 外网上传带宽, 单位:Gbps
  1274. :type extranet_upload_bw: int
  1275. :param total_download_bw: 总下载带宽, 单位:Gbps
  1276. :type total_download_bw: int
  1277. :param intranet_download_bw: 内外下载带宽, 单位:Gbps
  1278. :type intranet_download_bw: int
  1279. :param extranet_download_bw: 外网下载带宽, 单位:Gbps
  1280. :type extranet_download_bw: int
  1281. :param total_qps: 总qps限制
  1282. :type total_qps: int
  1283. :param intranet_qps: 内网访问qps
  1284. :type intranet_qps: int
  1285. :param extranet_qps: 外网访问qps
  1286. :type extranet_qps: int
  1287. """
  1288. def __init__(self,
  1289. region=None,
  1290. total_upload_bw = None,
  1291. intranet_upload_bw = None,
  1292. extranet_upload_bw = None,
  1293. total_download_bw = None,
  1294. intranet_download_bw = None,
  1295. extranet_download_bw = None,
  1296. total_qps = None,
  1297. intranet_qps = None,
  1298. extranet_qps = None):
  1299. self.region = region
  1300. self.total_upload_bw = total_upload_bw
  1301. self.intranet_upload_bw = intranet_upload_bw
  1302. self.extranet_upload_bw = extranet_upload_bw
  1303. self.total_download_bw = total_download_bw
  1304. self.intranet_download_bw = intranet_download_bw
  1305. self.extranet_download_bw = extranet_download_bw
  1306. self.total_qps = total_qps
  1307. self.intranet_qps = intranet_qps
  1308. self.extranet_qps = extranet_qps
  1309. class GetUserQosInfoResult(RequestResult, UserQosInfo):
  1310. def __init__(self, resp):
  1311. RequestResult.__init__(self, resp)
  1312. UserQosInfo.__init__(self)
  1313. class GetBucketQosInfoResult(RequestResult, BucketQosInfo):
  1314. def __init__(self, resp):
  1315. RequestResult.__init__(self, resp)
  1316. BucketQosInfo.__init__(self)
  1317. class BucketUserQos(object):
  1318. """用户服务质量。
  1319. :param int storage_capacity: 容量大小,单位GB
  1320. """
  1321. def __init__(self, storage_capacity=None):
  1322. self.storage_capacity = storage_capacity
  1323. class GetBucketUserQosResult(RequestResult, BucketUserQos):
  1324. def __init__(self, resp):
  1325. RequestResult.__init__(self, resp)
  1326. BucketUserQos.__init__(self)
  1327. ASYNC_FETCH_TASK_STATE_RUNNING = 'Running'
  1328. ASYNC_FETCH_TASK_STATE_RETRY = 'Retry'
  1329. ASYNC_FETCH_TASK_STATE_FETCH_SUCCESS_CALLBACK_FAILED = 'FetchSuccessCallbackFailed'
  1330. ASYNC_FETCH_TASK_STATE_FAILED= 'Failed'
  1331. ASYNC_FETCH_TASK_STATE_SUCCESS = 'Success'
  1332. class AsyncFetchTaskConfiguration(object):
  1333. """异步获取文件到bucket到任务配置项
  1334. :param url: 源文件url
  1335. :type url: str
  1336. :param object_name: 文件的名称。
  1337. :type task_state: str
  1338. :param host: 文件所在服务器的host,如果不指定则会根据url解析填充。
  1339. :type host: str
  1340. :param content_md5: 指定校验源文件的md5
  1341. :type content_md5: str
  1342. :param callback: 指定fetch成功知乎回调给用户的引用服务器,如果不指定则不回调。
  1343. callback格式与OSS上传回调的请求头callback一致,详情见官网。
  1344. :type callback: str
  1345. :param ignore_same_key: 默认为True表示如果文件已存在则忽略本次任务,api调用将会报错。如果为False,则会覆盖已存在的object。
  1346. :type ignore_same_key: bool
  1347. """
  1348. def __init__(self,
  1349. url,
  1350. object_name,
  1351. host = None,
  1352. content_md5 = None,
  1353. callback = None,
  1354. ignore_same_key = None):
  1355. self.url = url
  1356. self.object_name = object_name
  1357. self.host = host
  1358. self.content_md5 = content_md5
  1359. self.callback = callback
  1360. self.ignore_same_key = ignore_same_key
  1361. class PutAsyncFetchTaskResult(RequestResult):
  1362. def __init__(self, resp, task_id=None):
  1363. RequestResult.__init__(self, resp)
  1364. self.task_id = task_id
  1365. class GetAsyncFetchTaskResult(RequestResult):
  1366. """获取异步获取文件到bucket的任务的返回结果
  1367. :param task_id: 任务id
  1368. :type task_id: str
  1369. :param task_state: 取值范围:oss2.models.ASYNC_FETCH_TASK_STATE_RUNNING, oss2.models.ASYNC_FETCH_TASK_STATE_RETRY,
  1370. oss2.models.ASYNC_FETCH_TASK_STATE_FETCH_SUCCESS_CALLBACK_FAILED, oss2.models.ASYNC_FETCH_TASK_STATE_FAILED,
  1371. oss2.models.ASYNC_FETCH_TASK_STATE_SUCCESS。
  1372. :type task_state: str
  1373. :param error_msg: 错误信息
  1374. :type error_msg: str
  1375. :param task_config: 任务配置信息
  1376. :type task_config: class:`AsyncFetchTaskConfiguration <oss2.models.AsyncFetchTaskConfiguration>`
  1377. """
  1378. def __init__(self, resp,
  1379. task_id=None,
  1380. task_state=None,
  1381. error_msg=None,
  1382. task_config=None):
  1383. RequestResult.__init__(self, resp)
  1384. self.task_id = task_id
  1385. self.task_state = task_state
  1386. self.error_msg = error_msg
  1387. self.task_config = task_config
  1388. INVENTORY_INCLUDED_OBJECT_VERSIONS_CURRENT = "Current"
  1389. INVENTORY_INCLUDED_OBJECT_VERSIONS_ALL = "All"
  1390. INVENTORY_FREQUENCY_DAILY = "Daily"
  1391. INVENTORY_FREQUENCY_WEEKLY = "Weekly"
  1392. INVENTORY_FORMAT_CSV = "CSV"
  1393. FIELD_SIZE = "Size"
  1394. FIELD_LAST_MODIFIED_DATE = "LastModifiedDate"
  1395. FIELD_STORAG_CLASS = "StorageClass"
  1396. FIELD_ETAG = "ETag"
  1397. FIELD_IS_MULTIPART_UPLOADED = "IsMultipartUploaded"
  1398. FIELD_ENCRYPTION_STATUS = "EncryptionStatus"
  1399. class InventoryConfiguration(object):
  1400. """清单配置
  1401. :param str inventory_id: 清单的识别id
  1402. :type inventory_id: str
  1403. :param is_enabled: 是否生效
  1404. :type is_enabled: bool
  1405. :param include_object_versions: 包含的对象版本,
  1406. 取值可以是 INVENTORY_INCLUDE_OBJECT_VERSIONS_CURRENT 或者 INVENTORY_INCLUDE_OBJECT_VERSIONS_ALL.
  1407. :type include_object_versions: str
  1408. :param inventory_filter: 清单的过滤器
  1409. :type inventory_filter: class:`InventoryFilter <oss2.models.InventoryFilter>`
  1410. :param inventory_destination: 清单的目标地址
  1411. :type inventory_destination: class:`InventoryDestination <oss2.models.InventoryDestination>`
  1412. :param inventory_schedule: 清单的生成周期
  1413. :type inventory_schedule: class:`InventoryDestination <oss2.models.InventorySchedule>`
  1414. :param optional_fields: 清单中包含的字段
  1415. :type optional_fields: str
  1416. """
  1417. def __init__(self,
  1418. inventory_id=None,
  1419. is_enabled=None,
  1420. included_object_versions=None,
  1421. inventory_filter=None,
  1422. inventory_destination=None,
  1423. inventory_schedule=None,
  1424. optional_fields=None):
  1425. self.inventory_id = inventory_id
  1426. self.is_enabled = is_enabled
  1427. self.included_object_versions = included_object_versions
  1428. self.inventory_filter = inventory_filter
  1429. self.inventory_destination = inventory_destination
  1430. self.inventory_schedule = inventory_schedule
  1431. self.optional_fields = optional_fields or []
  1432. class InventoryFilter(object):
  1433. """清单过滤器
  1434. :param prefix: 清单筛选的前缀, 指定前缀后,清单将筛选出符合前缀设置的对象。
  1435. :type prefix: str
  1436. :param prefix: 筛选数据的起始时间戳。
  1437. :type prefix: int
  1438. :param prefix: 筛选数据的终止时间戳。
  1439. :type prefix: int
  1440. :param prefix: 筛选文件大小的最小大小。
  1441. :type prefix: int
  1442. :param prefix: 筛选文件大小的最大大小。
  1443. :type prefix: int
  1444. :param prefix: 筛选存储类型(支持多选),默认选All。
  1445. :type prefix: str
  1446. """
  1447. def __init__(self, prefix=None, last_modify_begin_time_stamp=None, last_modify_end_time_stamp=None, lower_size_bound=None,
  1448. upper_size_bound=None, storage_class=None):
  1449. self.prefix = prefix
  1450. self.last_modify_begin_time_stamp = last_modify_begin_time_stamp
  1451. self.last_modify_end_time_stamp = last_modify_end_time_stamp
  1452. self.lower_size_bound = lower_size_bound
  1453. self.upper_size_bound = upper_size_bound
  1454. self.storage_class = storage_class
  1455. class InventorySchedule(object):
  1456. """清单的生成周期
  1457. :param frequency: 清单的生成周期,可以是oss2.models.INVENTORY_FREQUENCY_DAILY 或者 oss2.models.INVENTORY_FREQUENCY_WEEKLY
  1458. :type frequency: str
  1459. """
  1460. def __init__(self, frequency):
  1461. self.frequency = frequency
  1462. class InventoryDestination(object):
  1463. """清单的接收目的地址
  1464. :param bucket_destination: OSS Bucket作为目的地,需要配置的OSS Bucket信息。
  1465. :type bucket_destination: class:`InventoryBucketDestination <oss2.models.InventoryBucketDestination>`
  1466. """
  1467. def __init__(self, bucket_destination=None):
  1468. self.bucket_destination = bucket_destination
  1469. class InventoryBucketDestination(object):
  1470. """OSS Bucket作为清单目的地的配置
  1471. :param account_id: 接收方的account id
  1472. :type account_id: class:`InventoryBucketDestination <oss2.models.InventoryBucketDestination>`
  1473. :param role_arn: 接收方的ram role arn
  1474. :type role_arn: str
  1475. :param bucket: OSS Bucket名称
  1476. :type bucket: str
  1477. :param inventory_format: 清单格式,可以是 oss2.models.INVENTORY_FORMAT_CSV。
  1478. :type inventory_format: str
  1479. :param prefix: 清单文件的存储路径前缀
  1480. :type prefix: str
  1481. :param sse_kms_encryption: 服务端使用kms作为清单的加密项
  1482. :type sse_kms_encryption: class:`InventoryServerSideEncryptionKMS <oss2.models.InventoryServerSideEncryptionKMS>`
  1483. :param sse_oss_encryption: OSS服务端为清单提供加密支持。
  1484. :type sse_oss_encryption: class:`InventoryServerSideEncryptionOSS <oss2.models.InventoryServerSideEncryptionOSS>`
  1485. """
  1486. def __init__(self,
  1487. account_id=None,
  1488. role_arn=None,
  1489. bucket=None,
  1490. inventory_format=None,
  1491. prefix=None,
  1492. sse_kms_encryption=None,
  1493. sse_oss_encryption=None):
  1494. if all((sse_kms_encryption, sse_oss_encryption)):
  1495. raise ClientError('only one encryption method between sse_kms_encryption and sse_oss_encryption can be chosen.')
  1496. self.account_id = account_id
  1497. self.role_arn = role_arn
  1498. self.bucket = bucket
  1499. self.inventory_format = inventory_format
  1500. self.prefix = prefix
  1501. self.sse_kms_encryption = sse_kms_encryption
  1502. self.sse_oss_encryption = sse_oss_encryption
  1503. class InventoryServerSideEncryptionKMS(object):
  1504. """服务端使用kms加密清单的加密项。
  1505. :param key_id: kms key id
  1506. :type key_id: str
  1507. """
  1508. def __init__(self, key_id):
  1509. self.key_id = key_id
  1510. class InventoryServerSideEncryptionOSS(object):
  1511. """OSS服务端加密清单的加密项。
  1512. """
  1513. pass
  1514. class GetInventoryConfigurationResult(RequestResult, InventoryConfiguration):
  1515. """获取清单配置的操作返回结果
  1516. """
  1517. def __init__(self, resp):
  1518. RequestResult.__init__(self, resp)
  1519. InventoryConfiguration.__init__(self)
  1520. class ListInventoryConfigurationsResult(RequestResult):
  1521. """列出清单配置的操作返回结果
  1522. :param inventory_configurations: list of class:`InventoryConfiguration <oss2.models.InventoryConfiguration>`
  1523. :type inventory_configurations: list
  1524. :param is_truncated: 罗列结果是否是截断的, true: 本地罗列结果并不完整, False: 所有清单配置项已经罗列完毕。
  1525. :type is_truncated: bool
  1526. :param continuaiton_token: 本地罗列操作所携带的continuaiton_token
  1527. :type continuaiton_token: str
  1528. :param next_continuation_token: 下一个罗列操作携带的token
  1529. :type next_continuation_token: str
  1530. """
  1531. def __init__(self, resp):
  1532. RequestResult.__init__(self, resp)
  1533. self.inventory_configurations= []
  1534. self.is_truncated = None
  1535. self.continuaiton_token = None
  1536. self.next_continuation_token = None
  1537. RESTORE_TIER_EXPEDITED = 'Expedited'
  1538. RESTORE_TIER_STANDARD = 'Standard'
  1539. RESTORE_TIER_BULK = 'Bulk'
  1540. class ResotreJobParameters(object):
  1541. """冷归档类型(ColdArchive)文件的解冻优先级配置。
  1542. 请使用class:`RestoreJobParameters <oss2.models.RestoreJobParameters>`代替此类。
  1543. :param tier: 解冻优先级, 取值范围:
  1544. oss2.models.RESTORE_TIER_EXPEDITED: 1个小时之内解冻完成。
  1545. oss2.models.RESTORE_TIER_STANDARD: 5小时之内解冻完成。
  1546. oss2.models.RESTORE_TIER_BULK: 10小时之内解冻完成。
  1547. :type tier: str
  1548. """
  1549. def __init__(self, tier):
  1550. self.tier = tier
  1551. class RestoreJobParameters(object):
  1552. """冷归档类型(ColdArchive)文件的解冻优先级配置。
  1553. :param tier: 解冻优先级, 取值范围:
  1554. oss2.models.RESTORE_TIER_EXPEDITED: 1个小时之内解冻完成。
  1555. oss2.models.RESTORE_TIER_STANDARD: 5小时之内解冻完成。
  1556. oss2.models.RESTORE_TIER_BULK: 10小时之内解冻完成。
  1557. :type tier: str
  1558. """
  1559. def __init__(self, tier):
  1560. self.tier = tier
  1561. class RestoreConfiguration(object):
  1562. """Archive, ColdArchive类型文件的解冻配置
  1563. :param days: 解冻之后保持解冻状态的天数。
  1564. :type days: int
  1565. :param job_parameters: 解冻优先级配置, 解冻冷归档(ColdArchive)类型的文件才需要此配置。如果不配置此项,
  1566. 解冻优先级默认为 oss2.models.RESTORE_TIER_STANDARD: 5小时之内解冻完成。
  1567. :type job_parameters: class:`RestoreJobParameters <oss2.models.RestoreJobParameters>`
  1568. """
  1569. def __init__(self, days, job_parameters=None):
  1570. self.days = days
  1571. self.job_parameters = job_parameters
  1572. class InitBucketWormResult(RequestResult):
  1573. """创建合规保留策略的返回结果
  1574. :param str worm_id: 合规保留策略的id
  1575. """
  1576. def __init__(self, resp):
  1577. super(InitBucketWormResult, self).__init__(resp)
  1578. self.worm_id = None
  1579. class GetBucketWormResult(RequestResult):
  1580. """获取合规保留策略的返回结果
  1581. :param str worm_id: 合规保留策略的id
  1582. """
  1583. def __init__(self, resp):
  1584. super(GetBucketWormResult, self).__init__(resp)
  1585. # 合规保留策略的id
  1586. self.worm_id = None
  1587. # 合规保留策略的状态
  1588. self.worm_state = None
  1589. # object的保留天数
  1590. self.retention_period_days = None
  1591. # 合规保留策略的创建日期
  1592. self.creation_date = None
  1593. class ReplicationRule(object):
  1594. """创建Bucket指定跨区域复制规则
  1595. :param str rule_id: 规则ID。
  1596. :param str target_bucket_name: 目的地Bucket名称。
  1597. :param str target_bucket_location: 目的地Bucket所处地域。
  1598. :param str target_transfer_type: 跨区域复制时使用的数据链路。
  1599. :param list prefix_list: 待复制Object的前缀,只有匹配该前缀的Object才会被复制。
  1600. :param list action_list: 新写入的数据与历史数据需要遵循的Action类型, 其中"ALL" 表示"PUT", "ABORT"与"DELETE"操作。
  1601. 均会被同步到Bucket,"PUT"表示同步到目标Bucket的写入操作。
  1602. :param bool is_enable_historical_object_replication: 指定是否复制历史数据。
  1603. :param str sync_role_name: 授权OSS使用哪个角色来进行数据复制。如果指定使用SSE-KMS加密目标对象,则必须指定sync_role。
  1604. :param str replica_kms_keyid: 指定SSE-KMS密钥ID。
  1605. :param str sse_kms_encrypted_objects_status: 指定OSS是否复制通过SSE-KMS加密创建的对象。
  1606. 取值范围[ReplicationRule.ENABLED, ReplicationRule.DISABLED]。
  1607. :param str status: 复制状态,由服务端赋值,可能为:starting, doing 或closing。
  1608. """
  1609. ENABLED = 'Enabled'
  1610. DISABLED = 'Disabled'
  1611. ALL = 'ALL'
  1612. PUT = 'PUT'
  1613. DELETE = 'DELETE'
  1614. ABORT = 'ABORT'
  1615. STARTING = 'starting'
  1616. DOING = 'doing'
  1617. CLOSING = 'closing'
  1618. def __init__(self,
  1619. rule_id=None,
  1620. target_bucket_name=None,
  1621. target_bucket_location=None,
  1622. target_transfer_type=None,
  1623. prefix_list=None,
  1624. action_list=None,
  1625. is_enable_historical_object_replication=None,
  1626. sync_role_name=None,
  1627. replica_kms_keyid=None,
  1628. sse_kms_encrypted_objects_status=None,
  1629. status=None):
  1630. self.rule_id = rule_id
  1631. self.target_bucket_name = target_bucket_name
  1632. self.target_bucket_location = target_bucket_location
  1633. self.target_transfer_type = target_transfer_type
  1634. self.prefix_list = prefix_list or []
  1635. self.action_list = action_list or []
  1636. if is_enable_historical_object_replication is not None and not isinstance(is_enable_historical_object_replication, bool):
  1637. raise ClientError('is_enable_historical_object_replication should be instance of bool.')
  1638. self.is_enable_historical_object_replication = is_enable_historical_object_replication
  1639. self.sync_role_name = sync_role_name
  1640. self.replica_kms_keyid = replica_kms_keyid
  1641. if sse_kms_encrypted_objects_status is not None and sse_kms_encrypted_objects_status not in [self.ENABLED, self.DISABLED]:
  1642. raise ClientError('sse_kms_encrypted_objects_status should be "Enabled" or "Disabled".')
  1643. self.sse_kms_encrypted_objects_status = sse_kms_encrypted_objects_status
  1644. self.status = status
  1645. class BucketReplicationProgress(object):
  1646. """Bucket跨区域复制进度
  1647. :param str rule_id: 规则ID。
  1648. :param str target_bucket_name: 目的地Bucket名称。
  1649. :param str target_bucket_location: 目的地Bucket所处地域。
  1650. :param str target_transfer_type: 跨区域复制时使用的数据链路。
  1651. :param list prefix_list: 待复制Object的前缀,只有匹配该前缀的Object才会被复制。
  1652. :param list action_list: 新写入的数据与历史数据需要遵循的Action类型, 其中"ALL" 表示"PUT", "ABORT"与"DELETE"操作。
  1653. 均会被同步到Bucket,"PUT"表示同步到目标Bucket的写入操作。
  1654. :param bool is_enable_historical_object_replication: 指定是否复制历史数据。
  1655. :param str status: 复制状态,可能为starting, doing 或closing。
  1656. :param float historical_object_progress: 已复制历史数据的百分比。
  1657. :param str new_object_progress: 数据复制到目标Bucket的时间点。
  1658. 例如Thu, 24 Sep 2015 15:39:18 GMT,表示早于这个时间点写入的数据都已复制到目标Bucket。
  1659. """
  1660. def __init__(self,
  1661. rule_id=None,
  1662. target_bucket_name=None,
  1663. target_bucket_location=None,
  1664. target_transfer_type=None,
  1665. prefix_list=None,
  1666. action_list=None,
  1667. is_enable_historical_object_replication=None,
  1668. status=None,
  1669. historical_object_progress=None,
  1670. new_object_progress=None):
  1671. self.rule_id = rule_id
  1672. self.target_bucket_name = target_bucket_name
  1673. self.target_bucket_location = target_bucket_location
  1674. self.target_transfer_type = target_transfer_type
  1675. self.prefix_list = prefix_list or []
  1676. self.action_list = action_list or []
  1677. self.is_enable_historical_object_replication = is_enable_historical_object_replication
  1678. self.status = status
  1679. self.historical_object_progress = historical_object_progress or 0
  1680. self.new_object_progress = new_object_progress
  1681. class LocationTransferType(object):
  1682. """包含TransferType到Location信息
  1683. :param str location: 可复制到的目标Bucket所在的地域。
  1684. :param str transfer_type: 跨区域复制时使用的数据传输类型。
  1685. """
  1686. def __init__(self):
  1687. self.location = None
  1688. self.transfer_type = None
  1689. class GetBucketReplicationResult(RequestResult):
  1690. """获取Bucket跨区域复制规则的结果
  1691. :param rule_list: Bucket跨区域复制到规则集合,目前只允许配置一条规则,所以返回list大小最多为1。
  1692. :type rule_list: list, 元素类型为class:`ReplicationRule <oss2.models.ReplicationRule>`。
  1693. """
  1694. def __init__(self, resp):
  1695. super(GetBucketReplicationResult, self).__init__(resp)
  1696. self.rule_list = []
  1697. class GetBucketReplicationLocationResult(RequestResult):
  1698. """获取可复制到的目标存储空间(Bucket)所在的地域信息
  1699. :param location_list: 可复制到的目标Bucket所在的地域集合
  1700. :type location_list: list, 元素类型为str, 比如'oss-cn-beijing'
  1701. :param location_transfer_type_list: 包含TransferType到Location信息列表。
  1702. :type location_transfer_type_list: list, 元素类型为:class:`LocationTransferType <oss2.models.LocationTransferType>`。
  1703. """
  1704. def __init__(self, resp):
  1705. super(GetBucketReplicationLocationResult, self).__init__(resp)
  1706. self.location_list = []
  1707. self.location_transfer_type_list = []
  1708. class GetBucketReplicationProgressResult(RequestResult):
  1709. """获取某个存储空间(Bucket)的跨区域复制进度结果。
  1710. :param progress: Bucket跨区域复制进度
  1711. :type progress: class:`BucketReplicationProgress <oss2.models.BucketReplicationProgress>`。
  1712. """
  1713. def __init__(self, resp):
  1714. super(GetBucketReplicationProgressResult, self).__init__(resp)
  1715. self.progress = None
  1716. class GetBucketTransferAccelerationResult(RequestResult):
  1717. """获取目标存储空间(Bucket)的传输加速配置。
  1718. :param enabled: Bucket传输加速状态
  1719. :type progress: class:`GetBucketTransferAccelerationResult <oss2.models.GetBucketTransferAccelerationResult>`。
  1720. """
  1721. def __init__(self, resp):
  1722. super(GetBucketTransferAccelerationResult, self).__init__(resp)
  1723. self.enabled = None
  1724. class CreateBucketCnameTokenResult(RequestResult):
  1725. """创建域名所有权验证所需的CnameToken。
  1726. :param str bucket: 绑定Cname的Bucket名称。
  1727. :param str cname: 绑定的Cname名称。
  1728. :param str token: OSS返回的CnameToken。
  1729. :param str expire_time: CnameToken的有效时间。
  1730. """
  1731. def __init__(self, resp):
  1732. super(CreateBucketCnameTokenResult, self).__init__(resp)
  1733. self.bucket = None
  1734. self.cname = None
  1735. self.token = None
  1736. self.expire_time = None
  1737. class GetBucketCnameTokenResult(RequestResult):
  1738. """获取已创建的CnameToken。
  1739. :param str bucket: 绑定Cname的Bucket名称。
  1740. :param str cname: 绑定的Cname名称。
  1741. :param str token: OSS返回的CnameToken。
  1742. :param str expire_time: CnameToken的有效时间。
  1743. """
  1744. def __init__(self, resp):
  1745. super(GetBucketCnameTokenResult, self).__init__(resp)
  1746. self.bucket = None
  1747. self.cname = None
  1748. self.token = None
  1749. self.expire_time = None
  1750. class ListBucketCnameResult(RequestResult):
  1751. """查询某个存储空间(Bucket)下绑定的所有Cname列表。
  1752. :param str bucket: 已绑定Cname列表的Bucket名称。
  1753. :param str owner: Bucket Owner名称。
  1754. :param str cname: Cname信息列表的容器。元素类型为:class:`CnameInfo <oss2.models.CnameInfo>`。
  1755. """
  1756. def __init__(self, resp):
  1757. super(ListBucketCnameResult, self).__init__(resp)
  1758. self.bucket = None
  1759. self.owner = None
  1760. self.cname = []
  1761. class CnameInfo(RequestResult):
  1762. """Cname信息列表。
  1763. :param str domain: 自定义域名。
  1764. :param str last_modified: 绑定自定义域名的时间
  1765. :param str status: 域名所处状态。
  1766. :param class certificate: 证书信息的容器。元素类型为:class:`CertificateInfo <oss2.models.CertificateInfo>`。
  1767. """
  1768. def __init__(self):
  1769. self.domain = None
  1770. self.last_modified = None
  1771. self.status = None
  1772. self.is_purge_cdn_cache = None
  1773. self.certificate = None
  1774. class CertificateInfo(object):
  1775. """证书信息。
  1776. :param str type: 证书来源。
  1777. :param str cert_id: 证书ID。
  1778. :param str status: 证书状态。
  1779. :param str creation_date: 证书绑定时间。
  1780. :param str fingerprint: 证书签名。
  1781. :param str valid_start_date: 证书有效期起始时间。
  1782. :param str valid_end_date: 证书有效期终止时间。
  1783. """
  1784. def __init__(self):
  1785. self.type = None
  1786. self.cert_id = None
  1787. self.status = None
  1788. self.creation_date = None
  1789. self.fingerprint = None
  1790. self.valid_start_date = None
  1791. self.valid_end_date = None
  1792. class PutBucketCnameRequest(object):
  1793. """绑定证书请求。
  1794. :param str domain: 自定义域名。
  1795. :param class cert: 证书。元素类型为:class:`CertInfo <oss2.models.CertInfo>`。
  1796. """
  1797. def __init__(self, domain, cert=None):
  1798. self.domain = domain
  1799. self.cert = cert
  1800. class CertInfo(RequestResult):
  1801. """绑定证书信息请求参数。
  1802. :param str cert_id: 证书ID。
  1803. :param str certificate: 证书公钥。
  1804. :param str private_key: 证书私钥。
  1805. :param str previous_cert_id: 当前证书ID。
  1806. :param bool force: 是否强制覆盖证书
  1807. :param bool delete_certificate: 是否删除证书。
  1808. """
  1809. def __init__(self, cert_id=None, certificate=None, private_key=None, previous_cert_id=None, force=None,
  1810. delete_certificate=None):
  1811. self.cert_id = cert_id
  1812. self.certificate = certificate
  1813. self.private_key = private_key
  1814. self.previous_cert_id = previous_cert_id
  1815. self.force = force
  1816. self.delete_certificate = delete_certificate
  1817. class MetaQuery(object):
  1818. """元数据索引库信息查询信息设置
  1819. :param str next_token: 当Object总数大于设置的MaxResults时,用于翻页的token。
  1820. :param str max_results: 返回Object的最大个数,取值范围为0~200。不设置此参数或者设置为0时,则默认值为100。
  1821. :param str query: 查询条件。
  1822. :param str sort: 对指定字段排序。
  1823. :param str order: 排序方式。asc(默认):升序; desc:降序。
  1824. :param list aggregations: 聚合操作信息的容器。元素类型为:class:`AggregationsRequest <oss2.models.AggregationsRequest>`。
  1825. """
  1826. def __init__(self,
  1827. next_token=None,
  1828. max_results=None,
  1829. query=None,
  1830. sort=None,
  1831. order=None,
  1832. aggregations=None):
  1833. self.next_token = next_token
  1834. self.max_results = str(max_results)
  1835. self.query = query
  1836. self.sort = sort
  1837. self.order = order
  1838. self.aggregations = aggregations or []
  1839. class AggregationsRequest(object):
  1840. """聚合操作信息的容器。
  1841. :param str field: 字段名称。
  1842. :param str operation: 聚合操作中的操作符。
  1843. """
  1844. def __init__(self,
  1845. field=None,
  1846. operation=None):
  1847. self.field = field
  1848. self.operation = operation
  1849. class GetBucketMetaQueryResult(RequestResult):
  1850. """获取指定存储空间(Bucket)的元数据索引库信息。
  1851. :param str state: 元数据索引库的状态。
  1852. :param str phase: 当前扫描类型。
  1853. :param str create_time: 元数据索引库的创建时间,遵循RFC 3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE。
  1854. :param str update_time: 元数据索引库的更新时间,遵循RFC 3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE。
  1855. """
  1856. def __init__(self, resp):
  1857. super(GetBucketMetaQueryResult, self).__init__(resp)
  1858. self.state = None
  1859. self.phase = None
  1860. self.create_time = None
  1861. self.update_time = None
  1862. class DoBucketMetaQueryResult(RequestResult):
  1863. """查询满足指定条件的文件(Object),并按照指定字段和排序方式列出文件信息。
  1864. :param str next_token: Object完整路径。
  1865. :param list files: Object信息的容器。元素类型为:class:`MetaQueryFile <oss2.models.MetaQueryFile>`。
  1866. :param list aggregations: 聚合操作信息的容器。元素类型为:class:`AggregationsInfo <oss2.models.AggregationsInfo>`。
  1867. """
  1868. def __init__(self, resp):
  1869. super(DoBucketMetaQueryResult, self).__init__(resp)
  1870. self.next_token = None
  1871. self.files = []
  1872. self.aggregations = []
  1873. class MetaQueryFile(object):
  1874. """Object信息的容器。
  1875. :param str file_name: Object完整路径。
  1876. :param int size: Object大小。单位为字节。
  1877. :param str file_modified_time: Object的最近一次修改时间,遵循RFC 3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.ms+TIMEZONE。
  1878. :param str file_create_time: Object的创建时间,遵循RFC 3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.ms+TIMEZONE。
  1879. :param str file_access_time: Object的智能分层时间,遵循RFC 3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.ms+TIMEZONE。
  1880. :param str oss_object_type: Object的类型。
  1881. :param str oss_storage_class: Object的存储类型。
  1882. :param str object_acl: Object的访问权限。
  1883. :param str etag: Object生成时会创建相应的ETag ,ETag用于标识一个Object的内容。
  1884. :param str oss_crc64: Object的64位CRC值。该64位CRC根据ECMA-182标准计算得出。
  1885. :param int oss_tagging_count: Object的标签个数。
  1886. :param list oss_tagging: 标签信息的容器。元素类型为:class:`OSSTaggingInfo <oss2.models.OSSTaggingInfo>`。
  1887. :param list oss_user_meta: 用户自定义元数据的容器。元素类型为:class:`OSSUserMetaInfo <oss2.models.OSSUserMetaInfo>`。
  1888. """
  1889. def __init__(self):
  1890. self.file_name = None
  1891. self.size = None
  1892. self.file_modified_time = None
  1893. self.file_create_time = None
  1894. self.file_access_time = None
  1895. self.oss_object_type = None
  1896. self.oss_storage_class = None
  1897. self.object_acl = None
  1898. self.etag = None
  1899. self.oss_crc64 = None
  1900. self.oss_tagging_count = None
  1901. self.oss_tagging = []
  1902. self.oss_user_meta = []
  1903. class AggregationsInfo(object):
  1904. """聚合操作信息的容器。
  1905. :param str field: 字段名称。
  1906. :param str operation: 聚合操作中的操作符。
  1907. :param float value: 聚合操作的结果值。
  1908. :param list groups: 分组聚合的结果列表。元素类型为:class:`AggregationGroupInfo <oss2.models.AggregationGroupInfo>`。
  1909. """
  1910. def __init__(self):
  1911. self.field = None
  1912. self.operation = None
  1913. self.value = None
  1914. self.groups = []
  1915. class OSSTaggingInfo(object):
  1916. """标签信息的容器。
  1917. :param key: 标签或者用户自定义元数据的Key。
  1918. :type key: str
  1919. :param value: 标签或者用户自定义元数据的Value。
  1920. :type value: str
  1921. """
  1922. def __init__(self, key, value):
  1923. self.key = key
  1924. self.value = value
  1925. class OSSUserMetaInfo(object):
  1926. """用户自定义元数据的容器。
  1927. :param key: 用户自定义元数据的 key。
  1928. :type key: str
  1929. :param value: 用户自定义元数据的 value。
  1930. :type value: str
  1931. """
  1932. def __init__(self, key, value):
  1933. self.key = key
  1934. self.value = value
  1935. class AggregationGroupInfo(object):
  1936. """分组聚合的结果列表。
  1937. :param value: 分组聚合的值。
  1938. :type value: str
  1939. :param count: 分组聚合的总个数。
  1940. :type count: int
  1941. """
  1942. def __init__(self, value, count):
  1943. self.value = value
  1944. self.count = count
  1945. class GetBucketAccessMonitorResult(RequestResult):
  1946. """获取目标存储空间(Bucket)的访问跟踪状态。
  1947. :param class access_monitor: Bucket访问跟踪状态容器. 元素类型为:class:`AccessMonitorInfo <oss2.models.AccessMonitorInfo>`。
  1948. """
  1949. def __init__(self, resp):
  1950. super(GetBucketAccessMonitorResult, self).__init__(resp)
  1951. self.access_monitor = None
  1952. class AccessMonitorInfo(object):
  1953. """获取目标存储空间(Bucket)的访问跟踪状态。
  1954. :param str status: Bucket访问跟踪状态.
  1955. """
  1956. def __init__(self, status):
  1957. self.status = status
  1958. class LifecycleFilter(object):
  1959. """规则的条件参数容器。
  1960. :param list filter_not: 规则的匹配容器。 元素类型为:class:`FilterNot <oss2.models.FilterNot>`。
  1961. """
  1962. def __init__(self, filter_not=None):
  1963. self.filter_not = filter_not or []
  1964. class FilterNot(object):
  1965. """规则的匹配容器。
  1966. :param str prefix: 排除规则所适用的前缀。
  1967. :param class tag: 排除规则所适用的对象标签。元素类型为:class:`FilterNotTag <oss2.models.FilterNotTag>`。
  1968. """
  1969. def __init__(self, prefix=None, tag=None):
  1970. self.prefix = prefix
  1971. self.tag = tag
  1972. class FilterNotTag(object):
  1973. """对象标签。
  1974. :param str key: 标签key。
  1975. :param str value: 标签value。
  1976. """
  1977. def __init__(self, key=None, value=None):
  1978. self.key = key
  1979. self.value = value
  1980. class GetBucketResourceGroupResult(RequestResult):
  1981. """显示资源组ID的容器。
  1982. :param resource_group_id: Bucket所属的资源组ID
  1983. :type progress: class:`GetBucketResourceGroupResult <oss2.models.GetBucketResourceGroupResult>`。
  1984. """
  1985. def __init__(self, resp):
  1986. super(GetBucketResourceGroupResult, self).__init__(resp)
  1987. self.resource_group_id = None
  1988. class GetBucketStyleResult(RequestResult):
  1989. """获取图片样式内容的容器。
  1990. :param name: 图片样式名称。
  1991. :param content: 图片样式内容。
  1992. :param create_time: 图片样式创建时间。
  1993. :param last_modify_time: 图片样式修改时间。
  1994. :type progress: class:`GetBucketStyleResult <oss2.models.GetBucketStyleResult>`。
  1995. """
  1996. def __init__(self, resp):
  1997. super(GetBucketStyleResult, self).__init__(resp)
  1998. self.name = None
  1999. self.content = None
  2000. self.create_time = None
  2001. self.last_modify_time = None
  2002. class BucketStyleInfo(RequestResult):
  2003. """图片样式内容的容器。
  2004. :param name: 图片样式名称。
  2005. :param content: 图片样式内容。
  2006. :param create_time: 图片样式创建时间。
  2007. :param last_modify_time: 图片样式修改时间。
  2008. :type progress: class:`BucketStyleInfo <oss2.models.BucketStyleInfo>`。
  2009. """
  2010. def __init__(self, name=None, content=None, create_time=None, last_modify_time=None):
  2011. self.name = name
  2012. self.content = content
  2013. self.create_time = create_time
  2014. self.last_modify_time = last_modify_time
  2015. class ListBucketStyleResult(RequestResult):
  2016. """查询图片样式信息列表的容器。
  2017. :param str styles: 图片样式内容的容器。元素类型为:class:`BucketStyleInfo <oss2.models.BucketStyleInfo>`。
  2018. """
  2019. def __init__(self, resp):
  2020. super(ListBucketStyleResult, self).__init__(resp)
  2021. self.styles = []
  2022. class RegionInfo(RequestResult):
  2023. """地域信息。
  2024. :param region: 地域ID。
  2025. :param internet_endpoint: 地域对应的外网Endpoint。
  2026. :param internal_endpoint: 地域对应的内网Endpoint。
  2027. :param accelerate_endpoint: 地域对应的传输加速Endpoint。取值固定为oss-accelerate.aliyuncs.com。
  2028. """
  2029. def __init__(self, region=None, internet_endpoint=None, internal_endpoint=None, accelerate_endpoint=None):
  2030. self.region = region
  2031. self.internet_endpoint = internet_endpoint
  2032. self.internal_endpoint = internal_endpoint
  2033. self.accelerate_endpoint = accelerate_endpoint
  2034. class DescribeRegionsResult(RequestResult):
  2035. """地域信息列表。
  2036. :param list regions: 地域信息列表。元素类型为:class:`RegionInfo <oss2.models.RegionInfo>`。
  2037. """
  2038. def __init__(self, resp):
  2039. super(DescribeRegionsResult, self).__init__(resp)
  2040. self.regions = []
  2041. class AsyncProcessObject(RequestResult):
  2042. """异步多媒体处理返回信息。
  2043. :param str event_id: 事件id。
  2044. :param str async_request_id: 请求id。
  2045. :param str task_id: 任务id。
  2046. """
  2047. def __init__(self, resp):
  2048. super(AsyncProcessObject, self).__init__(resp)
  2049. self.event_id = None
  2050. self.async_request_id = None
  2051. self.task_id = None
  2052. class CallbackPolicyInfo(RequestResult):
  2053. """回调policy信息。
  2054. :param policy_name: policy名称。
  2055. :param callback: 回调参数。
  2056. :param callback_var: 自定义回调参数。
  2057. """
  2058. def __init__(self, policy_name=None, callback=None, callback_var=None):
  2059. self.policy_name = policy_name
  2060. self.callback = callback
  2061. self.callback_var = callback_var
  2062. class CallbackPolicy(object):
  2063. """设置回调policy请求。
  2064. :param list callback_policies: 回调策略集合。 元素类型为:class:`<oss2.models.CallbackPolicyInfo>`。
  2065. """
  2066. def __init__(self, callback_policies=None):
  2067. self.callback_policies = callback_policies or []
  2068. class CallbackPolicyResult(RequestResult):
  2069. """返回回调policy。
  2070. :param list callback_policies: 回调策略集合。元素类型为:class:`<oss2.models.CallbackPolicyInfo>`。
  2071. """
  2072. def __init__(self, resp):
  2073. super(CallbackPolicyResult, self).__init__(resp)
  2074. self.callback_policies = []