• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift3 ——S3 API中间件兼容性测试

原作者: [db:作者] 来自: [db:来源] 收藏 邀请


在Swift中,Swift3中间件在Object Storage上提供了S3 REST 风格的API

    目前支持的操作有以下几种:

· GET Service

· DELETE Bucket

· GET Bucket (List Objects)

· PUT Bucket

· DELETE Object

· GET Object

· HEAD Object

· PUT Object

· PUT Object (Copy)

配置注意:

proxy-server.conf配置swift3,并确保swift3在auth和其他查找swift请求的中间件之前。具体配置示例如下:

[pipeline:main]

pipeline = healthcheck cache swift3 swauth proxy-server

       

[filter:swift3]

use = egg:swift#swift3

以SAIO的配置为例,使用AWS的boto python包来分析S3 API的使用,基本信息:

account: test

user:tester

password: testing

0. 连接

文档中仅给出了一个连接例子,代码如下:

connection = boto.s3.Connection(
    aws_access_key_id='test:tester',
    aws_secret_access_key='testing',
    port=8080,
    host='127.0.0.1',
    is_secure=False,
    calling_format=boto.s3.connection.OrdinaryCallingFormat())

但是我在测试时,发现存在问题,traceback如下:

Traceback (most recent call last):

  File "/home/swift/tmp2.py", line 8, in <module>

    connection = boto.s3.Connection(

AttributeError: 'module' object has no attribute 'Connection'

我估计是写错了,boto.s3.connection是一个module,我去阅读了boto的文档,正确写法应该是:

connection = boto.s3.connection.S3Connection(
    aws_access_key_id='test:tester',
    aws_secret_access_key='testing',
    port=8080,
    host='127.0.0.1',
    is_secure=False,
    calling_format=boto.s3.connection.OrdinaryCallingFormat())

创建成功,无任何输出消息。

其中access_keyaws_access_key_id相同。

>>> connection.access_key
'test:tester'
>>> connection.aws_access_key_id
'test:tester'
>>> connection.aws_secret_access_key
'testing'

1. Container管理

Swift中Container的概念与S3中的Bucket相等。

使用以下语句创建一个bucket:

>>> connection.create_bucket('1st')
<Bucket: 1st>

如果再次创建相同名称的bucket,会出现409冲突错误:

boto.exception.S3CreateError: S3CreateError: 409 Conflict

如果使用了大写字母也会出错,而使用rackspace的API则无此限制:

>>> connection.create_bucket('1sT')

boto.exception.BotoClientError: BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.

使用中文字符创建bucket,出现403 Forbidden错误:

>>> connection.create_bucket('结果')

boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden

此外,可以单独使用纯数字或下划线_创建bucket,不可以使用!@#$%&等符号。

也可以使用connecttion.create_bucket('media.userdomain.com')的风格来创建bucket。

检索bucket

使用get_all_buckets()来获得所有的buckets信息:

>>> connection.get_all_buckets()
[<Bucket: 1>, <Bucket: 1st>, <Bucket: SINA>, <Bucket: ___>, <Bucket: a>, <Bucket: aa>, <Bucket: media.user.com>,<Bucket: photos>, <Bucket: sss>, <Bucket: 图片>, <Bucket: 文件>, <Bucket: 视频>]

此外,使用get_bucket()来获得指定bucket,这里分别测试了小写字母、大写字母、不存在的、中文的bucket,其中大写字母的bucket可以获得,get不存在的bucket返回400 Bad Request,而get中文字符的bucket仍然返回403 Forbidden

>>> connection.get_bucket('sss')
<Bucket: sss>
>>> connection.get_bucket('SINA')
<Bucket: SINA>
>>> connection.get_bucket('SINa')
Traceback (most recent call last):
boto.exception.S3ResponseError: S3ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>InvalidBucketName</Code>
  <Message>The specified bucket is not valid</Message>
</Error>
>>> connection.get_bucket('图片')
Traceback (most recent call last):
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied</Message>
</Error>

删除bucket

使用delete_bucket()来删除指定的bucket,如果目标bucket不存在,返回400 Bad Request,中文的bucket仍然有问题。

>>> connection.delete_bucket('sss')
>>> 
>>> connection.delete_bucket('sss')
boto.exception.S3ResponseError: S3ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>InvalidBucketName</Code>
  <Message>The specified bucket is not valid</Message>
</Error>
>>> connection.delete_bucket('视频')

boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied</Message>
</Error>

2. key管理

   获得key列表

在swift中使用object的概念与S3中的key对应。

>>> con=connection.get_bucket('photos')  #获得名为photosbucket

>>> con.get_all_keys()   #获得key列表
[<Key: photos,List>, <Key: photos,lzl.jpg>, <Key: photos,sample>]

创建key

使用以下流程创建了一个key,从本地磁盘上传了一张照片并设置了元数据。

>>> from boto.s3.key import Key  
>>> k=Key(con,'sample')   #在photos内新建一个名为sample的key
>>> k
<Key: photos,sample>  
>>> k.name
'sample'
>>> k.set_contents_from_filename('/home/swift/lzl.jpg')   选择从本地上传文件
>>> k.size    #查看key的大小
46486L


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
swift1.2语言函数和闭包函数介绍发布时间:2022-07-13
下一篇:
Swift发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap