オブジェクトストレージの使用

Application Mashup (WireCloud) course @ https://fiware-academy.readthedocs.io/

Presenter Notes

オブジェクトストレージの使用

イントロダクション

Presenter Notes

イントロダクション

オブジェクトストレージは、バイナリ・オブジェクト用の永続ストレージを提供します。 オブジェクトはコンテナと呼ばれる名前付きの場所に保管されます。コンテナはネストでき、 オブジェクトは階層的に格納できます。このセクションの主な目的は、この API の使い方を理解できるようにするための例を示すことです。

Presenter Notes

オブジェクトストレージの使用

ウィジェット/オペレータへの ObjectStorage サポートの追加

Presenter Notes

ウィジェット/オペレータへの ObjectStorage サポートの追加

この機能を使用したい場合は、まず config.xml ファイルを変更し、Requirements 内に新しい ObjectStorageFeature という名前を追加する必要があります。 たとえば、XML を使用してウィジェットの構成を設定した場合、コードは次のようになります。 KeyStone サーバの URL を保存するのに役立つ設定も追加されています。

<?xml version='1.0' encoding='UTF-8'?>
<widget xmlns="http://wirecloud.conwet.fi.upm.es/ns/macdescription/1" vendor="Wirecloud" name="objectstorage-test-widget" version="1.0">
  <details>
    <title>Wirecloud Object Storage API test widget</title>
    <authors>aarranz</authors>
    <email>aarranz@conwet.com</email>
    <image>images/catalogue.png</image>
    <smartphoneimage>images/catalogue_iphone.png</smartphoneimage>
    <description>This widget is used to test whether the Object Storage API is usable by widgets</description>
    <doc>doc/index.html</doc>
  </details>
  <requirements>
    <feature name="ObjectStorage"/>
  </requirements>
  <preferences>
    <preference name="keystone_url" type="text" label="Keystone Server" description="Keystone Server where the Object Storage server to use for testing the integration between Wirecloud and the Object Storage GE is registered" default="https://cloud.lab.fiware.org/keystone"/>
  </preferences>
  <wiring/>
  <contents src="test.html" contenttype="text/html" charset="utf-8" useplatformstyle="true"/>
  <rendering height="24" width="6"/>
</widget>

Presenter Notes

ウィジェット/オペレータへの ObjectStorage サポートの追加

RDF を使用したい場合は、コードは次のようになります :

!
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns:foaf="http://xmlns.com/foaf/0.1/"
  xmlns:wire="http://wirecloud.conwet.fi.upm.es/ns/widget#"
  xmlns:gr="http://purl.org/goodrelations/v1#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:usdl="http://www.linked-usdl.org/ns/usdl-core#"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dcterms="http://purl.org/dc/terms/"
  xmlns:vcard="http://www.w3.org/2006/vcard/ns#"
>
  <wire:Widget rdf:about="http://wirecloud.conwet.fi.upm.es/ns/widget#Wirecloud/objectstorage-test-widget/1.0">
    <dcterms:creator>
      <foaf:Person rdf:nodeID="N2cda3cef67eb47558145c705d0d3b191">
        <foaf:name>aarranz</foaf:name>
      </foaf:Person>
    </dcterms:creator>
    <wire:displayName>Wirecloud Object Storage API test widget</wire:displayName>
    <foaf:page rdf:resource="doc/index.html"/>
    <dcterms:description>This widget is used to test whether the Object Storage API is usable by widgets</dcterms:description>
    <wire:hasPlatformPreference>
      <wire:PlatformPreference rdf:nodeID="Nf5128b00c737420f91385f002c272954">
        <dcterms:description>Keystone Server where the Object Storage server to use for testing the integration between Wirecloud and the Object Storage GE is registered</dcterms:description>
        <rdfs:label>Keystone Server</rdfs:label>
        <wire:index>0</wire:index>
        <wire:type>text</wire:type>
        <dcterms:title>keystone_url</dcterms:title>
        <wire:default>https://cloud.lab.fiware.org/keystone</wire:default>
      </wire:PlatformPreference>
    </wire:hasPlatformPreference>
    <wire:hasImageUri rdf:resource="images/catalogue.png"/>
    <usdl:versionInfo>1.0</usdl:versionInfo>
    <dcterms:title>objectstorage-test-widget</dcterms:title>
    <vcard:addr>
      <vcard:Work rdf:nodeID="N353ea6f0c6c24daf8e3e2ba8b1b6396c">
        <vcard:email>aarranz@conwet.com</vcard:email>
      </vcard:Work>
    </vcard:addr>
    <usdl:hasProvider>
      <gr:BusinessEntity rdf:nodeID="Naf20bf95bb5d4a6484f501744b75deb4">
        <foaf:name>Wirecloud</foaf:name>
      </gr:BusinessEntity>
    </usdl:hasProvider>
    <wire:hasPlatformWiring>
      <wire:PlatformWiring rdf:nodeID="Na67dd8db508d48338034a1f14ab4f2c9"/>
    </wire:hasPlatformWiring>
    <usdl:utilizedResource>
      <usdl:Resource rdf:about="test.html">
        <wire:usePlatformStyle>true</wire:usePlatformStyle>
      </usdl:Resource>
    </usdl:utilizedResource>
    <wire:hasPlatformRendering>
      <wire:PlatformRendering rdf:nodeID="Nb55500a19f324a88bc5eff01d3d0bd8d">
        <wire:renderingHeight>24</wire:renderingHeight>
        <wire:renderingWidth>6</wire:renderingWidth>
      </wire:PlatformRendering>
    </wire:hasPlatformRendering>

    <!-- Here we add the Feature -->
    <wire:hasRequirement>
      <wire:Feature rdf:nodeID="N2cdd6eec5a4c43ad8cd68d09f51c100c">
        <rdfs:label>ObjectStorage</rdfs:label>
      </wire:Feature>
    </wire:hasRequirement>
    <wire:hasiPhoneImageUri rdf:resource="images/catalogue_iphone.png"/>
  </wire:Widget>
</rdf:RDF>

Presenter Notes

オブジェクトストレージの使用

KeyStone サーバとの接続

Presenter Notes

KeyStone サーバとの接続

ObjectStorage を使い始めるには、まず KeyStone サーバとの接続を設定する必要があります。 そのため、新しい KeystoneAPI を作成します :

var keystone = new KeystoneAPI(url, options)

サポートされているオプションの全リストについては、 ObjectStorage Javascript API documentation の資料を参照してください。ただし、サマリとして、url は、ObjectStorage サーバの場所です。また、IdM 認証を使用して ObjectStorage インスタンスに接続している場合は、必要な認証資格情報を渡す必要があります。 これには2つの方法があります :

  • token オプションを利用して必要な Authentication ヘッダを直接渡します
  • ObjectStorage に、IdM から WireCloud によって取得されたトークンを 使用させるための use_user_fiware_token オプションを使用します

Presenter Notes

KeyStone サーバとの接続

この例は、FIWARE テストベッドで利用可能なリソースを使用して KeyStone サーバに 接続する方法を示しています。使用する Keystone URL は設定から取得されたものです :

var keystone = new KeystoneAPI(MashupPlatform.prefs.get('keystone_url'), {
    use_user_fiware_token: true
});

Presenter Notes

オブジェクトストレージの使用

ユーザが利用できるすべてのテナントを取得

Presenter Notes

ユーザが利用できるすべてのテナントを取得

KeyStone サーバに接続したら、考慮に入れる必要があるのは、ユーザは複数のテナントを 使用して情報を保存できるということです。ユーザが利用できるテナントの一覧を 取得するには、以下の getTenants 関数を使います :

keystone.getTenants([options])

options 引数は、次の2つのコールバックを設定することができます :

  • onSuccess は、リクエストが正常に終了したときに呼び出されます。 この関数は、リクエストを行ったユーザが利用できるすべてのテナントを含む フィールド・テナントを持つ辞書を受け取ります
  • onFailure は、リクエストがエラーで終了したときに呼び出されます

Presenter Notes

ユーザが利用できるすべてのテナントを取得

次の例では、両方のコールバックで関数を呼び出します。リクエストが正常に終了すると、 最初に利用可能なテナントの ID が表示されます。そうでなければ、メッセージ・エラーを 表示します :

keystone.getTenants({
    onSuccess: function(data) {
        document.getElementById('tenantId').textContent = data.tenants[0].id;
    },
    onFailure: function () {
        document.getElementById('tenantId').textContent = 'Fail';
    }
});

Presenter Notes

オブジェクトストレージの使用

認証トークンの取得

Presenter Notes

認証トークンの取得

使用するテナントを選択したら、getAuthToken 関数を使って認証トークンを 取得しなければなりません :

keystone.getAuthToken([options])

options 引数には以下のフィールドが含まれます :

  • tenantName : 生成されたトークンに関連付けられるテナントの名前。tenantId 属性とtenantName 属性はどちらもオプションですが、同時に指定しないでください
  • tenantId : 生成したトークンに関連付けるテナントの idtenantId 属性と tenantName 属性はどちらもオプションですが、一緒に指定しないでください
  • onSuccess : リクエストが正常に終了したときに呼び出されます。 この関数は2つのパラメータを受け取ります
    • new_token : ObjectStorage へのアクセスに使用できる新しいトークン
    • data: テナントが利用できるサービスのカタログ
  • onFailure: リクエストがエラーで終了したときに呼び出されます

Presenter Notes

認証トークンの取得

次のスニペットはこの関数の使い方を示しています。この場合、前のコードで取得した テナント ID を使用します。ObjectStorage の URL を取得するために data パラメータも処理します :

keystone.getAuthToken({
    tenantId: data.tenants[0].id,
    onSuccess: function (new_token, data) {
        for (i = 0; i < data.access.serviceCatalog.length; i++) {
            if (data.access.serviceCatalog[i].type === 'object-store') {
                object_storage = data.access.serviceCatalog[i].endpoints[0].publicURL;
            }
        }
    },
    onFailure: function () {
        document.getElementById('api_token').textContent = 'Fail';
    }
});

Presenter Notes

オブジェクトストレージの使用

ObjectStorage サーバとの接続

Presenter Notes

ObjectStorage サーバとの接続

ObjectStorage サーバの URL を入手したら、それに接続できます。そのために、 以下の関数を使用しします :

objectStorage = ObjectStorageAPI(url)

今回の例では、ObjectStorage サーバの URL を object_storage 変数に保存したので、 コードは次のようになります :

objectStorage = ObjectStorageAPI(object_storage)

Presenter Notes

オブジェクトストレージの使用

コンテナで利用可能なコンテンツのリスト

Presenter Notes

コンテナで利用可能なコンテンツのリスト

ObjectStorage サーバに接続すると、コンテナで利用可能なすべてのコンテンツを リストすることができます。そのために、listContainer 関数を使用します :

objectStorage.listContainer(container[, options])

container 引数はコンテナの名前ですが、options 引数は以下のフィールドを 含むべきです :

  • token : 以前に getAuthToken 関数で取得したトークン
  • onSuccess : リクエストが正常に終了したときに呼び出されます。 この関数は引数としてコンテナ内の利用可能なファイルのリストを受け取ります
  • onFailure : リクエストがエラーで終了したときに呼び出されます

Presenter Notes

コンテナで利用可能なコンテンツのリスト

次の例では、integrationTests コンテナ内の利用可能なファイルを取得し、 最初のファイルの名前を表示します。

objectStorage.listContainer('integrationTests', {
    token: token,

    onSuccess: function(file_list) {
        document.getElementById('file_name').textContent = file_list[0].name;
    },

    onFailure: function () {
        document.getElementById('file_count').textContent = 'Fail';
    }
});

Presenter Notes

オブジェクトストレージの使用

ファイルのアップロード

Presenter Notes

ファイルのアップロード

ObjectStorage に接続している場合は、ファイルを簡単にアップロードすることもできます。 そのためには、uploadFile 関数をを使用します :

objectStorage.uploadFile(container, file[, options])

containerfile がアップロードされる予定の名前ですが、file はアップロード されるコンテンツです。options 引数は以下のフィールドを含むべきです :

  • token : 以前に getAuthToken 関数で取得した token
  • file_name : アップロードされたコンテンツを container に保存するために使われる名前
  • onSuccess : リクエストが正常に終了したときに呼び出されます。この機能は    引数を受け取りません
  • onFailure : リクエストがエラーで終了したときに呼び出されます

Presenter Notes

ファイルのアップロード

ここでは、"Hello world!" というテキストファイルをアップロードする方法を示します。

var blob = new Blob(["Hello world!"], { type: "text/plain" });
objectStorage.uploadFile('integrationTests', blob, {
    token: token,
    file_name: 'test1.txt',
    onSuccess: function() {
        document.getElementById('file_upload').textContent = 'OK';
    },
    onFailure: function () {
        document.getElementById('file_upload').textContent = 'Fail';
    }
});

Presenter Notes

オブジェクトストレージの使用

ファイルの削除

Presenter Notes

ファイルの削除

ファイルをアップロードすると便利ですが、場合によっては削除したいことがあります。 そのために、deleteFile 関数を使用します :

objectStorage.deleteFile(container, file_name[, options])

container はファイルが削除されるコンテナの名前で、file_name は削除する ファイルの名前です。options 引数は以下のフィールドを含むべきです :

  • token : 以前に getAuthToken 関数で取得したトークン
  • onSuccess : リクエストが正常に終了したときに呼び出されます。この機能は    引数を受け取りません
  • onFailure : リクエストがエラーで終了したときに呼び出されます

Presenter Notes

ファイルの削除

次の例は、前の手順で作成したファイルを削除する方法を示しています :

objectStorage.deleteFile('integrationTests', file_name, {
    token: token,
    onSuccess: function() {
        document.getElementById('file_deletion').textContent = 'OK';
    },
    onFailure: function () {
        document.getElementById('file_deletion').textContent = 'Fail';
    }
});

Presenter Notes

オブジェクトストレージの使用

自分でテスト

Presenter Notes

自分でテスト

この機能を使うことを学ぶ最良の方法はそれを使うことです。このため、このガイドに 基づいて非常に簡単な例を紹介します。コードを確認して好きなように変更し、 それが機能するかどうかをテストします。このウィジェットは、実行する前に instanceTests コンテナを作成した場合にのみ機能します。それ以外の場合は失敗します。

Presenter Notes

Thanks!

Presenter Notes