jclouds の BlobStore API - 単純な Blob の put/get

様々なクラウド環境に対して共通的な API でのアクセスを提供する Java 用ライブラリ jclouds の BlobStore API を試してみました。

BlobStore APIAmazon 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)となっている事が確認できます。