From fbd0be50c8d9a47f7560a7eef11ee899ff3a70b3 Mon Sep 17 00:00:00 2001 From: yanwen Date: Fri, 25 Feb 2022 21:14:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B33.22.2=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 + README_CN.md | 8 +- ...icloud-obs-sdk-python_3.22.2.tar.gz.sha256 | 1 + release/huaweicloud-obs-sdk-python_3.22.2.zip | Bin 0 -> 137891 bytes src/obs/__init__.py | 6 +- src/obs/client.py | 305 +++++++++++++++++- src/obs/const.py | 22 +- src/obs/convertor.py | 127 +++++++- src/obs/model.py | 67 +++- src/setup.py | 7 +- src/tests/conftest.py | 10 + src/tests/test_config.json | 2 + src/tests/test_obs_client.py | 76 ++++- 13 files changed, 602 insertions(+), 38 deletions(-) create mode 100644 release/huaweicloud-obs-sdk-python_3.22.2.tar.gz.sha256 create mode 100644 release/huaweicloud-obs-sdk-python_3.22.2.zip diff --git a/README.md b/README.md index 2c5e5ef..2af6734 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ +Version 3.22.2 + +New Features: + +1. Added interfaces related to virtual buckets +2. Compatibility changes have been made for the use of the Python3 HTTPS parameter + +------------------------------------------------------------------------------------------------- + Version 3.21.8 New Features: diff --git a/README_CN.md b/README_CN.md index 8d37d32..dfd5b9c 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,4 +1,10 @@ -Version 3.21.8 +Version 3.22.2 +新特性: +1. 增加虚拟桶相关接口 +2. 针对Python3 HTTPS参数的使用做了兼容修改 + +------------------------------------------------------------------------------------------------- +Version 3.21.8 新特性: diff --git a/release/huaweicloud-obs-sdk-python_3.22.2.tar.gz.sha256 b/release/huaweicloud-obs-sdk-python_3.22.2.tar.gz.sha256 new file mode 100644 index 0000000..76b9aa3 --- /dev/null +++ b/release/huaweicloud-obs-sdk-python_3.22.2.tar.gz.sha256 @@ -0,0 +1 @@ +c1be9812a702d1301be1bbeb07da91fd18d8dd89895169c5a229b18b59d08f9d *huaweicloud-obs-sdk-python_.tar.gz diff --git a/release/huaweicloud-obs-sdk-python_3.22.2.zip b/release/huaweicloud-obs-sdk-python_3.22.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..05be0e335de16d5fe1fb0d6ef96f6c9a9ee5279c GIT binary patch literal 137891 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

J;}T-Ui36doV~O_W3rZ5Z8taP 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

}OVM#QQCpr#13 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 1: key = args[1] elif kwargs.get('bucketName'): @@ -139,12 +141,17 @@ def wrapper(*args, **kwargs): try: if obsClient: obsClient.log_client.log(INFO, 'enter %s ...' % func.__name__) - key = _isCopyOrList(func.__name__, obsClient, *args, **kwargs) + key = _getCacheKey(func.__name__, obsClient, *args, **kwargs) if obsClient.is_signature_negotiation: - authType, resp = _is_signature_negotiation(obsClient, func.__name__, key) - if not authType: - return resp + black_list = ['listAvailableZoneInfo', 'createVirtualBucket', 'createBucketAlias', + 'listBucketAlias', 'deleteBucketAlias'] + if func.__name__ in black_list: + obsClient.thread_local.signature = const.OBS_SIGNATURE + else: + authType, resp = _is_signature_negotiation(obsClient, func.__name__, key) + if not authType: + return resp ret = func(*args, **kwargs) except Exception as e: if obsClient and obsClient.log_client: @@ -261,6 +268,7 @@ def __init__(self, access_key_id='', secret_access_key='', is_secure=True, serve else: self.ha = convertor.Adapter(self.signature) self.convertor = convertor.Convertor(self.signature, self.ha) + self.json_response_method_name = 'GetJsonResponse' @staticmethod def _parse_server_hostname(server): @@ -667,7 +675,7 @@ def _get_server_connection_use_http1x(self, is_secure, server, port, proxy_host, conn = httplib.HTTPSConnection(server, port=port, timeout=self.timeout) else: conn = httplib.HTTPSConnection(server, port=port, timeout=self.timeout, context=self.context, - check_hostname=False) + check_hostname=None) else: conn = httplib.HTTPConnection(server, port=port, timeout=self.timeout) @@ -1272,11 +1280,22 @@ def _getApiVersion(self, bucketName=''): return const.V2_SIGNATURE, res @funcCache - def listBuckets(self, isQueryLocation=True, extensionHeaders=None): + def listBuckets(self, isQueryLocation=True, extensionHeaders=None, bucketType=None): + """ + Obtain a bucket list. + :param isQueryLocation: Whether to query the bucket location. + :param extensionHeaders: Other headers + :param bucketType: Type of the buckets you want to list. The value can be OBJECT or POSIX, or be left blank. + "OBJECT": To list common buckets. + "POSIX": To list parallel file systems. + If this parameter is left blank, both buckets and parallel file systems will be listed. + :return: A bucket list + """ if self.is_cname: raise Exception('listBuckets is not allowed in custom domain mode') return self._make_get_request(methodName='listBuckets', extensionHeaders=extensionHeaders, - **self.convertor.trans_list_buckets(isQueryLocation=isQueryLocation)) + **self.convertor.trans_list_buckets(isQueryLocation=isQueryLocation, + bucketType=bucketType)) @funcCache def createBucket(self, bucketName, header=None, location=None, extensionHeaders=None): @@ -2174,6 +2193,270 @@ def getBucketRequestPayment(self, bucketName, extensionHeaders=None): return self._make_get_request(bucketName, pathArgs={'requestPayment': None}, methodName='getBucketRequestPayment', extensionHeaders=extensionHeaders) + # begin virtual bucket related + # begin virtual bucket related + # begin virtual bucket related + + @funcCache + def listAvailableZoneInfo(self, regionId, token, extensionHeaders=None): + self._assert_not_null(regionId, 'regionId should not be empty') + self._assert_not_null(token, 'token should not be empty') + + pathArgs = {'regionId': regionId} + header = { + const.X_AUTH_TOKEN_HEADER: token, + const.CONTENT_TYPE_HEADER: const.MIME_TYPES.get('json') + } + + return self._make_get_request( + objectKey='v1/services/clusters', + pathArgs=pathArgs, + headers=header, + methodName=self.json_response_method_name, + extensionHeaders=extensionHeaders + ) + + @funcCache + def createBucketAlias(self, bucketName, aliasInfo=None, extensionHeaders=None): + if aliasInfo is None: + raise Exception('aliasInfo is None') + self._assert_not_null(aliasInfo.get('bucket1'), 'bucket1 should not be empty') + self._assert_not_null(aliasInfo.get('bucket2'), 'bucket2 should not be empty') + return self._make_put_request(bucketName, extensionHeaders=extensionHeaders, + **self.convertor.trans_set_bucket_alias(aliasInfo=aliasInfo)) + + @funcCache + def bindBucketAlias(self, bucketName, aliasInfo=None, extensionHeaders=None): + if aliasInfo is None: + raise Exception('aliasInfo is None') + self._assert_not_null(aliasInfo.get('alias'), 'bucket alias should not be empty') + return self._make_put_request(bucketName, extensionHeaders=extensionHeaders, + **self.convertor.trans_bind_bucket_alias(aliasInfo=aliasInfo)) + + @funcCache + def deleteBucketAlias(self, bucketAlias, extensionHeaders=None): + self._assert_not_null(bucketAlias, 'bucket alias should not be empty') + pathArgs = {const.OBSBUCKETALIAS_PARAM: None} + return self._make_delete_request(bucketName=bucketAlias, pathArgs=pathArgs, extensionHeaders=extensionHeaders) + + @funcCache + def unbindBucketAlias(self, bucketName, extensionHeaders=None): + pathArgs = {const.OBSALIAS_PARAM: None} + return self._make_delete_request(bucketName, pathArgs=pathArgs, extensionHeaders=extensionHeaders) + + @funcCache + def getBucketAlias(self, bucketName, extensionHeaders=None): + pathArgs = {const.OBSALIAS_PARAM: None} + return self._make_get_request(bucketName, pathArgs=pathArgs, methodName='getBucketAlias', + extensionHeaders=extensionHeaders) + + @funcCache + def listBucketAlias(self, extensionHeaders=None): + pathArgs = {const.OBSBUCKETALIAS_PARAM: None} + return self._make_get_request(pathArgs=pathArgs, methodName='ListBucketAlias', + extensionHeaders=extensionHeaders) + + @funcCache + def createVirtualBucket(self, regionId, token, bucketName1, bucketName2, bucketAlias, agencyName, header=None): + # step 1: 列举指定region下的集群信息 + azResp = self.listAvailableZoneInfo(regionId, token) + if azResp.status != 200: + raise Exception('list AZ infos failed, resp: %s' % azResp) + + firstAZCgId, secondAZCgId = self._get_cluster_group_id(azResp) + + # step 2: 指定集群id创桶 + self._create_bucket_with_cluster_id(firstAZCgId, secondAZCgId, bucketName1, bucketName2, bucketAlias, header) + + # step 3: 创建一次别名 + aliasInfo = BucketAliasModel() + aliasInfo.bucket1 = bucketName1 + aliasInfo.bucket2 = bucketName2 + cbaResp = self.createBucketAlias(bucketAlias, aliasInfo) + if cbaResp.status != 200: + self._clear_virtual_bucket(const.VIRTUAL_BUCKET_CREATEBUCKET_STAGED, bucketName1, bucketName2, bucketAlias) + raise Exception('create bucket alias failed, resp: %s' % cbaResp) + + # step 4: 绑定两次别名,为两个真实桶分别绑定 + aliasInfo.alias = bucketAlias + bindResp = self.bindBucketAlias(bucketName1, aliasInfo) + if bindResp.status != 200: + self._clear_virtual_bucket(const.VIRTUAL_BUCKET_CREATEALIAS_STAGED, bucketName1, bucketName2, bucketAlias) + raise Exception('binding bucket alias failed, resp: %s' % bindResp) + + bindResp = self.bindBucketAlias(bucketName2, aliasInfo) + if bindResp.status != 200: + self._clear_virtual_bucket(const.VIRTUAL_BUCKET_BINDALIAS_STAGED, bucketName1, bucketName2, bucketAlias) + raise Exception('binding bucket alias failed, resp: %s' % bindResp) + + # step 5: 双向配置复制关系,并开启历史对象复制 + replicationResp = self._set_virtual_replication(agencyName, bucketName1, bucketName2) + if replicationResp.status != 200: + self._clear_virtual_bucket(const.VIRTUAL_BUCKET_BINDALIAS_STAGED, bucketName1, bucketName2, bucketAlias) + raise Exception('set replication failed, resp: %s' % replicationResp) + + replicationResp = self._set_virtual_replication(agencyName, bucketName2, bucketName1) + if replicationResp.status != 200: + self._clear_virtual_bucket(const.VIRTUAL_BUCKET_BINDALIAS_STAGED, bucketName1, bucketName2, bucketAlias) + raise Exception('set replication failed, resp: %s' % replicationResp) + + return {'code': 'OK', 'message': 'create virtual bucket success', 'virtualBucketName': bucketAlias, + 'bucketName1': bucketName1, 'bucketName2': bucketName2} + + def _get_cluster_group_id(self, azResp): + azJsonResp = util.jsonLoadsForPy2(azResp.body) if const.IS_PYTHON2 else json.loads(azResp.body) + azInfos = azJsonResp.get('infos') + + if len(azInfos) != const.VIRTUAL_BUCKET_NEED_AZ_COUNT: + raise Exception('the number of AZs does not meet the requirements') + + firstAZKey = next(iter(azInfos)) + firstAZValue = azInfos.get(firstAZKey) + if len(firstAZValue) == 0: + raise Exception('no cluster exists in the AZ, AZ key: %s' % firstAZKey) + + firstAZCgId = firstAZValue[0].get(const.KEY_CLUSTER_GROUP_ID) + if not firstAZCgId: + raise Exception('this AZs first cluster group id is None, AZ key: %s' % firstAZKey) + + secondAZKey = list(azInfos.keys())[-1] + secondAZValue = azInfos.get(secondAZKey) + if len(secondAZValue) == 0: + raise Exception('no cluster exists in the AZ, AZ key: %s' % secondAZKey) + + secondAZCgId = secondAZValue[0].get(const.KEY_CLUSTER_GROUP_ID) + if not secondAZCgId: + raise Exception('this AZs first cluster group id is None, AZ key: %s' % secondAZKey) + + return firstAZCgId, secondAZCgId + + def _create_bucket_with_cluster_id(self, firstAZCgId, secondAZCgId, bucketName1, bucketName2, bucketAlias, header): + # 判断桶是否存在 + bucket1CgId, bucket2CgId = self._head_virtual_bucket(bucketName1, bucketName2) + + # 两个桶都存在,且cluster group id一致 + if bucket1CgId and bucket2CgId and bucket1CgId == bucket2CgId: + raise Exception('create bucket failed, both buckets exist and cluster group id is the same') + + extensionHeaders = ExtensionHeader() + + # 只存在桶1 + if bucket1CgId: + extensionHeaders.locationClusterGroupId = secondAZCgId if bucket1CgId == firstAZCgId else firstAZCgId + cbResp = self.createBucket(bucketName2, header=header, extensionHeaders=extensionHeaders) + if cbResp.status != 200: + self._clear_virtual_bucket(const.VIRTUAL_BUCKET_CREATEBUCKET_STAGED, bucketName1, bucketName2, + bucketAlias) + raise Exception('create bucket failed, cluster group id: %s, resp: %s' % ( + extensionHeaders.locationClusterGroupId, cbResp)) + + # 只存在桶2 + if bucket2CgId: + extensionHeaders.locationClusterGroupId = secondAZCgId if bucket2CgId == firstAZCgId else firstAZCgId + cbResp = self.createBucket(bucketName1, header=header, extensionHeaders=extensionHeaders) + if cbResp.status != 200: + self._clear_virtual_bucket(const.VIRTUAL_BUCKET_CREATEBUCKET_STAGED, bucketName1, bucketName2, + bucketAlias) + raise Exception('create bucket failed, cluster group id: %s, resp: %s' % ( + extensionHeaders.locationClusterGroupId, cbResp)) + + # 两个桶都不存在 + if not bucket1CgId and not bucket2CgId: + extensionHeaders.locationClusterGroupId = firstAZCgId + cbResp = self.createBucket(bucketName1, header=header, extensionHeaders=extensionHeaders) + if cbResp.status != 200: + self._clear_virtual_bucket(const.VIRTUAL_BUCKET_CREATEBUCKET_STAGED, bucketName1, bucketName2, + bucketAlias) + raise Exception('create bucket failed, cluster group id: %s, resp: %s' % (firstAZCgId, cbResp)) + + extensionHeaders.locationClusterGroupId = secondAZCgId + cbResp = self.createBucket(bucketName2, header=header, extensionHeaders=extensionHeaders) + if cbResp.status != 200: + self._clear_virtual_bucket(const.VIRTUAL_BUCKET_CREATEBUCKET_STAGED, bucketName1, bucketName2, + bucketAlias) + raise Exception('create bucket failed, cluster group id: %s, resp: %s' % (secondAZCgId, cbResp)) + + def _head_virtual_bucket(self, bucketName1, bucketName2): + bucket1CgId = None + bucket2CgId = None + + head1Resp = self.headBucket(bucketName1) + if head1Resp.status == 200: + for h in head1Resp.header: + if const.LOCATION_CLUSTERGROUP_ID in h: + bucket1CgId = h[1] + break + + head2Resp = self.headBucket(bucketName2) + if head2Resp.status == 200: + for h in head2Resp.header: + if const.LOCATION_CLUSTERGROUP_ID in h: + bucket2CgId = h[1] + break + + return bucket1CgId, bucket2CgId + + def _set_virtual_replication(self, agencyName, sourceBucketName, destBucketName): + replication = Replication() + replication.agency = agencyName + + # rule的默认规则如下: + # id:{sourceBucketName}_to_{destBucketName} + # prefix为空 + # status为Enabled + # storageClass为STANDARD + # deleteData为Enabled + # historicalObjectReplication为Enabled + _rules = [] + replicationRule = ReplicationRule() + replicationRule.id = sourceBucketName + '_to_' + destBucketName + replicationRule.prefix = '' + replicationRule.status = 'Enabled' + replicationRule.bucket = destBucketName + replicationRule.storageClass = 'STANDARD' + replicationRule.deleteData = 'Enabled' + replicationRule.historicalObjectReplication = 'Enabled' + + _rules.append(replicationRule) + replication.replicationRules = _rules + resp = self.setBucketReplication(sourceBucketName, replication) + return resp + + def _clear_virtual_bucket(self, staged, bucketName1, bucketName2, bucketAlias): + # staged取值: + # 1:创建真实桶 + # 2:创建桶别名 + # 3:绑定桶别名 + if staged >= const.VIRTUAL_BUCKET_BINDALIAS_STAGED: + # 解绑桶别名 + unbindResp = self.unbindBucketAlias(bucketName1) + if unbindResp.status != 204: + raise Exception('unbind bucket alias failed, resp: %s' % unbindResp) + + unbindResp = self.unbindBucketAlias(bucketName2) + if unbindResp.status != 204: + raise Exception('unbind bucket alias failed, resp: %s' % unbindResp) + + if staged >= const.VIRTUAL_BUCKET_CREATEALIAS_STAGED: + # 删除桶别名 + deleteAliasResp = self.deleteBucketAlias(bucketAlias) + if deleteAliasResp.status != 204: + raise Exception('delete bucket alias failed, resp: %s' % deleteAliasResp) + + if staged >= const.VIRTUAL_BUCKET_CREATEBUCKET_STAGED: + # 删除真实桶 + deleteBucketResp = self.deleteBucket(bucketName1) + if deleteBucketResp.status != 204: + raise Exception('delete bucket failed, resp: %s' % deleteBucketResp) + + deleteBucketResp = self.deleteBucket(bucketName2) + if deleteBucketResp.status != 204: + raise Exception('delete bucket failed, resp: %s' % deleteBucketResp) + + # end virtual bucket related + # end virtual bucket related + # end virtual bucket related + @funcCache def uploadFile(self, bucketName, objectKey, uploadFile, partSize=9 * 1024 * 1024, taskNum=1, enableCheckpoint=False, checkpointFile=None, diff --git a/src/obs/const.py b/src/obs/const.py index 1e193f4..5b9943c 100644 --- a/src/obs/const.py +++ b/src/obs/const.py @@ -26,7 +26,6 @@ CONTENT_ENCODING_HEADER = 'Content-Encoding' CONTENT_LANGUAGE_HEADER = 'Content-Language' EXPIRES_HEADER = 'Expires' - DATE_HEADER = 'Date' CONTENT_LIST = [CONTENT_TYPE_HEADER.lower(), CONTENT_MD5_HEADER.lower(), DATE_HEADER.lower()] @@ -54,6 +53,14 @@ ETAG_HEADER = 'ETag' LAST_MODIFIED_HEADER = 'Last-Modified' +LOCATION_CLUSTERGROUP_ID = 'location-clustergroup-id' +X_AUTH_TOKEN_HEADER = 'X-Auth-Token' +KEY_CLUSTER_GROUP_ID = 'cgId' +VIRTUAL_BUCKET_NEED_AZ_COUNT = 2 +VIRTUAL_BUCKET_CREATEBUCKET_STAGED = 1 +VIRTUAL_BUCKET_CREATEALIAS_STAGED = 2 +VIRTUAL_BUCKET_BINDALIAS_STAGED = 3 + VERSION_ID_PARAM = 'versionId' RESPONSE_CACHE_CONTROL_PARAM = 'response-cache-control' RESPONSE_CONTENT_DISPOSITION_PARAM = 'response-content-disposition' @@ -62,6 +69,8 @@ RESPONSE_CONTENT_TYPE_PARAM = 'response-content-type' RESPONSE_EXPIRES_PARAM = 'response-expires' X_IMAGE_PROCESS_PARAM = 'x-image-process' +OBSALIAS_PARAM = 'obsalias' +OBSBUCKETALIAS_PARAM = 'obsbucketalias' HTTP_METHOD_PUT = 'PUT' HTTP_METHOD_POST = 'POST' @@ -87,7 +96,7 @@ DEFAULT_TASK_NUM = 8 DEFAULT_TASK_QUEUE_SIZE = 20000 -OBS_SDK_VERSION = '3.21.8' +OBS_SDK_VERSION = '3.21.12' V2_META_HEADER_PREFIX = 'x-amz-meta-' V2_HEADER_PREFIX = 'x-amz-' @@ -176,7 +185,11 @@ 'x-workflow-execution-state', 'x-workflow-execution-type', 'x-workflow-next-marker', - 'obsworkflowtriggerpolicy' + 'obsworkflowtriggerpolicy', + + # virtual bucket api + 'obsbucketalias', + 'obsalias' ) ALLOWED_REQUEST_HTTP_HEADER_METADATA_NAMES = ( @@ -203,7 +216,8 @@ 'if-match', 'if-none-match', 'last-modified', - 'content-range' + 'content-range', + 'x-auth-token' ) ALLOWED_RESPONSE_HTTP_HEADER_METADATA_NAMES = ( diff --git a/src/obs/convertor.py b/src/obs/convertor.py index a8eb4aa..9cf1276 100644 --- a/src/obs/convertor.py +++ b/src/obs/convertor.py @@ -16,6 +16,7 @@ import xml.etree.cElementTree as ET except Exception: import xml.etree.ElementTree as ET + import json from obs import util from obs import const @@ -36,7 +37,7 @@ from obs.model import DateTime, ListObjectsResponse, Content, CorsRule, ObjectVersionHead, ObjectVersion, \ ObjectDeleteMarker, DeleteObjectResult, NoncurrentVersionExpiration, NoncurrentVersionTransition, Rule, Condition, \ Redirect, FilterRule, FunctionGraphConfiguration, Upload, CompleteMultipartUploadResponse, ListPartsResponse, \ - Grant, ReplicationRule, Transition, Grantee + Grant, ReplicationRule, Transition, Grantee, BucketAliasModel, ListBucketAliasModel if const.IS_PYTHON2: from urllib import unquote_plus, quote_plus @@ -87,6 +88,10 @@ def acl_header(self): def epid_header(self): return self._get_header_prefix() + 'epid' + @staticmethod + def pfs_header(): + return 'x-obs-fs-file-interface' + def date_header(self): return self._get_header_prefix() + 'date' @@ -116,6 +121,10 @@ def indicator_header(): def location_header(self): return self._get_header_prefix() + 'location' + @staticmethod + def queryPFS_header(): + return 'x-obs-bucket-type' + def bucket_region_header(self): return self._get_header_prefix() + 'bucket-location' if self.is_obs \ else self._get_header_prefix() + 'bucket-region' @@ -207,6 +216,9 @@ def object_type_header(): def request_payer_header(self): return self._get_header_prefix() + 'request-payer' + def location_clustergroup_id_header(self): + return self._get_header_prefix() + const.LOCATION_CLUSTERGROUP_ID + def oef_marker_header(self): return self._get_header_prefix() + 'oef-marker' @@ -305,6 +317,8 @@ def trans_create_bucket(self, **kwargs): self.ha.adapt_storage_class(header.get('storageClass'))) self._put_key_value(headers, self.ha.az_redundancy_header(), header.get('availableZone')) self._put_key_value(headers, self.ha.epid_header(), header.get('epid')) + if header.get('isPFS'): + self._put_key_value(headers, self.ha.pfs_header(), "Enabled") extensionGrants = header.get('extensionGrants') if extensionGrants is not None and len(extensionGrants) > 0: grantDict = {} @@ -331,6 +345,8 @@ def trans_list_buckets(self, **kwargs): headers = {} if kwargs.get('isQueryLocation'): self._put_key_value(headers, self.ha.location_header(), 'true') + if kwargs.get('bucketType'): + self._put_key_value(headers, self.ha.queryPFS_header(), kwargs.get('bucketType')) return {'headers': headers} def trans_list_objects(self, **kwargs): @@ -1049,16 +1065,23 @@ def trans_replication(self, replication): ET.SubElement(ruleEle, 'Prefix').text = util.safe_decode(replicationRule['prefix']) if replicationRule.get('status') is not None: ET.SubElement(ruleEle, 'Status').text = util.to_string(replicationRule['status']) + if replicationRule.get('historicalObjectReplication') is not None: + ET.SubElement(ruleEle, 'HistoricalObjectReplication').text = util.to_string( + replicationRule['historicalObjectReplication']) - if replication.get('bucket') is not None: + if replicationRule.get('bucket') is not None: destinationEle = ET.SubElement(ruleEle, 'Destination') bucket_name = util.to_string(replicationRule['bucket']) bucket_name = bucket_name if self.is_obs else bucket_name if bucket_name.startswith( 'arn:aws:s3:::') else 'arn:aws:s3:::' + bucket_name ET.SubElement(destinationEle, 'Bucket').text = bucket_name + if replicationRule.get('storageClass') is not None: - ET.SubElement(destinationEle, 'Bucket').text = self.ha.adapt_storage_class( + ET.SubElement(destinationEle, 'StorageClass').text = self.ha.adapt_storage_class( replicationRule['storageClass']) + + if replicationRule.get('deleteData') is not None: + ET.SubElement(destinationEle, 'DeleteData').text = util.to_string(replicationRule['deleteData']) return ET.tostring(root, 'UTF-8') @staticmethod @@ -1070,7 +1093,9 @@ def trans_bucket_request_payment(payer): def trans_get_extension_headers(self, headers): _headers = {} if headers is not None and len(headers) > 0: - self._put_key_value(_headers, self.ha.request_payer_header(), (headers.get('requesterPayer'))) + self._put_key_value(_headers, self.ha.request_payer_header(), headers.get('requesterPayer')) + self._put_key_value(_headers, self.ha.location_clustergroup_id_header(), + headers.get('locationClusterGroupId')) return _headers # OEF trans func @@ -1113,6 +1138,16 @@ def _find_item(root, item_name, encoding_type=None): return util.to_string(unquote_plus(result)) return util.to_string(result) + @staticmethod + def _find_text(result, encoding_type=None): + if result is None: + return None + if const.IS_PYTHON2: + result = util.safe_encode(result) + if encoding_type == "url": + return util.to_string(unquote_plus(result)) + return util.to_string(result) + def parseListBuckets(self, xml, headers=None): root = ET.fromstring(xml) owner = root.find('Owner') @@ -1129,8 +1164,9 @@ def parseListBuckets(self, xml, headers=None): name = self._find_item(bucket, 'Name') d = self._find_item(bucket, 'CreationDate') location = self._find_item(bucket, 'Location') + bucket_type = self._find_item(bucket, 'BucketType') create_date = DateTime.UTCToLocal(d) - curr_bucket = Bucket(name=name, create_date=create_date, location=location) + curr_bucket = Bucket(name=name, create_date=create_date, location=location, bucket_type=bucket_type) entries.append(curr_bucket) return ListBucketsResponse(buckets=entries, owner=Owners) @@ -1873,8 +1909,11 @@ def parseGetBucketReplication(self, xml, headers=None): status = self._find_item(rule, 'Status') bucket = self._find_item(rule, 'Destination/Bucket') storageClass = self._find_item(rule, 'Destination/StorageClass') + deleteData = self._find_item(rule, 'Destination/DeleteData') + historicalObjectReplication = self._find_item(rule, 'Destination/HistoricalObjectReplication') _rules.append( - ReplicationRule(id=_id, prefix=prefix, status=status, bucket=bucket, storageClass=storageClass)) + ReplicationRule(id=_id, prefix=prefix, status=status, bucket=bucket, storageClass=storageClass, + deleteData=deleteData, historicalObjectReplication=historicalObjectReplication)) replication = Replication(agency=agency, replicationRules=_rules) return replication @@ -2066,3 +2105,79 @@ def parseGetTriggerPolicyResponse(jsons, header=None): # end workflow related # end workflow related # end workflow related + + # begin virtual bucket related + # begin virtual bucket related + # begin virtual bucket related + + def trans_set_bucket_alias(self, **kwargs): + aliasInfo = kwargs.get('aliasInfo') + entity = None if aliasInfo is None or len(aliasInfo) == 0 else self.trans_set_aliasInfo(aliasInfo) + return {'pathArgs': {const.OBSBUCKETALIAS_PARAM: None}, 'entity': entity} + + def trans_set_aliasInfo(self, aliasInfo): + root = ET.Element('CreateBucketAlias') + bucketListEle = ET.SubElement(root, 'BucketList') + ET.SubElement(bucketListEle, 'Bucket').text = util.to_string(aliasInfo.get('bucket1')) + ET.SubElement(bucketListEle, 'Bucket').text = util.to_string(aliasInfo.get('bucket2')) + return ET.tostring(root, 'UTF-8') + + def trans_bind_bucket_alias(self, **kwargs): + aliasInfo = kwargs.get('aliasInfo') + entity = None if aliasInfo is None or len(aliasInfo) == 0 else self.trans_bind_aliasInfo(aliasInfo) + return {'pathArgs': {const.OBSALIAS_PARAM: None}, 'entity': entity} + + def trans_bind_aliasInfo(self, aliasInfo): + root = ET.Element('AliasList') + ET.SubElement(root, 'Alias').text = util.to_string(aliasInfo.get('alias')) + return ET.tostring(root, 'UTF-8') + + def parseGetBucketAlias(self, xml, header=None): + root = ET.fromstring(xml) + bucketAliasXml = root.find('BucketAlias') + alias = self._find_item(bucketAliasXml, 'Alias') + bucketAlias = BucketAliasModel(alias=alias) + + bucketListXml = bucketAliasXml.find('BucketList').findall('Bucket') + bucketNameList = [] + for bucketXml in bucketListXml: + bucketNameList.append(self._find_text(bucketXml.text)) + + if len(bucketNameList) > 0: + bucketAlias.bucket1 = bucketNameList[0] + if len(bucketNameList) > 1: + bucketAlias.bucket2 = bucketNameList[1] + + return bucketAlias + + def parseListBucketAlias(self, xml, header=None): + root = ET.fromstring(xml) + ownerXml = root.find('Owner') + ownerID = self._find_item(ownerXml, 'ID') + listBucketAlias = ListBucketAliasModel(owner=ownerID) + + bucketAliasListXml = root.find('BucketAliasList').findall('BucketAlias') + bucketAliasList = [] + for bucketAliasXml in bucketAliasListXml: + alias = self._find_item(bucketAliasXml, 'Alias') + creationDate = self._find_item(bucketAliasXml, 'CreationDate') + bucketAlias = BucketAliasModel(alias=alias, creationDate=creationDate) + + bucketListXml = bucketAliasXml.find('BucketList').findall('Bucket') + bucketNameList = [] + for bucketXml in bucketListXml: + bucketNameList.append(self._find_text(bucketXml.text)) + + if len(bucketNameList) > 0: + bucketAlias.bucket1 = bucketNameList[0] + if len(bucketNameList) > 1: + bucketAlias.bucket2 = bucketNameList[1] + + bucketAliasList.append(bucketAlias) + + listBucketAlias.bucketAlias = bucketAliasList + return listBucketAlias + + # end virtual bucket related + # end virtual bucket related + # end virtual bucket related diff --git a/src/obs/model.py b/src/obs/model.py index 687e23f..89f42e4 100644 --- a/src/obs/model.py +++ b/src/obs/model.py @@ -132,7 +132,9 @@ 'ListWorkflowExecutionResponse', 'GetWorkflowExecutionResponse', 'RestoreFailedWorkflowExecutionResponse', - 'GetTriggerPolicyResponse' + 'GetTriggerPolicyResponse', + 'BucketAliasModel', + 'ListBucketAliasModel' ] @@ -291,12 +293,13 @@ def add_grant(self, grant): class Bucket(BaseModel): - allowedAttr = {'name': BASESTRING, 'create_date': BASESTRING, 'location': BASESTRING} + allowedAttr = {'name': BASESTRING, 'create_date': BASESTRING, 'location': BASESTRING, "bucket_type": BASESTRING} - def __init__(self, name=None, create_date=None, location=None): + def __init__(self, name=None, create_date=None, location=None, bucket_type=None): self.name = name self.create_date = create_date self.location = location + self.bucket_type = bucket_type class CommonPrefix(BaseModel): @@ -476,14 +479,28 @@ def __init__(self, id=None, allowedMethod=None, allowedOrigin=None, allowedHeade class CreateBucketHeader(BaseModel): allowedAttr = {'aclControl': BASESTRING, 'storageClass': BASESTRING, 'extensionGrants': list, - 'availableZone': BASESTRING, 'epid': BASESTRING} - - def __init__(self, aclControl=None, storageClass=None, extensionGrants=None, availableZone=None, epid=None): + 'availableZone': BASESTRING, 'epid': BASESTRING, "isPFS": bool} + + def __init__(self, aclControl=None, storageClass=None, extensionGrants=None, + availableZone=None, epid=None, isPFS=False): + """ + Headers that can be carried during bucket creation + :param aclControl: ACL policy of a bucket + :param storageClass: Specifies the default storage class of a bucket. The value can be "STANDARD" (Standard), + "WARM" (Infrequent Access), and "COLD" (Archive). The Standard storage class is used by default. + :param extensionGrants: Extended permission list that can be specified during bucket creation. + :param availableZone: AZ type that can be specified during bucket creation. A single AZ is used by default. + You can also use "3az". + :param epid: Enterprise project ID. Users who have enabled the enterprise project function can obtain this ID + from the enterprise project management service. + :param isPFS: Specifies whether to create a parallel file system. + """ self.aclControl = aclControl self.storageClass = storageClass self.extensionGrants = extensionGrants self.availableZone = availableZone self.epid = epid + self.isPFS = isPFS class ExtensionGrant(BaseModel): @@ -558,14 +575,17 @@ def __init__(self, replicationRules=None, agency=None): class ReplicationRule(BaseModel): allowedAttr = {'id': BASESTRING, 'prefix': BASESTRING, 'status': BASESTRING, 'bucket': BASESTRING, - 'storageClass': BASESTRING} + 'storageClass': BASESTRING, 'deleteData': BASESTRING, 'historicalObjectReplication': BASESTRING} - def __init__(self, id=None, prefix=None, status=None, bucket=None, storageClass=None): + def __init__(self, id=None, prefix=None, status=None, bucket=None, storageClass=None, deleteData=None, + historicalObjectReplication=None): self.id = id self.prefix = prefix self.status = status self.bucket = bucket self.storageClass = storageClass + self.deleteData = deleteData + self.historicalObjectReplication = historicalObjectReplication class Notification(BaseModel): @@ -1393,10 +1413,11 @@ def __init__(self, response=None, buffer=None, size=None, url=None, deleteMarker class ExtensionHeader(BaseModel): - allowedAttr = {'requesterPayer': BASESTRING} + allowedAttr = {'requesterPayer': BASESTRING, 'locationClusterGroupId': BASESTRING} - def __init__(self, requesterPayer=None): + def __init__(self, requesterPayer=None, locationClusterGroupId=None): self.requesterPayer = requesterPayer + self.locationClusterGroupId = locationClusterGroupId # OEF Model @@ -1594,6 +1615,32 @@ class GetTriggerPolicyResponse(BaseModel): def __init__(self, rules=None): self.rules = rules + # end workflow related # end workflow related # end workflow related + +# begin virtual bucket related +# begin virtual bucket related +# begin virtual bucket related + +class BucketAliasModel(BaseModel): + allowedAttr = {'alias': BASESTRING, 'bucket1': BASESTRING, 'bucket2': BASESTRING, 'creationDate': BASESTRING} + + def __init__(self, alias=None, bucket1=None, bucket2=None, creationDate=None): + self.alias = alias + self.bucket1 = bucket1 + self.bucket2 = bucket2 + self.creationDate = creationDate + + +class ListBucketAliasModel(BaseModel): + allowedAttr = {'owner': BASESTRING, 'bucketAlias': list} + + def __init__(self, owner=None, bucketAlias=None): + self.owner = owner + self.bucketAlias = bucketAlias + +# end virtual bucket related +# end virtual bucket related +# end virtual bucket related diff --git a/src/setup.py b/src/setup.py index 65da0d8..7866e71 100644 --- a/src/setup.py +++ b/src/setup.py @@ -21,13 +21,16 @@ setup( name='esdk-obs-python', - version='3.21.4', - packages=find_packages(), + version='3.21.12', + packages=find_packages(exclude=['tests']), zip_safe=False, description='OBS Python SDK', long_description='OBS Python SDK', license='Apache-2.0', keywords=('obs', 'python'), + install_requires=[ + 'pycryptodome==3.10.1' + ], platforms='Independant', url='', ) diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 7977e87..affecdf 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -68,6 +68,16 @@ def gen_test_file(request): os.remove(test_config["path_prefix"] + file_name) +@pytest.fixture() +def delete_bucket_after_test(): + results = {"need_delete_buckets": []} + yield results + if "client" in results: + for bucket_name in results["need_delete_buckets"]: + delete_result = results["client"].deleteBucket(bucket_name) + assert delete_result.status == 204 + + def gen_random_file(file_name, file_size): tmp_1024 = "".join(chr(random.randint(10000, 40000)) for _ in range(341)).encode("UTF-8") tmp_1024 += b"m" diff --git a/src/tests/test_config.json b/src/tests/test_config.json index 17e8000..506d30b 100644 --- a/src/tests/test_config.json +++ b/src/tests/test_config.json @@ -2,6 +2,8 @@ "ak": "", "sk": "", "endpoint": "", + "location": "", + "bucket_prefix": "", "bucketName": "", "path_prefix": "", "public_key": "", diff --git a/src/tests/test_obs_client.py b/src/tests/test_obs_client.py index 55062d9..b3b6554 100644 --- a/src/tests/test_obs_client.py +++ b/src/tests/test_obs_client.py @@ -8,7 +8,7 @@ import pytest import conftest -from obs import GetObjectHeader, ObsClient, UploadFileHeader +from obs import CreateBucketHeader, GetObjectHeader, ObsClient, UploadFileHeader from conftest import test_config from obs.const import IS_PYTHON2 @@ -29,6 +29,75 @@ def get_client(self): is_signature_negotiation=False, path_style=path_style) return client_type, uploadClient, downloadClient + def test_create_PFS_bucket(self, delete_bucket_after_test): + _, uploadClient, _ = self.get_client() + bucket_name = test_config["bucket_prefix"] + "create-pfs-001" + delete_bucket_after_test["client"] = uploadClient + delete_bucket_after_test["need_delete_buckets"].append(bucket_name) + create_bucket_header = CreateBucketHeader(isPFS=True) + create_result = uploadClient.createBucket(bucket_name, header=create_bucket_header, + location=test_config["location"]) + assert create_result.status == 200 + + bucket_metadata = uploadClient.getBucketMetadata(bucket_name) + assert bucket_metadata.status == 200 + assert ("fs-file-interface", 'Enabled') in bucket_metadata.header + + def test_create_object_bucket(self, delete_bucket_after_test): + _, uploadClient, _ = self.get_client() + bucket_name = test_config["bucket_prefix"] + "create-pfs-002" + delete_bucket_after_test["client"] = uploadClient + delete_bucket_after_test["need_delete_buckets"].append(bucket_name) + create_bucket_header = CreateBucketHeader(isPFS=False) + create_result = uploadClient.createBucket(bucket_name, header=create_bucket_header, + location=test_config["location"]) + assert create_result.status == 200 + + bucket_metadata = uploadClient.getBucketMetadata(bucket_name) + assert bucket_metadata.status == 200 + assert ("fs-file-interface", 'Enabled') not in bucket_metadata.header + + list_bucket_result = uploadClient.listBuckets(bucketType="OBJECT") + assert list_bucket_result.status == 200 + all_object_buckets = [i["name"] for i in list_bucket_result.body["buckets"]] + assert bucket_name in all_object_buckets + + def test_list_buckets(self, delete_bucket_after_test): + _, uploadClient, _ = self.get_client() + bucket_name = test_config["bucket_prefix"] + "list-pfs-001" + delete_bucket_after_test["client"] = uploadClient + delete_bucket_after_test["need_delete_buckets"].append(bucket_name) + create_bucket_header = CreateBucketHeader(isPFS=True) + create_result = uploadClient.createBucket(bucket_name, header=create_bucket_header, + location=test_config["location"]) + assert create_result.status == 200 + bucket_name2 = test_config["bucket_prefix"] + "list-pfs-002" + delete_bucket_after_test["need_delete_buckets"].append(bucket_name2) + create_result2 = uploadClient.createBucket(bucket_name2, location=test_config["location"]) + assert create_result2.status == 200 + + list_bucket_result = uploadClient.listBuckets(bucketType="POSIX") + assert list_bucket_result.status == 200 + all_pfs_buckets = [i["name"] for i in list_bucket_result.body["buckets"]] + assert bucket_name in all_pfs_buckets + assert bucket_name2 not in all_pfs_buckets + + list_bucket_result2 = uploadClient.listBuckets() + all_buckets = [i["name"] for i in list_bucket_result2.body["buckets"]] + assert bucket_name in all_buckets + assert bucket_name2 in all_buckets + + list_bucket_result3 = uploadClient.listBuckets(bucketType="OBJECT") + assert list_bucket_result3.status == 200 + all_object_buckets = [i["name"] for i in list_bucket_result3.body["buckets"]] + assert bucket_name not in all_object_buckets + assert bucket_name2 in all_object_buckets + + list_bucket_result4 = uploadClient.listBuckets(bucketType="Wrong_Value") + all_buckets2 = [i["name"] for i in list_bucket_result4.body["buckets"]] + assert bucket_name in all_buckets2 + assert bucket_name2 in all_buckets2 + def test_uploadFile_and_getObject_to_file(self, gen_test_file): client_type, uploadClient, downloadClient = self.get_client() object_name = client_type + "test_uploadFile_and_getObject_to_file_" + gen_test_file @@ -206,7 +275,10 @@ def test_uploadFile_with_storage_type(self): checkSum=True, taskNum=10) assert upload_result.status == 200 object_metadata = uploadClient.getObjectMetadata(test_config["bucketName"], object_name) - assert dict(object_metadata.header)["storage-class"] == i + if i == "WARM": + assert dict(object_metadata.header)["storage-class"] in (i, "STANDARD_IA") + else: + assert dict(object_metadata.header)["storage-class"] in (i, "GLACIER") uploadClient.deleteObject(test_config["bucketName"], object_name) os.remove(test_config["path_prefix"] + object_name)