Skip to content

Commit fb26e01

Browse files
authored
Merge pull request #224 from l-iberty/master
支持创建多AZ桶, 修复可签入签名的headers列表, 配置自定义域名证书
2 parents 97e58c0 + 0039745 commit fb26e01

File tree

3 files changed

+228
-9
lines changed

3 files changed

+228
-9
lines changed

qcloud_cos/cos_auth.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,7 @@ def filter_headers(data):
3333
"if-unmodified-since",
3434
"origin",
3535
"range",
36-
"response-cache-control",
37-
"response-content-disposition",
38-
"response-content-encoding",
39-
"response-content-language",
40-
"response-content-type",
41-
"response-expires",
4236
"transfer-encoding",
43-
"versionid",
4437
]
4538
headers = {}
4639
for i in data:

qcloud_cos/cos_client.py

Lines changed: 128 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1273,23 +1273,35 @@ def select_object_content(self, Bucket, Key, Expression, ExpressionType, InputSe
12731273
return data
12741274

12751275
# s3 bucket interface begin
1276-
def create_bucket(self, Bucket, **kwargs):
1276+
def create_bucket(self, Bucket, BucketAZConfig=None, **kwargs):
12771277
"""创建一个bucket
12781278
12791279
:param Bucket(string): 存储桶名称.
1280+
:param BucketAZConfig(string): 存储桶的多AZ配置
12801281
:param kwargs(dict): 设置请求headers.
12811282
:return: None.
12821283
12831284
.. code-block:: python
12841285
12851286
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
12861287
client = CosS3Client(config)
1287-
# 创建bucket
1288+
# 创建单AZ bucket
12881289
response = client.create_bucket(
12891290
Bucket='bucket'
12901291
)
1292+
# 创建多AZ bucket
1293+
response = client.create_bucket(
1294+
Bucket='bucket',
1295+
BucketAZConfig='MAZ'
1296+
)
12911297
"""
12921298
headers = mapped(kwargs)
1299+
xml_config = None
1300+
if BucketAZConfig == 'MAZ':
1301+
bucket_config = {'BucketAZConfig': 'MAZ'}
1302+
xml_config = format_xml(data=bucket_config, root='CreateBucketConfiguration')
1303+
headers['Content-MD5'] = get_md5(xml_config)
1304+
headers['Content-Type'] = 'application/xml'
12931305
url = self._conf.uri(bucket=Bucket)
12941306
logger.info("create bucket, url=:{url} ,headers=:{headers}".format(
12951307
url=url,
@@ -1298,6 +1310,7 @@ def create_bucket(self, Bucket, **kwargs):
12981310
method='PUT',
12991311
url=url,
13001312
bucket=Bucket,
1313+
data=xml_config,
13011314
auth=CosS3Auth(self._conf),
13021315
headers=headers)
13031316
return None
@@ -2569,6 +2582,119 @@ def delete_bucket_domain(self, Bucket, **kwargs):
25692582
params=params)
25702583
return None
25712584

2585+
def put_bucket_domain_certificate(self, Bucket, DomainCertificateConfiguration, **kwargs):
2586+
"""设置bucket的自定义域名证书配置规则
2587+
2588+
:param Bucket(string): 存储桶名称.
2589+
:param DomainCertificateConfiguration(dict): 设置Bucket的自定义域名证书配置规则.
2590+
:param kwargs(dict): 设置请求headers.
2591+
:return: None
2592+
2593+
.. code-block:: python
2594+
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
2595+
client = CosS3Client(config)
2596+
# 设置bucket自定义域名证书配置规则
2597+
domain_cert_config = {}
2598+
response = client.put_bucket_domain_certificate(
2599+
Bucket='bucket',
2600+
DomainCertificateConfiguration=domain_cert_config
2601+
)
2602+
"""
2603+
lst = ['<DomainList>', '</DomainList>'] # 类型为list的标签
2604+
xml_config = format_xml(data=DomainCertificateConfiguration, root='DomainCertificate', lst=lst)
2605+
headers = mapped(kwargs)
2606+
headers['Content-MD5'] = get_md5(xml_config)
2607+
headers['Content-Type'] = 'application/xml'
2608+
# params = {'domaincertificate': ''}
2609+
# 目前 Domain Certificate API 不能使用 params 传递 query_string '?domaincertificate=',
2610+
# 只能将'?domaincertificate'拼接到url
2611+
url = self._conf.uri(bucket=Bucket)
2612+
url += '?domaincertificate'
2613+
logger.info("put bucket domain certificate, url=:{url} ,headers=:{headers}".format(
2614+
url=url,
2615+
headers=headers))
2616+
rt = self.send_request(
2617+
method='PUT',
2618+
url=url,
2619+
bucket=Bucket,
2620+
data=xml_config,
2621+
auth=CosS3Auth(self._conf),
2622+
headers=headers)
2623+
return None
2624+
2625+
def get_bucket_domain_certificate(self, Bucket, DomainName, **kwargs):
2626+
"""获取bucket的自定义域名证书配置规则
2627+
2628+
:param Bucket(string): 存储桶名称.
2629+
:param DomainName(string): Bucket的自定义域名.
2630+
:param kwargs(dict): 设置请求headers.
2631+
:return(dict): Bucket的自定义域名证书配置规则.
2632+
2633+
.. code-block:: python
2634+
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
2635+
client = CosS3Client(config)
2636+
# 获取bucket自定义域名证书配置规则
2637+
response = client.get_bucket_domain_certificate(
2638+
Bucket='bucket',
2639+
DomainName='domain-name'
2640+
)
2641+
"""
2642+
headers = mapped(kwargs)
2643+
# 目前 Domain Certificate API 不能使用 params 传递 query_string '?domaincertificate=',
2644+
# 只能将'?domaincertificate'拼接到url
2645+
# params = {'domaincertificate': '', 'domainname': DomainName}
2646+
params = {'domainname': DomainName}
2647+
url = self._conf.uri(bucket=Bucket)
2648+
url += '?domaincertificate'
2649+
logger.info("get bucket domain certificate, url=:{url} ,headers=:{headers}".format(
2650+
url=url,
2651+
headers=headers))
2652+
rt = self.send_request(
2653+
method='GET',
2654+
url=url,
2655+
bucket=Bucket,
2656+
auth=CosS3Auth(self._conf, params=params),
2657+
headers=headers,
2658+
params=params)
2659+
data = xml_to_dict(rt.content)
2660+
return data
2661+
2662+
def delete_bucket_domain_certificate(self, Bucket, DomainName, **kwargs):
2663+
"""删除bucket的自定义域名证书配置规则
2664+
2665+
:param Bucket(string): 存储桶名称.
2666+
:param DomainName(string): Bucket的自定义域名.
2667+
:param kwargs(dict): 设置请求headers.
2668+
:return: None
2669+
2670+
.. code-block:: python
2671+
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
2672+
client = CosS3Client(config)
2673+
# 删除bucket自定义域名证书配置规则
2674+
response = client.delete_bucket_domain_certificate(
2675+
Bucket='bucket',
2676+
DomainName='domain-name'
2677+
)
2678+
"""
2679+
headers = mapped(kwargs)
2680+
# 目前 Domain Certificate API 不能使用 params 传递 query_string '?domaincertificate=',
2681+
# 只能将'?domaincertificate'拼接到url
2682+
# params = {'domaincertificate': '', 'domainname': DomainName}
2683+
params = {'domainname': DomainName}
2684+
url = self._conf.uri(bucket=Bucket)
2685+
url += "?domaincertificate"
2686+
logger.info("delete bucket domain certificate, url=:{url} ,headers=:{headers}".format(
2687+
url=url,
2688+
headers=headers))
2689+
rt = self.send_request(
2690+
method='DELETE',
2691+
url=url,
2692+
bucket=Bucket,
2693+
auth=CosS3Auth(self._conf, params=params),
2694+
headers=headers,
2695+
params=params)
2696+
return None
2697+
25722698
def put_bucket_origin(self, Bucket, OriginConfiguration={}, **kwargs):
25732699
"""设置bucket的回源规则
25742700

ut/test.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,21 @@ def test_create_head_delete_bucket():
406406
Bucket=bucket_name
407407
)
408408

409+
def test_create_head_delete_maz_bucket():
410+
"""创建一个多AZ bucket,head它是否存在,最后删除一个空bucket"""
411+
bucket_id = str(random.randint(0, 1000)) + str(random.randint(0, 1000))
412+
bucket_name = 'buckettest-maz' + bucket_id + '-' + APPID
413+
response = client.create_bucket(
414+
Bucket=bucket_name,
415+
BucketAZConfig='MAZ',
416+
ACL='public-read'
417+
)
418+
response = client.head_bucket(
419+
Bucket=bucket_name
420+
)
421+
response = client.delete_bucket(
422+
Bucket=bucket_name
423+
)
409424

410425
def test_put_bucket_acl_illegal():
411426
"""设置非法的ACL"""
@@ -1034,6 +1049,91 @@ def test_put_get_delete_bucket_domain():
10341049
Bucket=test_bucket
10351050
)
10361051

1052+
def test_put_get_delete_bucket_domain_certificate():
1053+
"""测试设置获取删除bucket自定义域名证书"""
1054+
1055+
"""
1056+
存储桶 bj-1259654469 专门用于测试自定义域名证书
1057+
"""
1058+
1059+
temp_bucket = 'bj-1259654469'
1060+
temp_conf = CosConfig(
1061+
Region='ap-beijing',
1062+
SecretId=SECRET_ID,
1063+
SecretKey=SECRET_KEY
1064+
)
1065+
temp_client = CosS3Client(
1066+
conf=temp_conf,
1067+
retry=3
1068+
)
1069+
1070+
domain = 'testcertificate.coshelper.com'
1071+
domain_config = {
1072+
'DomainRule': [
1073+
{
1074+
'Name': domain,
1075+
'Type': 'REST',
1076+
'Status': 'ENABLED',
1077+
},
1078+
]
1079+
}
1080+
1081+
# put domain
1082+
response = temp_client.put_bucket_domain(
1083+
Bucket=temp_bucket,
1084+
DomainConfiguration=domain_config
1085+
)
1086+
1087+
with open('./testcertificate.coshelper.com.key', 'rb') as f:
1088+
key = f.read().decode('utf-8')
1089+
with open('./testcertificate.coshelper.com.pem', 'rb') as f:
1090+
cert = f.read().decode('utf-8')
1091+
1092+
domain_cert_config = {
1093+
'CertificateInfo': {
1094+
'CertType': 'CustomCert',
1095+
'CustomCert': {
1096+
'Cert': cert,
1097+
'PrivateKey': key,
1098+
},
1099+
},
1100+
'DomainList': [
1101+
{
1102+
'DomainName': domain
1103+
},
1104+
],
1105+
}
1106+
1107+
# put domain certificate
1108+
response = temp_client.delete_bucket_domain_certificate(
1109+
Bucket=temp_bucket,
1110+
DomainName=domain
1111+
)
1112+
1113+
time.sleep(2)
1114+
response = temp_client.put_bucket_domain_certificate(
1115+
Bucket=temp_bucket,
1116+
DomainCertificateConfiguration=domain_cert_config
1117+
)
1118+
# wait for sync
1119+
# get domain certificate
1120+
time.sleep(4)
1121+
response = temp_client.get_bucket_domain_certificate(
1122+
Bucket=temp_bucket,
1123+
DomainName=domain
1124+
)
1125+
assert response["Status"] == "Enabled"
1126+
1127+
# delete domain certificate
1128+
response = temp_client.delete_bucket_domain_certificate(
1129+
Bucket=temp_bucket,
1130+
DomainName=domain
1131+
)
1132+
1133+
# delete domain
1134+
response = temp_client.delete_bucket_domain(
1135+
Bucket=temp_bucket,
1136+
)
10371137

10381138
def test_put_get_delete_bucket_inventory():
10391139
"""测试设置获取删除bucket清单"""

0 commit comments

Comments
 (0)