Skip to content

Commit 64bafa7

Browse files
author
libertyzhu
committed
release(1.9.40): feat/symlink
1 parent 849e63a commit 64bafa7

File tree

4 files changed

+159
-2
lines changed

4 files changed

+159
-2
lines changed

qcloud_cos/cos_client.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4576,6 +4576,86 @@ def update_object_meta(self, Bucket, Key, **kwargs):
45764576
)
45774577
return response
45784578

4579+
def put_symlink(self, Bucket, SymlinkName, SymlinkTarget, **kwargs):
4580+
"""创建软链接
4581+
4582+
:param Bucket(string): 存储桶名称.
4583+
:param SymlinkName(string): 软链接路径.
4584+
:param SymlinkTarget(string): 目标路径.
4585+
:kwargs(dict): 公共请求头部.
4586+
:return: 请求的响应头部.
4587+
4588+
.. code-block:: python
4589+
4590+
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
4591+
client = CosS3Client(config)
4592+
# 创建软链接
4593+
response = client.put_symlink(
4594+
Bucket='bucket-1250000000',
4595+
SymlinkName='testsym.txt',
4596+
SymlinkTarget='test.txt',
4597+
)
4598+
"""
4599+
4600+
headers = mapped(kwargs)
4601+
headers['x-cos-symlink-target'] = SymlinkTarget
4602+
params = {'symlink': ''}
4603+
4604+
url = self._conf.uri(bucket=Bucket, path=SymlinkName)
4605+
logger.debug("put symlink, url=:{url} ,headers=:{headers}".format(
4606+
url=url,
4607+
headers=headers))
4608+
rt = self.send_request(
4609+
method='PUT',
4610+
url=url,
4611+
bucket=Bucket,
4612+
auth=CosS3Auth(self._conf, SymlinkName, params=params),
4613+
headers=headers,
4614+
params=params)
4615+
response = dict(**rt.headers)
4616+
return response
4617+
4618+
def get_symlink(self, Bucket, SymlinkName, **kwargs):
4619+
"""获取软链接本身
4620+
4621+
:param Bucket(string): 存储桶名称.
4622+
:param SymlinkName(string): 软链接路径.
4623+
:kwargs(dict): 公共请求头部.
4624+
:return: 请求的响应头部.
4625+
4626+
.. code-block:: python
4627+
4628+
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象
4629+
client = CosS3Client(config)
4630+
# 获取软链接本身
4631+
response = client.get_symlink(
4632+
Bucket='bucket-1250000000',
4633+
SymlinkName='testsym.txt',
4634+
)
4635+
"""
4636+
4637+
headers = mapped(kwargs)
4638+
params = {'symlink': ''}
4639+
4640+
if 'versionId' in headers:
4641+
params['versionId'] = headers['versionId']
4642+
del headers['versionId']
4643+
params = format_values(params)
4644+
4645+
url = self._conf.uri(bucket=Bucket, path=SymlinkName)
4646+
logger.debug("get symlink, url=:{url} ,headers=:{headers}".format(
4647+
url=url,
4648+
headers=headers))
4649+
rt = self.send_request(
4650+
method='GET',
4651+
url=url,
4652+
bucket=Bucket,
4653+
auth=CosS3Auth(self._conf, SymlinkName, params=params),
4654+
headers=headers,
4655+
params=params)
4656+
response = dict(**rt.headers)
4657+
return response
4658+
45794659
def put_bucket_encryption(self, Bucket, ServerSideEncryptionConfiguration={}, **kwargs):
45804660
"""设置执行存储桶下的默认加密配置
45814661

qcloud_cos/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '5.1.9.39'
1+
__version__ = '5.1.9.40'

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def long_description():
3333

3434
setup(
3535
name='cos_python_sdk_v5', # comply with PEP 625
36-
version='1.9.39',
36+
version='1.9.40',
3737
url='https://www.qcloud.com/',
3838
license='MIT',
3939
author='tiedu, lewzylu, channingliu',

ut/test.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6750,6 +6750,83 @@ def test_put_object_with_tagging():
67506750
os.remove(filename)
67516751

67526752

6753+
def test_put_get_symlink_multiver():
6754+
"""测试创建和获取软链接功能"""
6755+
# 先上传一个目标文件
6756+
target_file_name = "test_symlink_target.txt"
6757+
symlink_name = "test_symlink.txt"
6758+
6759+
# 开启版本控制 测试带版本控制的软链接功能
6760+
response = client.put_bucket_versioning(
6761+
Bucket=test_bucket,
6762+
Status='Enabled',
6763+
)
6764+
6765+
# 上传目标文件
6766+
response = client.put_object(
6767+
Bucket=test_bucket,
6768+
Body=b'hello',
6769+
Key=target_file_name
6770+
)
6771+
6772+
# 创建软链接,指向目标文件
6773+
response = client.put_symlink(
6774+
Bucket=test_bucket,
6775+
SymlinkName=symlink_name,
6776+
SymlinkTarget=target_file_name
6777+
)
6778+
print(response)
6779+
6780+
# 验证put_symlink响应
6781+
assert 'x-cos-request-id' in response
6782+
assert 'x-cos-version-id' in response
6783+
version_id = response['x-cos-version-id']
6784+
6785+
# 获取软链接信息
6786+
response = client.get_symlink(
6787+
Bucket=test_bucket,
6788+
SymlinkName=symlink_name,
6789+
VersionId=version_id,
6790+
)
6791+
print(response)
6792+
6793+
# 验证get_symlink响应
6794+
assert 'x-cos-request-id' in response
6795+
assert 'x-cos-symlink-target' in response
6796+
assert response['x-cos-symlink-target'] == target_file_name
6797+
6798+
# 读取软链接指向文件
6799+
response = client.get_object(
6800+
Bucket=test_bucket,
6801+
Key=symlink_name,
6802+
)
6803+
body = response['Body'].read()
6804+
print(response)
6805+
print(body)
6806+
assert body == b'hello'
6807+
6808+
# 获取软链接信息 -- 使用无效的verionId
6809+
try:
6810+
client.get_symlink(
6811+
Bucket=test_bucket,
6812+
SymlinkName=symlink_name,
6813+
VersionId='invalid-version-id',
6814+
)
6815+
except CosServiceError as e:
6816+
assert e.get_error_code() == 'NoSuchVersion'
6817+
6818+
# 获取软链接信息 -- 使用无效的symlinkName
6819+
try:
6820+
client.get_symlink(
6821+
Bucket=test_bucket,
6822+
SymlinkName='invalid-sym',
6823+
)
6824+
except CosServiceError as e:
6825+
assert e.get_error_code() == 'NoSuchKey'
6826+
6827+
# 清理测试文件
6828+
client.delete_object(Bucket=test_bucket, Key=symlink_name)
6829+
client.delete_object(Bucket=test_bucket, Key=target_file_name)
67536830

67546831
if __name__ == "__main__":
67556832
setUp()

0 commit comments

Comments
 (0)