OAS的使用——Python SDK
[TOC]
当需要向OAS备份归档的文件量非常大的时候,通过web控制台和命令行工具来完成是不可能的,这时候需要使用OAS提供的SDK编写操作代码来实现,SDK包括Python SDK和Java SDK,本文主要讲解Python SDK, Java SDK的使用可以参考官方文档中的开发者工具和[最佳实践](https://docs.aliyun.com/?spm=5176.383338.201.102.NNmH36#/pub/oas/best_practice/java_sdk_demo
)。
使用需求
- 使用Python SDK编写脚本上传100个小文件(1M-32M),上传10个大文件(1G-5G)
- 使用Python SDK编写脚本查询上传后的Vault信息
- 使用Python SDK编写脚本下载所有的上传文件
- 使用Python SDK编写脚本删除已上传的所有文件
Python SDK概述
Python SDK是对API的一层封装,方便用户编写Python脚本来实现各种操作。官方文档中提到,Python SDK包含低级接口和高级接口。
低级接口是对API的最直接封装,在使用低级接口时必须对照API使用手册进行开发,需要仔细阅读API手册,对API中描述的各种参数需要比较清楚,因此使用灵活但是不够高效。
高级接口是对低级接口的封装,降低了用户的学习量,提高开发效率,而且代码也比低级接口更加清晰,因此官方建议一般用户都使用高级接口,在极个别高级接口不太灵活操作的地方使用低级接口。
本文所有代码均基于Python SDK的高级接口编写。
准备工作
根据使用需求,我需要准备好待上传的文件以及配置。
写个函数生成需要的文件:
def genfile(filePath, size):
splitSize = 100
with open(filePath, 'w') as fd:
if size <= splitSize:
fd.seek(1024*1024*size - 10)
randomString = "".join(random.sample("abcedfghigklmnopqrstuvwxyz", 10))
fd.write(randomString)
else:
for i in range(size/splitSize):
fd.seek((i + 1)*splitSize*1024*1024 - 10)
randomString = "".join(random.sample("abcedfghigklmnopqrstuvwxyz", 10))
fd.write(randomString)
if size % splitSize != 0:
fd.seek(size*1024*1024 - 10)
randomString = "".join(random.sample("abcedfghigklmnopqrstuvwxyz", 10))
fd.write(randomString)
def generate_files():
file_index = 0
file_prefix = 'test_file_%s'
file_dir = 'files'
for i in xrange(0, 105):
if i < 100:
size = random.randint(1, 32)
else:
size = random.randint(1024, 5 * 1024)
path = os.path.join(file_dir, file_prefix % file_index)
genfile(path, size)
file_index += 1
使用一个简单的配置文件来存放配置,然后读取这个配置文件:
使用下面代码读取配置:
class ConfHolder(object):
def __init__(self, conf_path):
self.conf_path = conf_path
self.parser = ConfigParser.SafeConfigParser()
self._read_conf()
def _read_conf(self):
try:
self.parser.read(self.conf_path)
self.host = self.parser.get('access', 'host')
self.id = self.parser.get('access', 'id')
self.key = self.parser.get('access', 'key')
self.vault_name = self.parser.get('access', 'vault_name')
self.local_path = self.parser.get('files', 'local_path')
self.download_path = self.parser.get('files', 'download_path')
except Exception, e:
log.exception(e)
print "Read Config File Error!"
print e
sys.exit(1)
Python SDK的使用
Python SDK中几个重要对象
Python SDK的高级接口抽象出来几个重要的对象:Vault、Uploader和Job。使用这三个对象基本可以完成常见的工作。实际上,Vault是所有操作的入口,更加直接的说法,我们在使用Python SDK的时候,只需要import两个包:
from oas.oas_api import OASAPI
from oas.ease.vault import Vault
其中Uploader和Job对象在Vault的类方法中生成。
重要的方法
创建Vault:
# 创建 Vault
vault = Vault.create_vault(api, '[Vault Name]')
上传Archive:
archive_id = vault.upload_archive('[File Path]')
下载 Archive:
#retrieve_archive生成一个Job类型的对象
#Job对象的具体方法和属性可以查看官方文档
job = vault.retrieve_archive('[Archive ID]')
job.download_to_file('[File Path]')
初始化multipart upload
#initiate_uploader 生成一个Uploader对象,用于进行multipart upload
#Uploader对象的具体方法和属性可以查看官方文档
uploader = vault.initiate_uploader('[File Path]')
下面使用这些对象和方法完成需求工作。
实现代码
class Task
有四个方法: upload
, download
,info
, delete
, 分别完成上传、下载、查询和删除工作。upload
上传的文件包含100个小文件和5个大文件,大文件采用multipart方式上传,对于上传失败的multipart,还将调用resume
来恢复上传,保存上传成功文件的filename和archive_id;download
将上传成功的文件下载至另外一个目录。info
使用retrieve_inventory来查询信息。delete
将已上传的所有文件删除。
注意:
由于OAS的元数据信息并非是实时更新,而且job调度是异步的,因此整个程序不会马上返回,可能会长时间阻塞,因此建议将程序写成Damon。
代码
代码包含配置文件(配置host, id以及key等)、生成文件代码和OAS SDK使用代码,另外提供了一个Python的daemonize函数,使用daemonize函数后台化。脚本会将中间信息打到日志中。
日志内容:
下载后的文件:
代码下载:
总结
在阅读API使用手册之后对整个系统的操作有比较清晰认识之后,参考官方文档的示例代码和SDK说明文档,OAS服务的使用非常容易上手。