OAS的使用——Python SDK

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
)。

使用需求

  1. 使用Python SDK编写脚本上传100个小文件(1M-32M),上传10个大文件(1G-5G)
  2. 使用Python SDK编写脚本查询上传后的Vault信息
  3. 使用Python SDK编写脚本下载所有的上传文件
  4. 使用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

使用一个简单的配置文件来存放配置,然后读取这个配置文件:
OAS的使用——Python SDK

使用下面代码读取配置:

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函数后台化。脚本会将中间信息打到日志中。

日志内容:
OAS的使用——Python SDK
OAS的使用——Python SDK

下载后的文件:
OAS的使用——Python SDK

代码下载:

总结

在阅读API使用手册之后对整个系统的操作有比较清晰认识之后,参考官方文档的示例代码和SDK说明文档,OAS服务的使用非常容易上手。

上一篇:一路踩坑,搭建的Appium自动化测试环境


下一篇:Mapped Statements collection does not contain value for xxx.xxx 错误原因&解决方案