Skip to content

Commit c58bc2e

Browse files
update 3.24.3
1 parent e8b8984 commit c58bc2e

File tree

8 files changed

+139
-16
lines changed

8 files changed

+139
-16
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
Version 3.24.3
2+
3+
New Features:
4+
5+
1. Added APIs related to accessLabel, including ObsClient.setAccesslabel,ObsClient.getAccessLabel and ObsClient.deleteAccessLabel.
6+
7+
-------------------------------------------------------------------------------------------------
18
Version 3.23.12
29

310
Resolved Issues:

README_CN.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1-
Version 3.23.12
1+
Version 3.24.3
22

3-
修复问题
3+
新特性:
4+
5+
1. 新增accessLabel相关接口(ObsClient.setAccesslabel/ObsClient.getAccessLabel/ObsClient.deleteAccessLabel)
6+
7+
-------------------------------------------------------------------------------------------------
8+
Version 3.23.12
9+
10+
修复问题:
411

512
1. 修复putFile上传文件夹时可能导致contentType不一致问题。
613

src/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#!/usr/bin/python
12
# -*- coding:utf-8 -*-
23
# Copyright 2019 Huawei Technologies Co.,Ltd.
34
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use

src/obs/client.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -670,8 +670,12 @@ def _get_server_connection_use_http1x(self, is_secure, server, port, proxy_host,
670670
except Exception:
671671
conn = httplib.HTTPSConnection(server, port=port, timeout=self.timeout)
672672
else:
673-
conn = httplib.HTTPSConnection(server, port=port, timeout=self.timeout, context=self.context,
674-
check_hostname=None)
673+
try:
674+
conn = httplib.HTTPSConnection(server, port=port, timeout=self.timeout, context=self.context,
675+
check_hostname=None)
676+
except Exception:
677+
conn = httplib.HTTPSConnection(server, port=port, timeout=self.timeout, context=self.context)
678+
675679
else:
676680
conn = httplib.HTTPConnection(server, port=port, timeout=self.timeout)
677681

@@ -1567,6 +1571,23 @@ def setObjectMetadata(self, bucketName, objectKey, metadata=None, headers=None,
15671571
**self.convertor.trans_set_object_metadata(metadata=metadata, headers=headers,
15681572
versionId=versionId))
15691573

1574+
@funcCache
1575+
def setAccessLabel(self, bucketName, objectKey, accesslabel, extensionHeaders=None):
1576+
return self._make_put_request(bucketName, objectKey, pathArgs={'x-obs-accesslabel': None},
1577+
entity={'accesslabel': accesslabel},
1578+
extensionHeaders=extensionHeaders)
1579+
1580+
@funcCache
1581+
def getAccessLabel(self, bucketName, objectKey, extensionHeaders=None):
1582+
return self._make_get_request(bucketName, objectKey, pathArgs={'x-obs-accesslabel': None},
1583+
methodName='getAccessLabel',
1584+
extensionHeaders=extensionHeaders)
1585+
1586+
@funcCache
1587+
def deleteAccessLabel(self, bucketName, objectKey, extensionHeaders=None):
1588+
return self._make_delete_request(bucketName, objectKey, pathArgs={'x-obs-accesslabel': None},
1589+
extensionHeaders=extensionHeaders)
1590+
15701591
@funcCache
15711592
def getObject(self, bucketName, objectKey, downloadPath=None, getObjectRequest=None,
15721593
headers=None, loadStreamInMemory=False, progressCallback=None, extensionHeaders=None, notifier=None):

src/obs/const.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
CONTENT_LENGTH_HEADER = 'Content-Length'
2222
CONTENT_TYPE_HEADER = 'Content-Type'
2323
CONTENT_MD5_HEADER = 'Content-MD5'
24-
CACHE_CONTROL_HEADER = 'Cache-Control'
24+
CACHE_CONTROL_HEADER = 'Cache-Control' # type: str
2525
CONTENT_DISPOSITION_HEADER = 'Content-Disposition'
2626
CONTENT_ENCODING_HEADER = 'Content-Encoding'
2727
CONTENT_LANGUAGE_HEADER = 'Content-Language'
@@ -96,7 +96,7 @@
9696
DEFAULT_TASK_NUM = 8
9797
DEFAULT_TASK_QUEUE_SIZE = 20000
9898

99-
OBS_SDK_VERSION = '3.23.12'
99+
OBS_SDK_VERSION = '3.24.3'
100100

101101
V2_META_HEADER_PREFIX = 'x-amz-meta-'
102102
V2_HEADER_PREFIX = 'x-amz-'

src/obs/convertor.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1919,6 +1919,10 @@ def parseSetObjectMetadata(self, headers):
19191919
option.nextPosition = util.to_long(headers.get(self.ha.next_position_header()))
19201920
return option
19211921

1922+
def parseGetAccessLabel(self, jsons, headers=None):
1923+
result = json.loads(jsons)
1924+
return result
1925+
19221926
def parseGetObject(self, headers, option):
19231927
self._parseGetObjectCommonHeader(headers, option)
19241928
option.deleteMarker = headers.get(self.ha.delete_marker_header())

src/setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#!/usr/bin/python
12
# -*- coding:utf-8 -*-
23
# Copyright 2019 Huawei Technologies Co.,Ltd.
34
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use
@@ -21,7 +22,7 @@
2122

2223
setup(
2324
name='esdk-obs-python',
24-
version='3.23.12',
25+
version='3.24.3',
2526
packages=find_packages(exclude=['tests']),
2627
zip_safe=False,
2728
description='OBS Python SDK',

src/tests/test_obs_client.py

Lines changed: 91 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222

2323
import conftest
2424
from obs import CreateBucketHeader, GetObjectHeader, ObsClient, UploadFileHeader, \
25-
Expiration, NoncurrentVersionExpiration, AbortIncompleteMultipartUpload, DateTime, \
26-
Rule, Lifecycle
25+
Expiration, NoncurrentVersionExpiration, AbortIncompleteMultipartUpload, DateTime, \
26+
Rule, Lifecycle
2727

2828
from conftest import test_config
2929

@@ -62,8 +62,8 @@ def test_create_PFS_bucket(self, delete_bucket_after_test):
6262
def test_delete_posix_folder(self):
6363
client_type, uploadClient, deleteClient = self.get_client()
6464
bucket_name = test_config["bucketName"]
65-
file1 =test_config["path_prefix"] + "file-001"
66-
file2 =test_config["path_prefix"] + "file-002"
65+
file1 = test_config["path_prefix"] + "file-001"
66+
file2 = test_config["path_prefix"] + "file-002"
6767
upload_result1 = uploadClient.putContent(bucket_name, file1, content='Hello OBS')
6868
assert upload_result1.status == 200
6969
upload_result2 = uploadClient.putContent(bucket_name, file2, content='Hello OBS')
@@ -72,7 +72,6 @@ def test_delete_posix_folder(self):
7272
assert len(delete_list) == 3
7373
assert len(error_list) == 0
7474

75-
7675
def test_create_object_bucket(self, delete_bucket_after_test):
7776
_, uploadClient, _ = self.get_client()
7877
bucket_name = test_config["bucket_prefix"] + "create-pfs-002"
@@ -421,21 +420,104 @@ def test_putFile_with_content_type(self):
421420

422421
assert new_content_list == old_content_list
423422

424-
425-
426423
def test_setBucketLifecycle_and_getBucketLifecycle_success(self):
427424
client_type, bucketLifecycleClient, obsClient = self.get_client()
428425
rule1 = Rule(id='rule1', prefix='prefix1', status='Enabled', expiration=Expiration(days=60),
429-
noncurrentVersionExpiration=NoncurrentVersionExpiration(10))
426+
noncurrentVersionExpiration=NoncurrentVersionExpiration(10))
430427
rule2 = Rule(id='rule2', prefix='prefix2', status='Enabled', expiration=Expiration(date=DateTime(2023, 12, 31)),
431-
abortIncompleteMultipartUpload=AbortIncompleteMultipartUpload(10))
428+
abortIncompleteMultipartUpload=AbortIncompleteMultipartUpload(10))
432429
lifecycle = Lifecycle(rule=[rule1, rule2])
433430
set_rul_result = bucketLifecycleClient.setBucketLifecycle(test_config["bucketName"], lifecycle)
434431
assert set_rul_result.status == 200
435432
get_rul_result = bucketLifecycleClient.getBucketLifecycle(test_config["bucketName"])
436433
assert get_rul_result.status == 200
437434
assert get_rul_result.body.lifecycleConfig.rule[1].abortIncompleteMultipartUpload.daysAfterInitiation == 10
438435

436+
def test_setAccessLabel_success(self):
437+
client_type, accessLabelClient, obsClient = self.get_client()
438+
accessLabelList = ['role_label_01', 'role_label_02']
439+
obsClient.putContent('pythonsdktestbucket-posix', 'dir1/')
440+
set_al_result = accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'dir1', accessLabelList)
441+
assert set_al_result.status == 204
442+
obsClient.deleteObject('pythonsdktestbucket-posix', 'dir1/')
443+
444+
def test_setAccessLabel_fail(self):
445+
client_type, accessLabelClient, obsClient = self.get_client()
446+
obsClient.putContent('pythonsdktestbucket-posix', 'dir1/')
447+
obsClient.putContent('pythonsdktestbucket-posix', 'file1', content='123')
448+
set_al_result1 = accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'dir1', ['role-label-01'])
449+
assert set_al_result1.status == 400
450+
set_al_result2 = accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'dir1',
451+
['abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ'])
452+
assert set_al_result2.status == 400
453+
set_al_result3 = accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'dir1',
454+
["role_label_" + str(i + 1) for i in range(513)])
455+
assert set_al_result3.status == 405
456+
set_al_result4 = accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'file1',
457+
['role_label_01', 'role_label_02'])
458+
assert set_al_result4.status == 405
459+
obsClient.deleteObject('pythonsdktestbucket-posix', 'dir1/')
460+
obsClient.deleteObject('pythonsdktestbucket-posix', 'file1')
461+
462+
def test_getAccessLabel_success(self):
463+
client_type, accessLabelClient, obsClient = self.get_client()
464+
obsClient.putContent('pythonsdktestbucket-posix', 'dir1/')
465+
obsClient.putContent('pythonsdktestbucket-posix', 'dir2/')
466+
obsClient.putContent('pythonsdktestbucket-posix', 'dir3/')
467+
obsClient.putContent('pythonsdktestbucket-posix', 'dir4/')
468+
accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'dir1', ['role_label_01', 'role_label_02'])
469+
get_al_result1 = accessLabelClient.getAccessLabel('pythonsdktestbucket-posix', 'dir1')
470+
assert get_al_result1.status == 200
471+
assert get_al_result1.body['accesslabel'] == ['role_label_01', 'role_label_02']
472+
accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'dir2',
473+
['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'])
474+
get_al_result2 = accessLabelClient.getAccessLabel('pythonsdktestbucket-posix', 'dir2')
475+
assert get_al_result2.status == 200
476+
assert get_al_result2.body['accesslabel'] == ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ']
477+
accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'dir3',
478+
["role_label_" + str(i + 1) for i in range(512)])
479+
get_al_result3 = accessLabelClient.getAccessLabel('pythonsdktestbucket-posix', 'dir3')
480+
assert get_al_result3.status == 200
481+
assert get_al_result3.body['accesslabel'] == ["role_label_" + str(i + 1) for i in range(512)]
482+
accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'dir4',
483+
["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW" + str(i + 1) for i in
484+
range(512)])
485+
get_al_result4 = accessLabelClient.getAccessLabel('pythonsdktestbucket-posix', 'dir4')
486+
assert get_al_result4.status == 200
487+
assert get_al_result4.body['accesslabel'] == ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW" + str(i + 1) for
488+
i in range(512)]
489+
obsClient.deleteObject('pythonsdktestbucket-posix', 'dir1/')
490+
obsClient.deleteObject('pythonsdktestbucket-posix', 'dir2/')
491+
obsClient.deleteObject('pythonsdktestbucket-posix', 'dir3/')
492+
obsClient.deleteObject('pythonsdktestbucket-posix', 'dir4/')
493+
494+
def test_getAccessLabel_fail(self):
495+
client_type, accessLabelClient, obsClient = self.get_client()
496+
obsClient.putContent('pythonsdktestbucket-posix', 'dir1/')
497+
get_al_result = accessLabelClient.getAccessLabel('pythonsdktestbucket-posix', 'dir1')
498+
assert get_al_result.status == 404
499+
obsClient.deleteObject('pythonsdktestbucket-posix', 'dir1/')
500+
501+
def test_deleteAccessLabel_success(self):
502+
client_type, accessLabelClient, obsClient = self.get_client()
503+
obsClient.putContent('pythonsdktestbucket-posix', 'dir1/')
504+
obsClient.putContent('pythonsdktestbucket-posix', 'dir2/')
505+
accessLabelClient.setAccessLabel('pythonsdktestbucket-posix', 'dir1', ['role_label_01', 'role_label_02'])
506+
del_al_result1 = accessLabelClient.deleteAccessLabel('pythonsdktestbucket-posix', 'dir1')
507+
del_al_result2 = accessLabelClient.deleteAccessLabel('pythonsdktestbucket-posix', 'dir2')
508+
del_al_result3 = accessLabelClient.deleteAccessLabel('pythonsdktestbucket-posix', 'dir3')
509+
assert del_al_result1.status == 204
510+
assert del_al_result2.status == 204
511+
assert del_al_result3.status == 204
512+
obsClient.deleteObject('pythonsdktestbucket-posix', 'dir1/')
513+
obsClient.deleteObject('pythonsdktestbucket-posix', 'dir2/')
514+
515+
def test_deleteAccessLabel_fail(self):
516+
client_type, accessLabelClient, obsClient = self.get_client()
517+
obsClient.putContent('pythonsdktestbucket-posix', 'file1', content='123')
518+
del_al_result1 = accessLabelClient.deleteAccessLabel('pythonsdktestbucket-posix', 'file1')
519+
assert del_al_result1.status == 405
520+
obsClient.deleteObject('pythonsdktestbucket-posix', 'file1')
439521

440522
if __name__ == "__main__":
441523
pytest.main(["-v", 'test_obs_client.py::TestOBSClient::test_uploadFile_with_metadata'])

0 commit comments

Comments
 (0)