jclouds の BlobStore API - 単純な Blob の put/get
様々なクラウド環境に対して共通的な API でのアクセスを提供する Java 用ライブラリ jclouds の BlobStore API を試してみました。
BlobStore API は Amazon S3, Windows Azure Blob, Google Storage 等、様々なクラウドストレージ環境をサポートしていますが、今回はクラウド環境を使わずローカル環境で試してみる事にします。
サンプルソースは http://github.com/fits/try_samples/tree/master/blog/20110831/
サポート Provider 一覧
BlobStore API でサポートしているクラウド環境は、以下のように BlobStoreUtils の SupportedProviders を取得する事で確認できます。
providers_list.groovy
@Grapes([
@Grab("org.jclouds:jclouds-all:1.1.1"),
@Grab("org.jclouds:jclouds-allblobstore:1.1.1")
])
import org.jclouds.blobstore.util.BlobStoreUtils
BlobStoreUtils.supportedProviders.each {
println it
}
実行例(サポート Provider 一覧)
> groovy providers_list.groovy synaptic-storage cloudonestorage eucalyptus-partnercloud-s3 cloudfiles-us swift transient aws-s3 cloudfiles-uk walrus atmos filesystem azureblob ninefold-storage
OpenStack の swift 等もサポートされている事が確認できます。
上記の中で、インメモリの transient とローカルファイルシステムを使う filesystem はローカル環境で手軽に試す事ができます。
Transient Provider を使った Blob の put/get
まず、インメモリの Transient Provider を使ってみることにします。
BlobStoreContextFactory から BlobStoreContext を作成し BlobStore を取得して、コンテナの作成や Blob の put/get 等の処理を行います。
なお、createContext の引数で Provider 名を指定します。
transient_sample.groovy (Transient Provider 版)
@Grapes([
@Grab("org.jclouds:jclouds-all:1.1.1"),
@Grab("org.jclouds:jclouds-allblobstore:1.1.1")
])
import org.jclouds.blobstore.BlobStoreContextFactory
//Transient Provider の BlobStoreContext 作成
def ctx = new BlobStoreContextFactory().createContext("transient", "identity", "credential")
def containerName = "sample1"
def store = ctx.blobStore
//コンテナ作成
store.createContainerInLocation(null, containerName)
//Blob 作成
def blob = store.newBlob("test")
//内容の設定
blob.setPayload("abc")
//Blob の put
store.putBlob(containerName, blob)
//Blob の get
def b = store.getBlob(containerName, "test")
println "${b} - ${b.payload} - ${b.payload.rawContent}"
print "payload = "
b.payload.writeTo(System.out)
ctx.close()
実行例
> groovy transient_sample.groovy
[metadata=[type=BLOB, id=null, name=test, location=null, uri=mem://sample1/test, userMetadata={}]] - [content=true, contentMetadata=[contentDisposition=null, contentEncoding=null, contentLanguage=null, contentLength=3, contentMD5=[-112, 1, 80, -104, 60, -46, 79, -80, -42, -106, 63, 125, 40, -31, 127, 114], contentType=application/unknown], written=false] - [97, 98, 99]
payload = abc
FileSystem Provider を使った Blob の put/get
次に、ローカルのファイルシステムを使う FileSystem Provider 版ですが、createContext() の引数が変わるだけで、残りの処理は Transient Provider 版と同じです。
filesystem_sample.groovy (FileSystem Provider 版)
@Grapes([
@Grab("org.jclouds:jclouds-all:1.1.1"),
@Grab("org.jclouds:jclouds-allblobstore:1.1.1")
])
import org.jclouds.filesystem.reference.FilesystemConstants
import org.jclouds.blobstore.BlobStoreContextFactory
def props = new Properties()
//ベースディレクトリの指定
props.setProperty(FilesystemConstants.PROPERTY_BASEDIR, "./temp")
//FileSystem Provider の BlobStoreContext 作成
def ctx = new BlobStoreContextFactory().createContext("filesystem", props)
・・・以降の処理は Transient Provider 版と同じ・・・
実行例
> groovy filesystem_sample.groovy
[metadata=[type=BLOB, id=null, name=test, location=null, uri=null, userMetadata={}]] - [content=true, contentMetadata=[contentDisposition=null, contentEncoding=null, contentLanguage=null, contentLength=3, contentMD5=[-112, 1, 80, -104, 60,
-46, 79, -80, -42, -106, 63, 125, 40, -31, 127, 114], contentType=application/unknown], written=false] - .\temp\sample1\test
payload = abcFileSystem Provider 版では、put の結果として temp\sample1\test ファイルが作成され、ファイルの内容が setPayload で設定した値(abc)となっている事が確認できます。