*

Pythonライブラリによる Swift の操作 ~ Swiftによるオブジェクトストレージシステムの構築(6)

公開日: 最終更新日:2014/07/23  |  By  |  Object Storage, OpenStack, Swift

by Yamagata 2013.03.14
(Swift関連の記事の一覧はこちらをご覧ください)

前回 Swift のAPI について解説しました。
curl を使い直接 httpのリクエスト・レスポンスを見ることで Swift の API がどのようなものか
確認しました。
今回は python-swiftclient のライブラリを使って API にアクセスする方法を解説します。

1. python-swiftclient パッケージ

python-swiftclient パッケージは Swift CLI が含まれているパッケージで、以前の記事に従って Swift クラスタを構築してあればすでにインストールされています。
このパッケージは Swift CLI だけでなく CLI が利用している Swift アクセス用のライブラリ swiftclient.client も含まれており、今回はこちらの使い方を説明します。
swiftclient.client は OpenStack 標準の keystone 認証にも対応していますので認証周りの処理の手間がかからず容易に API にアクセス可能です。

Python で Swift を利用したシステムを開発する場合は swiftclient.client の使用をおすすめします。

2. swiftclient.client ライブラリ の概要

swiftclient.client の API ドキュメントは以下にあります。

こちらのページは最新版のドキュメントになりますので、このブログで対象としている folsom 版とは

パラメータ等が一部異なる場合がありますのでご注意ください。
swiftclient.client パッケージは大きく分けると クラス Connection と個別のAPI関数群に分けられます。
Connectionクラスのメソッドの多くは API関数のラッパーとなっています。
Connectionクラスは API関数をより使いやすくまとめたクラスと考えられます。
以下に API関数をリストアップします。パラメータなどの詳細は上記 URLからご確認ください。

[認証処理API]

  1. get_auth() … 認証処理を行い、Storage URL とトークンからなるタプルを返します。
  2. get_auth_1_0() … Auth ver 1.0 用の認証処理です。 get_auth() 内部で auth_version引数に基づき呼び出されるので直接利用する必要はありません。
  3. get_keystoneclient_2_0() .. Keystone(Auth ver 2.0) 用の認証処理です。
    get_auth() 内部で auth_version引数に基づき呼び出されるので直接利用する必要はありません。
    KeyStone 認証を使うためには python-keystoneclient パッケージをインストールする必要があります。

[ アカウント操作API]

  1. get_account() … コンテナの一覧を取得
  2. head_account() … アカウントの情報を取得
  3. post_account() … アカウントのメタデータの更新

[コンテナ操作API]

  1. get_container() … 指定されたコンテナが保有するオブジェクトの一覧を取得
  2. head_container() … コンテナの情報を取得
  3. put_container() … コンテナを作成
  4. post_container() … コンテナのメタデータを更新
  5. delete_container() … コンテナを削除

[オブジェクト操作API]

  1. get_object() … オブジェクトをダウンロード
  2. head_object() … オブジェクトの情報を取得
  3. put_object() … オブジェクトをアップロード
  4. post_object() … オブジェクトのメタデータを更新
  5. delete_object() … オブジェクトを削除

以下はサンプルコードです。(sample01_1.py)

1:  from swiftclient import *  
2:
3: auth_url = "http://localhost:8080/auth/v1.0"
4: user = "test:tester"
5: key = "testing"
6:
7: (url, token) = get_auth(auth_url, user, key)
8:
9: print "storage url:%s" % url
10: print "token :%s" % token
11:
12: (resp_headers, containers) = get_account(url, token)
13:
14: print "n<response headers>"
15: for (k, v) in resp_headers.items():
16: print "%s : %s" % (k, v)
17: print "n<containers>"
18: for c in containers:
19: print "%s" % c
20:
  • 7行目で get_auth() を呼び出してStorage URLと token を取得します。
  • 12行目で get_account() を取得した上記情報を渡して実行します。
  • get_account()は レスポンスヘッダとコンテナのリストのタプルを返しますので 14行目以降でそれらを表示しています。

実行すると以下のような出力が表示されます。

 > ./sample01_1.py  
storage url:http://192.168.0.127:8080/v1/AUTH_test
token :AUTH_tkfa591725f4a745a5aa46889cd4538730

<response headers>
content-length : 249
accept-ranges : bytes
x-timestamp : 1358492197.05102
x-account-meta-key2 : fugafuga
date : Thu, 07 Mar 2013 08:22:47 GMT
x-account-bytes-used : 20480000
x-account-container-count : 5
content-type : application/json; charset=utf-8
x-account-object-count : 11

<containers>
{'count': 1, 'bytes': 10240000, 'name': 'folder1'}
{'count': 0, 'bytes': 0, 'name': 'folder2'}
{'count': 0, 'bytes': 0, 'name': 'folder3'}
{'count': 0, 'bytes': 0, 'name': 'folder4'}
{'count': 10, 'bytes': 10240000, 'name': 'folder6_segments'}

3. swiftclient.client.Connection クラスの使い方

次にConnectionクラスの使い方を確認したいと思います。
以下はサンプルのコードです。(sample01_2.py)
1:  conn = Connection(auth_url, user, key)  
2:
3: (resp_headers, containers) = conn.get_account()
4:
5: print "<response headers>"
6: for (k, v) in resp_headers.items():
7: print "%s : %s" % (k, v)
8:
9: print "n<containers>"
10: for c in containers:
11: print "%s" % c
12:
上記のサンプルでは以下の処理を行っています。

  1. Connection オブジェクトの生成 ( 変数 conn )   … 1行目
  2. conn.get_account() を呼び出しアカウント情報を取得 … 3行目
  3. 戻り値として返ってくるタプル (レスポンスヘッダ, コンテナ一覧) を表示 5~11行
実行結果は以下のようになります。

 > ./sample01_2.py  
<response headers>
content-length : 249
accept-ranges : bytes
x-timestamp : 1358492197.05102
x-account-meta-key2 : fugafuga
date : Thu, 07 Mar 2013 08:29:44 GMT
x-account-bytes-used : 20480000
x-account-container-count : 5
content-type : application/json; charset=utf-8
x-account-object-count : 11

<containers>
{'count': 1, 'bytes': 10240000, 'name': 'folder1'}
{'count': 0, 'bytes': 0, 'name': 'folder2'}
{'count': 0, 'bytes': 0, 'name': 'folder3'}
{'count': 0, 'bytes': 0, 'name': 'folder4'}
{'count': 10, 'bytes': 10240000, 'name': 'folder6_segments'}


次に上のサンプルで呼び出したメソッド関数 get_account() のコードを見てみます。

 class Connection(object):  
....
def get_account(self, marker=None, limit=None, prefix=None,
full_listing=False):
return self._retry(None, get_account, marker=marker, limit=limit,
prefix=prefix, full_listing=full_listing)

内部では _retry() メンバ関数経由で API関数 get_account() を呼び出しています。
_retry() は名前からも想像がつくように API関数の呼び出しで失敗があったときはリトライをします。
リトライ数はデフォルトで 5 で、メンバ変数 retries により変更可能です。

このように Connection クラスを使うことで、Swiftクラスタの認証、接続まわりの処理を意識することなく API を呼び出すことができます。
なお認証トークン、Storage URL が必要な場合は、Connectionのメンバ変数 token および url により取得可能です。
ただし Connection クラスをインスタンス化した時点では Swiftクラスタにアクセスしませんので変数の値はNoneのままです。
API 系メソッドを呼び出した後にアクセスしてください。
以下は Storage URL と トークンを表示するコードです。(sample01_3.py)

1:  conn = Connection(auth_url, user, key)  
2:
3: resp_headers = conn.head_account()
4:
5: print "storage url:%s" % conn.url
6: print "token :%s" % conn.token
7:

head_account() を呼び出した後に url, token にアクセスして出力しています。
実行すると以下のように表示されます。

 > ./sample01_3.py  

storage_url:http://192.168.0.127:8080/v1/AUTH_test
token :AUTH_tkfa591725f4a745a5aa46889cd4538730

最後にファイルのアップロードのやり方について確認したいと思います。
以下がコードになります。(sample01_4.py)

1:  container_name = sys.argv[1]  
2: object_name = sys.argv[2]
3: upload_file = sys.argv[3]
4:
5: try:
6: conn = Connection(auth_url, user, key)
7: create_container(conn, container_name)
8: f = open(upload_file, 'r')
9: conn.put_object(container_name, object_name, f, chunk_size=4096)
10: headers = conn.head_object(container_name, object_name)
11: for (k, v) in headers.items():
12: print "%s : %s" % (k, v)
13:
14: except:
15: print "Exception occured"
16: raise
17:

このプログラムは第一引数にアップロード先のコンテナ名、第2引数でオブジェクト名、第3引数でアップロードするローカルファイルへのパスを渡します。

9行目で put_object() メンバ関数によりファイルをアップロードしています。

put_object() の第3引数は、データそのものか、file オブジェクトを引き渡します。
このサンプルでは 8行目の open() で生成されたファイルオブジェクトを渡しています。
引数 chunk_size は Swift にファイルをアップロードするときに一度に送るサイズです。

10行目で put_object() の実行結果を確認するために head_object() を呼び出しそのヘッダ情報を出力します。

以上 swiftclient.client ライブラリの使い方を説明しました。ご活用ください。

関連記事

no image

Swift のグローバルクラスタ (3) Icehouse 開発版でのテスト結果

2014.4.14 by You Yamagata 山縣です。 前回・前々回でグローバルクラスタ対応

記事を読む

no image

サーバ1台での構築(Grizzly版) ~ Swiftによるオブジェクトストレージシステムの構築(7)

by You Yamagata 2013.04.17(Swift関連の記事の一覧はこちらをご覧くださ

記事を読む

no image

LVM上にインスタンスを作成する

OpenStack 担当 石川です。 実際に自分が使うか使わないかは置いておき、気になったオプ

記事を読む

summit_top

OpenStack Summit Vancouver Summary

5/18~5/22に開催されたOpenStack Summit Vancouver に参加してきまし

記事を読む

no image

Grizzlyの新機能(1) ~ Swiftによるオブジェクトストレージシステムの構築(8)

by You Yamagata 2013.04.24(Swift関連の記事の一覧はこちらをご覧くださ

記事を読む

no image

Swiftの概要 ~ Swiftによるオブジェクトストレージシステムの構築(1)

(Swift関連の記事の一覧はこちらをご覧ください)はじめまして、山縣と申します。私はビットアイル総

記事を読む

IMG_0870

OpenStack Summit San Diegoに参加しています

by hasegawa 2012/10/16ビットアイル総研の長谷川です。10月15日(月)〜18日

記事を読む

oss_on_slshowcase

CentOS 6 から7へのアップグレード

この記事は OSS on SoftLayer Showcase  の OpenStack Juno

記事を読む

horizon

OpenStack Cinder Multiple driver backends 機能を使ってみよう

by Hiroki Ishikawa OpenStack 担当、石川です。 Grizzly

記事を読む

welcome

OpenStack Summit in Paris (Day1)

by Ikuo Kumagai (@kumagai19o)   こんに

記事を読む

no image

ビットアイル総合研究所は、クラウド技術に関する調査&研究を通して、社会と会社に寄与していくことを目的に、ビットアイル・エクイニクスの企業内研究所として2011年8月に設立されました。

openstack-figure1-2x
COHO DataStream のCinder連携

OpenStack Cinder のストレージバックエンドとしてはCe

blog-ocata
Jujuで Ocataを含む様々なバージョンのOpenStack をデプロイする方法

祝OpenStack Ocata リリース!! ということで、早速デプ

newton
Juju Manual Cloud で OpenStack 環境構築

本当にご無沙汰しております。 この投稿はOpenStack Adve

top
HACK! THE Juju/MAAS

6/8~6/10まで幕張メッセで開催されたInterop 2016。皆

dpdk
OpenStack OVS VXLAN ネットワークの高速化

少し前の話になりますが、3月2日に開催された 日本仮想化技術株式会社様

→もっと見る

PAGE TOP ↑