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 = abc
FileSystem Provider 版では、put の結果として temp\sample1\test ファイルが作成され、ファイルの内容が setPayload で設定した値(abc)となっている事が確認できます。