Skip to content

Commit bb6f167

Browse files
committed
support set object lifecycle
1 parent e71237c commit bb6f167

File tree

4 files changed

+112
-5
lines changed

4 files changed

+112
-5
lines changed

examples/set_object_lifecycle.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# -*- coding: utf-8 -*-
2+
# flake8: noqa
3+
4+
from qiniu import Auth
5+
from qiniu import BucketManager
6+
7+
access_key = 'your_ak'
8+
secret_key = 'your_sk'
9+
10+
# 初始化 Auth
11+
q = Auth(access_key, secret_key)
12+
13+
# 初始化 BucketManager
14+
bucket = BucketManager(q)
15+
16+
# 目标空间
17+
bucket_name = 'your_bucket_name'
18+
# 目标 key
19+
key = 'path/to/key'
20+
21+
# bucket_name 更新 rule
22+
ret, info = bucket.set_object_lifecycle(
23+
bucket=bucket_name,
24+
key=key,
25+
to_line_after_days=10,
26+
to_archive_after_days=20,
27+
to_deep_archive_after_days=30,
28+
delete_after_days=40,
29+
cond={
30+
'hash': 'object_hash'
31+
}
32+
)
33+
print(ret)
34+
print(info)

qiniu/auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
'persistentNotifyUrl', # 持久化处理结果通知URL
3535
'persistentPipeline', # 持久化处理独享队列
3636
'deleteAfterDays', # 文件多少天后自动删除
37-
'fileType', # 文件的存储类型,0为普通存储,1为低频存储
37+
'fileType', # 文件的存储类型,0为标准存储,1为低频存储,2为归档存储,3为深度归档存储
3838
'isPrefixalScope' # 指定上传文件必须使用的前缀
3939
])
4040

qiniu/services/storage/bucket.py

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,21 +219,21 @@ def change_mime(self, bucket, key, mime):
219219
def change_type(self, bucket, key, storage_type):
220220
"""修改文件的存储类型
221221
222-
修改文件的存储类型为普通存储或者是低频存储,参考文档:
222+
修改文件的存储类型,参考文档:
223223
https://developer.qiniu.com/kodo/api/3710/modify-the-file-type
224224
225225
Args:
226226
bucket: 待操作资源所在空间
227227
key: 待操作资源文件名
228-
storage_type: 待操作资源存储类型,0为普通存储,1为低频存储,2 为归档存储
228+
storage_type: 待操作资源存储类型,0为普通存储,1为低频存储,2 为归档存储,3 为深度归档
229229
"""
230230
resource = entry(bucket, key)
231231
return self.__rs_do('chtype', resource, 'type/{0}'.format(storage_type))
232232

233233
def restoreAr(self, bucket, key, freezeAfter_days):
234-
"""解冻归档存储文件
234+
"""解冻归档存储、深度归档存储文件
235235
236-
修改文件的存储类型为普通存储或者是低频存储,参考文档
236+
对归档存储、深度归档存储文件,进行解冻操作参考文档
237237
https://developer.qiniu.com/kodo/api/6380/restore-archive
238238
239239
Args:
@@ -263,6 +263,45 @@ def change_status(self, bucket, key, status, cond):
263263
return self.__rs_do('chstatus', resource, 'status/{0}'.format(status), 'cond', condstr)
264264
return self.__rs_do('chstatus', resource, 'status/{0}'.format(status))
265265

266+
def set_object_lifecycle(
267+
self,
268+
bucket,
269+
key,
270+
to_line_after_days=0,
271+
to_archive_after_days=0,
272+
to_deep_archive_after_days=0,
273+
delete_after_days=0,
274+
cond=None
275+
):
276+
"""
277+
278+
设置对象的生命周期
279+
280+
Args:
281+
bucket: 目标空间
282+
key: 目标资源
283+
to_line_after_days: 多少天后将文件转为低频存储,设置为 -1 表示取消已设置的转低频存储的生命周期规则, 0 表示不修改转低频生命周期规则。
284+
to_archive_after_days: 多少天后将文件转为归档存储,设置为 -1 表示取消已设置的转归档存储的生命周期规则, 0 表示不修改转归档生命周期规则。
285+
to_deep_archive_after_days: 多少天后将文件转为深度归档存储,设置为 -1 表示取消已设置的转深度归档存储的生命周期规则, 0 表示不修改转深度归档生命周期规则
286+
delete_after_days: 多少天后将文件删除,设置为 -1 表示取消已设置的删除存储的生命周期规则, 0 表示不修改删除存储的生命周期规则。
287+
cond: 匹配条件,只有条件匹配才会设置成功,当前支持设置 hash、mime、fsize、putTime。
288+
289+
Returns:
290+
resBody, respInfo
291+
292+
"""
293+
options = [
294+
'toIAAfterDays', str(to_line_after_days),
295+
'toArchiveAfterDays', str(to_archive_after_days),
296+
'toDeepArchiveAfterDays', str(to_deep_archive_after_days),
297+
'deleteAfterDays', str(delete_after_days)
298+
]
299+
if cond and isinstance(cond, dict):
300+
cond_str = '&'.join(["{0}={1}".format(k, v) for k, v in cond.items()])
301+
options += ['cond', urlsafe_base64_encode(cond_str)]
302+
resource = entry(bucket, key)
303+
return self.__rs_do('lifecycle', resource, *options)
304+
266305
def batch(self, operations):
267306
"""批量操作:
268307

test_qiniu.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,40 @@ def test_delete_after_days(self):
460460
ret, info = self.bucket.delete_after_days(bucket_name, key, days)
461461
assert info.status_code == 200
462462

463+
def test_set_object_lifecycle(self):
464+
key = 'test_set_object_lifecycle' + rand_string(8)
465+
ret, info = self.bucket.copy(bucket_name, 'copyfrom', bucket_name, key)
466+
assert info.status_code == 200
467+
ret, info = self.bucket.set_object_lifecycle(
468+
bucket=bucket_name,
469+
key=key,
470+
to_line_after_days=10,
471+
to_archive_after_days=20,
472+
to_deep_archive_after_days=30,
473+
delete_after_days=40
474+
)
475+
assert info.status_code == 200
476+
477+
def test_set_object_lifecycle_with_cond(self):
478+
key = 'test_set_object_lifecycle_cond' + rand_string(8)
479+
ret, info = self.bucket.copy(bucket_name, 'copyfrom', bucket_name, key)
480+
assert info.status_code == 200
481+
ret, info = self.bucket.stat(bucket_name, key)
482+
assert info.status_code == 200
483+
key_hash = ret['hash']
484+
ret, info = self.bucket.set_object_lifecycle(
485+
bucket=bucket_name,
486+
key=key,
487+
to_line_after_days=10,
488+
to_archive_after_days=20,
489+
to_deep_archive_after_days=30,
490+
delete_after_days=40,
491+
cond={
492+
'hash': key_hash
493+
}
494+
)
495+
assert info.status_code == 200
496+
463497

464498
class UploaderTestCase(unittest.TestCase):
465499
mime_type = "text/plain"

0 commit comments

Comments
 (0)