models.py 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034
  1. # -*- coding: utf-8 -*-
  2. """
  3. oss2.models
  4. ~~~~~~~~~~
  5. 该模块包含Python SDK API接口所需要的输入参数以及返回值类型。
  6. """
  7. from . import utils
  8. from .utils import http_to_unixtime, make_progress_adapter, make_crc_adapter, b64encode_as_string, b64decode_from_string
  9. from .exceptions import ClientError, InconsistentError
  10. from .compat import urlunquote, to_string, urlquote
  11. from .select_response import SelectResponseAdapter
  12. from .headers import *
  13. import json
  14. import logging
  15. import copy
  16. import struct
  17. from requests.structures import CaseInsensitiveDict
  18. logger = logging.getLogger(__name__)
  19. class PartInfo(object):
  20. """表示分片信息的文件。
  21. 该文件既用于 :func:`list_parts <oss2.Bucket.list_parts>` 的输出,也用于 :func:`complete_multipart_upload
  22. <oss2.Bucket.complete_multipart_upload>` 的输入。
  23. :param int part_number: 分片号
  24. :param str etag: 分片的ETag
  25. :param int size: 分片的大小。用在 `list_parts` 的结果里,也用与分片对象做crc combine得到整个对象crc64值
  26. :param int last_modified: 该分片最后修改的时间戳,类型为int。参考 :ref:`unix_time`
  27. :param int part_crc: 该分片的crc64值
  28. """
  29. def __init__(self, part_number, etag, size=None, last_modified=None, part_crc=None):
  30. self.part_number = part_number
  31. self.etag = etag
  32. self.size = size
  33. self.last_modified = last_modified
  34. self.part_crc = part_crc
  35. class ContentCryptoMaterial(object):
  36. def __init__(self, cipher, wrap_alg, encrypted_key=None, encrypted_iv=None, mat_desc=None):
  37. self.cipher = cipher
  38. self.cek_alg = cipher.alg
  39. self.wrap_alg = wrap_alg
  40. self.encrypted_key = encrypted_key
  41. self.encrypted_iv = encrypted_iv
  42. self.mat_desc = mat_desc
  43. self.deprecated = False
  44. def to_object_meta(self, headers=None, multipart_upload_context=None):
  45. if not isinstance(headers, CaseInsensitiveDict):
  46. headers = CaseInsensitiveDict(headers)
  47. if 'content-md5' in headers:
  48. headers[OSS_CLIENT_SIDE_ENCRYPTION_UNENCRYPTED_CONTENT_MD5] = headers['content-md5']
  49. del headers['content-md5']
  50. if 'content-length' in headers:
  51. headers[OSS_CLIENT_SIDE_ENCRYPTION_UNENCRYPTED_CONTENT_LENGTH] = headers['content-length']
  52. del headers['content-length']
  53. headers[OSS_CLIENT_SIDE_ENCRYPTION_KEY] = b64encode_as_string(self.encrypted_key)
  54. headers[OSS_CLIENT_SIDE_ENCRYPTION_START] = b64encode_as_string(self.encrypted_iv)
  55. headers[OSS_CLIENT_SIDE_ENCRYPTION_CEK_ALG] = self.cek_alg
  56. headers[OSS_CLIENT_SIDE_ENCRYPTION_WRAP_ALG] = self.wrap_alg
  57. if multipart_upload_context and multipart_upload_context.data_size and multipart_upload_context.part_size:
  58. headers[OSS_CLIENT_SIDE_ENCRYPTION_DATA_SIZE] = str(multipart_upload_context.data_size)
  59. headers[OSS_CLIENT_SIDE_ENCRYPTION_PART_SIZE] = str(multipart_upload_context.part_size)
  60. if self.mat_desc:
  61. headers[OSS_CLIENT_SIDE_ENCRYTPION_MATDESC] = json.dumps(self.mat_desc)
  62. return headers
  63. def from_object_meta(self, headers):
  64. if not isinstance(headers, CaseInsensitiveDict):
  65. headers = CaseInsensitiveDict(headers)
  66. if DEPRECATED_CLIENT_SIDE_ENCRYPTION_KEY in headers:
  67. self.deprecated = True
  68. if self.deprecated:
  69. undecode_encrypted_key = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYPTION_KEY)
  70. undecode_encrypted_iv = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYPTION_START)
  71. cek_alg = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYPTION_CEK_ALG)
  72. wrap_alg = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYPTION_WRAP_ALG)
  73. mat_desc = _hget(headers, DEPRECATED_CLIENT_SIDE_ENCRYTPION_MATDESC)
  74. if wrap_alg == "kms":
  75. self.encrypted_key = undecode_encrypted_key
  76. self.encrypted_iv = undecode_encrypted_iv
  77. wrap_alg = KMS_ALI_WRAP_ALGORITHM
  78. else:
  79. if undecode_encrypted_key:
  80. self.encrypted_key = b64decode_from_string(undecode_encrypted_key)
  81. if undecode_encrypted_iv:
  82. self.encrypted_iv = b64decode_from_string(undecode_encrypted_iv)
  83. wrap_alg = RSA_NONE_OAEPWithSHA1AndMGF1Padding
  84. if cek_alg == utils.AES_GCM:
  85. cek_alg = utils.AES_CTR
  86. else:
  87. undecode_encrypted_key = _hget(headers, OSS_CLIENT_SIDE_ENCRYPTION_KEY)
  88. undecode_encrypted_iv = _hget(headers, OSS_CLIENT_SIDE_ENCRYPTION_START)
  89. if undecode_encrypted_key:
  90. self.encrypted_key = b64decode_from_string(undecode_encrypted_key)
  91. if undecode_encrypted_iv:
  92. self.encrypted_iv = b64decode_from_string(undecode_encrypted_iv)
  93. cek_alg = _hget(headers, OSS_CLIENT_SIDE_ENCRYPTION_CEK_ALG)
  94. wrap_alg = _hget(headers, OSS_CLIENT_SIDE_ENCRYPTION_WRAP_ALG)
  95. mat_desc = _hget(headers, OSS_CLIENT_SIDE_ENCRYTPION_MATDESC)
  96. if mat_desc:
  97. self.mat_desc = json.loads(mat_desc)
  98. if cek_alg and cek_alg != self.cek_alg:
  99. logger.error("CEK algorithm or is inconsistent, object meta: cek_alg:{0}, material: cek_alg:{1}".
  100. format(cek_alg, self.cek_alg))
  101. err_msg = 'Data encryption/decryption algorithm is inconsistent'
  102. raise InconsistentError(err_msg, self)
  103. if wrap_alg and wrap_alg != self.wrap_alg:
  104. logger.error("WRAP algorithm or is inconsistent, object meta: wrap_alg:{0}, material: wrap_alg:{1}".
  105. format(wrap_alg, self.wrap_alg))
  106. err_msg = 'Envelope encryption/decryption algorithm is inconsistent'
  107. raise InconsistentError(err_msg, self)
  108. self.cek_alg = cek_alg
  109. self.wrap_alg = wrap_alg
  110. def is_unencrypted(self):
  111. if not self.encrypted_key and not self.encrypted_iv and not self.cek_alg and not self.wrap_alg:
  112. return True
  113. else:
  114. return False
  115. class MultipartUploadCryptoContext(object):
  116. def __init__(self, data_size=None, part_size=None, content_crypto_material=None):
  117. self.content_crypto_material = content_crypto_material
  118. self.data_size = data_size
  119. self.part_size = part_size
  120. def _hget(headers, key, converter=lambda x: x):
  121. if key in headers:
  122. return converter(headers[key])
  123. else:
  124. return None
  125. def _get_etag(headers):
  126. return _hget(headers, 'etag', lambda x: x.strip('"'))
  127. class RequestResult(object):
  128. def __init__(self, resp):
  129. #: HTTP响应
  130. self.resp = resp
  131. #: HTTP状态码
  132. self.status = resp.status
  133. #: HTTP头
  134. self.headers = resp.headers
  135. #: 请求ID,用于跟踪一个OSS请求。提交工单时,最后能够提供请求ID
  136. self.request_id = resp.request_id
  137. self.versionid = _hget(self.headers, 'x-oss-version-id')
  138. self.delete_marker = _hget(self.headers, 'x-oss-delete-marker', bool)
  139. class HeadObjectResult(RequestResult):
  140. def __init__(self, resp):
  141. super(HeadObjectResult, self).__init__(resp)
  142. #: 文件类型,可以是'Normal'、'Multipart'、'Appendable'等
  143. self.object_type = _hget(self.headers, OSS_OBJECT_TYPE)
  144. #: 文件最后修改时间,类型为int。参考 :ref:`unix_time` 。
  145. self.last_modified = _hget(self.headers, 'last-modified', http_to_unixtime)
  146. #: 文件的MIME类型
  147. self.content_type = _hget(self.headers, 'content-type')
  148. #: Content-Length,可能是None。
  149. self.content_length = _hget(self.headers, 'content-length', int)
  150. #: HTTP ETag
  151. self.etag = _get_etag(self.headers)
  152. #: 文件 server_crc
  153. self._server_crc = _hget(self.headers, 'x-oss-hash-crc64ecma', int)
  154. @property
  155. def server_crc(self):
  156. return self._server_crc
  157. class GetSelectObjectMetaResult(HeadObjectResult):
  158. def __init__(self, resp):
  159. super(GetSelectObjectMetaResult, self).__init__(resp)
  160. self.select_resp = SelectResponseAdapter(resp, None, None, False)
  161. for data in self.select_resp: # waiting the response body to finish
  162. pass
  163. self.csv_rows = self.select_resp.rows # to be compatible with previous version.
  164. self.csv_splits = self.select_resp.splits # to be compatible with previous version.
  165. self.rows = self.csv_rows
  166. self.splits = self.csv_splits
  167. class GetObjectMetaResult(RequestResult):
  168. def __init__(self, resp):
  169. super(GetObjectMetaResult, self).__init__(resp)
  170. #: 文件最后修改时间,类型为int。参考 :ref:`unix_time` 。
  171. self.last_modified = _hget(self.headers, 'last-modified', http_to_unixtime)
  172. #: Content-Length,文件大小,类型为int。
  173. self.content_length = _hget(self.headers, 'content-length', int)
  174. #: HTTP ETag
  175. self.etag = _get_etag(self.headers)
  176. class GetSymlinkResult(RequestResult):
  177. def __init__(self, resp):
  178. super(GetSymlinkResult, self).__init__(resp)
  179. #: 符号连接的目标文件
  180. self.target_key = urlunquote(_hget(self.headers, OSS_SYMLINK_TARGET))
  181. class GetObjectResult(HeadObjectResult):
  182. def __init__(self, resp, progress_callback=None, crc_enabled=False, crypto_provider=None, discard=0):
  183. super(GetObjectResult, self).__init__(resp)
  184. self.__crc_enabled = crc_enabled
  185. self.__crypto_provider = crypto_provider
  186. self.content_range = _hget(resp.headers, 'Content-Range')
  187. if self.content_range:
  188. byte_range = self._parse_range_str(self.content_range)
  189. if progress_callback:
  190. self.stream = make_progress_adapter(self.resp, progress_callback, self.content_length)
  191. else:
  192. self.stream = self.resp
  193. if self.__crc_enabled:
  194. self.stream = make_crc_adapter(self.stream, discard=discard)
  195. if self.__crypto_provider:
  196. content_crypto_material = ContentCryptoMaterial(self.__crypto_provider.cipher,
  197. self.__crypto_provider.wrap_alg)
  198. content_crypto_material.from_object_meta(resp.headers)
  199. if content_crypto_material.is_unencrypted():
  200. logger.info("The object is not encrypted, use crypto provider is not recommended")
  201. else:
  202. crypto_provider = self.__crypto_provider
  203. if content_crypto_material.mat_desc != self.__crypto_provider.mat_desc:
  204. logger.warn("The material description of the object and the provider is inconsistent")
  205. encryption_materials = self.__crypto_provider.get_encryption_materials(
  206. content_crypto_material.mat_desc)
  207. if encryption_materials:
  208. crypto_provider = self.__crypto_provider.reset_encryption_materials(encryption_materials)
  209. else:
  210. raise ClientError(
  211. 'There is no encryption materials match the material description of the object')
  212. plain_key = crypto_provider.decrypt_encrypted_key(content_crypto_material.encrypted_key)
  213. if content_crypto_material.deprecated:
  214. if content_crypto_material.wrap_alg == KMS_ALI_WRAP_ALGORITHM:
  215. plain_counter = int(
  216. crypto_provider.decrypt_encrypted_iv(content_crypto_material.encrypted_iv, True))
  217. else:
  218. plain_counter = int(crypto_provider.decrypt_encrypted_iv(content_crypto_material.encrypted_iv))
  219. else:
  220. plain_iv = crypto_provider.decrypt_encrypted_iv(content_crypto_material.encrypted_iv)
  221. offset = 0
  222. if self.content_range:
  223. start, end = crypto_provider.adjust_range(byte_range[0], byte_range[1])
  224. offset = content_crypto_material.cipher.calc_offset(start)
  225. cipher = copy.copy(content_crypto_material.cipher)
  226. if content_crypto_material.deprecated:
  227. cipher.initial_by_counter(plain_key, plain_counter + offset)
  228. else:
  229. cipher.initialize(plain_key, plain_iv, offset)
  230. self.stream = crypto_provider.make_decrypt_adapter(self.stream, cipher, discard)
  231. else:
  232. if OSS_CLIENT_SIDE_ENCRYPTION_KEY in resp.headers or DEPRECATED_CLIENT_SIDE_ENCRYPTION_KEY in resp.headers:
  233. logger.warn(
  234. "Using Bucket to get an encrypted object will return raw data, please confirm if you really want to do this")
  235. @staticmethod
  236. def _parse_range_str(content_range):
  237. # :param str content_range: sample 'bytes 0-128/1024'
  238. range_data = (content_range.split(' ', 2)[1]).split('/', 2)[0]
  239. range_start, range_end = range_data.split('-', 2)
  240. return int(range_start), int(range_end)
  241. def read(self, amt=None):
  242. return self.stream.read(amt)
  243. def close(self):
  244. self.resp.response.close()
  245. def __iter__(self):
  246. return iter(self.stream)
  247. def __enter__(self):
  248. return self
  249. def __exit__(self, exc_type, exc_val, exc_tb):
  250. self.close()
  251. @property
  252. def client_crc(self):
  253. if self.__crc_enabled:
  254. return self.stream.crc
  255. else:
  256. return None
  257. class SelectObjectResult(HeadObjectResult):
  258. def __init__(self, resp, progress_callback=None, crc_enabled=False):
  259. super(SelectObjectResult, self).__init__(resp)
  260. self.__crc_enabled = crc_enabled
  261. self.select_resp = SelectResponseAdapter(resp, progress_callback, None, enable_crc = self.__crc_enabled)
  262. def read(self):
  263. return self.select_resp.read()
  264. def close(self):
  265. self.resp.response.close()
  266. def __iter__(self):
  267. return iter(self.select_resp)
  268. def __next__(self):
  269. return self.select_resp.next()
  270. def __enter__(self):
  271. return self
  272. def __exit__(self, exc_type, exc_val, exc_tb):
  273. self.close()
  274. class PutObjectResult(RequestResult):
  275. def __init__(self, resp):
  276. super(PutObjectResult, self).__init__(resp)
  277. #: HTTP ETag
  278. self.etag = _get_etag(self.headers)
  279. #: 文件上传后,OSS上文件的CRC64值
  280. self.crc = _hget(resp.headers, OSS_HASH_CRC64_ECMA, int)
  281. class AppendObjectResult(RequestResult):
  282. def __init__(self, resp):
  283. super(AppendObjectResult, self).__init__(resp)
  284. #: HTTP ETag
  285. self.etag = _get_etag(self.headers)
  286. #: 本次追加写完成后,OSS上文件的CRC64值
  287. self.crc = _hget(resp.headers, OSS_HASH_CRC64_ECMA, int)
  288. #: 下次追加写的偏移
  289. self.next_position = _hget(resp.headers, OSS_NEXT_APPEND_POSITION, int)
  290. class BatchDeleteObjectVersion(object):
  291. def __init__(self, key=None, versionid=None):
  292. self.key = key or ''
  293. self.versionid = versionid or ''
  294. class BatchDeleteObjectVersionList(object):
  295. def __init__(self, object_version_list=None):
  296. self.object_version_list = object_version_list or []
  297. def append(self, object_version):
  298. self.object_version_list.append(object_version)
  299. def len(self):
  300. return len(self.object_version_list)
  301. class BatchDeleteObjectVersionResult(object):
  302. def __init__(self, key, versionid=None, delete_marker=None, delete_marker_versionid=None):
  303. self.key = key
  304. self.versionid = versionid or ''
  305. self.delete_marker = delete_marker or False
  306. self.delete_marker_versionid = delete_marker_versionid or ''
  307. class BatchDeleteObjectsResult(RequestResult):
  308. def __init__(self, resp):
  309. super(BatchDeleteObjectsResult, self).__init__(resp)
  310. #: 已经删除的文件名列表
  311. self.deleted_keys = []
  312. #:已经删除的带版本信息的文件信息列表
  313. self.delete_versions = []
  314. class InitMultipartUploadResult(RequestResult):
  315. def __init__(self, resp):
  316. super(InitMultipartUploadResult, self).__init__(resp)
  317. #: 新生成的Upload ID
  318. self.upload_id = None
  319. # 客户端加密Bucket关于Multipart文件的context
  320. # self.crypto_multipart_context = None
  321. class ListObjectsResult(RequestResult):
  322. def __init__(self, resp):
  323. super(ListObjectsResult, self).__init__(resp)
  324. #: True表示还有更多的文件可以罗列;False表示已经列举完毕。
  325. self.is_truncated = False
  326. #: 下一次罗列的分页标记符,即,可以作为 :func:`list_objects <oss2.Bucket.list_objects>` 的 `marker` 参数。
  327. self.next_marker = ''
  328. #: 本次罗列得到的文件列表。其中元素的类型为 :class:`SimplifiedObjectInfo` 。
  329. self.object_list = []
  330. #: 本次罗列得到的公共前缀列表,类型为str列表。
  331. self.prefix_list = []
  332. class ListObjectsV2Result(RequestResult):
  333. def __init__(self, resp):
  334. super(ListObjectsV2Result, self).__init__(resp)
  335. #: True表示还有更多的文件可以罗列;False表示已经列举完毕。
  336. self.is_truncated = False
  337. #: 下次罗列操作携带的token
  338. self.next_continuation_token = ''
  339. #: 本次罗列得到的文件列表。其中元素的类型为 :class:`SimplifiedObjectInfo` 。
  340. self.object_list = []
  341. #: 本次罗列得到的公共前缀列表,类型为str列表。
  342. self.prefix_list = []
  343. class SimplifiedObjectInfo(object):
  344. def __init__(self, key, last_modified, etag, type, size, storage_class, owner=None):
  345. #: 文件名,或公共前缀名。
  346. self.key = key
  347. #: 文件的最后修改时间
  348. self.last_modified = last_modified
  349. #: HTTP ETag
  350. self.etag = etag
  351. #: 文件类型
  352. self.type = type
  353. #: 文件大小
  354. self.size = size
  355. #: 文件的存储类别,是一个字符串。
  356. self.storage_class = storage_class
  357. #: owner信息, 类型为: class:`Owner <oss2.models.Owner>`
  358. self.owner = owner
  359. def is_prefix(self):
  360. """如果是公共前缀,返回True;是文件,则返回False"""
  361. return self.last_modified is None
  362. OBJECT_ACL_DEFAULT = 'default'
  363. OBJECT_ACL_PRIVATE = 'private'
  364. OBJECT_ACL_PUBLIC_READ = 'public-read'
  365. OBJECT_ACL_PUBLIC_READ_WRITE = 'public-read-write'
  366. class GetObjectAclResult(RequestResult):
  367. def __init__(self, resp):
  368. super(GetObjectAclResult, self).__init__(resp)
  369. #: 文件的ACL,其值可以是 `OBJECT_ACL_DEFAULT`、`OBJECT_ACL_PRIVATE`、`OBJECT_ACL_PUBLIC_READ`或
  370. #: `OBJECT_ACL_PUBLIC_READ_WRITE`
  371. self.acl = ''
  372. class SimplifiedBucketInfo(object):
  373. """:func:`list_buckets <oss2.Service.list_objects>` 结果中的单个元素类型。"""
  374. def __init__(self, name, location, creation_date, extranet_endpoint, intranet_endpoint, storage_class):
  375. #: Bucket名
  376. self.name = name
  377. #: Bucket的区域
  378. self.location = location
  379. #: Bucket的创建时间,类型为int。参考 :ref:`unix_time`。
  380. self.creation_date = creation_date
  381. #: Bucket访问的外网域名
  382. self.extranet_endpoint = extranet_endpoint
  383. #: 同区域ECS访问Bucket的内网域名
  384. self.intranet_endpoint = intranet_endpoint
  385. #: Bucket存储类型,支持“Standard”、“IA”、“Archive”、“ColdArchive”
  386. self.storage_class = storage_class
  387. class ListBucketsResult(RequestResult):
  388. def __init__(self, resp):
  389. super(ListBucketsResult, self).__init__(resp)
  390. #: True表示还有更多的Bucket可以罗列;False表示已经列举完毕。
  391. self.is_truncated = False
  392. #: 下一次罗列的分页标记符,即,可以作为 :func:`list_buckets <oss2.Service.list_buckets>` 的 `marker` 参数。
  393. self.next_marker = ''
  394. #: 得到的Bucket列表,类型为 :class:`SimplifiedBucketInfo` 。
  395. self.buckets = []
  396. class MultipartUploadInfo(object):
  397. def __init__(self, key, upload_id, initiation_date):
  398. #: 文件名
  399. self.key = key
  400. #: 分片上传ID
  401. self.upload_id = upload_id
  402. #: 分片上传初始化的时间,类型为int。参考 :ref:`unix_time`
  403. self.initiation_date = initiation_date
  404. def is_prefix(self):
  405. """如果是公共前缀则返回True"""
  406. return self.upload_id is None
  407. class ListMultipartUploadsResult(RequestResult):
  408. def __init__(self, resp):
  409. super(ListMultipartUploadsResult, self).__init__(resp)
  410. #: True表示还有更多的为完成分片上传可以罗列;False表示已经列举完毕。
  411. self.is_truncated = False
  412. #: 文件名分页符
  413. self.next_key_marker = ''
  414. #: 分片上传ID分页符
  415. self.next_upload_id_marker = ''
  416. #: 分片上传列表。类型为`MultipartUploadInfo`列表。
  417. self.upload_list = []
  418. #: 公共前缀列表。类型为str列表。
  419. self.prefix_list = []
  420. class ListPartsResult(RequestResult):
  421. def __init__(self, resp):
  422. super(ListPartsResult, self).__init__(resp)
  423. # True表示还有更多的Part可以罗列;False表示已经列举完毕。
  424. self.is_truncated = False
  425. # 下一个分页符
  426. self.next_marker = ''
  427. # 罗列出的Part信息,类型为 `PartInfo` 列表。
  428. self.parts = []
  429. BUCKET_ACL_PRIVATE = 'private'
  430. BUCKET_ACL_PUBLIC_READ = 'public-read'
  431. BUCKET_ACL_PUBLIC_READ_WRITE = 'public-read-write'
  432. BUCKET_STORAGE_CLASS_STANDARD = 'Standard'
  433. BUCKET_STORAGE_CLASS_IA = 'IA'
  434. BUCKET_STORAGE_CLASS_ARCHIVE = 'Archive'
  435. BUCKET_STORAGE_CLASS_COLD_ARCHIVE = "ColdArchive"
  436. BUCKET_DATA_REDUNDANCY_TYPE_LRS = "LRS"
  437. BUCKET_DATA_REDUNDANCY_TYPE_ZRS = "ZRS"
  438. REDIRECT_TYPE_MIRROR = 'Mirror'
  439. REDIRECT_TYPE_EXTERNAL = 'External'
  440. REDIRECT_TYPE_INTERNAL = 'Internal'
  441. REDIRECT_TYPE_ALICDN = 'AliCDN'
  442. PAYER_BUCKETOWNER = 'BucketOwner'
  443. PAYER_REQUESTER = 'Requester'
  444. class GetBucketAclResult(RequestResult):
  445. def __init__(self, resp):
  446. super(GetBucketAclResult, self).__init__(resp)
  447. #: Bucket的ACL,其值可以是 `BUCKET_ACL_PRIVATE`、`BUCKET_ACL_PUBLIC_READ`或`BUCKET_ACL_PUBLIC_READ_WRITE`。
  448. self.acl = ''
  449. class GetBucketLocationResult(RequestResult):
  450. def __init__(self, resp):
  451. super(GetBucketLocationResult, self).__init__(resp)
  452. #: Bucket所在的数据中心
  453. self.location = ''
  454. class BucketLogging(object):
  455. """Bucket日志配置信息。
  456. :param str target_bucket: 存储日志到这个Bucket。
  457. :param str target_prefix: 生成的日志文件名加上该前缀。
  458. """
  459. def __init__(self, target_bucket, target_prefix):
  460. self.target_bucket = target_bucket
  461. self.target_prefix = target_prefix
  462. class GetBucketLoggingResult(RequestResult, BucketLogging):
  463. def __init__(self, resp):
  464. RequestResult.__init__(self, resp)
  465. BucketLogging.__init__(self, '', '')
  466. class BucketCreateConfig(object):
  467. def __init__(self, storage_class, data_redundancy_type=None):
  468. self.storage_class = storage_class
  469. self.data_redundancy_type = data_redundancy_type
  470. class BucketStat(object):
  471. def __init__(self, storage_size_in_bytes, object_count, multi_part_upload_count):
  472. self.storage_size_in_bytes = storage_size_in_bytes
  473. self.object_count = object_count
  474. self.multi_part_upload_count = multi_part_upload_count
  475. class AccessControlList(object):
  476. def __init__(self, grant):
  477. self.grant = grant
  478. class Owner(object):
  479. def __init__(self, display_name, owner_id):
  480. self.display_name = display_name
  481. self.id = owner_id
  482. class BucketInfo(object):
  483. def __init__(self, name=None, owner=None, location=None, storage_class=None, intranet_endpoint=None,
  484. extranet_endpoint=None, creation_date=None, acl=None, data_redundancy_type=None, comment=None,
  485. bucket_encryption_rule=None, versioning_status=None):
  486. self.name = name
  487. self.owner = owner
  488. self.location = location
  489. self.storage_class = storage_class
  490. self.intranet_endpoint = intranet_endpoint
  491. self.extranet_endpoint = extranet_endpoint
  492. self.creation_date = creation_date
  493. self.acl = acl
  494. self.data_redundancy_type = data_redundancy_type
  495. self.comment = comment
  496. self.bucket_encryption_rule = bucket_encryption_rule
  497. self.versioning_status = versioning_status
  498. class GetBucketStatResult(RequestResult, BucketStat):
  499. def __init__(self, resp):
  500. RequestResult.__init__(self, resp)
  501. BucketStat.__init__(self, 0, 0, 0)
  502. class GetBucketInfoResult(RequestResult, BucketInfo):
  503. def __init__(self, resp):
  504. RequestResult.__init__(self, resp)
  505. BucketInfo.__init__(self)
  506. class BucketReferer(object):
  507. """Bucket防盗链设置。
  508. :param bool allow_empty_referer: 是否允许空的Referer。
  509. :param referers: Referer列表,每个元素是一个str。
  510. """
  511. def __init__(self, allow_empty_referer, referers):
  512. self.allow_empty_referer = allow_empty_referer
  513. self.referers = referers
  514. class GetBucketRefererResult(RequestResult, BucketReferer):
  515. def __init__(self, resp):
  516. RequestResult.__init__(self, resp)
  517. BucketReferer.__init__(self, False, [])
  518. class Condition(object):
  519. """ 匹配规则
  520. :父节点: class `RoutingRule <oss2.models.RoutingRule>`
  521. :param key_prefix_equals: 匹配object的前缀,
  522. :type key_prefix_equals: string str
  523. :param http_err_code_return_equals: 匹配访问object时返回的status。
  524. :type http_err_code_return_equals: int
  525. :param include_header_list: 匹配指定的header
  526. :type include_header_list: list of :class:`ConditionInlcudeHeader`
  527. """
  528. def __init__(self, key_prefix_equals=None, http_err_code_return_equals=None, include_header_list=None):
  529. if (include_header_list is not None):
  530. if not isinstance(include_header_list, list):
  531. raise ClientError('class of include_header should be list')
  532. if len(include_header_list) > 5:
  533. raise ClientError('capacity of include_header_list should not > 5, please check!')
  534. self.key_prefix_equals = key_prefix_equals
  535. self.http_err_code_return_equals = http_err_code_return_equals
  536. self.include_header_list = include_header_list or []
  537. class ConditionInlcudeHeader(object):
  538. """ 指定匹配的header
  539. :父节点: class `Condition <oss2.models.Condition>`
  540. :param key: header key
  541. :type key: str
  542. :param key: header value
  543. :type key: str
  544. """
  545. def __init__(self, key=None, equals= None):
  546. self.key = key
  547. self.equals = equals
  548. class Redirect(object):
  549. """匹配规则之后执行的动作
  550. :父节点: class `RoutingRule <oss2.models.RoutingRule>`
  551. :param redirect_type: 跳转类型, 取值为Mirror, External, Internal, AliCDN其中一个。
  552. :type redirect_type: class: str
  553. :param pass_query_string: 执行跳转或者镜像回源时,是否要携带发起请求的请求参数,默认false。
  554. :type pass_query_string: bool
  555. :param replace_key_with: Redirect的时候object name将替换成这个值,可以支持变量(目前支持的变量是${key}
  556. 当RedirectType为Internal, External或者AliCDN时有效。
  557. :type replace_key_with: str
  558. :param replace_key_prefix_with: Redirect的时候object name的前缀将替换成这个值。如果前缀为空则将这个字符串插入在object namde的最前面。
  559. 当RedirectType为Internal, External或者AliCDN时有效。
  560. :type replace_key_prefix_with: str
  561. :param proto: 跳转时的协议,只能取值为http或者https。
  562. 当RedirectType为External或者AliCDN时有效。
  563. :type proto: class: str
  564. :param host_name: 跳转时的域名
  565. 当RedirectType为External或者AliCDN时有效。
  566. :type host_name: str
  567. :param http_redirect_code: 跳转时返回的状态码,取值为301、302或307。
  568. 当RedirectType为External或者AliCDN时有效。
  569. :type http_redirect_code: int (HTTP状态码)
  570. :mirror相关当参数只有当RedirectType为Mirror时有效。
  571. :param mirror_url: 镜像回源的源站地址,
  572. :type mirror_url: str
  573. :param mirror_url_slave: 镜像回源的备站地址
  574. :type mirror_url_slave: str
  575. :param mirror_url_probe: 主备切换模式的探测url,这个url需要代表主源站的健康程度,mirror_url_slave指定时,此项必须指定。
  576. :type mirror_url_probe: str
  577. :param mirror_pass_query_string: 作用同pass_query_string,默认false。
  578. :type mirror_pass_query_string: bool
  579. :param mirror_follow_redirect: 如果镜像回源获取的结果是3xx,是否要继续跳转到指定的Location获取数据。默认true。
  580. :type mirror_follow_redirect: bool
  581. :param mirror_check_md5: 是否要检查回源body的md5, 默认false。
  582. :type mirror_check_md5: bool
  583. :param mirror_headers: 指定匹配此规则后执行的动作。
  584. :type mirror_headers: class:`RedirectMirrorHeaders <oss2.models.RedirectMirrorHeaders>`
  585. """
  586. def __init__(self, redirect_type=None, pass_query_string= None, replace_key_with=None, replace_key_prefix_with=None,
  587. proto=None, host_name=None, http_redirect_code=None, mirror_url=None, mirror_url_slave=None,
  588. mirror_url_probe=None, mirror_pass_query_string=None, mirror_follow_redirect=None,
  589. mirror_check_md5=None, mirror_headers=None):
  590. if redirect_type not in [REDIRECT_TYPE_MIRROR, REDIRECT_TYPE_EXTERNAL, REDIRECT_TYPE_INTERNAL, REDIRECT_TYPE_ALICDN]:
  591. raise ClientError('redirect_type must be Internal, External, Mirror or AliCDN.')
  592. if redirect_type == REDIRECT_TYPE_INTERNAL:
  593. if any((host_name, proto, http_redirect_code)):
  594. raise ClientError('host_name, proto, http_redirect_code must be empty when redirect_type is Internal.')
  595. if redirect_type in [REDIRECT_TYPE_EXTERNAL, REDIRECT_TYPE_ALICDN]:
  596. if http_redirect_code is not None:
  597. if http_redirect_code < 300 or http_redirect_code > 399:
  598. raise ClientError("http_redirect_code must be a valid HTTP 3xx status code.")
  599. if redirect_type in [REDIRECT_TYPE_EXTERNAL, REDIRECT_TYPE_ALICDN, REDIRECT_TYPE_INTERNAL]:
  600. if all((replace_key_with, replace_key_prefix_with)):
  601. raise ClientError("replace_key_with or replace_key_prefix_with only choose one.")
  602. elif redirect_type == REDIRECT_TYPE_MIRROR:
  603. if any((proto, host_name, replace_key_with, replace_key_prefix_with, http_redirect_code)):
  604. raise ClientError('host_name, replace_key_with, replace_key_prefix_with, http_redirect_code and proto must be empty when redirect_type is Mirror.')
  605. if mirror_url is None:
  606. raise ClientError('mirror_url should not be None when redirect_type is Mirror.')
  607. if (not mirror_url.startswith('http://') and not mirror_url.startswith('https://')) or not mirror_url.endswith('/'):
  608. raise ClientError(r'mirror_url is invalid, should startwith "http://" or "https://", and endwith "/"')
  609. if mirror_url_slave is not None:
  610. if mirror_url_probe is None:
  611. raise ClientError('mirror_url_probe should not be none when mirror_url_slave is indicated')
  612. if (not mirror_url_slave.startswith('http://') and not mirror_url_slave.startswith('https://')) or not mirror_url_slave.endswith('/'):
  613. raise ClientError(r'mirror_url_salve is invalid, should startwith "http://" or "https://", and endwith "/"')
  614. self.redirect_type = redirect_type
  615. self.pass_query_string = pass_query_string
  616. self.replace_key_with = replace_key_with
  617. self.replace_key_prefix_with = replace_key_prefix_with
  618. self.proto = proto
  619. self.host_name = host_name
  620. self.http_redirect_code = http_redirect_code
  621. self.mirror_url = mirror_url
  622. self.mirror_url_slave = mirror_url_slave
  623. self.mirror_url_probe = mirror_url_probe
  624. self.mirror_pass_query_string = mirror_pass_query_string
  625. self.mirror_check_md5 = mirror_check_md5
  626. self.mirror_follow_redirect = mirror_follow_redirect
  627. self.mirror_headers = mirror_headers
  628. class RedirectMirrorHeaders(object):
  629. """指定镜像回源时携带的header
  630. :父节点: class `Redirect <oss2.models.Redirect>`
  631. :param pass_all: 是否透传请求中所有的header(除了保留的几个header以及以oss-/x-oss-/x-drs-开头的header)到源站。默认false
  632. :type pass_all: bool
  633. :param pass_list: 透传指定的header到源站,最多10个,只有在RedirectType为Mirror时生效
  634. :type pass_list: list of str
  635. :param remove_list: 禁止透传指定的header到源站,这个字段可以重复,最多10个
  636. :type remove_list: list of str
  637. :param set_list: 设置一个header传到源站,不管请求中是否携带这些指定的header,回源时都会设置这些header。
  638. 该容器可以重复,最多10组。只有在RedirectType为Mirror时生效。
  639. :type set_list: list of :class:`MirrorHeadersSet <oss2.models.MirrorHeadersSet>`
  640. """
  641. def __init__(self,pass_all=None, pass_list=None, remove_list=None, set_list=None):
  642. if pass_list is not None:
  643. if not isinstance(pass_list, list):
  644. raise ClientError('The type of pass_list should be list.')
  645. if len(pass_list) > 10:
  646. raise ClientError('The capacity of pass_list should not > 10!')
  647. if remove_list is not None:
  648. if not isinstance(remove_list, list):
  649. raise ClientError('The type of remove_list should be list.')
  650. if len(remove_list) > 10:
  651. raise ClientError('The capacity of remove_list should not > 10!')
  652. if set_list is not None:
  653. if not isinstance(set_list, list):
  654. raise ClientError('The type of set_list should be list.')
  655. if len(set_list) > 10:
  656. raise ClientError('The capacity of set_list should not > 10!')
  657. self.pass_all = pass_all
  658. self.pass_list = pass_list or []
  659. self.remove_list = remove_list or []
  660. self.set_list = set_list or []
  661. class MirrorHeadersSet(object):
  662. """父节点: class `RedirectMirrorHeaders <oss2.models.RedirectMirrorHeaders>`
  663. :param key:设置header的key,最多1024个字节,字符集与Pass相同。只有在RedirectType为Mirror时生效。
  664. :type key: str
  665. :param value:设置header的value,最多1024个字节,不能出现”\r\n” 。只有在RedirectType为Mirror时生效。
  666. :type value: str
  667. """
  668. def __init__(self, key=None, value=None):
  669. self.key = key
  670. self.value = value
  671. class RoutingRule(object):
  672. """设置静态网站托管模式中的跳转规则
  673. :param rule_num: RoutingRule的序号, 必须为正整数
  674. :type rule_num: int
  675. :param condition: 匹配条件
  676. :type condition: class:`Condition <oss2.models.Condition>`
  677. :param redirect: 指定匹配此规则后执行的动作
  678. :type redirect: class:`Redirect <oss2.models.Redirect>`
  679. """
  680. def __init__(self, rule_num=None, condition=None, redirect=None):
  681. if (rule_num is None) or (not isinstance(rule_num, int)) or (rule_num <= 0):
  682. raise ClientError('rule_num should be positive integer.')
  683. if(condition is None) or (redirect is None):
  684. raise ClientError('condition and redirect should be effective.')
  685. if(redirect.redirect_type == REDIRECT_TYPE_MIRROR) and condition.http_err_code_return_equals != 404:
  686. raise ClientError('http_err_code not match redirect_type, it should be 404!')
  687. self.rule_num = rule_num
  688. self.condition = condition
  689. self.redirect = redirect
  690. class BucketWebsite(object):
  691. """静态网站托管配置。
  692. :param str index_file: 索引页面文件
  693. :param str error_file: 404页面文件
  694. :param rules : list of class:`RoutingRule <oss2.models.RoutingRule>`
  695. """
  696. def __init__(self, index_file, error_file, rules=None):
  697. if rules is not None:
  698. if not isinstance(rules, list):
  699. raise ClientError('rules type should be list.')
  700. if len(rules) > 5:
  701. raise ClientError('capacity of rules should not be > 5.')
  702. self.index_file = index_file
  703. self.error_file = error_file
  704. self.rules = rules or []
  705. class GetBucketWebsiteResult(RequestResult, BucketWebsite):
  706. def __init__(self, resp):
  707. RequestResult.__init__(self, resp)
  708. BucketWebsite.__init__(self, '', '', [])
  709. class LifecycleExpiration(object):
  710. """过期删除操作。
  711. :param days: 表示在文件修改后过了这么多天,就会匹配规则,从而被删除
  712. :type days: int
  713. :param date: 表示在该日期之后,规则就一直生效。即每天都会对符合前缀的文件执行删除操作(如,删除),而不管文件是什么时候生成的。*不建议使用*
  714. :type date: `datetime.date`
  715. :param created_before_date: delete files if their last modified time earlier than created_before_date
  716. :type created_before_date: `datetime.date`
  717. :param expired_detete_marker: 真实文件删除之后是否自动移除删除标记,适用于多版本场景。
  718. :param expired_detete_marker: bool
  719. """
  720. def __init__(self, days=None, date=None, created_before_date=None, expired_detete_marker=None):
  721. not_none_fields = 0
  722. if days is not None:
  723. not_none_fields += 1
  724. if date is not None:
  725. not_none_fields += 1
  726. if created_before_date is not None:
  727. not_none_fields += 1
  728. if expired_detete_marker is not None:
  729. not_none_fields += 1
  730. if not_none_fields > 1:
  731. raise ClientError('More than one field(days, date and created_before_date, expired_detete_marker) has been specified')
  732. self.days = days
  733. self.date = date
  734. self.created_before_date = created_before_date
  735. self.expired_detete_marker = expired_detete_marker
  736. class AbortMultipartUpload(object):
  737. """删除parts
  738. :param days: 删除相对最后修改时间days天之后的parts
  739. :param created_before_date: 删除最后修改时间早于created_before_date的parts
  740. """
  741. def __init__(self, days=None, created_before_date=None):
  742. if days is not None and created_before_date is not None:
  743. raise ClientError('days and created_before_date should not be both specified')
  744. self.days = days
  745. self.created_before_date = created_before_date
  746. class StorageTransition(object):
  747. """transit objects
  748. :param days: 将相对最后修改时间days天之后的Object转储
  749. :param created_before_date: 将最后修改时间早于created_before_date的对象转储
  750. :param storage_class: 对象转储到OSS的目标存储类型
  751. """
  752. def __init__(self, days=None, created_before_date=None, storage_class=None):
  753. if days is not None and created_before_date is not None:
  754. raise ClientError('days and created_before_date should not be both specified')
  755. self.days = days
  756. self.created_before_date = created_before_date
  757. self.storage_class = storage_class
  758. class NoncurrentVersionExpiration(object):
  759. """OSS何时将非当前版本的object删除
  760. :param noncurrent_days: 指定多少天之后删除
  761. :type noncurrent_days: int
  762. """
  763. def __init__(self, noncurrent_days):
  764. self.noncurrent_days = noncurrent_days
  765. class NoncurrentVersionStorageTransition(object):
  766. """生命周期内,OSS何时将指定Object的非当前版本转储为IA或者Archive存储类型。
  767. :param noncurrent_days: 多少天之后转存储
  768. :type noncurrent_days: int
  769. """
  770. def __init__(self, noncurrent_days, storage_class):
  771. self.noncurrent_days = noncurrent_days
  772. self.storage_class = storage_class
  773. class LifecycleRule(object):
  774. """生命周期规则。
  775. :param id: 规则名
  776. :type id: str
  777. :param prefix: 只有文件名匹配该前缀的文件才适用本规则
  778. :type prefix: str
  779. :param expiration: 过期删除操作。
  780. :type expiration: :class:`LifecycleExpiration`
  781. :param status: 启用还是禁止该规则。可选值为 `LifecycleRule.ENABLED` 或 `LifecycleRule.DISABLED`
  782. :param storage_transitions: 存储类型转换规则
  783. :type storage_transitions: list of class:`StorageTransition <oss2.models.StorageTransition>`
  784. :param tagging: object tagging 规则
  785. :type tagging: :class:`Tagging <oss2.models.StorageTransition>`
  786. :param noncurrent_version_expiration: 指定Object非当前版本生命周期规则的过期属性。适用于多版本场景。
  787. :type noncurrent_version_expiration class:`NoncurrentVersionExpiration <oss2.models.NoncurrentVersionExpiration>`
  788. :param noncurrent_version_sotrage_transitions: 在有效生命周期中,OSS何时将指定Object的非当前版本转储为IA或者Archive存储类型,适用于多版本场景。
  789. :type noncurrent_version_sotrage_transitions: list of class:`NoncurrentVersionStorageTransition <oss2.models.NoncurrentVersionStorageTransition>`
  790. """
  791. ENABLED = 'Enabled'
  792. DISABLED = 'Disabled'
  793. def __init__(self, id, prefix,
  794. status=ENABLED, expiration=None,
  795. abort_multipart_upload=None,
  796. storage_transitions=None, tagging=None,
  797. noncurrent_version_expiration=None,
  798. noncurrent_version_sotrage_transitions=None):
  799. self.id = id
  800. self.prefix = prefix
  801. self.status = status
  802. self.expiration = expiration
  803. self.abort_multipart_upload = abort_multipart_upload
  804. self.storage_transitions = storage_transitions
  805. self.tagging = tagging
  806. self.noncurrent_version_expiration = noncurrent_version_expiration
  807. self.noncurrent_version_sotrage_transitions = noncurrent_version_sotrage_transitions
  808. class BucketLifecycle(object):
  809. """Bucket的生命周期配置。
  810. :param rules: 规则列表,
  811. :type rules: list of :class:`LifecycleRule <oss2.models.LifecycleRule>`
  812. """
  813. def __init__(self, rules=None):
  814. self.rules = rules or []
  815. class GetBucketLifecycleResult(RequestResult, BucketLifecycle):
  816. def __init__(self, resp):
  817. RequestResult.__init__(self, resp)
  818. BucketLifecycle.__init__(self)
  819. class CorsRule(object):
  820. """CORS(跨域资源共享)规则。
  821. :param allowed_origins: 允许跨域访问的域。
  822. :type allowed_origins: list of str
  823. :param allowed_methods: 允许跨域访问的HTTP方法,如'GET'等。
  824. :type allowed_methods: list of str
  825. :param allowed_headers: 允许跨域访问的HTTP头部。
  826. :type allowed_headers: list of str
  827. """
  828. def __init__(self,
  829. allowed_origins=None,
  830. allowed_methods=None,
  831. allowed_headers=None,
  832. expose_headers=None,
  833. max_age_seconds=None):
  834. self.allowed_origins = allowed_origins or []
  835. self.allowed_methods = allowed_methods or []
  836. self.allowed_headers = allowed_headers or []
  837. self.expose_headers = expose_headers or []
  838. self.max_age_seconds = max_age_seconds
  839. class BucketCors(object):
  840. def __init__(self, rules=None):
  841. self.rules = rules or []
  842. class GetBucketCorsResult(RequestResult, BucketCors):
  843. def __init__(self, resp):
  844. RequestResult.__init__(self, resp)
  845. BucketCors.__init__(self)
  846. class LiveChannelInfoTarget(object):
  847. """Live channel中的Target节点,包含目标协议的一些参数。
  848. :param type: 协议,目前仅支持HLS。
  849. :type type: str
  850. :param frag_duration: HLS协议下生成的ts文件的期望时长,单位为秒。
  851. :type frag_duration: int
  852. :param frag_count: HLS协议下m3u8文件里ts文件的数量。
  853. :type frag_count: int"""
  854. def __init__(self,
  855. type = 'HLS',
  856. frag_duration = 5,
  857. frag_count = 3,
  858. playlist_name = ''):
  859. self.type = type
  860. self.frag_duration = frag_duration
  861. self.frag_count = frag_count
  862. self.playlist_name = playlist_name
  863. class LiveChannelInfo(object):
  864. """Live channel(直播频道)配置。
  865. :param status: 直播频道的状态,合法的值为"enabled"和"disabled"。
  866. :type status: str
  867. :param description: 直播频道的描述信息,最长为128字节。
  868. :type description: str
  869. :param target: 直播频道的推流目标节点,包含目标协议相关的参数。
  870. :type class:`LiveChannelInfoTarget <oss2.models.LiveChannelInfoTarget>`
  871. :param last_modified: 直播频道的最后修改时间,这个字段仅在`ListLiveChannel`时使用。
  872. :type last_modified: int, 参考 :ref:`unix_time`。
  873. :param name: 直播频道的名称。
  874. :type name: str
  875. :param play_url: 播放地址。
  876. :type play_url: str
  877. :param publish_url: 推流地址。
  878. :type publish_url: str"""
  879. def __init__(self,
  880. status = 'enabled',
  881. description = '',
  882. target = LiveChannelInfoTarget(),
  883. last_modified = None,
  884. name = None,
  885. play_url = None,
  886. publish_url = None):
  887. self.status = status
  888. self.description = description
  889. self.target = target
  890. self.last_modified = last_modified
  891. self.name = name
  892. self.play_url = play_url
  893. self.publish_url = publish_url
  894. class LiveChannelList(object):
  895. """List直播频道的结果。
  896. :param prefix: List直播频道使用的前缀。
  897. :type prefix: str
  898. :param marker: List直播频道使用的marker。
  899. :type marker: str
  900. :param max_keys: List时返回的最多的直播频道的条数。
  901. :type max_keys: int
  902. :param is_truncated: 本次List是否列举完所有的直播频道
  903. :type is_truncated: bool
  904. :param next_marker: 下一次List直播频道使用的marker。
  905. :type marker: str
  906. :param channels: List返回的直播频道列表
  907. :type channels: list,类型为 :class:`LiveChannelInfo`"""
  908. def __init__(self,
  909. prefix = '',
  910. marker = '',
  911. max_keys = 100,
  912. is_truncated = False,
  913. next_marker = ''):
  914. self.prefix = prefix
  915. self.marker = marker
  916. self.max_keys = max_keys
  917. self.is_truncated = is_truncated
  918. self.next_marker = next_marker
  919. self.channels = []
  920. class LiveChannelVideoStat(object):
  921. """LiveStat中的Video节点。
  922. :param width: 视频的宽度。
  923. :type width: int
  924. :param height: 视频的高度。
  925. :type height: int
  926. :param frame_rate: 帧率。
  927. :type frame_rate: int
  928. :param codec: 编码方式。
  929. :type codec: str
  930. :param bandwidth: 码率。
  931. :type bandwidth: int"""
  932. def __init__(self,
  933. width = 0,
  934. height = 0,
  935. frame_rate = 0,
  936. codec = '',
  937. bandwidth = 0):
  938. self.width = width
  939. self.height = height
  940. self.frame_rate = frame_rate
  941. self.codec = codec
  942. self.bandwidth = bandwidth
  943. class LiveChannelAudioStat(object):
  944. """LiveStat中的Audio节点。
  945. :param codec: 编码方式。
  946. :type codec: str
  947. :param sample_rate: 采样率。
  948. :type sample_rate: int
  949. :param bandwidth: 码率。
  950. :type bandwidth: int"""
  951. def __init__(self,
  952. codec = '',
  953. sample_rate = 0,
  954. bandwidth = 0):
  955. self.codec = codec
  956. self.sample_rate = sample_rate
  957. self.bandwidth = bandwidth
  958. class LiveChannelStat(object):
  959. """LiveStat结果。
  960. :param status: 直播状态。
  961. :type codec: str
  962. :param remote_addr: 客户端的地址。
  963. :type remote_addr: str
  964. :param connected_time: 本次推流开始时间。
  965. :type connected_time: int, unix time
  966. :param video: 视频描述信息。
  967. :type video: class:`LiveChannelVideoStat <oss2.models.LiveChannelVideoStat>`
  968. :param audio: 音频描述信息。
  969. :type audio: class:`LiveChannelAudioStat <oss2.models.LiveChannelAudioStat>`"""
  970. def __init__(self,
  971. status = '',
  972. remote_addr = '',
  973. connected_time = '',
  974. video = None,
  975. audio = None):
  976. self.status = status
  977. self.remote_addr = remote_addr
  978. self.connected_time = connected_time
  979. self.video = video
  980. self.audio = audio
  981. class LiveRecord(object):
  982. """直播频道中的推流记录信息
  983. :param start_time: 本次推流开始时间。
  984. :type start_time: int,参考 :ref:`unix_time`。
  985. :param end_time: 本次推流结束时间。
  986. :type end_time: int, 参考 :ref:`unix_time`。
  987. :param remote_addr: 推流时客户端的地址。
  988. :type remote_addr: str"""
  989. def __init__(self,
  990. start_time = '',
  991. end_time = '',
  992. remote_addr = ''):
  993. self.start_time = start_time
  994. self.end_time = end_time
  995. self.remote_addr = remote_addr
  996. class LiveChannelHistory(object):
  997. """直播频道下的推流记录。"""
  998. def __init__(self):
  999. self.records = []
  1000. class CreateLiveChannelResult(RequestResult, LiveChannelInfo):
  1001. def __init__(self, resp):
  1002. RequestResult.__init__(self, resp)
  1003. LiveChannelInfo.__init__(self)
  1004. class GetLiveChannelResult(RequestResult, LiveChannelInfo):
  1005. def __init__(self, resp):
  1006. RequestResult.__init__(self, resp)
  1007. LiveChannelInfo.__init__(self)
  1008. class ListLiveChannelResult(RequestResult, LiveChannelList):
  1009. def __init__(self, resp):
  1010. RequestResult.__init__(self, resp)
  1011. LiveChannelList.__init__(self)
  1012. class GetLiveChannelStatResult(RequestResult, LiveChannelStat):
  1013. def __init__(self, resp):
  1014. RequestResult.__init__(self, resp)
  1015. LiveChannelStat.__init__(self)
  1016. class GetLiveChannelHistoryResult(RequestResult, LiveChannelHistory):
  1017. def __init__(self, resp):
  1018. RequestResult.__init__(self, resp)
  1019. LiveChannelHistory.__init__(self)
  1020. class GetVodPlaylistResult(RequestResult):
  1021. def __init__(self, resp):
  1022. RequestResult.__init__(self, resp)
  1023. self.playlist = to_string(resp.read())
  1024. class ProcessObjectResult(RequestResult):
  1025. def __init__(self, resp):
  1026. RequestResult.__init__(self, resp)
  1027. self.bucket = ""
  1028. self.fileSize = 0
  1029. self.object = ""
  1030. self.process_status = ""
  1031. result = json.loads(to_string(resp.read()))
  1032. if 'bucket' in result:
  1033. self.bucket = result['bucket']
  1034. if 'fileSize' in result:
  1035. self.fileSize = result['fileSize']
  1036. if 'object' in result:
  1037. self.object = result['object']
  1038. if 'status' in result:
  1039. self.process_status = result['status']
  1040. _MAX_OBJECT_TAGGING_KEY_LENGTH=128
  1041. _MAX_OBJECT_TAGGING_VALUE_LENGTH=256
  1042. class Tagging(object):
  1043. def __init__(self, tagging_rules=None):
  1044. self.tag_set = tagging_rules or TaggingRule()
  1045. def __str__(self):
  1046. tag_str = ""
  1047. tagging_rule = self.tag_set.tagging_rule
  1048. for key in tagging_rule:
  1049. tag_str += key
  1050. tag_str += "#" + tagging_rule[key] + " "
  1051. return tag_str
  1052. class TaggingRule(object):
  1053. def __init__(self):
  1054. self.tagging_rule = dict()
  1055. def add(self, key, value):
  1056. if key is None or key == '':
  1057. raise ClientError("Tagging key should not be empty")
  1058. if len(key) > _MAX_OBJECT_TAGGING_KEY_LENGTH:
  1059. raise ClientError("Tagging key is too long")
  1060. if len(value) > _MAX_OBJECT_TAGGING_VALUE_LENGTH:
  1061. raise ClientError("Tagging value is too long")
  1062. self.tagging_rule[key] = value
  1063. def delete(self, key):
  1064. del self.tagging_rule[key]
  1065. def len(self):
  1066. return len(self.tagging_rule)
  1067. def to_query_string(self):
  1068. query_string = ''
  1069. for key in self.tagging_rule:
  1070. query_string += urlquote(key)
  1071. query_string += '='
  1072. query_string += urlquote(self.tagging_rule[key])
  1073. query_string += '&'
  1074. if len(query_string) == 0:
  1075. return ''
  1076. else:
  1077. query_string = query_string[:-1]
  1078. return query_string
  1079. class GetTaggingResult(RequestResult, Tagging):
  1080. def __init__(self, resp):
  1081. RequestResult.__init__(self, resp)
  1082. Tagging.__init__(self)
  1083. SERVER_SIDE_ENCRYPTION_AES256 = 'AES256'
  1084. SERVER_SIDE_ENCRYPTION_KMS = 'KMS'
  1085. SERVER_SIDE_ENCRYPTION_SM4 = 'SM4'
  1086. KMS_DATA_ENCRYPTION_SM4 = 'SM4'
  1087. class ServerSideEncryptionRule(object):
  1088. def __init__(self, sse_algorithm=None, kms_master_keyid=None, kms_data_encryption=None):
  1089. self.sse_algorithm = sse_algorithm
  1090. self.kms_master_keyid = kms_master_keyid
  1091. self.kms_data_encryption = kms_data_encryption
  1092. class GetServerSideEncryptionResult(RequestResult, ServerSideEncryptionRule):
  1093. def __init__(self, resp):
  1094. RequestResult.__init__(self, resp)
  1095. ServerSideEncryptionRule.__init__(self)
  1096. class ListObjectVersionsResult(RequestResult):
  1097. def __init__(self, resp):
  1098. super(ListObjectVersionsResult, self).__init__(resp)
  1099. #: True表示还有更多的文件可以罗列;False表示已经列举完毕。
  1100. self.is_truncated = False
  1101. #: 本次使用的分页标记符
  1102. self.key_marker = ''
  1103. #: 下一次罗列的分页标记符,即,可以作为 :func:`list_object_versions <oss2.Bucket.list_object_versions>` 的 `key_marker` 参数。
  1104. self.next_key_marker = ''
  1105. #: 本次使用的versionid分页标记符
  1106. self.versionid_marker = ''
  1107. #: 下一次罗列的versionid分页标记符,即,可以作为 :func:`list_object_versions <oss2.Bucket.list_object_versions>` 的 `versionid_marker` 参数。
  1108. self.next_versionid_marker = ''
  1109. self.name = ''
  1110. self.owner = ''
  1111. self.prefix = ''
  1112. self.max_keys = ''
  1113. self.delimiter = ''
  1114. #: 本次罗列得到的delete marker列表。其中元素的类型为 :class:`DeleteMarkerInfo` 。
  1115. self.delete_marker = []
  1116. #: 本次罗列得到的文件version列表。其中元素的类型为 :class:`ObjectVersionInfo` 。
  1117. self.versions = []
  1118. self.common_prefix = []
  1119. class DeleteMarkerInfo(object):
  1120. def __init__(self):
  1121. self.key = ''
  1122. self.versionid = ''
  1123. self.is_latest = False
  1124. self.last_modified = ''
  1125. self.owner = Owner('', '')
  1126. class ObjectVersionInfo(object):
  1127. def __init__(self):
  1128. self.key = ''
  1129. self.versionid = ''
  1130. self.is_latest = False
  1131. self.last_modified = ''
  1132. self.owner = Owner('', '')
  1133. self.type = ''
  1134. self.storage_class = ''
  1135. self.size = ''
  1136. self.etag = ''
  1137. BUCKET_VERSIONING_ENABLE = 'Enabled'
  1138. BUCKET_VERSIONING_SUSPEND = 'Suspended'
  1139. class BucketVersioningConfig(object):
  1140. def __init__(self, status=None):
  1141. self.status = status
  1142. class GetBucketVersioningResult(RequestResult, BucketVersioningConfig):
  1143. def __init__(self, resp):
  1144. RequestResult.__init__(self,resp)
  1145. BucketVersioningConfig.__init__(self)
  1146. class GetBucketPolicyResult(RequestResult):
  1147. def __init__(self, resp):
  1148. RequestResult.__init__(self, resp)
  1149. self.policy = to_string(resp.read())
  1150. class GetBucketRequestPaymentResult(RequestResult):
  1151. def __init__(self, resp):
  1152. RequestResult.__init__(self, resp)
  1153. self.payer = ''
  1154. class BucketQosInfo(object):
  1155. """bucket的Qos信息
  1156. :以下参数如果设置为0则表示完全禁止指定类型的访问,如果为-1则表示不单独限制
  1157. :param total_upload_bw: 总上传带宽, 单位Gbps
  1158. :type total_upload_bw: int
  1159. :param intranet_upload_bw: 内网上传带宽, 单位Gbps
  1160. :type intranet_upload_bw: int
  1161. :param extranet_upload_bw: 外网上传带宽, 单位Gbps
  1162. :type extranet_upload_bw: int
  1163. :param total_download_bw: 总下载带宽, 单位Gbps
  1164. :type total_download_bw: int
  1165. :param intranet_download_bw: 内外下载带宽, 单位Gbps
  1166. :type intranet_download_bw: int
  1167. :param extranet_download_bw: 外网下载带宽, 单位Gbps
  1168. :type extranet_download_bw: int
  1169. :param total_qps: 总qps, 单位请求数/s
  1170. :type total_qps: int
  1171. :param intranet_qps: 内网访问qps, 单位请求数/s
  1172. :type intranet_qps: int
  1173. :param extranet_qps: 外网访问qps, 单位请求数/s
  1174. :type extranet_qps: int
  1175. """
  1176. def __init__(self,
  1177. total_upload_bw = None,
  1178. intranet_upload_bw = None,
  1179. extranet_upload_bw = None,
  1180. total_download_bw = None,
  1181. intranet_download_bw = None,
  1182. extranet_download_bw = None,
  1183. total_qps = None,
  1184. intranet_qps = None,
  1185. extranet_qps = None):
  1186. self.total_upload_bw = total_upload_bw
  1187. self.intranet_upload_bw = intranet_upload_bw
  1188. self.extranet_upload_bw = extranet_upload_bw
  1189. self.total_download_bw = total_download_bw
  1190. self.intranet_download_bw = intranet_download_bw
  1191. self.extranet_download_bw = extranet_download_bw
  1192. self.total_qps = total_qps
  1193. self.intranet_qps = intranet_qps
  1194. self.extranet_qps = extranet_qps
  1195. class UserQosInfo(object):
  1196. """User的Qos信息
  1197. :param region: 查询的qos配置生效的区域
  1198. :type region: str
  1199. :以下参数如果为0则表示完全禁止指定类型的访问,如果为-1表示不单独限制
  1200. :param total_upload_bw: 总上传带宽, 单位Gbps
  1201. :type total_upload_bw: int
  1202. :param intranet_upload_bw: 内网上传带宽, 单位:Gbps
  1203. :type intranet_upload_bw: int
  1204. :param extranet_upload_bw: 外网上传带宽, 单位:Gbps
  1205. :type extranet_upload_bw: int
  1206. :param total_download_bw: 总下载带宽, 单位:Gbps
  1207. :type total_download_bw: int
  1208. :param intranet_download_bw: 内外下载带宽, 单位:Gbps
  1209. :type intranet_download_bw: int
  1210. :param extranet_download_bw: 外网下载带宽, 单位:Gbps
  1211. :type extranet_download_bw: int
  1212. :param total_qps: 总qps限制
  1213. :type total_qps: int
  1214. :param intranet_qps: 内网访问qps
  1215. :type intranet_qps: int
  1216. :param extranet_qps: 外网访问qps
  1217. :type extranet_qps: int
  1218. """
  1219. def __init__(self,
  1220. region=None,
  1221. total_upload_bw = None,
  1222. intranet_upload_bw = None,
  1223. extranet_upload_bw = None,
  1224. total_download_bw = None,
  1225. intranet_download_bw = None,
  1226. extranet_download_bw = None,
  1227. total_qps = None,
  1228. intranet_qps = None,
  1229. extranet_qps = None):
  1230. self.region = region
  1231. self.total_upload_bw = total_upload_bw
  1232. self.intranet_upload_bw = intranet_upload_bw
  1233. self.extranet_upload_bw = extranet_upload_bw
  1234. self.total_download_bw = total_download_bw
  1235. self.intranet_download_bw = intranet_download_bw
  1236. self.extranet_download_bw = extranet_download_bw
  1237. self.total_qps = total_qps
  1238. self.intranet_qps = intranet_qps
  1239. self.extranet_qps = extranet_qps
  1240. class GetUserQosInfoResult(RequestResult, UserQosInfo):
  1241. def __init__(self, resp):
  1242. RequestResult.__init__(self, resp)
  1243. UserQosInfo.__init__(self)
  1244. class GetBucketQosInfoResult(RequestResult, BucketQosInfo):
  1245. def __init__(self, resp):
  1246. RequestResult.__init__(self, resp)
  1247. BucketQosInfo.__init__(self)
  1248. class BucketUserQos(object):
  1249. """用户服务质量。
  1250. :param int storage_capacity: 容量大小,单位GB
  1251. """
  1252. def __init__(self, storage_capacity=None):
  1253. self.storage_capacity = storage_capacity
  1254. class GetBucketUserQosResult(RequestResult, BucketUserQos):
  1255. def __init__(self, resp):
  1256. RequestResult.__init__(self, resp)
  1257. BucketUserQos.__init__(self)
  1258. ASYNC_FETCH_TASK_STATE_RUNNING = 'Running'
  1259. ASYNC_FETCH_TASK_STATE_RETRY = 'Retry'
  1260. ASYNC_FETCH_TASK_STATE_FETCH_SUCCESS_CALLBACK_FAILED = 'FetchSuccessCallbackFailed'
  1261. ASYNC_FETCH_TASK_STATE_FAILED= 'Failed'
  1262. ASYNC_FETCH_TASK_STATE_SUCCESS = 'Success'
  1263. class AsyncFetchTaskConfiguration(object):
  1264. """异步获取文件到bucket到任务配置项
  1265. :param url: 源文件url
  1266. :type url: str
  1267. :param object_name: 文件的名称。
  1268. :type task_state: str
  1269. :param host: 文件所在服务器的host,如果不指定则会根据url解析填充。
  1270. :type host: str
  1271. :param content_md5: 指定校验源文件的md5
  1272. :type content_md5: str
  1273. :param callback: 指定fetch成功知乎回调给用户的引用服务器,如果不指定则不回调。
  1274. callback格式与OSS上传回调的请求头callback一致,详情见官网。
  1275. :type callback: str
  1276. :param ignore_same_key: 默认为True表示如果文件已存在则忽略本次任务,api调用将会报错。如果为False,则会覆盖已存在的object。
  1277. :type ignore_same_key: bool
  1278. """
  1279. def __init__(self,
  1280. url,
  1281. object_name,
  1282. host = None,
  1283. content_md5 = None,
  1284. callback = None,
  1285. ignore_same_key = None):
  1286. self.url = url
  1287. self.object_name = object_name
  1288. self.host = host
  1289. self.content_md5 = content_md5
  1290. self.callback = callback
  1291. self.ignore_same_key = ignore_same_key
  1292. class PutAsyncFetchTaskResult(RequestResult):
  1293. def __init__(self, resp, task_id=None):
  1294. RequestResult.__init__(self, resp)
  1295. self.task_id = task_id
  1296. class GetAsyncFetchTaskResult(RequestResult):
  1297. """获取异步获取文件到bucket的任务的返回结果
  1298. :param task_id: 任务id
  1299. :type task_id: str
  1300. :param task_state: 取值范围:oss2.models.ASYNC_FETCH_TASK_STATE_RUNNING, oss2.models.ASYNC_FETCH_TASK_STATE_RETRY,
  1301. oss2.models.ASYNC_FETCH_TASK_STATE_FETCH_SUCCESS_CALLBACK_FAILED, oss2.models.ASYNC_FETCH_TASK_STATE_FAILED,
  1302. oss2.models.ASYNC_FETCH_TASK_STATE_SUCCESS。
  1303. :type task_state: str
  1304. :param error_msg: 错误信息
  1305. :type error_msg: str
  1306. :param task_config: 任务配置信息
  1307. :type task_config: class:`AsyncFetchTaskConfiguration <oss2.models.AsyncFetchTaskConfiguration>`
  1308. """
  1309. def __init__(self, resp,
  1310. task_id=None,
  1311. task_state=None,
  1312. error_msg=None,
  1313. task_config=None):
  1314. RequestResult.__init__(self, resp)
  1315. self.task_id = task_id
  1316. self.task_state = task_state
  1317. self.error_msg = error_msg
  1318. self.task_config = task_config
  1319. INVENTORY_INCLUDED_OBJECT_VERSIONS_CURRENT = "Current"
  1320. INVENTORY_INCLUDED_OBJECT_VERSIONS_ALL = "All"
  1321. INVENTORY_FREQUENCY_DAILY = "Daily"
  1322. INVENTORY_FREQUENCY_WEEKLY = "Weekly"
  1323. INVENTORY_FORMAT_CSV = "CSV"
  1324. FIELD_SIZE = "Size"
  1325. FIELD_LAST_MODIFIED_DATE = "LastModifiedDate"
  1326. FIELD_STORAG_CLASS = "StorageClass"
  1327. FIELD_ETAG = "ETag"
  1328. FIELD_IS_MULTIPART_UPLOADED = "IsMultipartUploaded"
  1329. FIELD_ENCRYPTION_STATUS = "EncryptionStatus"
  1330. class InventoryConfiguration(object):
  1331. """清单配置
  1332. :param str inventory_id: 清单的识别id
  1333. :type inventory_id: str
  1334. :param is_enabled: 是否生效
  1335. :type is_enabled: bool
  1336. :param include_object_versions: 包含的对象版本,
  1337. 取值可以是 INVENTORY_INCLUDE_OBJECT_VERSIONS_CURRENT 或者 INVENTORY_INCLUDE_OBJECT_VERSIONS_ALL.
  1338. :type include_object_versions: str
  1339. :param inventory_filter: 清单的过滤器
  1340. :type inventory_filter: class:`InventoryFilter <oss2.models.InventoryFilter>`
  1341. :param inventory_destination: 清单的目标地址
  1342. :type inventory_destination: class:`InventoryDestination <oss2.models.InventoryDestination>`
  1343. :param inventory_schedule: 清单的生成周期
  1344. :type inventory_schedule: class:`InventoryDestination <oss2.models.InventorySchedule>`
  1345. :param optional_fields: 清单中包含的字段
  1346. :type optional_fields: str
  1347. """
  1348. def __init__(self,
  1349. inventory_id=None,
  1350. is_enabled=None,
  1351. included_object_versions=None,
  1352. inventory_filter=None,
  1353. inventory_destination=None,
  1354. inventory_schedule=None,
  1355. optional_fields=None):
  1356. self.inventory_id = inventory_id
  1357. self.is_enabled = is_enabled
  1358. self.included_object_versions = included_object_versions
  1359. self.inventory_filter = inventory_filter
  1360. self.inventory_destination = inventory_destination
  1361. self.inventory_schedule = inventory_schedule
  1362. self.optional_fields = optional_fields or []
  1363. class InventoryFilter(object):
  1364. """清单过滤器
  1365. :param prefix: 清单筛选的前缀, 指定前缀后,清单将筛选出符合前缀设置的对象。
  1366. :type prefix: str
  1367. """
  1368. def __init__(self, prefix=None):
  1369. self.prefix = prefix
  1370. class InventorySchedule(object):
  1371. """清单的生成周期
  1372. :param frequency: 清单的生成周期,可以是oss2.models.INVENTORY_FREQUENCY_DAILY 或者 oss2.models.INVENTORY_FREQUENCY_WEEKLY
  1373. :type frequency: str
  1374. """
  1375. def __init__(self, frequency):
  1376. self.frequency = frequency
  1377. class InventoryDestination(object):
  1378. """清单的接收目的地址
  1379. :param bucket_destination: OSS Bucket作为目的地,需要配置的OSS Bucket信息。
  1380. :type bucket_destination: class:`InventoryBucketDestination <oss2.models.InventoryBucketDestination>`
  1381. """
  1382. def __init__(self, bucket_destination=None):
  1383. self.bucket_destination = bucket_destination
  1384. class InventoryBucketDestination(object):
  1385. """OSS Bucket作为清单目的地的配置
  1386. :param account_id: 接收方的account id
  1387. :type account_id: class:`InventoryBucketDestination <oss2.models.InventoryBucketDestination>`
  1388. :param role_arn: 接收方的ram role arn
  1389. :type role_arn: str
  1390. :param bucket: OSS Bucket名称
  1391. :type bucket: str
  1392. :param inventory_format: 清单格式,可以是 oss2.models.INVENTORY_FORMAT_CSV。
  1393. :type inventory_format: str
  1394. :param prefix: 清单文件的存储路径前缀
  1395. :type prefix: str
  1396. :param sse_kms_encryption: 服务端使用kms作为清单的加密项
  1397. :type sse_kms_encryption: class:`InventoryServerSideEncryptionKMS <oss2.models.InventoryServerSideEncryptionKMS>`
  1398. :param sse_oss_encryption: OSS服务端为清单提供加密支持。
  1399. :type sse_oss_encryption: class:`InventoryServerSideEncryptionOSS <oss2.models.InventoryServerSideEncryptionOSS>`
  1400. """
  1401. def __init__(self,
  1402. account_id=None,
  1403. role_arn=None,
  1404. bucket=None,
  1405. inventory_format=None,
  1406. prefix=None,
  1407. sse_kms_encryption=None,
  1408. sse_oss_encryption=None):
  1409. if all((sse_kms_encryption, sse_oss_encryption)):
  1410. raise ClientError('only one encryption method between sse_kms_encryption and sse_oss_encryption can be chosen.')
  1411. self.account_id = account_id
  1412. self.role_arn = role_arn
  1413. self.bucket = bucket
  1414. self.inventory_format = inventory_format
  1415. self.prefix = prefix
  1416. self.sse_kms_encryption = sse_kms_encryption
  1417. self.sse_oss_encryption = sse_oss_encryption
  1418. class InventoryServerSideEncryptionKMS(object):
  1419. """服务端使用kms加密清单的加密项。
  1420. :param key_id: kms key id
  1421. :type key_id: str
  1422. """
  1423. def __init__(self, key_id):
  1424. self.key_id = key_id
  1425. class InventoryServerSideEncryptionOSS(object):
  1426. """OSS服务端加密清单的加密项。
  1427. """
  1428. pass
  1429. class GetInventoryConfigurationResult(RequestResult, InventoryConfiguration):
  1430. """获取清单配置的操作返回结果
  1431. """
  1432. def __init__(self, resp):
  1433. RequestResult.__init__(self, resp)
  1434. InventoryConfiguration.__init__(self)
  1435. class ListInventoryConfigurationsResult(RequestResult):
  1436. """列出清单配置的操作返回结果
  1437. :param inventory_configurations: list of class:`InventoryConfiguration <oss2.models.InventoryConfiguration>`
  1438. :type inventory_configurations: list
  1439. :param is_truncated: 罗列结果是否是截断的, true: 本地罗列结果并不完整, False: 所有清单配置项已经罗列完毕。
  1440. :type is_truncated: bool
  1441. :param continuaiton_token: 本地罗列操作所携带的continuaiton_token
  1442. :type continuaiton_token: str
  1443. :param next_continuation_token: 下一个罗列操作携带的token
  1444. :type next_continuation_token: str
  1445. """
  1446. def __init__(self, resp):
  1447. RequestResult.__init__(self, resp)
  1448. self.inventory_configurations= []
  1449. self.is_truncated = None
  1450. self.continuaiton_token = None
  1451. self.next_continuation_token = None
  1452. RESTORE_TIER_EXPEDITED = 'Expedited'
  1453. RESTORE_TIER_STANDARD = 'Standard'
  1454. RESTORE_TIER_BULK = 'Bulk'
  1455. class ResotreJobParameters(object):
  1456. """冷归档类型(ColdArchive)文件的解冻优先级配置。
  1457. 请使用class:`RestoreJobParameters <oss2.models.RestoreJobParameters>`代替此类。
  1458. :param tier: 解冻优先级, 取值范围:
  1459. oss2.models.RESTORE_TIER_EXPEDITED: 1个小时之内解冻完成。
  1460. oss2.models.RESTORE_TIER_STANDARD: 5小时之内解冻完成。
  1461. oss2.models.RESTORE_TIER_BULK: 10小时之内解冻完成。
  1462. :type tier: str
  1463. """
  1464. def __init__(self, tier):
  1465. self.tier = tier
  1466. class RestoreJobParameters(object):
  1467. """冷归档类型(ColdArchive)文件的解冻优先级配置。
  1468. :param tier: 解冻优先级, 取值范围:
  1469. oss2.models.RESTORE_TIER_EXPEDITED: 1个小时之内解冻完成。
  1470. oss2.models.RESTORE_TIER_STANDARD: 5小时之内解冻完成。
  1471. oss2.models.RESTORE_TIER_BULK: 10小时之内解冻完成。
  1472. :type tier: str
  1473. """
  1474. def __init__(self, tier):
  1475. self.tier = tier
  1476. class RestoreConfiguration(object):
  1477. """Archive, ColdArchive类型文件的解冻配置
  1478. :param days: 解冻之后保持解冻状态的天数。
  1479. :type days: int
  1480. :param job_parameters: 解冻优先级配置, 解冻冷归档(ColdArchive)类型的文件才需要此配置。如果不配置此项,
  1481. 解冻优先级默认为 oss2.models.RESTORE_TIER_STANDARD: 5小时之内解冻完成。
  1482. :type job_parameters: class:`RestoreJobParameters <oss2.models.RestoreJobParameters>`
  1483. """
  1484. def __init__(self, days, job_parameters=None):
  1485. self.days = days
  1486. self.job_parameters = job_parameters
  1487. class InitBucketWormResult(RequestResult):
  1488. """创建合规保留策略的返回结果
  1489. :param str worm_id: 合规保留策略的id
  1490. """
  1491. def __init__(self, resp):
  1492. super(InitBucketWormResult, self).__init__(resp)
  1493. self.worm_id = None
  1494. class GetBucketWormResult(RequestResult):
  1495. """获取合规保留策略的返回结果
  1496. :param str worm_id: 合规保留策略的id
  1497. """
  1498. def __init__(self, resp):
  1499. super(GetBucketWormResult, self).__init__(resp)
  1500. # 合规保留策略的id
  1501. self.worm_id = None
  1502. # 合规保留策略的状态
  1503. self.worm_state = None
  1504. # object的保留天数
  1505. self.retention_period_days = None
  1506. # 合规保留策略的创建日期
  1507. self.creation_date = None