Oracle® Fusion Middleware Oracle Virtual Assembly Builderアプリケーションおよびイントロスペクション・プラグインの開発

12c (12.1.2)

E47992-01(原本部品番号:E29472-01)

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 Oracle Virtual Assembly Builderデプロイヤの概要

- 1.1 概要

- 1.2 デプロイメントのライフサイクル

- 1.2.1 アセンブリ・アーカイブのアップロード

- 1.2.1.1 アセンブリ・アーカイブのバージョニング

- 1.2.2 デプロイメント・フェーズ

- 1.3 デプロイヤのアーキテクチャ

- 1.4 ターゲット

- 1.5 タグ

- 1.6 メタデータ・ドリブン機能

2 API Webサービス

- 2.1 操作

- 2.2 管理操作

- 2.3 使用方法およびライフサイクル

- 2.4 管理Webサービス

- 2.4.1 コンテキスト・パス

- 2.4.2 問合せ文字列のパターン

- 2.4.3 アクション

- 2.4.4 エラー処理

- 2.4.5 XMLスキーマ

- 2.5 デプロイヤWebサービス

- 2.5.1 コンテキスト・パス

- 2.5.2 問合せ文字列のパターン

- 2.5.3 アクション

- 2.5.4 エラー処理

- 2.5.5 XMLスキーマ

3 APIリファレンス: 管理操作

- 3.1 HTTP問合せ文字列におけるパラメータ

- 3.2 レスポンスのコンテンツ

- 3.3 AddTargetUser

- 3.4 CreateTarget

- 3.5 DeleteTarget

- 3.6 DescribeTargetConfigurations

- 3.7 DescribeTargetNames

- 3.8 DescribeTargetUsers

- 3.9 DescribeUserTargets

- 3.10 GetDefaultTarget

- 3.11 GetTargetType

- 3.12 RemoveTargetUsers

- 3.13 SetDefaultTarget

4 APIリファレンス: デプロイヤ操作

- 4.1 HTTP問合せ文字列におけるパラメータ

- 4.2 AddAssemblyUsers

- 4.3 CreateAssemblyInstance

- 4.4 CreateTags

- 4.5 DeleteAssemblyArchive

- 4.6 DeleteAssemblyInstance

- 4.7 DeleteAssemblyResources

- 4.8 DeleteDeploymentPlan

- 4.9 DeleteLogEvents

- 4.10 DeleteRequests

- 4.11 DeleteTags

- 4.12 DeployAssemblyInstance

- 4.13 DescribeAssemblyArchives

- 4.14 DescribeApplianceInstances

- 4.15 DescribeAssemblyInstances

- 4.16 DescribeAssemblyResources

- 4.17 DescribeAssemblyUsers

- 4.18 DescribeDeployer

- 4.19 DescribeLogEvents

- 4.20 DescribeRegistrations

- 4.21 DescribeRequests

- 4.22 DescribeScalingGroups

- 4.23 DescribeTags

- 4.24 DescribeTargets

- 4.25 DescribeVnets

- 4.26 DownloadAssemblyArchive

- 4.27 DownloadAssemblyMetadata

- 4.28 DownloadAssemblyResources

- 4.29 RedeployAssemblyInstance

- 4.30 RegisterAssemblyArchive

- 4.31 RemoveAssemblyUsers

- 4.32 RestartAssemblyInstance

- 4.33 ResumeAssemblyInstance

- 4.34 ScaleAppliance

- 4.35 StartAssemblyInstance

- 4.36 StopAssemblyInstance

- 4.37 SuspendAssemblyInstance

- 4.38 UndeployAssemblyInstance

- 4.39 UnregisterAssemblyArchive

- 4.40 UpdateAssemblyArchive

- 4.41 UploadAssemblyArchive

- 4.42 UploadAssemblyResources

- 4.43 UploadDeploymentPlan

- 4.44 ValidateAssemblyInstanceResources

5 Oracle Virtual Assembly BuilderプラグインSDKを使用して開発するための準備

- 5.1 概要

- 5.1.1 プラグインの機能

- 5.1.2 パッケージ化と配布

- 5.2 プラグインを開発するための準備

- 5.2.1 プラグインの命名

- 5.2.2 プラグインかプラグインの拡張機能か

- 5.2.3 プラグインのバージョン

- 5.2.4 イントロスぺクション・プラグインの開発

- 5.3 プラグインのアーキテクチャとワークフロー

- 5.3.1 ワークフロー

- 5.3.2 プラグインの適合方法

- 5.3.2.1 ジョブ・パラメータ

- 5.3.2.2 デハイドレーション

- 5.3.2.3 リハイドレーション

- 5.3.2.4 デプロイメント後の操作

- 5.4 メタデータの概要

- 5.4.1 メタデータのタイプ

- 5.4.1.1 アプライアンス

- 5.4.1.2 原子性アセンブリ

- 5.4.2 アプライアンス

- 5.4.2.1 スケーラビリティ

- 5.4.3 アセンブリ

- 5.4.4 原子性アセンブリ

- 5.4.5 プロパティ

- 5.4.5.1 プロパティのカテゴリ

- 5.4.5.2 プロパティ・グループ

- 5.4.5.3 統合プロパティ

- 5.4.5.4> プロパティの設定と取得

- 5.4.6 入力および出力

- 5.4.6.1 出力接続プロパティ

- 5.4.6.2 接続

- 5.4.6.3 外部リソース

- 5.4.6.4 Vnet

- 5.4.6.5 インタフェース

- 5.4.7 コンテンツ・リソース

- 5.4.8 ファイル・セット定義

- 5.4.8.1 除外

- 5.4.8.2 共有ファイル・セット

- 5.5 イントロスペクタ・プラグインの拡張機能

- 5.5.1 プラグイン拡張機能のセマンティクス

- 5.5.2 プラグイン拡張機能の制限

- 5.5.3 プラグイン拡張機能の実行

- 5.5.4 プラグイン拡張機能の実装

- 5.5.5 プラグイン拡張機能SPIFサービスのアクティブ化

- 5.6 サポート・サービス

- 5.6.1 SPIF

- 5.6.1.1 クラスのロード

- 5.6.1.2 アプリケーション

- 5.6.1.3 サービス

- 5.6.1.4 サービスの作成

- 5.6.1.5 サービス・アクティベータ

- 5.6.1.6 サービスの登録

- 5.6.1.7 サービスの検索

- 5.6.2 検証フレームワーク

- 5.6.2.1 ファイル・セット取得の検証

- 5.6.2.2 プラットフォームとOS検証

- 5.6.2.3 テンプレート検証

- 5.6.3 プラグインの検出およびインストール

- 5.6.3.1 プラグインのロケーション

- 5.6.3.2 plugin.configファイル

- 5.6.4 IntrospectorPluginLocatorサービスの実装

- 5.6.5 プラグインの下位互換性要件

- 5.6.6 プラグインのインストールのガイドライン

- 5.7 ユーティリティおよびヘルパー

- 5.7.1 OCM登録

- 5.7.2 OUI中央インベントリ

- 5.7.3 SSH

- 5.7.4 Velocity

- 5.7.5 その他のユーティリティ

- 5.8 ベスト・プラクティス

- 5.8.1 参照システムの変更の回避

- 5.8.2 静的変数の回避

- 5.8.3 ServiceActivator.start()時のSPIFサービスへのアクセス試行の禁止

- 5.8.4 予約ネームとネーミングの制限

- 5.8.4.1 アプライアンスおよびアセンブリの名前

- 5.8.4.2 プロパティ名

- 5.8.4.3 タイプ

- 5.8.5 外部依存関係の管理

- 5.9 イントロスペクタ・プラグインのテスト

- 5.9.1 デハイドレーションのテスト

- 5.9.2 リハイドレーションのテストとトラブルシューティング

- 5.9.2.1 デプロイメントのライフサイクル

6 イントロスぺクション・プラグインの開発

- 6.1 概要

- 6.2 チュートリアル1: Oracle Virtual Assembly Builderの統合

- 6.2.1 プロジェクトの作成

- 6.2.2 IntrospectorPluginの作成

- 6.2.3 SPIFサービスのアクティブ化

- 6.2.4 チュートリアルの作成

- 6.2.5 プラグインのインストール

- 6.2.6 イントロスペクタ・プラグインの実行

- 6.2.6.1 abctlコマンドライン・ユーザー・インタフェース

- 6.2.6.2 Oracle Virtual Assembly Builder Studio

- 6.2.7 まとめ

- 6.3 チュートリアル2: デハイドレーション

- 6.4 チュートリアル3: リハイドレート

- 6.5 チュートリアル4: 進捗

- 6.6 チュートリアル5: ジョブ・パラメータ

- 6.7 サンプル・プラグイン

- 6.8 サンプル・プラグイン拡張機能

7 イントロスぺクション・プラグイン・モジュール参照

- 7.1 概要

- 7.2 外部共通[oracle.as.assemblybuilder.external.common]

- 7.2.1 ロギング

- 7.2.2 例外

- 7.2.3 リソース

- 7.3 進捗[oracle.as.assemblybuilder.progress]

- 7.4 イントロスペクタ[oracle.as.assemblybuilder.introspector.api]

- 7.5 アプライアンス[oracle.as.assemblybuilder.introspector.metadata.appliance.Appliance]

- 7.6 アセンブリ[oracle.as.assemblybuilder.introspector.metadata.assembly.Assembly]

- 7.7 カタログ[oracle.as.assemblybuilder.catalog.api]

- 7.8 イントロスペクタ・プラグイン・ユーティリティ[oracle.as.assemblybuilder.introspector.plugin.util]

8 サンプル・アプリケーション: WebサービスAPI

- 8.1 サンプル・アプリケーション

A Webサービス・スキーマ

- A.1 スキーマ

Oracle® Fusion Middleware

Oracle Virtual Assembly Builderアプリケーションおよびイントロスペクション・プラグインの開発

12c (12.1.2)

E47992-01(原本部品番号:E29472-01)

2013年6月

Oracle Fusion Middleware Oracle Virtual Assembly Builderアプリケーションおよびイントロスペクション・プラグインの開発, 12c (12.1.2)

E47992-01

Copyright © 2013, Oracle and/or its affiliates.All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007).Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle およびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

はじめに

このマニュアルでは、Oracle Virtual Assembly Builderの開発について説明します。ここでは、次の内容を説明します。

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

対象読者

次の開発機能を活用してアプリケーションを作成するOracle Virtual Assembly Builder開発者が対象読者です。

- WebサービスAPIを使用して、PaaS対応アプリケーションを作成する機能。

- イントロスペクション・プラグインSDKを使用して、イントロスペクション・プラグインを作成する機能。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleカスタマは、My Oracle Supportから電子サポートにアクセスできます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoまたはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs (聴覚障害者向け)を参照してください。

関連ドキュメント

詳細は、ドキュメント・セットに含まれる次のドキュメントを参照してください。

- Oracle Virtual Assembly Builderのインストール

- Oracle Virtual Assembly Builderの使用方法

- Oracle Virtual Assembly Builderリリース・ノート

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダー変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 Oracle Virtual Assembly Builderデプロイヤの概要

次の項では、WebサービスAPIおよびその開発プロセスについて説明します。

- 第1.1項「概要」

- 第1.2項「デプロイメントのライフサイクル」

- 第1.3項「デプロイヤのアーキテクチャ」

- 第1.4項「ターゲット」

- 第1.5項「タグ」

- 第1.6項「メタデータ・ドリブン機能」

1.1 概要

Oracle Virtual Assembly Builderデプロイヤは、アセンブリ・アーカイブのリポジトリをメンテナンスし、そこに含まれるソフトウェア・システムのデプロイメントの側面を管理するJ2EEアプリケーションです。Oracle Virtual Assembly Builder Studioでアセンブリ・アーカイブを作成します。

デプロイヤによって、Oracle VMのような仮想化されたシステムにアセンブリ・アーカイブを登録するための操作、およびアセンブリ・アーカイブによって定義されているソフトウェア・システムのデプロイメントを編成するための操作が提供されます。

Oracle Virtual Assembly Builder Studioによって作成されたアセンブリ・アーカイブには、アプリケーションの形成のために連携して動作する、複数の関連するソフトウェア・スタックから構成されるソフトウェア・システムに関する情報が含まれます。このシステムをアセンブリと呼びます。アセンブリ・アーカイブには、アセンブリと、仮想化環境におけるアセンブリのインスタンスをインスタンス化するために使用される仮想マシン・テンプレートに関するメタデータが含まれます。

Oracle Virtual Assembly Builderデプロイヤへのインタフェースは、アセンブリ・アーカイブをそのリポジトリにアップロードする操作、仮想化システムにアセンブリ・アーカイブを登録する操作、およびアセンブリ・アーカイブで定義されたシステムのデプロイメント・インスタンスを管理する操作を行うWebサービスです。

Oracle Virtual Assembly Builderによって、総合的な製品ソリューションの一部としての追加インタフェースが提供されます。特に、Oracle Virtual Assembly Builder Studioおよびabctlコマンドライン・インタフェースが、Webサービスと統合されます。

第1.4項「ターゲット」に示すとおり、Oracle Virtual Assembly Builderデプロイヤは、Oracle VM内のターゲットにデプロイできます。このような環境間における、機能面でのわずかな差異については、ドキュメント全体をとおして説明しています。

1.2 デプロイメントのライフサイクル

この項では、デプロイヤのリポジトリへのアセンブリ・アーカイブのアップロードを含む、デプロイメントのライフサイクルと、アセンブリ・インスタンスのデプロイメント・フェーズについて説明します。

1.2.1 アセンブリ・アーカイブのアップロード

Oracle Virtual Assembly Builderデプロイヤは、アセンブリ・アーカイブをリポジトリにアップロードする操作を行うWebサービスです。

1.2.1.1 アセンブリ・アーカイブのバージョニング

デプロイヤのリポジトリでは、複数のバージョンのアセンブリ・アーカイブを同時に保持することができます。アセンブリ・アーカイブがアップロードされる際に、デプロイヤによってバージョン番号が割り当てられます。

バージョニングの書式は、整数の単位で増加します(バージョン1、2、3など)。通常、最新のバージョンは、バージョンを必要とするアセンブリ操作のデフォルトとみなされます。同じ名前でアップロードされた別のアセンブリ・アーカイブは、次のバージョンを取得します。

1.2.2 デプロイメント・フェーズ

アセンブリ・インスタンスは、デプロイ可能なアーティファクトです。アセンブリ、そのデプロイメント計画の1つ、およびデプロイされる必要があるターゲットを選択して、アセンブリ・インスタンスを作成する必要があります。CreateAssemblyInstanceを使用して、アセンブリ・インスタンスを作成できます。

デプロイ時に、デプロイ対象のアセンブリ・インスタンスを選択します。アセンブリ・インスタンスのデプロイメントは、様々なフェーズを通って遷移します(図1-1)。このフェーズには、ステージング済、デプロイ済および失敗が含まれます。それぞれの状態で、操作のサブセットが実行されます。

アプライアンス・インスタンスは、ターゲットの仮想環境で実行中または作成された(あるいはその両方の)アプライアンスのインスタンスです。アセンブリ・インスタンスがデプロイされると、アプライアンス・インスタンスを起動および停止でき、あるいはデプロイされたアセンブリ・インスタンスに関連付けられたアプライアンス・インスタンスの番号を増減できます。Oracle Virtual Assembly Builderがデプロイされたアプリケーションの状態を監視することはなく、デプロイメント関連操作が成功したか失敗したかと、アセンブリがデプロイ済かステージング済かの通知のみを行います。

図1-1 デプロイメントのライフサイクル

「図1-1 デプロイメントのライフサイクル」の説明

次に、アセンブリ・インスタンス・フェーズのサマリーを示します。

- デプロイ済: アセンブリ・インスタンスがデプロイされ、操作が正常に完了した場合、デプロイ済の状態になります。デプロイ済アセンブリ・インスタンスで実行できる操作は次のとおりです。

- StopAssemblyInstance: この操作では、アセンブリ・インスタンスの実行中のすべてのアプライアンス・インスタンスを停止します。この操作の完了後に、アセンブリ・インスタンスはステージング済フェーズに遷移します。アプライアンス・インスタンスは仮想化環境に残り、後で再起動することが可能です。

- UndeployAssemblyInstance: この操作では、実行中のすべてのアプライアンス・インスタンスを停止して、これらを環境から削除します。この操作の完了後、アセンブリ・インスタンスはシステムに残るため、再度デプロイすることが可能です。

- RestartAssemblyInstance: この操作では、アセンブリ・インスタンスの実行中のすべてのアプライアンス・インスタンスを再開します。アセンブリ・インスタンスは、ステージング済に遷移してからデプロイ済に戻ります。

- RedeployAssemblyInstance: この操作では、アセンブリ・インスタンスを再デプロイします。この操作の一部として、すべてのアプライアンス・インスタンスが停止され、ターゲット環境から削除されます。新しいアプライアンス・インスタンスが作成され、起動されます。

- スケール: アセンブリ・インスタンス内のスケーリング・グループをスケールします。スケーリングは、アセンブリ・インスタンスでスケーリング・グループをスケール・アップまたはスケール・ダウンするために実行可能です。スケーリング・グループに対して実行可能なアプライアンス・インスタンス数は、構成済の最小インスタンス数と最大インスタンス数の間である必要があります。デプロイメントはデプロイ済状態のままとなります。

- 失敗: デプロイまたはアンデプロイ操作に失敗した際に、アセンブリ・インスタンスはこのフェーズになります。デプロイメント操作は、リソース不足などの様々な理由で失敗する可能性があります。失敗したデプロイメントに対して実行可能な操作は次のとおりです。

- DeleteAssemblyInstance: この操作では、必要なクリーンアップが行われます(アプライアンス・インスタンスの停止および削除など)。この操作が完了すると、アセンブリ・インスタンスは存在しなくなります。

- ステージング済: アセンブリ・インスタンスを停止すると、ステージング済のフェーズになります。このフェーズでは、すべてのアプライアンス・インスタンスは停止されています。このフェーズから実行可能な操作は次のとおりです。

- StartAssemblyInstance: この操作では、停止されているすべてのアプライアンス・インスタンスを起動します。この操作の完了後、アセンブリ・インスタンスはデプロイ済状態に戻ります。

- UndeployAssemblyInstance: この操作では、停止されているすべてのアプライアンス・インスタンスを仮想化環境から削除します。この操作の完了後、アセンブリ・インスタンスは残るため、再度デプロイすることが可能です。

1.3 デプロイヤのアーキテクチャ

Oracle Virtual Assembly Builderデプロイヤは、WebLogic ServerドメインにWebアプリケーションとして構成されます。

図1-2は、Oracle Virtual Assembly Builderデプロイヤの最上位コンポーネントを示しています。デプロイヤ・リポジトリには、アセンブリ・アーカイブと、Webクライアントによってデプロイヤにアップロードされる任意のデプロイメント計画が含まれます。アセンブリ・アーカイブおよびデプロイメント計画はOracle Virtual Assembly Builder Studioで作成されますが、デプロイヤによってメンテナンスされるリポジトリは、Oracle Virtual Assembly Builder Studioカタログとは別のものです。Oracle Virtual Assembly Builder Studioで作成された計画は、WebサービスAPI経由でデプロイヤにアップロードされます。デプロイヤのランタイムおよび構成の状態は、存続しているCoherenceの分散キャッシュで維持されるため、単一インスタンス・インストールが失敗した場合でもリカバリ可能です(つまり、デプロイヤのプロセスが存在します)。デプロイヤは1つ以上の仮想化システムと対話し、これらのシステムにアセンブリ・アーカイブのデプロイメントを編成します。

図1-2 デプロイヤのアーキテクチャ

1.4 ターゲット

仮想化システムが異なると、異なる方法でリソースが構成され、リソースに対する参照およびアクセスには異なる情報が必要となります。異なるシステム間で共通の操作性を実現するために、Oracle Virtual Assembly Builderデプロイヤによってターゲットの概念が定義されています。ターゲットは、このドキュメントで後述する管理インタフェースを使用して構成され、仮想化システムにおけるリソースまたはリソースのプールを参照するために使用されます。各ターゲットに提供される構成情報は、ターゲットを含む仮想化システムに固有のものです。

Oracle Virtual Assembly Builderデプロイヤでは、Oracle VMのターゲットへのアセンブリ・インスタンスのデプロイがサポートされます。

1.5 タグ

一部の仮想化システムでは、システムと対話するツールによって問合せ可能なテンプレートやVMインスタンスなどのアーティファクトと関連付けられたタグによって、アーティファクトの検索や、またはアーティファクト間の関係の検索(特定のデプロイメントに関連付けられたアーティファクトの検索など)が可能です。

タグ付けをサポートするシステムでは、Oracle Virtual Assembly Builderデプロイヤによって、作成される特定のアーティファクトには自動的にタグが追加されます。表1-1で、これらのタグについて説明します。タグの値は常に文字列ですが、別の型として解釈されるものもあります。データ型列は、これらの型を示しています。たとえばデータ型が整数の場合、値が123のような文字列であると、数値の123として解釈される可能性があります。Oracle VMアーティファクトの列は、特定のタグが関連付けられるアーティファクトの種類を示しています。

表1-1 Oracle Virtual Assembly Builderデプロイヤのタグ

キー名

データ型

Oracle VMアーティファクト

説明

例

ovab:AssemblyArchiveName

文字列

インスタンス、

テンプレート

インスタンスのソースであるテンプレートを作成するために使用されるアセンブリ・アーカイブ名。

MySite.ova

ovab:TemplateId

文字列

インスタンス

インスタンスのソースであるテンプレートのOracle VM名。

234jlk234jj3lkj43

ovab:TemplateRepositoryName

文字列

インスタンス

インスタンスのソースであるテンプレートを含むリポジトリ名。

MyRepository

ovab:AppliancePath

文字列

インスタンス

Oracle Virtual Assembly Builderアセンブリ内のアプライアンスへのパス。これを使用して、元のアセンブリ構造におけるインスタンスの場所を決定します。

/MyWls/EjbCluster

ovab:ApplianceInstanceIndex

整数

インスタンス

アプライアンス・インスタンス索引。

2

ovab:ComponentType

文字列

インスタンス

Oracle Virtual Assembly Builderイントロスペクションによって決定されるアプライアンスのタイプ。

WLS

ovab:DeployerId

文字列

インスタンス、

アセンブリ・アーカイブ、

テンプレート

アーティファクトを作成したデプロイヤ・インスタンス識別子。

ovab:AssemblyInstanceId

文字列

インスタンス

デプロイヤ・インスタンスの有効範囲内で一意のアセンブリ・インスタンスの識別子。

Lkj234lk32j4lkj34

ovab:DeploymentPlan

文字列

インスタンス

インスタンスが含まれるデプロイメントに使用されるデプロイメント計画の名前。

MyPlan

ovab:UserName

文字列

テンプレート、

アセンブリ・アーカイブ、

インスタンス

アーティファクトの作成に進むデプロイメント操作を開始したユーザー名。

John

ovab:InitialTargetCount

整数

インスタンス

デプロイメント時のインスタンス数の初期ターゲット。

5

ovab:ScalabilityMin

整数

インスタンス

アプライアンスに許可されるインスタンスの最小数。

1

ovab:ScalabilityMax

整数

インスタンス

アプライアンスに許可されるインスタンスの最大数。

10

1.6 メタデータ・ドリブン機能

デプロイメント編成に関する詳細情報は、アプリケーションを表示するアセンブリ・アーカイブに埋め込まれているOVFメタデータ、およびデプロイメントの作成時に提供するデプロイメント計画に保存される情報によって決定します。

2 API Webサービス

次の項では、Oracle Virtual Assembly Builder WebサービスAPIについて説明します。

- 第2.1項「操作」

- 第2.2項「管理操作」

- 第2.3項「使用方法およびライフサイクル」

- 第2.4項「管理Webサービス」

- 第2.5項「デプロイヤWebサービス」

2.1 操作

Oracle Virtual Assembly Builderデプロイヤによって、WebサービスおよびCLI操作で使用される論理操作が提供されます。一部の操作は非同期であり、これらの操作をdescribeRequests操作で追跡できます。

操作に関する包括的なAPIリファレンスは、次の章に記載されています。

- 第3章「APIリファレンス: 管理操作」

- 第4章「APIリファレンス: デプロイヤ操作」

2.2 管理操作

Oracle Virtual Assembly Builderデプロイヤによって、ターゲットを構成するための論理的な管理操作が提供され、この操作では、仮想化環境におけるプールを参照します。これらの操作はすべて同期がとられます。

仮想化環境の動作およびその環境との対話方法の違いによって、このような構成には2つの手順が含まれます。

- CreateTarget操作を使用したターゲットの作成。このステップはOracle VMのために必要です。

- AddTargetUserを使用したターゲットに対する指定ユーザーの構成情報の追加。詳細は、第3章「APIリファレンス: 管理操作」の第3.3項「AddTargetUser」を参照してください。

ユーザーを追加するための操作は、これらの管理操作では提供されません。これらの操作は、このような操作を行う権限のあるセキュリティ管理者がLDAPサーバーに対して直接実行するものとされるためです。

2.3 使用方法およびライフサイクル

Oracle Virtual Assembly Builderデプロイヤを使用する際の最初の操作は、uploadAssemblyArchive操作を使用してデプロイヤのリポジトリにアセンブリ・アーカイブをアップロードすることです。

registerAssemblyArchive操作を使用して、アップロード済のアセンブリ・アーカイブを1つ以上のターゲットに登録できます。登録の詳細は、ターゲット・タイプごとに異なります。Oracle VMの場合は、デプロイヤへのアセンブリ・アーカイブのアップロード、Oracle VMシステム内のターゲットへのテンプレートの登録が含まれます。

ターゲットにアセンブリ・アーカイブが登録された後、createAssemblyInstance操作を使用して、その登録に1つ以上のアセンブリ・インスタンスを作成できます。アセンブリ・インスタンスは、アセンブリ・アーカイブによって定義されたアセンブリのVMインスタンスのライフサイクルを管理するために使用されるコンテキストです。アセンブリ・インスタンスの作成時に、デプロイメント計画(アセンブリ・インスタンス経由で管理されるアセンブリの環境に固有の詳細を定義するもの)が提供される必要があります。

アセンブリ・アーカイブのアセンブリ・インスタンスが作成されると、デプロイメント操作を開始できます。デプロイメント中に、アセンブリ・アーカイブによって定義されたアセンブリの初期インスタンスが作成され、起動されます。これが行われると、デプロイヤは、インスタンスの初期化スクリプトに埋め込まれた再構成ロジックと対話します(このロジックは、ネットワークおよびマウント済のディスク・ボリュームを構成し、その環境用にアプリケーション・スタックも構成します)。これらの対話によって、アプリケーション・スタックの起動時に作成されるインスタンス間の接続が構成されます。

アセンブリ・インスタンスがデプロイされると、アセンブリ内のアプライアンスで実行中のインスタンスの数を増減させるscaleなど、その他の多数のライフサイクル操作を実行中のシステムに適用できます。デプロイメントのすべてのインスタンスを停止および起動する操作もあり、この操作は、アプリケーションをオフラインにしたりオンラインに戻したりするために使用されます。

2.4 管理Webサービス

Webサービスに対する操作は、デプロイヤのコンテキスト・パスにHTTPリクエストをポストすることによって行われます。このリクエストには、操作に対する引数を定義するゼロ個以上のリクエスト・パラメータが続くアクションを定義するリクエスト・パラメータが含まれます。詳細は、次の第2.5.2項「問合せ文字列のパターン」を参照してください。

2.4.1 コンテキスト・パス

管理Webサービスのコンテキスト・パスは、/ovab/adminです。

2.4.2 問合せ文字列のパターン

アクション= action&param1=value&param2=value...

値の配列の場合は、問合せ文字列で同じパラメータ名を複数回使用します。次に例を示します。

アクション= action&param1=value&param2=value&param2=value...

2.4.3 アクション

第3章「APIリファレンス: 管理操作」では、管理Webサービスによって公開されるすべての操作が説明されています。レスポンスのコンテンツの列に含まれる型の詳細は、付録A「Webサービス・スキーマ」に示すスキーマで参照できる場合があります。

2.4.4 エラー処理

表2-1に、Webサービスに対して実行されるエラー処理の方法を示しています。

表2-1 Webサービスのエラー処理

エラーに対する責任

HTTPステータス・コード

レスポンスのコンテンツのXML要素

ユーザー

4xx

ErrorResult (type=USER)

サービス

5xx

ErrorResult (type=SERVICE)

注意:

エラーが発生した場合、レスポンスにコンテンツがない可能性があります(ErrorResult)。HTTPステータス・コードがサーブレット・コンテナによって生成された場合、レスポンスのコンテンツはなくなります。HTTPレスポンスがOracle Virtual Assembly Builderデプロイヤによって生成されと、予期しないサービス・エラーが発生した場合を除いて、通常はレスポンスにコンテンツが存在します。

2.4.5 XMLスキーマ

付録A「Webサービス・スキーマ」で、Webサービスのスキーマを参照できます。このスキーマには、前述のアクションの表に含まれるレスポンスのコンテンツ項目の定義が含まれます。

2.5 デプロイヤWebサービス

Webサービスに対する操作は、デプロイヤのコンテキスト・パスにHTTPリクエストをポストすることによって行われます。このリクエストには、操作に対する引数を定義するゼロ個以上のリクエスト・パラメータが続くアクションを定義するリクエスト・パラメータが含まれます。詳細は、次の第2.5.2項「問合せ文字列のパターン」を参照してください。

第2.1項「操作」に示すとおり、一部の操作で非同期アクションが開始される場合があります。Webサービスによって公開される操作は、前述の論理操作の説明で示したものと同じです。

2.5.1 コンテキスト・パス

デプロイヤWebサービスのコンテキスト・パスは、/ovab/deployerです。

2.5.2 問合せ文字列のパターン

アクション= action&param1=value&param2=value...

値の配列の場合は、問合せ文字列で同じパラメータ名を複数回使用します。次に例を示します。

アクション= action&param1=value&param2=value&param2=value...

2.5.3 アクション

第4章「APIリファレンス: デプロイヤ操作」では、デプロイヤWebサービスによって公開されるすべての操作が説明されています。レスポンスのコンテンツの列に含まれる型の詳細は、付録A「Webサービス・スキーマ」に示すスキーマで参照できる場合があります。

2.5.4 エラー処理

表2-2に、デプロイヤWebサービスに対して実行されるエラー処理の方法を示しています。

表2-2 Webサービスのエラー処理

エラーに対する責任

HTTPステータス・コード

レスポンスのコンテンツのXML要素

ユーザー

4xx

ErrorResult (type=USER)

サービス

5xx

ErrorResult (type=SERVICE)

注意:

エラーが発生した場合、レスポンスにコンテンツがない可能性があります(ErrorResult)。HTTPステータス・コードがサーブレット・コンテナによって生成された場合、レスポンスのコンテンツはなくなります。HTTPレスポンスがOracle Virtual Assembly Builderデプロイヤによって生成されと、予期しないサービス・エラーが発生した場合を除いて、通常はレスポンスにコンテンツが存在します。

2.5.5 XMLスキーマ

付録A「Webサービス・スキーマ」で、Webサービスのスキーマを参照できます。このスキーマには、前述のアクションの表に含まれるレスポンスのコンテンツ項目の定義が含まれます。

3 APIリファレンス: 管理操作

次の項では、Oracle Virtual Assembly BuilderデプロイヤWebサービスAPIにおける管理操作について説明します。

- 第3.1項「HTTP問合せ文字列におけるパラメータ」

- 第3.2項「レスポンスのコンテンツ」

- 第3.3項「AddTargetUser」

- 第3.4項「CreateTarget」

- 第3.5項「DeleteTarget」

- 第3.6項「DescribeTargetConfigurations」

- 第3.7項「DescribeTargetNames」

- 第3.8項「DescribeTargetUsers」

- 第3.9項「DescribeUserTargets」

- 第3.10項「GetDefaultTarget」

- 第3.11項「GetTargetType」

- 第3.12項「RemoveTargetUsers」

- 第3.13項「SetDefaultTarget」

3.1 HTTP問合せ文字列におけるパラメータ

次の定義は、各操作の「HTTP問合せ文字列における他のパラメータ」の項に示すパラメータに適用されます。

- 1..1 : パラメータは必須で、指定できるのは1回だけです。

- 1..* : パラメータは必須で、複数回指定できます。

- 0..1 : パラメータはオプションで、指定する場合は1回だけ指定できます。

- 0..* : パラメータはオプションで、指定する場合は複数回指定できます。

3.2 レスポンスのコンテンツ

操作のレスポンスのタイプは、Webサービス・スキーマの定義に対応します。付録A「Webサービス・スキーマ」を参照してください。

3.3 AddTargetUser

この操作によって、ターゲットに指定されたユーザーのユーザー構成情報が追加されます。AddTargetUserの目的は、ユーザーがターゲットを使用することを指定することに加えて、ターゲットと対話する際に使用されるユーザー固有の情報を、必要に応じて指定することです。

Oracle VMで使用されるデプロイヤの場合、AddTargetUserは、ターゲットに対するアクセス権限を付与するためにクラウド管理者によって呼び出されます。この場合、ターゲットの作成時にクラウド管理者が仮想化環境への資格証明を提供するため、他のプロパティは提供されません。資格証明は保護される必要があるため、一般的なデプロイヤの場合は、アプリケーション管理者がこの操作を呼び出すことは許可されません。

HTTP問合せ文字列における他のパラメータ

target 1..1

user 1..1

ユーザーのプロパティとして他のパラメータが使用されます。

HTTPメソッド

POST

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: AddTargetUserResult

必要なロールおよび権限

Oracle VMデプロイヤでは、クラウド管理者のみがAddTargetUserの呼出しを許可されます。資格情報をターゲットの構成に提供し、保護する必要があります。

この操作を呼び出すクラウド管理者は、自身以外のユーザー名を指定できます。

3.4 CreateTarget

この操作によって、デプロイメント操作のターゲットを作成します。コールには接続情報を定義する構成情報が含まれます。Oracle VMターゲットの資格情報を指定します。

HTTP問合せ文字列における他のパラメータ

name 1..1

type 1..1

default 0..1(デフォルト値はfalse)

ターゲットのプロパティとして、他のパラメータが使用されます。

HTTPメソッド

POST

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: CreateTargetResult

必要なロールおよび権限

この操作は、クラウド管理者によってのみ呼出し可能です。

3.5 DeleteTarget

この操作によって、デプロイメント・ターゲットおよびすべての構成情報が削除されます。このターゲットがあるユーザーまたはすべてのユーザーのデフォルトであった場合、このデフォルト設定は解除されます。.

HTTP問合せ文字列における他のパラメータ

name 1..1

HTTPメソッド

POST

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: DeleteTargetResult

必要なロールおよび権限

この操作は、クラウド管理者によってのみ呼出し可能です。

3.6 DescribeTargetConfigurations

この操作によって、ターゲットの構成情報を記述します。

HTTP問合せ文字列における他のパラメータ

target 1..1

HTTPメソッド

GET

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: DescribeTargetConfigurationsResult

必要なロールおよび権限

この操作は、クラウド管理者によってのみ呼出し可能です。

3.7 DescribeTargetNames

この操作によって、指定されたタイプのデプロイメント操作について作成されたターゲットがリストされます。

HTTP問合せ文字列における他のパラメータ

type 1..1

HTTPメソッド

GET

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: ListTargetsResult

必要なロールおよび権限

この操作は、アプリケーション管理者またはクラウド管理者によって呼出し可能です。

3.8 DescribeTargetUsers

この操作によって、指定されたターゲットのユーザーがリストされます。

HTTP問合せ文字列における他のパラメータ

target 1..1

HTTPメソッド

GET

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: DescribeTargetUsersResult

必要なロールおよび権限

この操作は、アプリケーション管理者またはクラウド管理者によって呼出し可能です。

3.9 DescribeUserTargets

この操作によって、指定されたユーザーのターゲットがリストされます。

HTTP問合せ文字列における他のパラメータ

user 1..1

HTTPメソッド

GET

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: DescribeUserTargetsResult

必要なロールおよび権限

この操作は、アプリケーション管理者またはクラウド管理者によって呼出し可能です。

3.10 GetDefaultTarget

この操作によって、すべてのユーザーに対し、そのタイプのデフォルトのターゲットが取得されます。

HTTP問合せ文字列における他のパラメータ

type 1..1

HTTPメソッド

GET

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: GetDefaultTargetResult

必要なロールおよび権限

この操作は、アプリケーション管理者またはクラウド管理者によって呼出し可能です。

3.11 GetTargetType

この操作によって指定したターゲット名のターゲット・タイプを取得します。

HTTP問合せ文字列における他のパラメータ

target 1..1

HTTPメソッド

GET

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: GetTargetTypeResult

必要なロールおよび権限

この操作は、アプリケーション管理者またはクラウド管理者によって呼出し可能です。

3.12 RemoveTargetUsers

この操作によって、ターゲットからユーザーが削除されます。

HTTP問合せ文字列における他のパラメータ

target 1..1

user 1..*

HTTPメソッド

POST

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: RemoveTargetUsersResult

必要なロールおよび権限

この操作は、アプリケーション管理者またはクラウド管理者によって呼出し可能です。

クラウド管理者ロールを保持する呼出し元は、メソッドを呼び出して自分以外のユーザー名を指定できます。管理者以外のユーザーは、自分のユーザー名の指定のみが可能です。

3.13 SetDefaultTarget

この操作によって、すべてのユーザーに対し、そのタイプのすべてのターゲットに関するデフォルト・ターゲットとして、指定した名前のターゲット・タイプが設定されます。ユーザーがOracle Virtual Assembly Builder操作を呼び出し、指定されたターゲットがない、またはそのターゲット・タイプのsetUserDefaultTargetを以前に呼び出したことがない場合は、指定されたターゲットが使用されます。

HTTP問合せ文字列における他のパラメータ

name 1..1

HTTPメソッド

POST

リクエストのコンテンツ

N/A

レスポンスのコンテンツ

text/xml要素: SetDefaultTargetResult

必要なロールおよび権限

この操作は、クラウド管理者によってのみ呼出し可能です。

4 APIリファレンス: デプロイヤ操作

次の項では、Oracle Virtual Assembly BuilderデプロイヤWebサービスAPIにおけるデプロイヤ操作について説明します(この操作は、そこに含まれるソフトウェア・システムのアセンブリ・アーカイブおよびデプロイメントの側面を管理するために使用されます)。

- 第4.1項「HTTP問合せ文字列におけるパラメータ」

- 第4.2項「AddAssemblyUsers」

- 第4.3項「CreateAssemblyInstance」

- 第4.4項「CreateTags」

- 第4.5項「DeleteAssemblyArchive」

- 第4.6項「DeleteAssemblyInstance」

- 第4.7項「DeleteAssemblyResources」

- 第4.8項「DeleteDeploymentPlan」

- 第4.9項「DeleteLogEvents」

- 第4.10項「DeleteRequests」

- 第4.11項「DeleteTags」

- 第4.12項「DeployAssemblyInstance」

- 第4.13項「DescribeAssemblyArchives」

- 第4.14項「DescribeApplianceInstances」

- 第4.15項「DescribeAssemblyInstances」

- 第4.16項「DescribeAssemblyResources」

- 第4.17項「DescribeAssemblyUsers」

- 第4.18項「DescribeDeployer」

- 第4.19項「DescribeLogEvents」

- 第4.20項「DescribeRegistrations」

- 第4.21項「DescribeRequests」

- 第4.22項「DescribeScalingGroups」

- 第4.23項「DescribeTags」

- 第4.24項「DescribeTargets」

- 第4.25項「DescribeVnets」

- 第4.26項「DownloadAssemblyArchive」

- 第4.27項「DownloadAssemblyMetadata」

- 第4.28項「DownloadAssemblyResources」

- 第4.29項「RedeployAssemblyInstance」

- 第4.30項「RegisterAssemblyArchive」

- 第4.31項「RemoveAssemblyUsers」

- 第4.32項「RestartAssemblyInstance」

- 第4.33項「ResumeAssemblyInstance」

- 第4.34項「ScaleAppliance」

- 第4.35項「StartAssemblyInstance」

- 第4.36項「StopAssemblyInstance」

- 第4.37項「SuspendAssemblyInstance」

- 第4.38項「UndeployAssemblyInstance」

- 第4.39項「UnregisterAssemblyArchive」

- 第4.40項「UpdateAssemblyArchive」

- 第4.41項「UploadAssemblyArchive」

- 第4.42項「UploadAssemblyResources」

- 第4.43項「UploadDeploymentPlan」

- 第4.44項「ValidateAssemblyInstanceResources」

4.1 HTTP問合せ文字列におけるパラメータ

次の定義は、各操作の「HTTP問合せ文字列における他のパラメータ」の項に示すパラメータに適用されます。

- 1..1 : パラメータは必須で、指定できるのは1回だけです。

- 1..* : パラメータは必須で、複数回指定できます。

- 0..1 : パラメータはオプションで、指定する場合は1回だけ指定できます。

- 0..* : パラメータはオプションで、指定する場合は複数回指定できます。

4.2 AddAssemblyUsers

この操作によって、他のユーザーにアセンブリへのアクセス権が付与されます。この操作は、アセンブリの所有者またはクラウド管理者によってのみ呼出し可能です。所有者は、デプロイヤにアセンブリを最初にアップロードしたユーザーとして定義されます。

アクセス権が付与されるユーザーは、ターゲットにアセンブリを登録でき、アセンブリ・インスタンスを作成できます。

HTTP問合せ文字列における他のパラメータ

user 1..*

assembly.name 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: AddAssemblyUsersResult

4.3 CreateAssemblyInstance

この操作によって、アセンブリにアセンブリ・インスタンスを作成します。

HTTP問合せ文字列における他のパラメータ

assembly.name 1..1

assembly.version 1..1

target 1..1

plan.name 0..1

HTTPメソッド

POST

リクエスト・コンテキスト

application/octetstream

プラン・ファイル

動作

同期。

レスポンスのコンテンツ

text/xml要素: CreateAssemblyInstanceResult

4.4 CreateTags

この操作によって、リソースに1つ以上のタグを作成します。

HTTP問合せ文字列における他のパラメータ

tag 1..*

resource.id 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: CreateTagsResult

4.5 DeleteAssemblyArchive

この操作によって、デプロイヤからアセンブリ・アーカイブを削除します。この操作は、アセンブリ・アーカイブの登録がない場合にのみ実行できます。

HTTP問合せ文字列における他のパラメータ

assembly.name 1..1

assembly.version 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DeleteAssemblyArchiveResult

4.6 DeleteAssemblyInstance

この操作によって、アセンブリ・インスタンスを削除します。この操作は、アセンブリがアンデプロイ済の状態である場合にのみ実行可能です。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id

1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DeleteAssemblyInstanceResult

4.7 DeleteAssemblyResources

この操作によってアセンブリのバージョンに関連付けられたリソースを削除します。

HTTP問合せ文字列における他のパラメータ

assembly.name

1..1

assembly.version

1..1

file

0..1 (削除されるリソース・パスのリスト。未設定の場合は、すべてのリソースが削除されます)。

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DeleteAssemblyResourcesResult

4.8 DeleteDeploymentPlan

この操作によってデプロイヤ・リポジトリからデプロイ・プランを削除します(注意: 使用中のプランを削除しようとするとこの操作は失敗します)。

HTTP問合せ文字列における他のパラメータ

assembly.name

1..1

assembly.version

1..1

assembly.plan.name

1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DeleteDeploymentPlanResult

4.9 DeleteLogEvents

この操作によってシステム内のログ・イベントを削除します。パラメータを何も指定しないと、すべてのイベントが削除されます。

HTTP問合せ文字列における他のパラメータ

event.type 0..1

user 0..1

assembly.instance.id 0..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DeleteLogEventsResult

4.10 DeleteRequests

この操作によって、以前に完了したリクエストを1つ以上削除します。

HTTP問合せ文字列における他のパラメータ

request.id 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DeleteRequestsResult

4.11 DeleteTags

この操作によって、リソースのタグを1つ以上削除します。

HTTP問合せ文字列における他のパラメータ

tag 1..*

resource.id 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DeleteTagsResult

4.12 DeployAssemblyInstance

この操作によって、アセンブリ・インスタンスをデプロイします。この操作によって、OVFおよびデプロイメント計画で定義されたデプロイメントの初期インスタンスの作成が編成されます。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: DeployAssemblyInstanceResult

4.13 DescribeAssemblyArchives

この操作によってデプロイヤ・リポジトリに1つ以上のアセンブリ・アーカイブを記述します。

HTTP問合せ文字列における他のパラメータ

assembly.name 1..*

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeAssemblyArchivesResult

4.14 DescribeApplianceInstances

この操作によって、アセンブリの1つ以上のデプロイ済インスタンスを記述します。

デプロイ済インスタンスのIDと状態に関する情報に加え、レスポンス・コンテンツにはアプライアンス・インスタンスの各ネットワーク・インタフェースの名前、IPアドレス、ネットワーク名およびパブリック/プライベート・ステータスを示す要素のリストが含まれます。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 0..1

appliance.id 0..1

instance.id 0..1

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeApplianceInstancesResult

4.15 DescribeAssemblyInstances

この操作によって、1つ以上のアセンブリ・インスタンスを記述します。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 1..*

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeAssemblyInstancesResult

4.16 DescribeAssemblyResources

この操作によってアセンブリに関連付けられたリソースを記述します。

HTTP問合せ文字列における他のパラメータ

assembly.name

1..1

assembly.version

1..1

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeAssemblyResourcesResult

4.17 DescribeAssemblyUsers

この操作によって、アセンブリの1つ以上のユーザーを記述します。

HTTP問合せ文字列における他のパラメータ

assembly.name 1..1

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeAssemblyUsersResult

4.18 DescribeDeployer

この操作によって、デプロイヤのバージョン情報が提供されます。

HTTP問合せ文字列における他のパラメータ

N/A

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: RedeployAssemblyInstanceResult

4.19 DescribeLogEvents

この操作はシステム内にログ・イベントを記述します。パラメータを何も指定しないと、すべてのイベントが記述され、それ以外の場合は、結果は指定したパラメータによってフィルタされます。

デプロイヤはOVAB管理者が表示するための特定のVMライフサイクル・イベントを追跡します。イベントは次のとおりです。

- VM_CREATE

- VM_START

- VM_STOP

- VM DESTROY

次の情報がVM_START、VM_STOPおよびVM_DESTROYのイベントごとに格納されます。

- ユーザー

- タイムスタンプ

- デプロイメントID

- アセンブリ名

- アプライアンス・パス

- アプライアンス・インスタンス・インデックス

次の情報がVM_CREATE操作ごとに格納されます。

- CPUの要件

- メモリーの要件

- ディスクの要件

HTTP問合せ文字列における他のパラメータ

user 0..1

assembly.instance.id 0..1

after.time 0..1

before.time 0..1

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeLogEventsResult

4.20 DescribeRegistrations

この操作によって、1つ以上のアセンブリ登録を記述します。

HTTP問合せ文字列における他のパラメータ

assembly.name 1..1

assembly.version 1..1

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeRegistrationsResult

4.21 DescribeRequests

この操作によって、以前に発行された1つ以上のリクエストを記述します。

HTTP問合せ文字列における他のパラメータ

request.id 1..*

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeRequestsResult

4.22 DescribeScalingGroups

この操作によって、1つ以上のスケーリング・グループを記述します。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 0..*

scalinggroup.id 0..*

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeScalingGroupsResult

4.23 DescribeTags

この操作によって、リソースの1つ以上のタグを記述します。

HTTP問合せ文字列における他のパラメータ

tag 1..*

resource.id 1..1

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeTagsResult

4.24 DescribeTargets

この操作によって、1つ以上のアセンブリ・インスタンス・ターゲットを記述します。

HTTP問合せ文字列における他のパラメータ

target 1..*

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeTargetsResult

4.25 DescribeVnets

この操作によって、1つ以上のネットワークを記述します。

HTTP問合せ文字列における他のパラメータ

target 1..1

id 0..*

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: DescribeVnetsResult

4.26 DownloadAssemblyArchive

この操作によって、デプロイヤからアセンブリをダウンロードします。

HTTP問合せ文字列における他のパラメータ

assembly.name 1..1

assembly.version 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

application/octet-stream

アセンブリ・アーカイブ(.ovaファイル)

4.27 DownloadAssemblyMetadata

この操作によって、デプロイヤからアセンブリ・メタデータ記述子をダウンロードします。

HTTP問合せ文字列における他のパラメータ

assembly.name 1..1

assembly.version 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

application/octet-stream

アセンブリ・メタデータ(.ovfファイル)

4.28 DownloadAssemblyResources

この操作によってデプロイヤ・リポジトリからリソースzipファイルをダウンロードします。

HTTP問合せ文字列における他のパラメータ

assembly.name

1..1

assembly.version

1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

application/octet-streamアセンブリ・リソースZipファイル

4.29 RedeployAssemblyInstance

この操作によって、アセンブリ・インスタンスを再デプロイします。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id

1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: RedeployAssemblyInstanceResult

4.30 RegisterAssemblyArchive

この操作によってバックエンド仮想化システム(Oracle VM)にアーカイブを登録します。

HTTP問合せ文字列における他のパラメータ

assembly.name

1..1

assembly.version

1..1

assembly.desc

1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: RegisterAssemblyArchiveResult

4.31 RemoveAssemblyUsers

この操作によって、アセンブリからユーザーを削除します。

HTTP問合せ文字列における他のパラメータ

user 1..*

assembly.name 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: RemoveAssemblyUsersResult

4.32 RestartAssemblyInstance

この操作によって、アセンブリ・インスタンスを再起動します。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: RestartAssemblyInstanceResult

4.33 ResumeAssemblyInstance

この操作によってアセンブリ・インスタンスのすべてのvServerを再開します。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: ResumeAssemblyInstanceResult

4.34 ScaleAppliance

この操作によって、アプライアンスをスケールします。この操作によって、アプライアンスに必要なインスタンス数を変更し、この新しい数値に応じてインスタンスを作成して開始するか、または停止して破棄します。

HTTP問合せ文字列における他のパラメータ

scalinggroup.id 1..1

target 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: ScaleApplianceResult

4.35 StartAssemblyInstance

この操作によって、アセンブリ・インスタンスを起動します。

HTTP問合せ文字列における他のパラメータ

deployment.id 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: StartAssemblyInstanceResult

4.36 StopAssemblyInstance

この操作によって、アセンブリ・インスタンスを停止します。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 1..1

force 0..1(デフォルトはfalse)

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: StopAssemblyInstanceResult

4.37 SuspendAssemblyInstance

この操作によってアセンブリ・インスタンスのすべてのvServerを一時停止します。これはOSがシャットダウンされない仮想休止操作です。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: SuspendAssemblyInstanceResult

4.38 UndeployAssemblyInstance

この操作によって、アセンブリ・インスタンスをアンデプロイします。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: UndeployAssemblyInstanceResult

4.39 UnregisterAssemblyArchive

この操作によって、バックエンド仮想化システム(ターゲット)から、登録のアーティファクトを削除します。ターゲットのこのアセンブリ・アーカイブのアセンブリ・インスタンスが存在しない場合にのみ、この操作を呼び出すことができます。

HTTP問合せ文字列における他のパラメータ

assembly.version 1..1

assembly.name 1..1

target 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: UnregisterAssemblyArchiveResult

4.40 UpdateAssemblyArchive

この操作によって、アセンブリ・アーカイブの記述情報を変更することが許可されます。

注意:

新規バージョンをアップロードするには、UploadAssemblyArchiveを再度呼び出します。

HTTP問合せ文字列における他のパラメータ

assembly.name 1..1

assembly.version 1..1

assembly.desc 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

N/A

動作

同期。

レスポンスのコンテンツ

text/xml要素: UpdateAssemblyArchiveResult

4.41 UploadAssemblyArchive

この操作を使用して、クライアントからデプロイヤにアセンブリ操作をアップロードします。デプロイヤはアセンブリ・アーカイブの複数のバージョンを保持するため、同じアセンブリに対しこの操作を複数回呼び出す可能性があります。

HTTP問合せ文字列における他のパラメータ

assembly.name 1..1

HTTPメソッド

POST

リクエスト・コンテキスト

application/octetstream

アセンブリ・アーカイブ(.ovaファイル)

動作

同期。

レスポンスのコンテンツ

text/xml要素: UploadAssemblyArchiveResult

4.42 UploadAssemblyResources

この操作によってデプロイヤ・リポジトリにリソースzipファイルをアップロードし、それをアセンブリのバージョンに関連付けます。

通常アセンブリリソースは1つのセットとして処理されリソースは単一の操作でアップロードされます。リソースを置換する必要があった場合はすべてのリソースを削除してから新しいリソース・セットのアップロードでそれらを置換します。これはこれらの操作のデフォルト動作です。

ディスク・イメージでは、すべてのリソースを再アップロードするコストを発生させずに単一のイメージを置換する場合があります。また、スクリプトは一般にアセンブリ自体とは密接に関連していないため、すべてのリソースを再アップロードする必要なくスクリプトを変更または追加する場合があります。

このような理由から、これらの操作にはこれらのシナリオをサポートするためのオプションがあります。DeleteAssemblyResources操作には、削除するファイルのサブセットを指定できるfilesオプションがあります。これが指定されていない場合はデフォルト動作によってすべてのリソースが削除されます。filesオプションとUploadAssemblyResourcesのappendオプションは組み合せて使用できます。appendオプションは既存のリソース・セットに追加する手段を提供します。filesオプションを使用してリソースのサブセットを削除し、その後UploadAssemblyResourcesのappendオプションによってそれらのファイルの代替をアップロードすることで、「置換」の概念を実現できます。

HTTP問合せ文字列における他のパラメータ

assembly.name

1..1

assembly.version

1..1

append

0..1 (追加のリソースをアップロードできます。このオプションなしで、2番目のアップロードを実行しようとすると拒否されます)。

HTTPメソッド

POST

リクエスト・コンテキスト

application/octet-streamアセンブリ・リソースzipファイル

動作

同期。

レスポンスのコンテンツ

text/xml要素: UploadAssemblyResourcesResult

4.43 UploadDeploymentPlan

この操作によってデプロイヤリポジトリに既存のアセンブリのデプロイメント・プランをアップロードします。デプロイメント・プランを特定のアセンブリのバージョンに関連付けられたデプロイヤ・リポジトリに格納するメカニズムを提供します。以前にアップロードされたデプロイメント・プランを参照するCreateAssemblyInstance操作に計画名を指定できるため、アセンブリ作成時のプランのアップロードはオプションです。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id

1..1

HTTPメソッド

POST

リクエスト・コンテキスト

application/octet-streamデプロイメント・プランxmlまたはzipストリーム

動作

同期。

レスポンスのコンテンツ

text/xml要素: UploadDeploymentPlanResult

4.44 ValidateAssemblyInstanceResources

この操作によって、ターゲットのアセンブリ・インスタンスにアセンブリをデプロイするために十分なリソースがあるかどうかをチェックします。次のリソースをチェックします。

- メモリーの可用性

- ディスクの可用性

- ネットワークの可用性。プランに指定された名前のネットワークがターゲットに存在しているかどうかをチェックします。

ValidateAssemblyInstanceResourcesはデプロイヤ側のチェックを実行します。同じチェックだが、クライアントに存在するアセンブリ・アーカイブに対してのみ実行するValidateAssemblyArchiveResources CLI操作もあります。この操作と同等なWebサービスはありません。ValidateAssemblyArchiveResourcesはデプロイヤに現在のリソースの可用性を問い合せることで動作し、その後、戻されたデータを使用してクライアントでローカルに検証を実行します。

HTTP問合せ文字列における他のパラメータ

assembly.instance.id 1..1

HTTPメソッド

GET

リクエスト・コンテキスト

N/A

動作

非同期。

レスポンスのコンテンツ

text/xml要素: ValidateAssemblyInstanceResult

5 Oracle Virtual Assembly BuilderプラグインSDKを使用して開発するための準備

次の項で具体的に説明します。

- 5.1項「概要」

- 5.2項「プラグインを開発するための準備」

- 5.3項「プラグインのアーキテクチャとワークフロー」

- 5.4項「メタデータの概要」

- 5.5項「イントロスペクタ・プラグインの拡張機能」

- 5.6項「サポート・サービス」

- 5.7項「ユーティリティとヘルパー」

- 5.8項「ベスト・プラクティス」

- 5.9項「イントロスペクタ・プラグインのテスト」

5.1 概要

開発者はOracle Virtual Assembly Builderを使用してイントロスペクタ・プラグインを作成できます。

5.1.1 プラグインの機能

参照ホストの状態を取得するプロセスはイントロスぺクションから始まります。プラグインは参照ソフトウェアのインストールのデハイドレーションを実行することでイントロスぺクションに関与します。デハイドレーションの出力は参照インストールを説明するメタデータです。

後からターゲット環境でソフトウェア・アプライアンスを仮想マシンとしてインスタンス化することはデプロイメントとして知られています。プラグインは実行中の仮想マシンのコンテキストで参照ソフトウェアのリハイドレーションを実行することでデプロイメントに関与します。デハイドレーション時に記録されたメタデータはリハイドレーション時にプラグインで使用できます。

5.1.2 パッケージ化と配布

プラグインはサポートする製品とともにパッケージ化された.jarファイルとして実装されます。プラグインは実行時に動的プラグイン検出プロセスを通じてOracle Virtual Assembly Builder環境に入ります。検出後、Oracle Virtual Assembly Builder製品フレームワークはプラグインのデハイドレーションとリハイドレーションのエントリ・ポイントが適切な時間と場所、つまりデハイドレーションの場合はイントロスぺクション時に参照ホスト上で、リハイドレーションの場合はデプロイメントの終盤に実行中の仮想マシンの中で呼び出されるように調整します。

5.2 プラグインを開発するための準備

イントロスペクタ・プラグインの設計と実装を開始するには、最初に実行しなければならないことがあります。

5.2.1 プラグインの命名

イントロスペクタの名前を選択します。イントロスペクタ・プラグインのjarファイルはOracle Virtual Assembly Builderソフトウェア・インストール・ディレクトリ・ツリー内のプラグインごとに専用のサブディレクトリに格納されています。これらのサブディレクトリはプラグイン名に従って命名されるため、各プラグイン名は一意である必要があります。イントロスぺクションが実行される製品に関連する名前を選択します。これによってプラグインのユーザーがそれを呼び出す方法を見分けやすくします。プラグインの名前を使用して製品にイントロスぺクションを実行するためのCLIコマンド名が作成されます。コマンド名はintrospect<plug-in name>の形式で構成されます。GUIではイントロスぺクションを実行可能なコンポーネント・タイプのリストにプラグイン名が「そのまま」表示されます。

5.2.2 プラグインかプラグインの拡張機能か

プラグインまたは既存のプラグインの拡張機能のいずれを記述するかを決定します。製品をOracle Virtual Assembly Builderプラグインが既存の別の製品(WLSなど)の上で実行する場合、そのプラグインへの拡張機能を記述した方が効率的な場合があります。

5.2.3 プラグインのバージョン

異なるバージョンの製品でイントロスぺクションを実行するプランを考えます。これはインスペクタ・プラグインに対して選択する名前に影響します。2つの明確に異なる方針があり、どちらか一方が他方より効果的な場合があります。方針の1つは単一のプラグインで異なる製品バージョンに一括してイントロスぺクションを実行するというものです。これはサポートされている製品バージョンの構成データが同様の場合に便利なことがあります。"foo"と呼ばれる製品の場合、イントロスペクタ・プラグインに"foo"と命名でき、プラグインは製品バージョン(バージョン1またはバージョン2)を検出し、そのバージョンに適した処理を実行します。

代替として、製品バージョンが非常に異なりイントロスペクタ・コードを完全に個別に保持した方が便利な場合には、それぞれ単一の製品バージョンに対してのみイントロスぺクションを実行できる"foo1"と"foo2"という名前の2つのプラグインを記述できます。この場合、ネットワーク内のどこかに両方の製品バージョンがインストールされている顧客は単一のOracle Virtual Assembly Builderインスタンスに両方のイントロスペクタ・プラグインを配置できますが、どの製品バージョンにイントロスぺクションを実行するかを顧客が認識している必要があります。Oracle Virtual Assembly Builderのクラスロード・スキームに起因して、異なるバージョンのプラグインには異なるパッケージ名を使用する必要がある点に注意してください。

5.2.4 イントロスぺクション・プラグインの開発

イントロスペクタ・プラグインのコードの記述を開始する際には、第6章「イントロスぺクション・プラグインの開発」と第7章「イントロスぺクション・プラグイン・モジュール参照」を参照してください。これらの章にはチュートリアル・コード・サンプルが含まれ、共通するプラグイン操作の説明と、Oracle Virtual Assembly Builderイントロスぺクション・フレームワーク内のモジュールへの参照が記載されています。チュートリアルに目を通しサンプルコードをコピーしてOracle Virtual Assembly Builderによって呼び出し可能で、製品固有のコードを追加できるプラグインを生成できます。

5.3 プラグインのアーキテクチャとワークフロー

イントロスペクタ・プラグインはイントロスペクタ・マネージャによって編成されます。それはイントロスペクタ・フレームワークのコアで、すべてのプラグインのコントローラとして動作します。イントロスペクタ・マネージャはユーザー・インタフェース(Studio GUIおよびコマンド・ライン・ユーティリティabctl)とプラグインの間に配置されたレイヤーです。すべてのプラグインを追跡しプラグインのデハイドレーションおよびリハイドレーションのメソッドを呼び出します。

可変のプラグイン・セットの場合があるため、使用可能なプラグインの正確なセットをイントロスペクタ・マネージャに通知するためのメカニズムが必要です。これはSPIFと呼ばれOracle Virtual Assembly Builderによって提供されているサービス・モデルを使用して実現されます。イントロスペクタ・マネージャに新しいプラグインを認識させるには、それをイントロスペクタ・プラグイン・サービスとして登録する必要があるのみです。この登録の実行方法の詳細は、第6章「イントロスぺクション・プラグインの開発」で説明されています。プラグインが登録されると、後はイントロスペクタ・フレームワークによって処理されます。

5.3.1 ワークフロー

Oracle Virtual Assembly Builderを使用して、プラグインとの相互作用をトリガーするプロセスは次のとおりです。

1. OVABユーザーがイントロスぺクションを開始し、イントロスぺクションを実行する製品コンポーネントのタイプ、コンポーネントが存在しているホストおよびパスワード、ディレクトリ・パス、ユーザー名などの製品の構成データを取得するため必要な情報を指定します。

2. プラグインに適したIntrospectorPluginLocatorが検索され、より新しいバージョンのプラグインが参照ホストに存在してるかどうか判別するために使用されます。より新しいバージョンのプラグインが存在する場合は、ユーザーがイントロスぺクションを実行する前にアップグレードする必要があります。

3. より新しいバージョンのプラグインが見つからなかった場合は、プラグインのDehydrator.dehydrate()メソッドが呼び出され、ローカルまたはリモート・ホストのいずれかでユーザーによて指定されたとおりに実行されます。デハイドレータは主要な構成情報を取得しOracle Virtual Assembly Builderメタデータを作成します。メタデータはイントロスぺクションが実行されたシステムからコピーする必要のある製品実行可能ファイル、データおよび構成を示し、ファイル・セット定義の観点からそれらを記述します。

4. Oracle Virtual Assembly Builderフレームワークはイントロスペクタ・プラグインのファイル・セット定義から作成するファイル・セットを取得します。デフォルトでは、これはイントロスぺクションの完了直後に実行されますが、ユーザーの必要に応じてそれ以降に延期できます。

5. OVABユーザーはイントロスぺクションが実行された各種コンポーネント(メタデータ内にアプライアンスまたは原子性アセンブリとして現れる)からアセンブリを作成し、ネットワーク接続の観点から互いの関係を記述します。ユーザーはこの時点で他の構成パラメータも同様に編集できます。

6. OVABユーザーはVMシステム・ベース・イメージを持つアセンブリ内でアプライアンスのファイル・セットを組み合せるデプロイ可能なVMテンプレートを作成します。これらのテンプレートと、デプロイメントに必要なアセンブリ・メタデータおよびOracle Virtual Assembly Builderビット(イントロスペクタ・プラグインを含む)は、その後、1つのアセンブリ・アーカイブに(.ovaファイル)に組み合されます。

7. OVABユーザーはデプロイメント・プランを作成します。デプロイメント・プランは、編集可能なメタデータを上書きするために使用できます。また、デプロイメントに使用されるターゲットOVM環境のネットワーク構成を指定するためにも使用されます。

8. デプロイメント時には、VMがアプライアンスごとにインスタンス化され、イントロスペクタ・プラグインのRehydrator.rehydrate()メソッドが実行されます。プラグインは、保存されたメタデータの状態を、変更したネットワーク接続や新しいホスト名などでVM環境に適した製品構成に変換することで、コンポーネントのリハイドレーションを実行します。rehydrate()メソッドの完了後、Rehydrator.start()メソッドが呼び出されます。start()メソッドはコンポーネントを起動するために必要なアクションを実行します。

9. アセンブリはデプロイ後は一体として停止および起動でき、スケーラブルなアプライアンスはスケール・アップまたはスケール・ダウンできます。

5.3.2 プラグインの適合方法

イントロスペクタ・プラグインは、参照ホストからの製品の取得(デハイドレーション)とその製品の仮想アプライアンスとしてのデプロイメント(リハイドレーション)の両方に関与しています。各プラグインは参照ホスト上の製品の構成を調べ、仮想システムへの製品のデプロイを可能にするために十分なデータを取得します。リハイドレーション時には、製品が新しいホスト上で動作し、ユーザーが指定したすべての構成のオーバーライドが適用されるように製品の構成を修正する必要があります。

5.3.2.1 ジョブ・パラメータ

プラグインは、コンポーネントにイントロスぺクションを実行している間にユーザーによって入力されたパラメータを指定できます。これらのパラメータは、abctlの使用時にコマンド・ライン・オプションとして、またはGUI内のテキスト・フィールド・エントリとして表示されます。様々なジョブ・パラメータ・タイプとそれらがユーザーに対してどのように表示されるかの詳細は、第6章「イントロスぺクション・プラグインの開発」のジョブ・パラメータのチュートリアルを参照してください。

パスワード・タイプのジョブ・パラメータはセキュリティ上の理由から他のパラメータ・タイプとは異なる方法でabctlによって処理される点に注意してください。コマンド・ラインにクリア・テキストで表示されるようなパスワードのユーザー入力ではなく、プラグインまたは拡張機能が値を要求するときにユーザーにパスワードの入力が求められます。

5.3.2.2 デハイドレーション

デハイドレーションは指定された製品の関連する構成情報をメタデータとファイル・セット定義で取得するプロセスです。「関連」の定義は製品固有で、再構成はOracle Enterprise Managerの領域であるため、ユーザーがイントロスぺクションが実行された参照システムからデプロイ済仮想システムまでシステムを完全に再構成できるように考えられるすべての構成要素を取得する必要はありません。デハイドレーション・プロセスでは、ユーザーがあるシステムから別のシステムに変更すると予想される構成の重要な部分についてのみ十分な情報を取得する必要しかありません。たとえば、製品にパスワードがある場合、新しいシステムをデプロイする前にユーザーがパスワードを変更できるようにしておくと賢明です。

ファイル・セット定義に指定された製品のインストール・パスは参照ホスト上に存続するためデプロイ済VM上でも同じままです。そのため、プラグインはパスの修正を行う必要はなく、カスタマイズのためにファイル・セット・パスをユーザーに公開しないでください。

プラグインはデハイドレータ実装を提供する必要があります。Dehydrator.dehydrate(DehydrateContext context)メソッドはイントロスぺクションの実行中に呼び出されます。このメソッドに渡されたDehydrateContextによってユーザーが指定されたJobParameter値にアクセスできます。また、デハイドレーションの結果となるアプライアンスやアセンブリを作成するために使用されるメソッドもあります。

製品の異なる側面を記述するために使用できる様々なタイプのメタデータがあり、これらについては5.4項「メタデータの概要」で説明されています。

5.3.2.3 リハイドレーション

リハイドレーションはデハイドレーションの逆です。リハイドレーションは取得したメタデータを仮想システムに適用するプロセスです。リハイドレーションはデプロイ済仮想サーバー上で発生し、デプロイメントの最終ステップでデプロイヤによって呼び出されます。

プラグインはリハイドレータ実装を提供する必要があります。Rehydrator.rehydrate(RehydrateContext context)メソッドは、プラグインがデプロイメント中に製品を再構成するときに呼び出されます。rehydrate()メソッドに渡されたRehydrateContextによって、デプロイされたアプライアンスに関連付けられたメタデータにアクセスできます。

次のメソッドは特に興味深い場合があります。

- RehydrateContext.getTargetAppliance()はターゲット・アプライアンス(デプロイされているアプライアンス)を取得し、プロパティ、入力、出力などにアクセスします。

- RehydrateContext.getHostForTargetAppliance()はVMホスト名を取得します。

リハイドレーション時の仮想マシン環境について認識しておくべきことがあります。

- ジョブのリハイドレートは常にデプロイ済システム上でrootとして実行します。コピーまたは作成するファイルはすべてroot所有権などが付きます。リハイドレーション時に作成するファイルのユーザーおよびグループの所有権は必要に応じて変更します。

- ファイル・セット定義に含まれるファイルは定義に所有者とグループの値が自動的に設定されます。デハイドレーション時にプラグインによって、またはアセンブリの編集時にユーザーによって値が指定されていない場合は、所有者とグループはどちらも'oracle'に設定されます。

- ファイル・セット定義に含まれるファイルは、VM上の元の権限を使用して作成されます。

- oracle.as.assemblybuilder.introspector.plugin.utilモジュール内のRehydrateUtilsには、コマンドを特定のユーザーとして実行する機能があります。プロセスが適用可能な場所で'oracle'として起動したことを確認します。

- プラグイン・コードはリハイドレーション時にアセンブリ内のすべてのメタデータにアクセスできます。RehydrateContext.getAssemblyNavigator()メソッドを使用して、必要なメタデータの検索に役立つAssemblyNavigatorを取得できます。

5.3.2.4 デプロイメント後の操作

イントロスペクタ・プラグインのリハイドレータは、リハイドレーション以外の他の操作でも必要とされます。デプロイ済アセンブリを停止および起動できます。Rehydrator.stop()メソッドは、デプロイ済アセンブリが停止されたときにコンポーネントを正常にシャットダウンする機会を提供します。Rehydrator.start()メソッドはRehydrator.rehydrate()メソッドが呼び出された直後のデプロイメント時に呼び出され、さらにアセンブリが停止された後に開始されたときにも呼び出されます。

5.4 メタデータの概要

次の項ではイントロスペクタ・プラグインの開発者が精通しておくべき様々なOracle Virtual Assembly Builderのメタデータの構成について説明しています。Oracle Virtual Assembly Builderメタデータは大半がXMLファイルとして$AB_INSTANCE/catalogディレクトリの下のOracle Virtual Assembly Builderカタログに格納されます。

5.4.1 メタデータのタイプ

メタデータの概要の説明を続ける前に、プラグインが製品にイントロスぺクションを実行した結果として作成する必要のあるメタデータの種類について考察します。

5.4.1.1 アプライアンス

最も簡単なオプションは単一のアプライアンスの生成で、これは最終的に単一の仮想マシンとしてデプロイされることがあるメタデータと関連付けられた製品構成データです。

5.4.1.2 原子性アセンブリ

より複雑なオプションはプラグインによる原子性アセンブリの作成で、これはユーザーが形状を変更できない、つまり、アプライアンスは原子性アセンブリに対して追加または削除できず、アプライアンス間の接続はアセンブリ編集時に変更できない、関連するアプライアンスの集合です。原子性アセンブリの各アプライアンスは専用VMとしてインスタンス化されます。

5.4.2 アプライアンス

アプライアンスはイントロスぺクション・プロセスのプライマリ出力です。アプライアンスは(追加の構成ステップの後に)実行中のVMとしてインスタンス化できるメタデータ構成です。アプライアンス・メタデータの一部には、イントロスぺクションが実行されたシステムの製品環境の構成が記述されています。また、アプライアンスはVM上の製品をインスタンス化するために必要な製品構成や他のファイルなどのコンテンツ・リソースにも関連付けできます。この製品データとアプライアンス・メタデータはOracle Virtual Assembly Builderカタログに格納されています。

また、アプライアンスにはリソース要件のセットもあります。たとえば、プラグイン開発者はアプライアンスをインスタンス化するVMのメモリーと使用可能なCPU数が最小限になるように指定できます。

各アプライアンスには、アプライアンスから作成する必要のあるVM数(最小、ターゲット、最大および絶対最大)を示すスケーラビリティ情報もあります。「ターゲット」値はデフォルトによって作成されるアプライアンスのVMインスタンスの初期数です。最小および最大の値はVMインスタンス数の制限で、これらの制限はアプライアンスを含むアセンブリのデプロイ後に実効となります。「絶対最大」値は最大値の上限です。Oracle Virtual Assembly Builderは2000を超える絶対最大をサポートしていません。

また、アプライアンスにはVMのホスト上のネットワーク構成との関係を示すインタフェースと、他のアプリケーションとのネットワーク接続を示す入力と出力もあります。

アプライアンスの作成者がイントロスペクタ・プラグインまたは拡張機能の名前となり、プラグインによっては変更できません。それはアプライアンスに自動的に追加されます。この値はOracle Virtual Assembly Builderフレームワークがアプライアンスを操作するためにどのプラグインを使用するかを決定するために使用されます。

アプライアンスのタイプはデフォルトでプラグインまたは拡張機能の名前になりますが、必要に応じてプラグインによって別の値を指定できます。一般に、同じプラグインが複数のアプライアンス・タイプを作成できる場合に、デフォルトとは異なるタイプを指定すると有意義です。

5.4.2.1 スケーラビリティ

アセンブリがデプロイされた後、ユーザーはアプライアンスのスケーリングを選択できます。つまり、ユーザーは同じアプライアンスをインスタンス化した追加のVMを作成できます。イントロスペクタ・プラグインは、各アプライアンスのインスタンス化の最小および最大数を指定することで、それが作成するアプライアンスのスケーリング動作に制限を指定できます。アプライアンスをスケーラブルにした方が有意義かどうか、有意義な場合は制限をいくつかにするかを決定します。

5.4.3 アセンブリ

アセンブリはアプライアンスとサブアセンブリのコンテナで、アセンブリによってそれらの間の接続を維持できます。非原子性アセンブリのみがデプロイメント・プランを保持できるため、トップレベルのアセンブリに含まれる単独のアプライアンスや原子性アセンブリは仮想環境にデプロイできません。(最も簡単なアセンブリには単一のアプライアンスのみが含まれ、そのアセンブリのデプロイメントの結果は単一のアプライアンス・インスタンスまたはVMとなります。)

5.4.4 原子性アセンブリ

イントロスペクタ・プラグインによって作成されたアセンブリは原子性アセンブリと呼ばれます。原子性アセンブリにはサブアセンブリは含まれません。Oracle Virtual Assembly Builder Studioでは、ユーザーが原子性アセンブリに影響をもたらすことのある編集操作を制限しています。原子性アセンブリ内でプラグインによって作成されたアプライアンス間の接続はユーザーによって編集できず、原子性アセンブリに対してアプライアンスを追加または削除することもできません。

原子性アセンブリは単位としてデプロイされるため、プラグインによってアセンブリ内に作成されたアプライアンスは適切な場所にネットワーク接続が配備されます。

原子性アセンブリ内のすべてのアプライアンスがファイル・セットを共有する必要があります。これは、イントロスぺクション・プロセスでは1つのホストとのみ接続しファイル・セットを取得するからです。ファイル・セットを共有するアプライアンスは兄弟と呼ばれ、最初のアプライアンスが作成された後、Assembly.createSibling()メソッドを使用して兄弟が原子性アセンブリに追加されます。

たとえば、Oracle WebLogic Serverでは、管理サーバーに管理対象サーバーと同じすべてのファイルが含まれるため、管理サーバーが取得したファイル・セットを必要とする唯一のマシンであり、他のアプライアンスは管理サーバー・アプライアンスの兄弟になることができます。

ただし、製品が個別にファイル・セットを取得する必要のある複数の異なるタイプのアプライアンスで構成されている場合は、原子性アセンブリではなくアプライアンスを生成するプラグインが必要です。複数のプラグインが必要となる場合もあれば、単一のプラグインでこれを実現できる場合もあります。その後、各アプライアンスは取得したファイル・セットを個別に保持できるため、それによってこれらのアプライアンスをすべての必要な接続を備えた適切なアセンブリにアセンブルできます。

5.4.5 プロパティ

プロパティとは、様々なタイプ(文字列、整数、パスワード、ブールおよびファイル参照)の値を格納する名前/値ペアです。他の大半Oracle Virtual Assembly Builderメタデータ構成では、アセンブリ、アプライアンス、入力、出力、インタフェースを含めそれらにプロパティをアタッチできます。

5.4.5.1 プロパティのカテゴリ

プロパティにはユーザーとシステムの2つのカテゴリがあり、ユーザー・プロパティはOVABユーザーによってオーバーライド可能である一方、システム・プロパティは読取り専用である点が異なります。ユーザー・プロパティの場合はプロパティのタイプを必須としてマークできるかどうかに応じて、初期値を指定できるかどうかが決まります。アセンブリをデプロイするには、事前にそのアセンブリに関連付けられたすべてのメタデータのすべての必須プロパティに値を指定する必要があります。これらの値は、アセンブリの編集時またはデプロイメント・プランを介してアセンブリ・メタデータ内で指定できます。

5.4.5.2 プロパティ・グループ

プロパティは、グループ化するすべてのプロパティの名前に共通の接頭辞を付加することで、プロパティ・グループにソートできます。Oracle Virtual Assembly Builder Studioは、プロパティをユーザーに表示するときのプロパティの編成方法としてグループを使用します。プラグイン・コードでは、グループに関連付けられた名前接頭辞を指定することでプロパティのグループを取得できます。

定義されたグループに属さないプロパティは、グループ・プロパティは共通の接頭辞(ある場合)に基づき、プロパティ名文字列は'.'文字で区切られるという経験則に従ってOracle Virtual Assembly Builder Studio内で表示されます。

"OVAB"、"Ovab"または"ovab"で始まるプロパティ・グループ名は内部使用向けに予約されている点に注意してください。

5.4.5.3 統合プロパティ

統合プロパティはアプライアンス・メタデータ内に存在せず、プラグインによって作成されないプロパティです。それらはデプロイメント・プラン内にのみ存在します。たとえば、アプライアンスのVMのホストに使用する必要のある物理マシン数を指定するためにデプロイメント・プラン内でオーバーライドされることのあるcom.oracle.ovab.deployer.anti-affinity-min-serversという名前の統合プロパティがあります。このプロパティはインスタンス化されたアプライアンスのみに関連するため、アプライアンス・メタデータ内には存在しません。

5.4.5.4 プロパティの設定と取得

大半のプロパティ・タイプでは、単純にデハイドレーション時にプロパティを作成し、リハイドレーション時にその値を取得します。ただし、パスワード・プロパティとファイル参照プロパティについては補足が必要です。

5.4.5.4.1 パスワード

パスワードは、メタデータがOracle Virtual Assembly Builderカタログのディスクに存続する場合に暗号化されます。リハイドレーション時にパスワード値を取得する場合は、TypedValue.getPasswordValue().getAsChar()メソッドを使用してクリア・テキスト値を取得する必要があります。char[]を取得します。次に示すように、セキュリティの理由からパスワードを使用して実行後すぐに消去する必要があります: Arrays.fill(passwd, (char) 0);

5.4.5.4.2 ファイル参照

ファイル参照プロパティの値はファイルを指しています。既存のコンテンツ・リソースを指定することで、デハイドレーション時にプラグインによってファイルを提供できます。NULL値も指定できます。プロパティが必須としてマークされプラグインによってNULL値が指定された場合は、ユーザーがデプロイメント・プランを介してファイルを提供する必要があります。

デプロイメント・プランを介してファイル参照タイプのプロパティをオーバーライドするには、ディスクのローカル・ファイルを指定します。このファイルはその後デプロイメント時にVMに送信され、プラグイン・リハイドレーション・コードからアクセス可能となります。

注意:

ファイル参照プロパティがデプロイメント・プランで表示専用の場合は、アセンブリ編集時にはそれらを表示または編集できません。

リハイドレーション時にアクセスするには、プラグインがFileRefプロパティの値を取得し、それを解析してコンテンツ・リソースの名前を見つける必要があります。プロパティ値は"contentresource:<name>"のようなURI値になります。メソッドjava.net.URI.getScheme()およびjava.net.URI.getSchemeSpecificPart()は値の解析に役立つ場合があります。コンテンツ・リソース名が取得されると、コンテンツ・リソースにアクセスするために提供されている通常のSDKメソッドを使用してコンテンツ・リソースにアクセスできます。

Oracle Virtual Assembly Builderは、将来的にFileRefプロパティ・タイプの他のURIスキームをサポートする権利を有しています。プラグイン・コードはこれに対して堅牢です。つまり、対応するコンテンツ・リソースの検索を試行する前に、それがコンテンツ・リソースであることを保証するURIスキームをチェックし、不明なスキームを持つプロパティは無視します。これは特に、プラグインがすべての使用可能なプロパティをスキャンする場合に当てはまります。

5.4.6 入力および出力

入力および出力は、アプライアンスと原子性アセンブリの機能で、アプライアンスまたは原子性アセンブリが使用するネットワーク・エンドポイントを示しています。(データ構造はアプライアンスとアセンブリで多少異なるため、ApplianceInput、AssemblyInput、ApplianceOutput、AssemblyOutputといったクラスがあります。)

入力および出力はイントロスペクタ・プラグインによって作成され、同じアセンブリ内の他のエンドポイントまたは外部リソースのいずれかへ接続するための可能な添付ポイントを示します。たとえば、データベース・アプライアンスにはデータベースが接続をリスニングしているポートを指す入力があり、WLSアプライアンスにはバックエンド・ストレージ用に使用されているホストを指すJDBC出力があります。WLS出力はデータベース入力に接続できます。この接続を介して、デプロイメント時にデータベース・ホストとポートをWLSプラグインに認識させることができるため、JDBC構成を修正できます。

アプライアンスをOracle Virtual Assembly Builder Studioアセンブリ・エディタで表示すると、入力はアプライアンスの左側に垂線付きの円として表示され、出力は右側に垂線付きの円として表示されます。

入力には関連付けられているポート番号があり、これはネットワーク接続と、ポートでサポートされているネットワーク・プロトコルのリストを受け入れるネットワーク・ポート番号です。入力はアプライアンスのネットワーク・インタフェースのいずれかにバインドされます。

入力と出力はどちらもイントロスペクタ・プラグインによってプロパティをアタッチできます。

出力には、出力からの通信に使用される単一のネットワーク・プロトコルが関連付けられます。

5.4.6.1 出力接続プロパティ

出力には必要に応じて接続プロパティ・セットを関連付け、(ある場合は)出力を確実に互換性のある入力に接続させるために使用できます。すべての出力接続プロパティの名前が入力プロパティの名前と一致する場合、入力と出力は互換性があるとみなされます。また、接続プロパティはその出力用に作成された外部リソースの入力プロパティをシードするためにも使用されます。

接続プロパティと入力プロパティはプラグインが生成したメタデータの外面の一部です。他のコンポーネントがアプライアンスとアセンブリへの接続方法を理解できるようにそれらをドキュメント化する必要があります。

5.4.6.2 接続

接続は出力から入力へのネットワーク接続を表しています。接続に含まれる2つのエンドポイントはアプライアンスまたはアセンブリのいずれかに所属できます。接続がアセンブリとの間の場合、エンドポイントは実際にはアセンブリ内のアプライアンスによって所有されます。

5.4.6.3 外部リソース

出力がアセンブリ内のアプライアンスによって表されていないネットワーク・リソースを参照している場合、ユーザーはアセンブリ内に外部リソースを作成することでその出力に接続できます。バインドされていないアプライアンス出力は新しい外部リソースの入力に接続するように構成されます。アセンブリをインスタンス化したときに外部リソース用のVMは作成されないため、外部リソースはプレースホルダーのような役割を果たします。それらはアセンブリ内に単独で存在するため、ユーザーはユーザーのネットワーク上に既存のエンティティについて構成情報(ホスト名、ポートなど)を指定できます。

たとえば、多くのOracle製品がLDAPサーバーに依存しています。現在Oracle Virtual Assembly BuilderはLDAPアプライアンスの仮想環境へのデプロイをサポートしていないため、アセンブリ内でLDAPサーバーを表すために外部リソースが使用されます。

5.4.6.4 Vnet

非原子性アセンブリを作成すると、デフォルトのVnetが指定されますが、後からさらにVnetを追加できます。アセンブリをインスタンス化すると、これらのVnetはOVM環境のネットワークに関連付けられます。アプライアンスは、アセンブリをインスタンス化する前にアセンブリVnetに関連付ける必要のあるインタフェースを使用して作成されます。

Vnetの操作はイントロスぺクション・プラグインによっては実行されません。かわりに、ユーザーが非原子性アセンブリの構成時にVnetを作成し構成します。

5.4.6.5 インタフェース

メタデータ内のインタフェースはネットワーク・インタフェース・カード(NIC)を表しています。インタフェースには2つのタイプがあります。物理インタフェースは物理ネットワーク・インタフェース・カードを表しています。物理インタフェースにはその後、基本的には同じ物理NIC上の追加のIPアドレスである仮想インタフェースを関連付けることができます。

アプライアンスには1つ以上のインタフェースが必要です。プラグインがアプライアンス上のインタフェースを作成しない場合は、イントロスぺクション・フレームワークが自動的にデフォルトのインタフェースを追加します。

5.4.7 コンテンツ・リソース

コンテンツ・リソースは、プラグインがリハイドレーション時に取得および使用するために、デハイドレーション時にOracle Virtual Assembly Builderカタログに保存されるファイルです。未修正のファイルをイントロスぺクションが実行されたシステムからデプロイ済システム(つまり、配布先ファイル・セット定義)へ転送するためにコンテンツ・リソースを使用しないでください。

コンテンツ・リソースは、、デハイドレーション時にVelocityテンプレート(または類似のもの)に変換され、後からリハイドレーション時にイントロスぺクションを実行したシステム上の元のファイルを変更することなくトークンに置換されるファイルに対して使用するためにあります。

また、コンテンツ・リソースはアセンブリの編集時にユーザーがまとめて更新できるようにするファイルに対しても使用できます。たとえば、ユーザーはカスタムSSL証明書を提供できます。この場合、コンテンツ・リソースをFileRefユーザー・プロパティとして公開する必要があります。そうすることで、ユーザーはデプロイメント時にそのファイルの異なるコピーを追加できます。

コンテンツ・リソースはアプライアンスまたは原子性アセンブリに関連付けることができます。

5.4.8 ファイル・セット定義

(これらは以前はパッケージ定義として知られ、PackageDefinitionBuilderクラスを介して作成されていました。)単純な例では、ファイル・セット定義は基本的にイントロスぺクションを実行したシステムからカタログにコピーされたファイルのリストで、後からアプライアンスをインスタンス化するために使用されるテンプレートに組み込まれます。

通常、定義にリストされるファイルは、イントロスぺクションを実行したシステムからカタログにコピーするために、Oracle Virtual Assembly Builderフレームワークによってファイル・セット(旧「パッケージ」)に圧縮(zip)され(取得され)ます。ファイル・セットはテンプレート作成プロセスでVMディスク・イメージに解凍され、ディスク・イメージはアプリケーションのインスタンス化時に実行中のVM上のディレクトリとしてマウントされます。

ファイル・セット定義には、ユーザーとシステムの2つのタイプがあります。ユーザー定義は、完全な削除を含め、ユーザーによって編集できます。システム定義はタイプを共有またはローカルとして選択する以外は編集できません。システム定義は、製品を適切に機能させるために必要なファイルのセットを示すためにあります。

5.4.8.1 除外

ファイル・セット定義の作成時に除外を指定できます。これらは、指定したルート・ディレクトリの下に存在し、ファイル・セットの取得時に内包させたくないファイルです。除外の典型的な候補は、デプロイ済VMに持ち越しても何の意味もないログ・ファイルです。

除外のセマンティクスを表5-1で説明しています。

表5-1 除外のセマンティクス

定義のルートからの相対ディレクトリ

除外の影響

some/relative/path/foo

'foo'ディレクトリ全体を除外します。'foo'ディレクトリはデプロイ済VMには一切存在しません。

some/relative/path/bar/*

'bar'ディレクトリの下のすべてのファイルを除外します。空のディレクトリがデプロイ済VMに存在します。

some/relative/path/logs/*.log

名前が'.log'で終わるログ・ディレクトリ内のすべてのファイルを除外します。他のファイルは引き続き取得されます。すべてのファイルが削除されても、ログ・ディレクトリは存在します。

5.4.8.2 共有ファイル・セット

ファイル・セット定義がサポートするより複雑なシナリオには共有ファイル・セットが関与します。このような場合、VMをインスタンス化した後に共有されるボリュームに対して様々な調整が図られます。ファイル・セットの取得(APIでは「パッケージング」として知られる)は共有ファイル・セットではオプションです。ファイル・セットが作成されない場合、ファイル・セット定義は既存のボリュームまたは空のボリュームを参照することがあります。

共有ファイル・セットがOracle Virtual Assembly Builderフレームワークによって取得された場合、ファイル・システム・タイプはNFSまたはDISK_IMAGEのいずれかになります。NFSの場合には、Oracle Virtual Assembly Builderは、コピーされる一時ディスク・イメージのコンテンツを、すべてのアプライアンスがアクセスできるNFSファイル・システムに配置します。後続のアプライアンス・インスタンスはNFSファイル・システムをマウントするのみです。取得されたNFSファイル・セットはクラスタ化されたアプライアンスのメンバー間でのみ使用できる点に注意してください。取得されたDISK_IMAGEファイル・セットの場合、各アプライアンスは読取り専用ディスクとしてマウントされたファイル・セットのコンテンツを認識できます。これもクラスタ化されたアプライアンスのメンバーのみが使用可能です。

Oracle Virtual Assembly Builderフレームワークによってファイル・セットが取得されテンプレートに追加されていない場合は、既存の共有ボリュームが前提とされ、ファイル・システム・タイプはNFSまたはRAWのいずれかになります。

次に共有ファイル・セットの候補について要約します。

表5-2 共有ファイル・セット(取得済)

ファイル・システム・タイプ

共有ルール

NFS

クラスタ化されたアプライアンスのメンバーによってのみ共有できます。デプロイメント・プランでマウントターゲットによって指定されたVM外部のNFSボリュームは、クラスタ内の最初のアプライアンスがインスタンス化されたときに作成、移入およびマウントされます。後続のクラスタ・メンバーの各インスタンス化では単にこのボリュームをNFSマウントするのみです。

DISK_IMAGE

クラスタ化されたアプライアンスのメンバーによってのみ共有できます。指定ファイルを含むボリュームをOracle Virtual Assembly Builderが構成します。OVMがよって各アプライアンスの構成にボリュームを含めます。これらのボリュームは読取り専用です。

RAW

使用できません。

表5-3 共有ファイル・セット(未取得)

ファイル・システム・タイプ

共有ルール

NFS

デプロイメント・プランのマウントターゲットによって指定された既存のNFSボリュームが各アプライアンスによってマウントされます。

DISK_IMAGE

使用しないでください。これは結果として空のまま存続するように指定された読取り専用のボリューム・サイズとなります。これらのいずれかを作成するためのプラグインは不要です。

RAW

クラスタ化されたアプライアンスのメンバーによってのみ共有できます。Oracle Virtual Assembly BuilderがLinux RAWデバイスと/devの所有者、グループ、権限およびシンボリック名を構成します。(注意: これはRACデータベース・アプライアンスをサポートするために存在し、他のプラグイン・タイプではほとんど使用されません。)

各ファイル・セット定義には、ファイル・セットを取得する際にファイルを収集するために再帰的にスキャンされるルート・ディレクトリが含まれます。特にイントロスぺクションを実行したシステムからインスタンス化されたVMへログや一時ファイルなどのファイルをコピーする必要がない場合、ルート・ディレクトリの下にあるファイルはファイル名またはパターンに基づいて除外されます。

原子性アセンブリは、原子性アセンブリ内のすべてのアプライアンスが同じファイル・セットを共有する構成で制限されます。(前述のコンテンツ・リソースは原子性アセンブリ内の各アプライアンス固有です。)

5.5 イントロスペクタ・プラグインの拡張機能

プラグイン拡張機能を使用して、デハイドレーションおよびリハイドレーション操作を既存のプラグインに追加できます。これはある製品が別の製品の上に構築されている場合に役立ちます。基礎の製品の動作を複製するのではなく、基礎のプラグインの実行時の実行にプラグイン拡張機能を追加し、必要に応じて追加のメタデータとロジックを提供できます。

5.5.1 プラグイン拡張機能のセマンティクス

プラグイン拡張機能は次のセマンティクスに従っています。

- プラグイン拡張機能は、その親プラグインが実行されると常に実行されます。

- プラグイン拡張機能は、デハイドレーション・ジョブの発行時にプラグインが受け取るパラメータ・セットに寄与します。これらの追加パラメータは、プラグインによって指定されたパラメータとともにプラグイン拡張機能に提供されます。

- プラグイン拡張機能がデハイドレーション操作を起動するための親プラグインの別名として表示されるように選択できます。基礎のプラグインは常に、それを拡張するすべてのプラグイン拡張機能とともに実行されるため、このことは実行には影響しませんが、ユーザーが個別で追加のイントロスぺクションを選択できるかのように見せる効果があります。

- プラグイン拡張機能はプラグインまたは別のプラグイン拡張機能を拡張できます(プラグイン拡張機能の拡張元エンティティは親とみなされます)。

- プラグイン拡張機能は常に、その親が実行した後に実行します。

- プラグイン拡張機能は直接の親を1つのみ保持できます。

- 1つのプラグインまたはプラグイン拡張機能は複数の子プラグイン拡張機能を保持できます。

- 兄弟プラグイン拡張機能は任意の順序で実行します。

5.5.2 プラグイン拡張機能の制限

プラグイン拡張機能は次の制限に従っています。

- プラグイン拡張機能は通常、その親によって実行される動作に依存します。プラグイン拡張機能は多くの場合、親によって提供されるデータを使用し競合するデータを作成しないようにするために、親が何を提供しているかを認識する必要があります。これは、親が変更された場合にプラグイン拡張機能を変更する必要が生じる場合があることを意味しています。

- プラグインは、それを拡張元とするプラグイン拡張機能とは独立している必要があります。プラグインにはそれを拡張元とするプラグイン拡張機能へのアクセスは提供されず、プラグイン拡張機能では親の操作を侵害しないよう注意する必要があります。

- プラグイン拡張機能は、親プラグインが許可するまでアセンブリまたはアプライアンスを作成できません。プラグイン所有者の同意と慎重な管理なく、プラグイン拡張機能によってアプライアンスまたはアセンブリを作成すると、プラグインまたは他のプラグイン拡張機能によって実行されるそれ以降の操作に影響することがあります。このような同意がない場合は、プラグイン拡張機能はその操作を、プラグインによって作成されたアセンブリとアプライアンスのメタデータに関与する操作のみに制限する必要があります。

- プラグイン拡張機能は実行する目的がない場合、つまり拡張機能が処理するコンポーネントがインストールされていない場合には何も実行しないでください。プラグイン拡張機能は常に親プラグインが実行したときに実行されます。つまり、一部の実行には特定のプラグイン拡張機能による動作は必要ありません。これを予測し、何も実行されなかったときにエラーがレポートされないようにするのはプラグイン拡張機能の責任です。これは、デハイドレーション時とリハイドレーション時の両方に当てはまります。

5.5.3 プラグイン拡張機能の実行

デハイドレーションの実行時に、プラグインは最初にアセンブリ/アプライアンスから構成される出力を使用して実行されます。プラグインが完了すると、次に各プラグイン拡張機能に、ユーザー指定のジョブ・パラメータ・セット全体と、他のプラグイン拡張機能実装によって加えられることのあるすべての変更を含むアセンブリ/アプライアンスの両方が渡されます。各プラグイン拡張機能が、すべての必要な入力パラメータを処理し、製品構成を調べ、プラグイン拡張機能の実行目的があるかどうかを判断する責任を担います。多くのプラグイン拡張機能では実行する処理がない場合に決定後に制御を戻すことが期待されています。

プラグイン拡張機能の実装は、起動、停止、ping、リハイドレートを含むすべてのリハイドレーション操作で親プラグインと一緒に呼び出されます。操作ごとに最初にベース・プラグインが実行されます。プラグインで実行された操作の正常な完了に続いて、対応する操作が各プラグイン拡張機能で順次呼び出されます。各プラグイン拡張機能が、特定の操作の実行中に何かを実行する必要があるかどうかを判断する責任を担っています。

プラグインまたはプラグイン拡張機能のデハイドレーション/リハイドレーション操作中に最初のエラーが発生すると、操作は中断され、追加のプラグイン拡張機能の実行を開始することなくエラーが即座に戻されます。つまり、プラグイン拡張機能の失敗は操作全体の失敗につながります。

5.5.4 プラグイン拡張機能の実装

プラグイン拡張機能を実装する手順は、実質上プラグインを実装する手順と同じです。主な違いは、プラグイン拡張機能がIntrospectorPluginインタフェースのかわりにIntrospectorPluginExtensionインタフェースを実装する必要がある点です。

IntrospectorPluginExtensionインタフェースには次の3つの追加メソッドがあります。

String getParentName();

プラグイン拡張機能が拡張する親プラグインまたはプラグイン拡張機能の名前を戻します。個々で戻される名前は、既存のプラグインまたは別の既存のプラグイン拡張機能のgetName()から戻される名前と同じである必要があります。

String getParentPluginName();

親プラグインの名前を戻します。プラグインから直接拡張している場合は、getParentName()は同じ値を戻します。

boolean isAlias();

アプリケーションが、可能なイントロスぺクションの選択肢のセットを提供する際に、このプラグイン拡張機能の名前を明確な選択肢として提供できるかどうかを判別します。例: このメソッドがtrueを戻した場合、ユーザーがintrospectXXXを実行したときに、親プラグインの名前が付いたコマンドが実行されたかのように、基礎の親プラグインが通常どおり実行されるにもかかわらず、abctlは個別のintrospectXXXコマンド(XXXはプラグイン拡張機能の名前)を作成します。

これらの各メソッドの詳細は、IntrospectorPluginExtensionに関するJavaDocに記載されています。IntrospectorPluginExtensionの他のすべてのメソッドはIntrospectorPluginのメソッドと同じです。

5.5.5 プラグイン拡張機能SPIFサービスのアクティブ化

プラグイン拡張機能ではサービス名としてIntrospectorPlugin.class.getName()ではなくIntrospectorPluginExtension.class.getName()を使用して登録する必要がある点を除き、プラグイン拡張機能をサービスとして登録する方法は、プラグインを登録する方法と同じです。

this.registration = serviceContext.registerService(
IntrospectorPluginExtension.class.getName(), pluginExtension);

プラグインの登録方法の詳細は、第6章「イントロスぺクション・プラグインの開発」を参照してください。

5.6 サポート・サービス

この項では、Oracle Virtual Assembly Builderのサポート・サービスについて説明します。

5.6.1 SPIF

サービス・プロバイダ・インタフェース・フレームワーク(SPIF)は、Javaクライアントが直接使用できるOSGiに似たインフラストラクチャを提供します。このフレームワークは、カスタム・クラスロード・メカニズム、アプリケーション・サービス、全般的なサービスおよびサービス検出を提供します。SPIFは、SPIと呼ばれるJavaが提供する単純なサービス・モデルの上に構築されています。

5.6.1.1 クラスのロード

Oracle Virtual Assembly BuilderのORACLE_HOMEディレクトリ構造内には、SPIF jarと多数のサブディレクトリを含む'jlib'ディレクトリがあります。'apps'という名前のサブディレクトリはSPIFフレームワークにとって特別な意味を持っています。それには、Oracle Virtual Assembly Builderによって提供されるアプリケーションを定義する追加のサブディレクトリが含まれています。その他のディレクトリは、関連するモジュールをグループ化するために使用できます。これは依存関係をより明瞭にするために実行されますが、よりファイングレインなクラスロードも実現できます。アプリケーションは、クラスのロード元となるこれらのトップ・レベルのjlibディレクトリのリストを指定できます。これらのトップ・レベルのjlibディレクトリのいずれかにサブディレクトリがある場合は、これらも同様にロードされます。たとえば、'packager'ディレクトリを見ると、'plugin'および'plugin'と呼ばれるサブディレクトリに追加のjarファイルがあることがわかります。したがって、'packager'をアプリケーションのディレクトリ・リストに追加すると、アプリケーションはディレクトリ・ツリー内にあるjarファイルもロードします。

5.6.1.2 アプリケーション

SPIFアプリケーションはOracle Virtual Assembly Builderアーキテクチャへのエントリ・ポイントです。プラグイン開発者は、プラグインを実行する各Oracle Virtual Assembly Builderアプリケーションがインストールされているプラグインを自動的にロードすることを理解している必要があります。アプリケーションに必要なその他のjarはspif.propertiesファイルを介して指定されます。

5.6.1.3 サービス

SPIFサービスはプラグインの開発において主要なコンポーネントです。サービス・アクティベータは、サービスの登録と、他のサービス・アクティベータからの登録済サービス・インスタンスの取得の両方に使用されます。

サービスは一部のインタフェースを実装するクラスのインスタンスにすぎません。サービスのコンシューマは実装クラスの名前やそのインスタンス化方法を知っている必要はありません。特定のインタフェースとして登録されたインスタンスがあることを知っていれば、それがどのように作成されたか意識せずに、インスタンスへの参照を取得しそれを使用することができます。

5.6.1.4 サービスの作成

プラグイン開発者として、1つ以上のサービスを開発する必要があります。イントロスぺクション・フレームワークとプラグイン間のインタフェースはoracle.as.assemblybuilder.introspector.plugin.IntrospectorPluginです。このインタフェースはORACLE_HOME/jlib/introspector/oracle.as.assemblybuilder.introspector_0.1.0.jarにあります。第6章「イントロスぺクション・プラグインの開発」のチュートリアル1は、このインタフェースの実装を作成する例と、イントロスぺクション・フレームワークに実装を接続する残りのプロセスを示しています。

5.6.1.5 サービス・アクティベータ

サービス・アクティベータの実装は、SPIFのエントリ・ポイントとして使用されます。それはstart()とstop()の両方のメソッドを提供します。単一のjarファイル内で複数のサービス・アクティベータが許容されます。複数のサービス・アクティベータがある場合、それぞれが呼び出されますが、呼出し順序は定義されていません。start()メソッドは、jarの初回ロード時にSPIFアプリケーションが起動される前に呼び出されます。これによりプリケーション・ロジックが呼び出される前にすべてのサービスが登録されるように確保しています。stop()メソッドは、SPIFアプリケーションの停止後、JVMが終了する前に呼び出されます。

サービス・アクティベータのインタフェース名は'oracle.as.assemblybuilder.spif.ServiceActivator'です。それは、'AB_HOME/jlib/oracle.as.assemblybuilder.spif_0.1.0.jar'ファイルにあります。このクラスの実装を呼び出すためには、それが最初にSPIFに接続されている必要があります。これは、jarに'META-INF/services/oracle.as.assemblybuilder.spif.ServiceActivator'という名前のファイルを追加することで実行されます。サービス・アクティベータ・ファイルで、サービス・アクティベータ実装の完全修飾クラス名を追加します。各クラス名はそれぞれ1行とし、最終行を含め各行の終わりに改行を付ける必要があります。

Oracle Virtual Assembly Builderがjarファイルをロードすると、アクティベータがロードされstart()メソッドが呼び出されます。その後、サービス・アクティベータを使用してサービスを登録するか既存のサービスを検索できます。

5.6.1.6 サービスの登録

インタフェースの実装を作成しサービス・アクティベータに関連付けた後に、それをサービスとして登録します。

サービス・アクティベータの開始メソッドで、サービスを提供するクラスのインスタンスを作成します。その後ServiceContextを使用してregisterService()を呼び出し、サービスとインスタンスになるインタフェースの名前を渡します。stop()メソッドでServiceReferenceのunregister()を呼び出せるように、このメソッドから戻されたServiceReferenceを確実に保存します。

次に、サービスを登録し、それを登録解除する例を示します。

public class PluginActivator implements ServiceActivator {
private ServiceRegistration registration = null;

@Override
public void start(ServiceContext serviceContext) throws Exception {
IntrospectorPlugin plug-in = new SamplePlugin();

registration =
serviceContext.registerService(
IntrospectorPlugin.class.getCanonicalName(),
plugin);
}

@Override
public void stop(ServiceContext serviceContext) throws Exception {
if (this.registration != null) {
this.registration.unregister();
}
}
}

5.6.1.7 サービスの検索

SPIFサービス・インスタンスはServiceContextが提供する複数のメソッドとインタフェースを介して取得できます。推奨アプローチは、ServiceContextからコレクタを取得し、そのコレクタを使用して必要なSPIFサービスを追跡する方法です。

ServiceActivator実装がstart()メソッド内からサービスの獲得を試行しない点が重要です。これが実行されない場合、必要なサービスが見つからない可能性があります。各サービス・インスタンスが必要とされるポイントでのみ取得され、start()メソッドよりかなり後に戻されれば理想的です。

コレクタを使用するには、最初にServiceActivatorのstart()メソッドの実行時にコレクタを作成します。

myCollector = serviceContext.createCollector();

このコレクタ・インスタンスは専用のサービス実装に直接渡されるか、サービス取得方法の詳細を隠すためにプラグイン実装で定義されたインタフェースでインスタンスをラップして渡されます。

サービスが必要とされるポイントの近くで、次のコレクタ・メソッドのいずれかが呼び出されます。

- SomeService myInstance = myCollector.getSingletonService(SomeService.class);

- List<SomeService> myInstances = myCollector.getServices(SomeService.class);

特定のサービスの1つのインスタンスのみが必要な場合は、getSingletonService()を使用します。サービスの1つ以上のインスタンスが登録されている場合は、インスタンスは任意で選択され戻されます。インスタンスが存在しない場合は、エラーがスローされます。

特定のサービスの複数のインスタンスを獲得する必要がある場合は、getServices()を使用します。インスタンスが存在しない場合、戻されるリストは空です。

5.6.2 検証フレームワーク

プラグインにより、Oracle Virtual Assembly Builderの様々なライフサイクル操作の検証コードを提供できます。このコードは他のプラグインと同じjarに組み込んで、IntrospectorPluginと同じServiceActivatorに登録できます。

5.6.2.1 ファイル・セット取得の検証

ファイル・セット取得(以前は「パッケージング」として知られ、SDKではまだそう呼ばれている)のプロセス時に、ファイル・セット定義に記述されているファイルはファイル・セット(旧「パッケージ」)に圧縮されます。これは通常イントロスぺクションが完了した直後に実行されますが、ファイル・セットの初期作成は遅延させることでき、OVABユーザーは後からファイル・セットを再作成するように選択できます。

Oracle Virtual Assembly Builderフレームワークによって、SDKユーザーはファイル・セット取得プロセスの開始時に呼び出され、製品の取得に適した状態を確保することを目的としたプラグインを提供できます。たとえば、ファイル・セット取得を続行する前に製品をシャットダウンする必要がある場合があります。検証プラグインは製品が実行中であることを検出した場合、ファイル・セット取得を中断できます。プラグインはOVABユーザーに対して表示されるエラー・メッセージを提供できます。

詳細は、SDKのPackagerValidationPluginインタフェースの冒頭を参照してください。

PackagerValidationPluginの登録はイントロスぺクタ・プラグインの登録と同じです。PackagerValidationPluginインタフェースの実装はイントロスペクタ・プラグインと同じjarにすることもできれば、同じディレクトリ内に配置された別のjarで配信することもできます。

5.6.2.2 プラットフォームとOS検証

プラグインではサポート可能なプラットフォームとOSのタイプに制限がある場合があります。Oracle Virtual Assembly Builderフレームワークはアプライアンスにイントロスぺクションが実行された後にこれらの要件を適用する機能があります。検証のJVMはイントロスぺクションのものと異なるため、この検証はアセンブリ・メタデータが提供する以上の状態情報には依存しません。

この機能を使用するには、PlatformOsValidationPluginインタフェースを実装するためのクラスを作成します。このクラスのインストールはイントロスペクタ・クラスのインストールと同様です。イントロスペクタ・プラグインと同じjarまたはプラグイン・ディレクトリ内の専用のjarファイルでクラスを配信できます。

Oracle Virtual Assembly Builderフレームワークはプラグインとそのプラグイン拡張機能に属するすべての実装に対してプラットフォームおよびOS検証を呼び出します。このような各実装が検証のレスポンスを提供し、このレスポンスがコンプライアンスまたは非コンプライアンスを示します。

非コンプライアンスはプラグイン指定のエラー・メッセージとともに警告または拒否として通知できます。拒否が示されていない場合は、すべての警告がユーザーにリレーされます。

5.6.2.3 テンプレート検証

Oracle Virtual Assembly Builderフレームワークは、プラグイン開発者がテンプレート作成に使用されるOSベース・イメージがプラグインの製品のニーズを満たしていることを保証するために使用できる機能を備えています。プラグインは、ユーザーおよびグループ・アカウント、ソフトウェア(RPM)パッケージ、カーネル構成パラメータおよびシステム・スワップ領域のチェックを手配できます。

この機能を使用するには、BaseImageValidationPluginインタフェースを実装するクラスを作成します。クラスのインストールはイントロスペクタ・クラスのインストールと同様です。イントロスペクタ・プラグインと同じjarまたはプラグイン・ディレクトリ内の専用のjarファイルでクラスを配信できます。

プラグインは、実行する必要のある検証ごとに、検証を記述したバリデータ・オブジェクトを作成します。Oracle Virtual Assembly Builderフレームワークはテンプレート・プロセス時にバリデータのリストを横断し、提案されたベース・イメージが要件を満たしているかチェックして、満たしていない場合はプラグイン指定の警告またはエラー・メッセージを発行します。

5.6.3 プラグインの検出およびインストール

バージョン12.1.2.0.0以降のOracle Virtual Assembly Builderでは、イントロスぺクション・プラグインはOracle Virtual Assembly Builder自体には組み込まれていませんが、かわりにそれらがサポートする製品で提供されインストールされます。プラグインはOracle Virtual Assembly Builderによって検出され、使用するOracle Virtual Assembly Builderインスタンスにインストールされます。これを容易にするために、プラグイン開発者はいくつかの責任を担っています。

- プラグインを製品とともに特定の場所にインストールします。

- plugin.configファイルを作成し、それをプラグインの側に提供/インストールします。

- IntrospectorPluginLocatorサービスを作成し、それをServiceActivatorから登録します(プラグインのServiceActivatorの詳細は第6章「イントロスぺクション・プラグインの開発」に記載されています)。

5.6.3.1 プラグインの場所

イントロスぺクション・プラグインまたは拡張機能は次の場所にインストールします。

$ORACLE_HOME/plugins/ovab/introspector/<plugin-name>/*

5.6.3.2 plugin.configファイル

各プラグインまたは拡張機能は、プラグイン検出、初期インストールおよびアップグレード時に使用するプロパティ・ファイルを提供する必要があります。このファイルは次の場所の各プラグインのディレクトリに存在します。

$ORACLE_HOME/plugins/ovab/introspector/<plug-in name>/plugin.config

plugin.configファイルで次のプロパティを公開する必要があります。

plugin.name

プラグイン/拡張機能の名前で、getName()によって戻されディレクトリ名と同じです。このプラグイン/拡張機能の適用先の製品を示している必要があります。

plugin.version

プラグインのバージョンで、プラグイン実装が変更されると変更されます。このバージョンは程度の差はあれ頻繁に変更されることがあるため、プラグインとともに提供された製品のバージョンとは異なります。値は後述のバージョン・フォーマットに準じている必要があります。

product.version.min

このプラグインがサポートする製品の最低バージョンです。このプロパティは情報提供のみを目的に使用されます。値は後述のバージョン・フォーマットに準じている必要があります。

product.version.max

このプラグインがサポートする製品の最高バージョンです。これは通常、プラグインを含むインストール内の製品のバージョンと同じです。このプロパティは情報提供のみを目的に使用されます。値は後述のバージョン・フォーマットに準じている必要があります。

plugin.description

プラグイン/拡張機能の簡単な説明です。プラグイン/拡張機能の操作対象の製品を含める必要があります。

ovabsdk.version

このプラグイン/拡張機能に必要なOracle Virtual Assembly Builderのイントロスペクタ・プラグインSDKの最低バージョンです。これはOVABバージョンとは異なりあまり頻繁には変更されません。Oracle Virtual Assembly Builder自体は実際にSDKを変更することなく改訂できます。Oracle Virtual Assembly Builderのバージョン12.1.2.0.0ではSDKのバージョンは3.0のため、plugin.configファイルでは3.0を使用します。SDKバージョンが変更されるたびにプラグイン開発者に通知されます。

parent.plugin.name

親プラグインまたは拡張機能の名前です。拡張機能の場合のみ設定します(トップ・レベルのプラグインには親はありません)。

parent.plugin.version

この拡張機能に必要な親プラグイン/拡張機能の最低バージョンです。拡張機能の場合のみ設定します(トップ・レベルのプラグインには親はありません)。値は後述のバージョン・フォーマットに準じている必要があります。

プロパティ・ファイルとの相互作用には次の動作が含まれます。

- Oracle Virtual Assembly Builderは、プロパティ・ファイルが<プラグイン名>ディレクトリに存在しない場合にエラーを報告します。

- Oracle Virtual Assembly Builderは不明なプロパティを検出した場合にエラーを報告しません。これは、使用中のOracle Virtual Assembly Builder製品より新しいプラグインのホームを検索している場合に発生することがあります。

- Oracle Virtual Assembly Builderはプロパティが指定されていない場合のデフォルトをドキュメント化する必要があります。これは、使用中のOracle Virtual Assembly Builder製品より古いプラグインのホームを検索している場合に発生することがあります。

バージョン番号のフォーマット

プロパティ・ファイル内のバージョン番号はすべて、単純な「番号.番号」形式で表す必要があります。これらのバージョン番号は、ピリオド(「.」)で区切られた正の10進整数から構成される構文(たとえば、「5」、「2.0」、「1.2.3.4.5.6.7」など)を使用します。これによって、拡張可能な番号を使用して、メジャー、マイナー、ミクロなどのバージョンを表現できます。バージョン仕様は次の正式な構文によって記述されます。

DotVersion:

Digits RefinedVersion

RefinedVersion:

. Digits

. Digits RefinedVersion

Digits:

Digit

Digits

Digit:

Character.isDigit(char)がtrueを戻す任意の文字(たとえば、0、1、2、...)。

バージョン番号は、バージョン番号の対応するコンポーネントを比較することで比較されます。各コンポーネントは整数として扱われ、値が比較されます。値が必要な値より大きい場合は、trueが戻されます。値が小さい場合は、falseが戻されます。値が等しい場合は、次のコンポーネント・ペアが比較されます。あるバージョンのコンポーネント数が他方より多い場合は、欠落したコンポーネントは0と想定され、比較時に存在していたかのように処理されます。

5.6.4 IntrospectorPluginLocatorサービスの実装

プラグインと拡張機能は、定義によって、イントロスペクション時にユーザーが指定したジョブ・パラメータから自身の製品の製品ルート・ディレクトリを決定できます。製品ルート・ディレクトリは、1つ以上の指定されたジョブ・パラメータから派生可能な場合もあるが、通常は明示的なジョブ・パラメータです。イントロスペクタ・フレームワークは、この情報がジョブ・パラメータからどのように派生しプラグインと拡張機能に渡されたか認識できませんが、各イントロスぺクションの開始時にプラグインと拡張機能の更新を自動的にチェックできるようにするためにこの情報を把握する必要があります。

この問題を解決するには、プラグインと拡張機能がIntrospectorPluginLocatorサービス実装を公開する必要があります。

各イントロスぺクション(デハイドレーション)の開始時にイントロスぺクション・フレームワークは次のステップを実行します。

1. イントロスぺクションに関与しているプラグインと拡張機能を判別します。

2. getPluginOrExtensionName()メソッドから同じ名前を戻すIntrospectorPluginLocator実装を検索します。

3. ステップ2で見つけた各IntrospectorPluginLocator実装でgetProductInstallHome()メソッドを実行することで、検索する製品ルートのリストを作成します。重複は統合されます。

4. ステップ3で導出した製品ルートで、ステップ1で見つけたより新しいバージョンのプラグインおよび拡張機能を検索します。見つかった場合は、イントロスぺクションを中断し、検出されたアップグレード候補をユーザーに報告します。

IntrospectorPluginLocator実装はSPIFサービスとして追跡され、対応するプラグインまたは拡張機能を登録するために使用された同じServiceActivator実装内で同じ方法で登録されることがあります。

5.6.5 プラグインの下位互換性要件

プラグインまたは拡張機能のインストール時には、plugin.config内の情報に基づいて、プラグインまたは拡張機能がすでにインストールされているものと互換性があるかどうかが判別されます。常に古いバージョンをより新しいバージョンで更新した方が安全であると想定されています。これを動作させるには、次の定義に従ってプラグインと拡張機能の両方に下位互換性が必要です(プラグインと拡張機能の両方に適用されます)。

- プラグインは、それがデハイドレート/リハイドレート可能な製品バージョンに関して常に下位互換性を持つことが前提とされています。つまり、新し製品に付随するより新しいプラグインは以前に取得可能だったより古い製品も引き続きデハイドレート/リハイドレートする必要があります。

- プラグインは、それが処理可能なカタログ・メタデータに関して常に下位互換性があることが前提とされます。つまり、より新しいプラグインは引き続き自身の以前バージョンが作成したメタデータを使用して製品をリハイドレートできなければなりません。

- プラグインは、それを拡張元とする拡張機能との相互作用に関して常に下位互換性を持つことが前提とされています。親の1つのバージョンに対して開発された拡張機能は、同じ親のより新しいバージョンに対しても引き続き動作する必要があります。

5.6.6 プラグインのインストールのガイドライン

プラグインと拡張機能のインストールに関連する操作は、次のガイドラインに準じる必要があります。

- 拡張機能はすでにインストールされている親なしではインストールできません。

- プラグインは、プラグインによって作成されたアプライアンスが存在しない場合を除き、インストールされているバージョンより古いバージョンにダウングレードできません。それを実行すると、プラグインによって作成されたアプライアンスが破損することがあります。

- プラグインは、プラグインによって作成されたアプライアンスが存在する場合は削除できません。それを実行すると、プラグインによって作成されたアプライアンスが破損します。

- プラグインを削除すると再帰的にプラグインのすべての子も削除されます。

- プラグインを無効にすると再帰的にプラグインのすべての子も無効になります。

- 拡張機能は親が無効な場合は有効化できません。

これらのガイドラインは、Oracle Virtual Assembly Builderアプリケーションによって提供される様々なプラグイン・インストール操作によって適用されます。

5.7 ユーティリティおよびヘルパー

プラグインSDKは1つ以上のプラグインで事項する必要が生じることのある共有のタスク向けにいくつかのユーティリティおよびヘルパー・クラスを提供しています。introspector.plug.utilパッケージにはSPIFサービスとして登録されるUtilFactoryが含まれています。プラグインのSPIFサービス・アクティベータ・クラスで次を使用することでこのサービスを操作できます。

UtilFactory utilFactory =
(UtilFactory) myCollector.getSingletonService(UtilFactory.class.getName());

5.7.1 OCM登録

UtilFactory.getOcmUtil()

このユーティリティを使用して、デハイドレーション時にOracle Configuration Managerに関連するプロパティをアプライアンスに追加し、リハイドレーション時にそれらのプロパティの基づいてOCMをアプライアンスに登録できます。

5.7.2 OUI中央インベントリ

UtilFactory.getOuiUtil()

このユーティリティを使用して、OUI中央インベントリを構成し、デプロイメント時にそのインベントリにORACLE_HOMEを登録するために必要なメタデータを作成できます。

5.7.3 SSH

UtilFactory.openSshConnection()

コマンドを実行またはファイルを送信/取得するために別マシンへのSSHが必要な場合は、SshConnectionクラスを使用します。

5.7.4 Velocity

UtilFactory.getContentBuilder()

Velocityはファイル内でトークン置換を実行するためのユーティリティです。ContentBuilderクラスはVelocityが実行するオプションのトークン置換を備えたコンテンツ・リソースの作成に役立ちます。

RehydrateUtilクラスにもconfigファイルを修正するためにリハイドレーション時に使用できるいくつかのVelocity関連のメソッドがあります。

5.7.5 その他のユーティリティ

UtilFactory.getRehydrateUtil()

RehydrateUtilクラスでファイルをコピーしコマンドを実行するための様々なユーティリティがあります。

5.8 ベスト・プラクティス

ここでは、いくつかのベスト・プラクティス、注意事項およびイントロスペクタ・プラグインの設計と開発時に留意すべき点について説明します。

5.8.1 参照システムの変更の回避

プラグインは、イントロスぺクション時に参照ホストを変更できません。一時ファイルは参照製品のディレクトリの下に作成できません。参照製品の構成と実行時の状態は変更できません。

一時ファイルを作成する必要がある場合は、Oracle Virtual Assembly Builderのtmpディレクトリを使用します。AbConfigクラスには、Oracle Virtual Assembly Builderのtmpディレクトリの場所を検索するためのメソッドがあります。

5.8.2 静的変数の回避

Oracle Virtual Assembly Builder Studioでイントロスペクタ・プラグインを1回インスタンス化すれば、それを繰り返し使用してイントロスぺクションとファイル・セット取得操作を実行できます。1つのStudioセッションで製品のイントロスぺクションを複数回実行する場合は静的変数を使用しないでください。使用すると予期せぬ結果を引き起こすことがあります。

5.8.3 ServiceActivator.start()時のSPIFサービスへのアクセス試行の禁止

ServiceActivator.start()を呼び出している間は、SPIFサービスへのアクセスを試みないでください。

5.8.4 予約ネームとネーミングの制限

プラグインが異なるメタデータ要素に指定できる名前には特定の制限があります。

5.8.4.1 アプライアンスおよびアセンブリの名前

アプライアンスおよびアセンブリの名前に含めることができるのは、ASCII文字(A-Z a-z)、数字(0-9)および次のシンボルのみです: ! # % ( ) * + , - . : = ? @ [ ] ^ _ { } ~

名前の長さは最長で40文字までです。

5.8.4.2 プロパティ名

プロパティ名にはアプライアンスおよびアセンブリの名前と同様のキャラクタ・セットの制限があります: ASCII文字(A-Z a-z)、数字(0-9)および次のシンボル: ! # % ( ) * + , - . : = ? @ [ ] ^ _ { } ~

プロパティ名には現在長さ制限はありませんが、将来的に追加される可能性があります。

'OVAB'、'Ovab'または'ovab'で始まるプロパティ名は内部使用向けに予約されているため作成しないでください。

5.8.4.3 タイプ

アプライアンスのタイプは'External'で始まるものに設定しないでください。その文字列で始まるタイプは内部使用向けに予約されています。

5.8.5 外部依存関係の管理

プラグイン開発者は、イントロスペクタ・プラグインを含めすべてのOracle Virtual Assembly Builderサービスが単一のクロスローダーによってロードされることを認識している必要があります。このため、複数のプラグインが同じクラスを提供する場合競合が生じることがあります。プラグインがクラスを共有することを想定していない場合があります。外部jarを提供するプラグイン(その他のプラグインによって内包されている場合もある)は、それらのjarをロードするために後述のImplProvider機能を使用する必要があります。

プラグインは、たとえば、製品に付随する独自のAPIを使用して製品構成を調べたり変更したりするために、ターゲット製品からのjarを使用しなければならない場合があります。プラグイン内で製品のjarを使用すると、これらのAPIを使用するプラグイン・コードを新しい製品バージョンと変更されたAPIに対応するように変更する必要が生じることがあるため、追加のメンテナンス問題が生じます。

多くの場合製品jarの使用はわずかな手間で回避できますが、ターゲット製品からのjarを使用する必要があると判断した場合に使用できる2つのオプションがあります。

1番目のオプションは、それらのjarをプラグインがデプロイされているディレクトリに追加することです。このアプローチの短所は、外部製品jarを製品とOracle Virtual Assembly Builderの両方に提供する必要がある点です。また、製品バージョンが変更されると、プラグインで新しい製品バージョンをそれぞれサポートするために、製品jarの複数のコピーをOracle Virtual Assembly Builderに提供する必要があります。

2番目のオプションは、製品jarをそれらが製品とともにインストールされている場所から実行時に動的にロードすることです。このアプローチは多少手間がかかりますが、製品jar(複数バージョンの可能性がある)をOracle Virtual Assembly Builderに提供する必要がなくなります。これは推奨アプローチです。

イントロスぺクション・プラグインまたはプラグイン拡張機能が複数のバージョンの製品と対話できれば理想的です。これは製品jarを使用する必要がある場合にはさらに厄介となります。そのような製品jar内のAPIはバージョンごとに変更されている可能性があるからです。これには複数のソリューションがありますが、ここでは検討する価値のある考えられる手段を提供しています。

基本的な考え方は、必要な製品jarを実行時にインストールから動的にロードするとともに、それらのjarにアクセスするための抽象レイヤーを作成するというものです。次にこのアプローチを使用するために実行できることを概略します。

1. 製品jarを使用して実行されるタスクを抽象化するラッパー・インタフェースを作成します。この抽象化は、複数の製品バージョンに適用するために十分な高レベルにする必要があります。インタフェースは、常にロードされるプラグインのjar内に配置できます。

2. 製品APIが変更された製品バージョンごとに前述のインタフェースの実装を作成します。最初はこのような実装を1つのみ作成し、それ以降の製品リリースで製品のAPIが変更されている場合にさらに追加していきます。これらの実装は製品インストール内のjarファイル内またはOracle Virtual Assembly Builderインストール内の個別のjarに配置できます。どちらの場合も、実装は実行時に動的にロードされます。

3. 実行時に、製品バージョンを判別し、対応するラッパー実装とその実装に必要な製品jarをロードします。

このアプローチを容易にするために次のように処理されます。

- Oracle Virtual Assembly Builderは、起動時に、BuilderのORACLE_HOME/jlib/ディレクトリ内の任意の場所にある"dynlib"という名前のディレクトリ内のすべてのjarのロードを省略します。複数のラッパー実装をこのディレクトリに配置し、必要に応じて動的にロードできます。

- UtilFactory.createImplProvider()は、ラッパー実装と必要なjarの製品インストールからの動的ロードを支援します。このメソッドとoracle.as.assemblybuilder.introspector.plugin.utilパッケージのImplProviderについてはJavadocを参照してください。

仮説の例:

/**
* Interface for interactions with MDS.
*
* Resides in jlib/stuff/myplugin.jar
*/
interface MdsWrapper {
String getMdsFoo();
String getMdsBar();
void setMdsFoo(String value);
void setMdsBar(String value);
}

/**
* Uses 11g APIs to interact with MDS (fabric-core.jar).
*
* Resides in jlib/stuff/dynlib/mdswrapper-v1.jar
*/
class MdsWrapperImplVersion1 implements MdsWrapper {
...
}

/**
* Uses 12g APIs to interact with MDS.
*
* Resides in jlib/stuff/dynlib/mdswrapper-v2.jar
*/
class MdsWrapperImplVersion2 implements MdsWrapper {
...
}

前述のコードでは、プラグインは製品バージョンに応じて必要な実装を取得できます。

void doMdsStuff(String oracleHome) {

String fabricJarPath = oracleHome + "/jlib/fabric-core.jar";

String productVersion = getVersion(oracleHome);

MdsWrapper mdsWrapper = null;

// obtain product version specific implementation
if (productVersion.equals(VER_11G)) {
ImplProvider implProvider =
utilFactory.createImplProvider("mdswrapper-v1.jar", fabricJarPath);
mdsWrapper =
implProvider.createInstance(MdsWrapper.class, "MdsWrapperImplVersion1");
}
else if (productVersion.equals(VER_12G)) {
ImplProvider implProvider =
utilFactory.createImplProvider("mdswrapper-v2.jar", fabricJarPath);
mdsWrapper =
implProvider.createInstance(MdsWrapper.class, "MdsWrapperImplVersion2");
}

// use implementation generically
String foo = mdsWrapper.getMdsFoo();
String bar = mdsWrapper.getMdsBar();
mdsWrapper.setMdsFoo(foo);
mdsWrapper.setMdsBar(bar);
}

5.9 イントロスペクタ・プラグインのテスト

プラグインのデハイドレーションおよびリハイドレーション機能のテストについて説明します。

5.9.1 デハイドレーションのテスト

イントロスペクタ・プラグイン内のデハイドレーション機能のテストは簡単で、単にイントロスぺクションを実行するのみです。プラグインをOracle Virtual Assembly Builder環境にインストールする方法の詳細は、5.6.3項「プラグインの検出およびインストール」を参照してください。

5.9.2 リハイドレーションのテストとトラブルシューティング

イントロスぺクション・プラグイン内のリハイドレーション機能のテストは時間がかかり、OVM環境でのトラブルシューティングが厄介な場合があります。この項では、ガイダンスを説明しています。Oracle Virtual Assembly Builderの使用のトラブルシューティングに関する項も参照してください。

5.9.2.1 デプロイメントのライフサイクル

Oracle Virtual Assembly Builderがアセンブリをデプロイするときに生ずるステップを理解しておくと、障害の優先順位付けに役立ちます。プラグイン・コードを呼び出す前にVMで実行するいくつかのアクションがあります。

1. 仮想マシンの作成と起動
Oracle Virtual Assembly BuilderデプロイヤはOVMマネージャに、デプロイしているアセンブリ内のすべてのアプリケーションの仮想マシンを作成するように指示します。すべての仮想マシンが作成された後、それらはアプライアンスとの依存関係に基づいて起動されます。

2. VM上でのABサービスの作成
VMが起動すると、oraclevm-template.shと呼ばれる特別なスクリプトが自動的に実行されます。このスクリプトは、'ab'と呼ばれるLinuxサービスをインストールします。abサービスはネットワーク構成とアプライアンス・デプロイ・ドライバの起動を担います。

3. VMのネットワーク構成
abサービスがoraclevm-template.shスクリプトによって起動され、VMのネットワーク設定を構成します。

4. phonehomeを介した遅延バインドの取得
ネットワーク・セットアップの完了後、abサービスはJavaプロセスのアプライアンス・デプロイ・ドライバを起動します。このJavaコードは、Oracle Virtual Assembly Builderデプロイヤとの通信を処理し遅延バインドを取得します。また、プラグインを呼び出すリハイドレータ・コードを起動し、Oracle Virtual Assembly Builderデプロイヤに再び接続してリハイドレーションが成功したか失敗したかを報告します。

アプライアンス・デプロイ・ドライバは、Oracle Virtual Assembly Builder Deployerに接続し遅延バインド情報を取得します。

遅延バインド情報がOracle Virtual Assembly Builderデプロイヤから取得されると、VM上のメタデータがその遅延バインドを反映して更新されます。この更新されたメタデータは/assemblybuilder/catalog/metadata/rootの下にあります。

5. イントロスペクタ・プラグインの呼出し
遅延バインディングがVM上のカタログ(Oracle Virtual Assembly Builderホスト上のカタログのサブセットで、デプロイされている現在のアプライアンスをリハイドレートするために必要なメタデータのみを含む)に保存された後、プラグインのRehydrator.rehydrate()メソッドが呼び出されます。

6. Oracle Virtual Assembly Builderデプロイヤへのリハイドレーションの結果の送信
ベース・プラグインとそのすべての拡張機能が正常に完了すると、アプライアンス・デプロイ・ドライバはOracle Virtual Assembly Builder Deployerへ正常な結果を送信します。いずれかのポイントで失敗した(ベース・プラグインまたはいずれかの拡張機能が例外をスローした)場合は、失敗が発生した時点で失敗の結果が送信されます。

6 イントロスぺクション・プラグインの開発

この章では、Oracle Virtual Assembly Builderイントロスペクタ・プラグインの開発用の一連のコード・チュートリアルを介してOracle Virtual Assembly BuilderイントロスぺクションAPIの使用方法を説明します。この章の構成は、次のとおりです。

- 6.1項「概要」

- 6.2項「Oracle Virtual Assembly Builderの統合」

- 6.3項「チュートリアル2: デハイドレーション」

- 6.4項「チュートリアル3: リハイドレーション」

- 6.5項「チュートリアル4: 進捗」

- 6.6項「チュートリアル5: ジョブ・パラメータ」

- 6.7項「サンプル・プラグイン」

- 6.8項「サンプル・プラグイン拡張機能」

6.1 概要

このドキュメントの目的は、プラグインを構築するための手順を追ったチュートリアルを提供することです。この説明書に記載されている例のチュートリアル・ソースは'tutorials'ディレクトリ内のSDKで入手できます。このドキュメントは特定の開発環境向けに記述されたものではなく、ご使用の開発環境で所定のステップを実行する方法を理解していることを前提にしています。

6.2 チュートリアル1: Oracle Virtual Assembly Builderの統合

このチュートリアルの目的は、最も単純なプラグインを作成することです。このチュートリアルの目的はOracle Virtual Assembly Builderアーキテクチャにプラグインを登録する方法を示すことです。このチュートリアルはこれ以降のすべてのチュートリアルの基本となります。

このチュートリアルで取り上げる内容:

- IntrospectorPluginインタフェース

- ServiceActivatorインタフェース

- IntrospectorPluginの登録

- チュートリアルの作成

- IntrospectorPluginのインストール

- デプロイ済プラグインの確認

6.2.1 プロジェクトの作成

開始するには、'SamplePlugin'と呼ばれる空のJavaプロジェクトを作成します。Oracle Virtual Assembly BuilderはJavaの早期バージョンとの互換性がないため、これらのチュートリアルではJDK 1.6を使用する必要があります。

次のjarファイルをSDKからプロジェクトに追加します。

- jlib/oracle.as.assemblybuilder.spif_0.1.0.jar

- jlib/introspector/oracle.as.assemblybuilder.introspector.plugin.api_0.1.0.jar

- jlib/core/oracle.as.assemblybuilder.external.common_0.1.0.jar

6.2.2 IntrospectorPluginの作成

プラグインを作成します。'oracle.as.assemblybuilder.introspector.plugin.IntrospectorPlugin'インタフェースがプラグインを定義します。イントロスペクタ・プラグイン・インタフェースを実装する'sample.plugin.internal.SamplePlugin'クラスを作成します。この場合、内部とはここにあるクラスは他では使用されないことを意味しています。

これでクラスは次のメソッドを保持しているはずです: getName()、getJobParameters()、initialize()、getDehydrator()およびgetRehydrator()。これで後は、getName()の戻り値を'SamplePlugin'に変更し、空のリストを戻すgetJobParameters()を作成するのみです。プラグイン実装の残りの変更は以降のチュートリアルで取り上げます。クラスは次のように表示されます。

package sample.plugin.internal;

import java.util.ArrayList;
import java.util.List;

import oracle.as.assemblybuilder.introspector.job.JobParameter;
import oracle.as.assemblybuilder.introspector.job.JobParameterBuilder;
import oracle.as.assemblybuilder.introspector.plugin.IntrospectorPlugin;
import oracle.as.assemblybuilder.introspector.plugin.dehydrate.Dehydrator;
import oracle.as.assemblybuilder.introspector.plugin.rehydrate.Rehydrator;

public class SamplePlugin implements IntrospectorPlugin {

@Override
public Dehydrator createDehydrator() {
// TODO Auto-generated method stub
return null;
}

@Override
public Rehydrator createRehydrator() {
// TODO Auto-generated method stub
return null;
}

@Override
public List<JobParameter> getJobParameters() {
List<JobParameter> jobParameters = new ArrayList<JobParameter>();

return jobParameters;
}

@Override
public String getName() {
return "SamplePlugin_Tutorial1";
}

@Override
public void initialize(JobParameterBuilder jobParameterBuilder){
// TODO Auto-generated method stub
}
}

6.2.3 SPIFサービスのアクティブ化

Oracle Virtual Assembly Builderフレームワークがプラグインを認識できるようにするために、サービス・アクティベータの作成から始めます。サービス・アクティベータはSPIFフレームワークの一部です。まだそうしていない場合は、第5章「Oracle Virtual Assembly BuilderプラグインSDKを使用して開発するための準備」のSPIFに関する説明に目を通してください。

'oracle.as.assemblybuilder.spif.ServiceActivator'を実装する新しいクラスの'sample.plugin.internal.spif.PluginActivator'を作成します。

サービス・アクティベータを呼び出すには、それを登録する必要があります。ルート・プロジェクト・ディレクトリ内に'resources/jar/META-INF/services'と呼ばれるフォルダを作成します。そのフォルダ内で、'oracle.as.assemblybuilder.spif.ServiceActivator'と呼ばれるテキスト・ファイルを作成します。そのファイル内にサービス・アクティベータ実装の名前を示す単一のテキスト行を配置し、必ず行末に改行を入れます。この場合、行は'sample.plugin.internal.spif.PluginActivator'になります。このファイルが'META-INF/services'ディレクトリ内の作成したjarファイルに追加されていることを確認する必要もあります。これが実行されると、Oracle Virtual Assembly Builderユーザー・インタフェースのいずれかが起動するとサービス・アクティベータのstartメソッドが呼び出され、それらがシャットダウンされるとstopメソッドが呼び出されます。

この時点で、サービス・アクティベータは呼び出されていますが、サービス・アクティベータはまだサンプル・プラグインをイントロスペクタ・プラグインとして登録していません。アクティブ化を完了するには、PluginActivatorを次のように変更します。

package sample.plugin.internal.spif;

import oracle.as.assemblybuilder.introspector.plugin.IntrospectorPlugin;
import oracle.as.assemblybuilder.spif.ServiceActivator;
import oracle.as.assemblybuilder.spif.ServiceContext;
import oracle.as.assemblybuilder.spif.ServiceRegistration;
import sample.plugin.internal.SamplePlugin;

public class PluginActivator implements ServiceActivator {
private ServiceRegistration registration = null;

@Override
public void start(ServiceContext serviceContext) throws Exception {
IntrospectorPlugin plugin = new SamplePlugin();

this.registration = serviceContext.registerService(
IntrospectorPlugin.class.getCanonicalName(),
plugin);
}

@Override
public void stop(ServiceContext serviceContext) throws Exception {
if (this.registration != null) {
this.registration.unregister();
}
}
}

startメソッドで、プラグインのインスタンスを作成し、それをIntrospectorPluginとして登録します。registerServiceの呼出し後、インスペクタ・マネージャに新しいプラグインが存在することが通知され、その後、Oracle Virtual Assembly Builderユーザー・インタフェースからのプラグインの呼出しが可能になります。もちろん、この時点では、ジョブ・パラメータ、デハイドレータ、リハイドレータも実装されていないため、興味深いことは何も発生していません。

stopメソッドでは、登録したサービスを必ず登録解除します。

6.2.4 チュートリアルの作成

プラグインをインストールし使用する前に、プラグイン・クラス用のjarファイルを作成する必要があります。大半の開発環境ではプロジェクトをJARファイルにエクスポートする手段が提供されています。META-INF/services/oracle.as.assemblybuilder.spif.ServiceActivatorファイルがJavaクラスとともにこのJARに追加されていることを確認します。

また、antを使用してOracle Virtual Assembly Builder SDKで提供されているチュートリアルとサンプル・プラグインを作成することもできます。チュートリアルまたはサンプル・ディレクトリに移動して'ant dist'と入力します。このコマンドは、クラスと適切なServiceActivatorファイルを含むjarを作成し、それを検出およびインストールに必要なディレクトリ構造に配置します。

6.2.5 プラグインのインストール

jarファイルが整ったら、plugin.configファイルとともにモックORACLE_HOMEディレクトリ構造を作成する必要があります。

Oracle Virtual Assembly Builderでは、'installPlugins'コマンドを使用してプラグインをインストールする必要があります。このコマンドを動作させるために、モックORACLE_HOMEを作成する必要があるため、'plugins/ovab/introspector/<plugin-name>'ディレクトリで'ab_home'を呼び出します。ここで、<plugin-name>はプラグインの'getName()'メソッドから戻される値で置き換えます。この場合、ディレクトリは'ab_home/plugins/ovab/introspector/SamplePlugin_Tutorial1'になります。

そのディレクトリ内に、プラグインJARファイルを'plugin.config'ファイルとともに配置する必要があります。'plugin.config'ファイルには次のコンテンツが必要です。

plugin.name=SamplePlugin
plugin.version=1.0.0
product.version.min=1.0.0
product.version.max=2.0.0
plugin.description=My sample plugin.
ovabsdk.version=3.0

jarおよびplugin.configファイルが配置され、これでプラグインをOracle Virtual Assembly Builderインストールにインストールする準備が整いました。これは、'installPlugins' abctlコマンドを使用して実行されます。次に例を示します。

./abctl installPlugins -productRoot /path/to/ab_home

6.2.6 イントロスペクタ・プラグインの実行

abctlまたはStudioを使用してイントロスペクタ・プラグインを実行する方法を説明します。

6.2.6.1 abctlコマンドライン・ユーザー・インタフェース

プラグインをインストールすると、CLIはコマンドをプラグイン名という名前で自動的に登録します。たとえば、'SamplePlugin'と呼ばれるプラグインがある場合、'abctl help'の実行時に表示されるコマンドは'introspectSamplePlugin'となります。

インストール後は、そのプラグインに対してイントロスぺクションを実行できます。

AB_INSTANCE/binディレクトリに変更して、'./abctl help introspection'を実行できます。結果は次のような出力になります。

> ./abctl help introspection

Usage: abctl command [options]

Command                 Description
------------------------------------------------------------------------------
captureFileSets         Creates file sets for specified appliance or assembly.
describePlugins         Lists the installed plugins.
disablePlugin           Disables a plugin or extension.
enablePlugin            Enables a plugin or extension.
findPlugins             Finds plugins to install.
installPlugins          Installs 1 or more plugins.
introspectCoherenceWeb  Alias for command "introspectWLS".
introspectGenericProd   Examines GenericProd configuration and captures
metadata.
introspectOHS           Examines OHS configuration and captures metadata.
introspectSamplePlugin  Examines SamplePlugin configuration and captures
metadata
introspectWLS           Examines WLS configuration and captures metadata.
removePlugin            Removes a plugin or extension.

Try "abctl help name" for detailed help of a specific command.

プラグインは、プラグインとして登録するのみで、専用のイントロスペクト・コマンドを自動的に取得します。それは前の例で太字で示されています。'./abctl help introspectSamplePlugin'と入力すると、このプラグインがサポートするすべてパラメータに関するヘルプが取得されます。JobParametersを定義していない場合でもパラメータ数はリストされます。プラグインを起動するCLIコマンドには専用のパラメータがあり、すべてのプラグインが同様にこれらを保持しています。プラグインに追加したJobParametersはこのリストに追加されます。また、'./abctl introspectSamplePlugin'と入力してデハイドレーション・ジョブを初期化することもできます。ただし、getDehydrator()はnullを戻し、次のエラーが表示されます。

Launching introspection of component 'SamplePlugin' ...
Task is done: DehydrateJob failed with error: null
Error: OAB-7105: Introspection failed

6.2.6.2 Oracle Virtual Assembly Builder Studio

インストール済のプラグインはグラフィカル・ユーザー・インタフェースに追加のプラグインとして自動的に表示されます。他のプラグインと同様にそれを実行できます。詳細は、Oracle Virtual Assembly Builderの使用を参照してください。

6.2.7 まとめ

このチュートリアルは完了です。プラグインの空の実装を作成し、プラグインをOracle Virtual Assembly Builderに登録して、プラグインをインストールし、abctl CLIユーザー・インタフェースで表示されることを確認しました。

6.3 チュートリアル2: デハイドレーション

現在プラグインが作成されインストールされています。それを有効に活用する必要があります。まずはデハイドレーションを取り上げます。デハイドレーションは、後からリハイドレーションできるようにコンポーネントのメタデータを収集するプロセスです。

チュートリアル1からプロジェクトを開始します。デハイドレーション実装の作成を開始する前に、進捗モジュールをプロジェクトに追加する必要があります。SDK jlib/coreディレクトリからoracle.as.assemblybuilder.progress.api_0.1.0.jarファイルをプロジェクトのビルド・パスに追加します。

次に、'sample.plugin.internal.DehydratorImpl'と呼ばれるoracle.as.assemblybuilder.introspector.Dehydratorインタフェースを作成します。このインタフェースにはinitialize()およびdehydrate()の2つのメソッドのみがあります。dehydrate()メソッドは、CLIのintrospect<name>コマンドまたはGUIのいずれかを介してデハイドレーション・ジョブが開始されると呼び出されます。プライベートなinitializeAppliance()メソッドは、正常なデハイドレート・ジョブを実行するために必要な最小量のメタデータを設定するために使用されます。

DehydratorImplクラスは次のように表示されます。

package sample.plugin.internal;

import java.util.ArrayList;
import java.util.Collection;

import oracle.as.assemblybuilder.introspector.metadata.appliance.Appliance;
import oracle.as.assemblybuilder.introspector.plugin.dehydrate.DehydrateContext;
import oracle.as.assemblybuilder.introspector.plugin.dehydrate.Dehydrator;
import oracle.as.assemblybuilder.progress.ProgressManagerFactory;

public class DehydratorImpl implements Dehydrator {

DehydratorImpl() {
}

@Override
public void initialize(ProgressManagerFactory progressManagerFactory) {
// TODO Auto-generated method stub
}

@Override
public void dehydrate(DehydrateContext context) throws Exception {
Appliance appliance = context.getOrCreateRootAppliance();

// initialize the appliance
initializeAppliance(appliance);

//TODO: This is where you will make the changes to the Appliance
}

/**
* Set the minimum amount needed to be a valid appliance.
*
* @param appliance the appliance to update
*/
private void initializeAppliance(Appliance appliance) {
appliance.setVersion(1, 0, 0);
appliance.setScalabilityInfo(1, 1, 99, 200);
builder.addResourceRequirement(ResourceEnum.MEMORY_MB, 256);
builder.addResourceRequirement(ResourceEnum.NUMBER_CPUS, 1);
}
}

createDehydrator()メソッドにこのクラスの新しいインスタンスを戻すためプラグインを更新します。同時デハイドレート・ジョブの処理が大幅に簡易化されるため、必ず新しいインスタンスを戻します。また、インスタンス固有のものを保持するために静的変数を使用するのは避けてください。そうすると、同時実行において診断な困難な問題が生じることがあります。

これで、プラグイン・クラスは次のように表示されます。

package sample.plugin.internal;

import java.util.ArrayList;
import java.util.List;

import oracle.as.assemblybuilder.introspector.job.JobParameter;
import oracle.as.assemblybuilder.introspector.job.JobParameterBuilder;
import oracle.as.assemblybuilder.introspector.plugin.IntrospectorPlugin;
import oracle.as.assemblybuilder.introspector.plugin.dehydrate.Dehydrator;
import oracle.as.assemblybuilder.introspector.plugin.rehydrate.Rehydrator;

public class SamplePlugin implements IntrospectorPlugin {

@Override
public Dehydrator createDehydrator() {
return new DehydratorImpl();
}

@Override
public Rehydrator createRehydrator() {
// TODO Auto-generated method stub
return null;
}

@Override
public List<JobParameter> getJobParameters() {
List<JobParameter> jobParameters = new ArrayList<JobParameter>();

return jobParameters;
}

@Override
public String getName() {
return "SamplePlugin_Tutorial2";
}

@Override
public void initialize(JobParameterBuilder jobParameterBuilder) {
}
}

この例では、アセンブリではなくアプライアンスを使用していますが、アプライアンスではなくアセンブリを作成するにはgetOrCreateRootAppliance()を呼び出している単一の行をgetOrCreateRootAssembly()に変更します。

プラグインJAR,を作成したら、6.2項「チュートリアル1: Oracle Virtual Assembly Builderの統合」の説明に従いプラグインをインストールする必要があります。

6.4 チュートリアル3: リハイドレート

リハイドレータ実装を追加するには、リハイドレータ・インタフェースを実装し、createRehydrator()が呼び出されたときにプラグインが新しいインスタンスを作成するように指定します。

sample.plugin.internalパッケージ内でRehydratorImplと呼ばれるクラスを作成します。

package sample.plugin.internal;

import oracle.as.assemblybuilder.introspector.plugin.rehydrate.RehydrateContext;
import oracle.as.assemblybuilder.introspector.plugin.rehydrate.Rehydrator;
import oracle.as.assemblybuilder.progress.ProgressManagerFactory;

public class RehydratorImpl implements Rehydrator {

@Override
public void initialize(ProgressManagerFactory progressManagerFactory) {
// TODO Auto-generated method stub
}

@Override
public boolean ping(RehydrateContext rehydrateContext) throws Exception {
// TODO Auto-generated method stub
return false;
}

@Override
public void rehydrate(RehydrateContext rehydrateContext) throws Exception {
// TODO Auto-generated method stub
}

@Override
public void start(RehydrateContext rehydrateContext) throws Exception {
// TODO Auto-generated method stub
}

@Override
public void stop(RehydrateContext rehydrateContext) throws Exception {
// TODO Auto-generated method stub
}
}

RehydrateContextはデハイドレータ実装内で作成したようにメタデータへのアクセスを提供し、Oracle Virtual Assembly Builderエディタまたはデプロイメント・プランのいずれかを介してユーザーがデータに加えた変更を反映します。必要に応じて構成を変更するために実装を追加する必要があります。

RehydrateContextは、リハイドレータのstop()メソッドが呼び出されたときに実行する停止の種類を決定するためのメソッドも提供しています。プラグインは、これが通常の停止、スケール・ダウン操作(コンポーネントではある種のクラスタ化が伴うことを意味します)の一部としての停止、またはアンデプロイ操作の一部としての停止かどうかに応じて異なるアクションを実行できます。

パッケージ定義に追加されたファイルは、すでにrehydrate()メソッドが呼び出される前に配置されています。

6.5 チュートリアル4: 進捗

デハイドレーション時に、デハイドレーションの完了を待機しているユーザーがそれがまだ実行中であることを理解できるように進捗を実装することが重要です。進捗には構造化と非定型の2つのタイプがあります。

構造化進捗は、処理中に常に発生することがわかっているステップを記述するために使用されます。構造化進捗の値によって、ユーザーはデハイドレート・ジョブの実行中に発生するすべてのステップと、現在どのステップが実行されているかを把握できます。短所は、デハイドレート対象のインスタンスに関連するメッセージに固有の情報を含めることができない点です。構造化進捗はツリーに似た構造です。トップ・レベルの進捗イベントは子を保持できます。必要なレベルの深さまでネストできます。

非定型進捗は実行時までメッセージ・コンテンツがわからない場合に使用される進捗です。非定型進捗は常に構造化進捗イベントに関連しています。非定型進捗は子を保持できません。

2つの異なるタイプを理解できるように例を作成してみましょう。サンプル・プラグインに、OUIの処理、OPMNの処理、configの解析、configの処理の4つのトップ・レベルのステップがあるとします。OUIの処理とOPMNの処理は個別のイベントですが、configの解析とconfigの処理にはサブイベントがあります。configの処理は数が不明なファイルの処理で構成され、ファイルが見つかるたびに進捗メッセージを送信するものとします。これを実行するには非定型進捗が必要です。ただし、configの処理は4つの個別のプロセッサで構成されています。そのため、configの処理に構造化進捗を使用できます。

この例では、2つの個別のProgressResourceBundlesを作成する必要があります。1つはトップ・レベル・リスト用で、これをTopLevelProgressBundleと呼びます。もう1つはconfig処理リスト用で、これをConfigProcessingProgressBundleと呼びます。これらの構造化進捗リストでは、順序を維持しており順序が重要となるため、ProgressResourceBundleクラスを拡張する必要があります。バンドル内でイベントをリストする順序がイベントの送信が予定される順序です。省略されたイベントはその後のイベントを送信すると自動的に終了として設定されます。

Configパーサー内で非定型イベントを処理するには、標準のListResourceBundleを拡張する必要があります。

package sample.plugin.resources;

import oracle.as.assemblybuilder.progress.ProgressResourceBundle;

public static class TopLevelProgressBundle extends ProgressResourceBundle {
private static final long serialVersionUID = -2753027497921148834L;

static public final String PROGRESS_START = "SPI-001";
static public final String OUI_PROCESSING = "SPI-002";
static public final String OPMN_PROCESSING = "SPI-003";
static public final String CONFIG_PARSING = "SPI-004";
static public final String CONFIG_PROCESSING = "SPI-005";
static public final String PROGRESS_COMPLETE = "SPI-006";

/**
* Contents of key/value progress messages
*/
static final Object[][] contents =
{ { PROGRESS_START, "dehydration starting" },
{ OUI_PROCESSING, "OUI processing completed" },
{ OPMN_PROCESSING, "OPMN processing completed" },
{ CONFIG_PARSING, "config parsing completed" },
{ CONFIG_PROCESSING, "config processing completed" },
{ PROGRESS_COMPLETE, "dehydration complete" } };

@Override
protected Object[][] getContents() {
return contents;
}
}

package sample.plugin.resources;

import oracle.as.assemblybuilder.progress.ProgressResourceBundle;

public static class ConfigProcessingProgressBundle extends ProgressResourceBundle {
private static final long serialVersionUID = -2105678590437947371L;

static public final String PROCESS_STEP_1 = "SPI-101";
static public final String PROCESS_STEP_2 = "SPI-102";
static public final String PROCESS_STEP_3 = "SPI-103";
static public final String PROCESS_STEP_4 = "SPI-104";

/**
* Contents of key/value progress messages
*/
static final Object[][] contents =
{ { PROCESS_STEP_1, "step 1 completed" },
{ PROCESS_STEP_2, "step 2 completed" },
{ PROCESS_STEP_3, "step 3 completed" },
{ PROCESS_STEP_4, "step 4 completed" } };

@Override
protected Object[][] getContents() {
return contents;
}
}

package sample.plugin.resources;

import java.util.ListResourceBundle;

public static class ConfigParsingAdHocProgressBundle extends ListResourceBundle {

static public final String PROCESSING_FILE = "SPI-201";

/**
* Contents of key/value progress messages
*/
static final Object[][] contents =
{ { PROCESSING_FILE, "processing file {0}" } };

@Override
protected Object[][] getContents() {
return contents;
}
}

残りの作業は以前の作成したDehydratorImplクラス内で実行されます。initialize()メソッドで、progressManagerFactoryへの参照をインスタンス変数に保存します。

次の例では、initializeProgress()メソッドに特に注意してください。例の後にメソッドについて説明します。

package sample.plugin.internal;

import java.util.ArrayList;
import java.util.Collection;

import oracle.as.assemblybuilder.introspector.metadata.appliance.Appliance;
import
oracle.as.assemblybuilder.introspector.metadata.attributes.ResourceRequirement.ResourceEnum;
import oracle.as.assemblybuilder.introspector.plugin.dehydrate.DehydrateContext;
import oracle.as.assemblybuilder.introspector.plugin.dehydrate.Dehydrator;
import oracle.as.assemblybuilder.progress.AdHocMarker;
import oracle.as.assemblybuilder.progress.ProgressListener;
import oracle.as.assemblybuilder.progress.ProgressManager;
import oracle.as.assemblybuilder.progress.ProgressManagerFactory;
import oracle.as.assemblybuilder.progress.ProgressProxy;
import sample.plugin.resources.Resources;

public class DehydratorImpl implements Dehydrator {
private ProgressManagerFactory progressManagerFactory = null;
private AdHocMarker configParsingAdHocMarker = null;

DehydratorImpl() {
}

@Override
public void initialize(ProgressManagerFactory progressManagerFactory) {
this.progressManagerFactory = progressManagerFactory;
}

@Override
public DehydrateResult dehydrate(DehydrateContext context) throws Exception {
Appliance appliance = context.getOrCreateRootAppliance();

//configure all the progress proxies
ProgressProxy progress = initializeProgress(context.getProgressListener());

progress.onProgress(Resources.TopLevelProgressBundle.PROGRESS_START);

//initialize the appliance
initializeAppliance(appliance);

//TODO: Do OUI stuff
progress.onProgress(Resources.TopLevelProgressBundle.OUI_PROCESSING);

//TODO: Do OPMN stuff
progress.onProgress(Resources.TopLevelProgressBundle.OPMN_PROCESSING);

//Just for fun, create a list of files to parse
String[] files = { "file.1", "file.2", "file.3", "file.4" };

for (String file : files) {
//TODO: do something with the files

//generate ad-hoc messages
progress.onProgress(this.configParsingAdHocMarker,
Resources.ConfigParsingAdHocProgressBundle.PROCESSING_FILE, file);
}

//Now send the processing events
progress.onProgress(Resources.ConfigProcessingProgressBundle.PROCESS_STEP_1);
progress.onProgress(Resources.ConfigProcessingProgressBundle.PROCESS_STEP_2);
progress.onProgress(Resources.ConfigProcessingProgressBundle.PROCESS_STEP_3);
progress.onProgress(Resources.ConfigProcessingProgressBundle.PROCESS_STEP_4);

//all done
progress.onProgress(Resources.TopLevelProgressBundle.PROGRESS_COMPLETE);
}

private ProgressProxy initializeProgress(ProgressListener progressListener) {
ProgressManager progressManager =
this.progressManagerFactory.createManager(progressListener);

//assign the top level events to this manager
progressManager.registerBundle(new Resources.TopLevelProgressBundle());

ProgressManager childProgressManager = null;

//create a child progress manager for the config parsing event
// and make it ad-hoc,  we need to save the adHocMarker when
// sending ad-hoc progress events
childProgressManager = progressManager.createChildManager(
Resources.TopLevelProgressBundle.CONFIG_PARSING);
this.configParsingAdHocMarker = childProgressManager.registerAdHoc(
new Resources.ConfigParsingAdHocProgressBundle());

//create the child-progress events for the config processing event
ProgressManager configProcessingProgressManager = progressManager.createChildManager(
Resources.TopLevelProgressBundle.CONFIG_PROCESSING);
configProcessingProgressManager.registerBundle(
new Resources.ConfigProcessingProgressBundle());

//at this point, the progress tree is configured
//now we generate the proxy that is used to send events

return progressManager.generateProxy();
}

/**
* Set the minimum amount needed to be a valid appliance.
*
* @param appliance the appliance to update
*/
private void initializeApplianceBuilder(Appliance appliance) {
appliance.setScalabilityInfo(1, 1, 99, Integer.MAX_VALUE);
appliance.addResourceRequirement(ResourceEnum.MEMORY_MB, 256);
appliance.addResourceRequirement(ResourceEnum.NUMBER_CPUS, 1);
}
}

進捗の興味深い部分はinitializeProgress()メソッドです。前述のとおり、それには進捗ツリーを作成するためのすべてのロジックが含まれています。進捗のトップ・レベルを表すProgressManagerインスタンスの作成から開始します。その後、トップ・レベル進捗イベント用のイベント・リストを含むProgressResourceBundleを設定します。

次のステップは、トップ・レベルProgressResourceBundleからのキーを使用した、Configの解析ツリー用の子ProgressManagerの作成です。これにより、この子ProgressManagerをトップ・レベル進捗イベントにアタッチします。Configの解析の子ProgressManagerは非定型進捗イベントを処理するため、registerAdHoc()メッセージを呼び出し、それを送信する進捗イベントを含むListResourceBundleに渡します。これは、後で非定型進捗イベントをトリガーするときに使用されるAdHocMarkerも戻します。

次に、Configの処理ツリー用の子ProgressManagerを作成します。この子ProgressManagerは構造化ProgressManagerであるため、registerBundle()を呼び出し、registerAdHoc()は呼び出しません。進捗ツリーのすべてのレベルのキーが一値であることを確認する必要があります。重複していると予期せぬ結果を招くことがあります。

プロセスの最終ステップは、進捗ツリー全体を構成した後のProgressProxyの生成です。その後、ProgressProxyは構造化と非定型の両方の進捗イベントをトリガーするために使用されます。ただし、非定型の場合は、ProgressProxyがイベントをツリー内のどこに追加する必要があるかわかるように、AdHocMarkerインスタンスを渡す必要があります。

プロジェクトをエクスポートし、それをORACLE_HOMEにデプロイします。その後'./abctl introspectSamplePlugin'を実行します。結果は、次のように表示されます。

> ./abctl introspectSamplePlugin
Launching introspection of component 'SamplePlugin' ...
Step 1 of 6: dehydration starting
Step 2 of 6: OUI processing completed
Step 3 of 6: OPMN processing completed
Step 1: processing file file.1
Step 2: processing file file.2
Step 3: processing file file.3
Step 4: processing file file.4
Step 1 of 4: step 1 completed
Step 2 of 4: step 2 completed
Step 3 of 4: step 3 completed
Step 4 of 4: step 4 completed
Step 6 of 6: dehydration complete
Task is done: DehydrateJob completed
Introspection complete
Storing result in catalog: '/Users/cooluser/Documents/Perforce/my-depot/drm/src/dist/ab_home/catalog' ...
Introspection stored as 'SamplePlugin-1276728646099' in the catalog

進捗のチュートリアルは完了です。このチュートリアルでは、構造化および非定型の両方の進捗、子ProgressManagerおよびProgressMessagesのトリガーを使用した進捗ツリーの初期化を取り上げました。プラグインのユーザーには、プラグインの実行が予想通り進行していることを把握するために必要な情報が提供されます。

6.6 チュートリアル5: ジョブ・パラメータ

イントロスペクタ・プラグインは、abctlコマンド・ラインで指定されたパラメータまたはStudio内のテキスト・フィールド・エントリを介して、呼出し時にユーザーからの追加情報を収集することがあります。イントロスペクタ・プラグインは、自身を登録するとジョブ・パラメータのリストをフレームワークに提供できます。フレームワークはそれをキューとして使用し、ユーザーからの指定された情報を収集します。

この例のサンプル・プラグインでは、1つは汎用文字列、もう1つはパスワードの2つのジョブ・パラメータを構成しています。

@Override
public List<JobParameter> getJobParameters() {
JobParameter jobParameter;
List<JobParameter> jobParameters = new ArrayList<JobParameter>();

jobParameter = jobParameterBuilder.setName(Resources.STRING_PARAM_NAME)
.setValueType(ValueType.NAME).setRequired(false)
.setDefaultValue(Resources.STRING_PARAM_DESC).build();
jobParameters.add(jobParameter);

jobParameter = jobParameterBuilder.setName(Resources.PASSWORD_PARAM_NAME)
.setValueType(ValueType.PASSWORD).setRequired(false)
.setDescription(Resources.PASSWORD_PARAM_DESC).build();
jobParameters.add(jobParameter);

return jobParameters;
}

前出の例で、このメソッドが空のジョブ・パラメータ・リストを戻していた点に注意してください。リソース・クラスは、パラメータ名と説明用にここで使用されている文字列を含むように作成されています。

package sample.plugin.resources;

public class Resources {

public static final String STRING_PARAM_NAME = "stringParam";
public static final String STRING_PARAM_DESC = "just a generic string parameter";

public static final String PASSWORD_PARAM_NAME = "samplePassword";
// This ends up being the password prompt:
public static final String PASSWORD_PARAM_DESC = "Administrator password";
}

これらのパラメータはユーザーによってabctlコマンド・ラインで指定される場合があります(必須としてマークされている場合は指定する必要があります)。それらは説明とともに自動的にプラグインのabctlヘルプに表示されます。Oracle Virtual Assembly Builder Studioでは、イントロスぺクション・ウィザードによってテキスト入力ボックスにパラメータ値を入力する機会が与えられ、すべての必須パラメータに値が入力された後にのみイントロスぺクション・ウィザードの次のステップに進めます。

Oracle Virtual Assembly Builderフレームワークはabctlで使用するためにパラメータ名の略語を生成します。たとえば、"samplePassword"という名前のパラメータは"abctl introspectSamplePlugin -samplePassword"または"abctl introspectSamplePlugin -sp"のいずれかで指定できます。フレームワークは、camelCaseパラメータ詳細名を調べてパラメータの略語を選択し、重複する略語がある場合は報告します。

パスワードタイプのジョブ・パラメータはセキュリティ上の考慮事項があるため他のタイプのパラメータとは異なり、パスワードはコマンド・ライン引数として入力できません。(それらがコマンドラインでプレーンテキストで入力されると、Unix "ps"コマンドを使用して表示可能となってしまいます。)かわりに、フレームワークはデハイドレーションを開始する前にパスワードの入力を求めます。短い説明がパスワード・プロンプトとして使用されます。また、セキュリティ上の配慮から、パスワードは文字列としてではなく文字配列として保持されます。それらは文字列に変換してはならず、パスワードがそれ以降不要になった場合には文字配列は消去する必要があります。

次のように、デハイドレーション時にユーザー指定のパスワード値を取得できます。

Map<String, JobParameter> jobParameterMap = context.getJobParameterMap();
JobParameter stringParameter = jobParameterMap.get(Resources.STRING_PARAM_NAME);
String stringParameterValue = stringParameter.getValue();

フレームワークは、パスワード用にいくつかのデータ型(NAME、ADDRESS、PATH、NUMERIC、BOOLEAN、PASSWORD)を提供していますが、例外のPASSWORDを除き、パラメータ値はプラグインに文字列として指定されるため、たとえば、BOOLEANパラメータの場合には、プラグインが文字列"true"および"false"を実際のブール値に変換する必要があります。

BOOLEANパラメータは2つの顕著な一意の側面を持つため、abctlコマンドでは、フラグが指定されている場合にパラメータ値が"true"といったように、これらをオプション・フラグとして作成します。そのため、BOOLEANパラメータを必須としても意味がなく、デフォルト値を指定する必要はありません。デフォルト値は常に"false"です。

6.7 サンプル・プラグイン

サンプル・プラグインはチュートリアルとともに含まれています。このサンプルはチュートリアルで網羅されていない多数のSDK機能の例を示しています。チュートリアルと同様に作成しインストールでき、イントロスぺクション用に使用する場合はデプロイ可能なアプライアンスが生成されます。

6.8 サンプル・プラグイン拡張機能

サンプル・プラグイン拡張機能も参考として提供されています。このサンプルはサンプル・プラグイン全体を拡張しています。このサンプルは、中でも特に、すでにベース・プラグインによって作成されたアプライアンスにアクセスする方法と、ベース・プラグインによって作成されたファイル・セット定義を更新する方法を示しています。

7 イントロスぺクション・プラグイン・モジュール参照

この章ではOracle Virtual Assembly Builderイントロスぺクション・フレームワークのモジュールについて説明します。この章の構成は、次のとおりです。

- 7.1項「概要」

- 7.2項「外部共通[oracle.as.assemblybuilder.external.common]」

- 7.3項「進捗[oracle.as.assemblybuilder.progress]」

- 7.4項「イントロスペクタ[oracle.as.assemblybuilder.introspector.api]」

- 7.5項「アプライアンス[oracle.as.assemblybuilder.introspector.metadata.appliance.Appliance]」

- 7.6項「アセンブリ[oracle.as.assemblybuilder.introspector.metadata.assembly.Assembly]」

- 7.7項「カタログ[oracle.as.assemblybuilder.catalog.api]」

- 7.8項「イントロスペクタ・プラグイン・ユーティリティ[oracle.as.assemblybuilder.introspector.plugin.util]」

7.1 概要

Oracle Virtual Assembly Builderフレームワークは多数のモジュールで構成されています。現時点では、モジュールという用語はJARファイルと同義語ですが、このドキュメントではモジュールという用語を使用します。単一のモジュールにすべての機能を配置するのではなく、機能の論議グループごとに専用のモジュールに格納します。これによって各モジュール間の依存関係を表示し、様々なユース・ケースでの機能のデプロイメントの柔軟性を高めます。

この項の目標は、Oracle Virtual Assembly Builderディストリビューションで提供されているモジュールを簡単に説明することです。これはすべてのモジュールの包括的なリストではなく、プラグインに関連するモジュールのみを取り上げています。

7.2 外部共通[oracle.as.assemblybuilder.external.common]

外部共通モジュールにはすべてのプラグインによって使用される機能が含まれます。このモジュールにはログ出力、リソース・バンドル(国際化のためにログ出力によって使用される)、基本例外およびその他のいくつかのクラスが含まれます。

7.2.1 ロギング

プラグイン内でのロギングの場合、LoggerFactoryを使用してログ出力インスタンスを作成します。このログ出力インスタンスは、すべてのログ・メッセージが共通のログ・ファイルに一貫した書式で格納されるように保証します。また、このログ出力インスタンスは診断情報とすべてのOracle製品で必要とされる国際化を適切に処理するためにOJDLをサポートしています。汎用のLoggerFactoryとロギングの使用の詳細は「イントロスペクタ・プラグインの開発」の項に記載されています。

7.2.2 例外

プラグインで新しい例外タイプを作成する場合は、AbExceptionまたはAbCheckedExceptionを拡張する必要があります。AbExceptionはRuntimeExceptionで、AbCheckedExceptionはExceptionです。これらの例外タイプは、すべてのOracle製品の要件であるOJDLをサポートしています。

7.2.3 リソース

ロギングと例外のどちらのクラスも国際化にリソース・バンドルを使用します。デフォルトでは、ログ出力がリソースにアクセスするためにこのモジュール内のResourceBundleクラスを拡張する必要があります。ただし、別の方法でメッセージを格納することを決定した場合は、ログ出力と例外を使用する他の方法があります。これについては、第6章「インスペクション・プラグインの開発」で詳しく説明されています。

7.3 進捗[oracle.as.assemblybuilder.progress]

進捗モジュールには、プラグインがユーザー・インタフェースに進捗を報告できるようにする機能が含まれています。現在配置されている進捗メカニズムは事前定義済進捗と非定型進捗の両方をサポートしています。事前定義済進捗を使用すると、プラグインはデハイドレーション(および最終的にはリハイドレーション)で発生するステップ・リスト、つまりユーザーに現在のステップや残りのステップ数を提示できるリストを定義できます。非定型進捗では、プラグインは実行時まで決定できない動的に生成されたテキストをユーザーに提供します。これについては、第6章「インスペクション・プラグインの開発」で詳しく説明されています。

7.4 イントロスペクタ[oracle.as.assemblybuilder.introspector.api]

イントロスペクタ・モジュールにはイントロスペクタ・フレームワークとメタデータAPIが含まれます。イントロスペクタ・モジュールは、クライアントがイントロスぺクションを実行するために使用するIntrospectorManagerサービスを登録します。また、すべての使用可能なプラグインを動的に検出するためにすべてのプラグイン・サービスの登録を追跡します。

このモジュールにはプラグインを作成するために必要なすべてのインタフェースが含まれます。したがって、プラグインはこのモジュールに必ず依存します。

このドキュメントの他の部分で述べたとおり、カタログはメタデータが格納される場所で、デハイドレーション・プロセスの主要な結果を示します。イントロスペクタ・モジュールは専用のメタデータAPIを通じてカタログAPIのサブセットを公開します。メタデータAPIは、'oracle.as.assemblybuilder.introspector.metadata'パッケージ内のこのモジュールに配置されています。

7.5 アプライアンス[oracle.as.assemblybuilder.introspector.metadata.appliance.Appliance]

アプライアンスは所定の製品のサーバーの特定にインストールに関するメタデータを取得するために使用されます。アプライアンスには子はありません。

次にアプライアンスの各部分を示します。

CaptureId

CaptureIdは、新しいアプライアンスが作成されると自動的に生成される一意のキーです。それは、他のカタログ・アーティファクトをメタデータに関連付けるために使用されます。

ScalabilityInfo

スケーラビリティ情報には、アプライアンスをデプロイするための最小、最大、ターゲットおよび絶対最大が記述されます。最小は、デプロイ可能なこのアプライアンスのインスタンスの最小数です。最大は、デプロイ可能なこのアプライアンスのインスタンスの最大数です。ターゲットは、デプロイ時に作成されるこのアプライアンスのインスタンスの実際の数です。ターゲットは最小を下回ることも最大を上回ることもありません。絶対最大は、最大を設定できる上限で、デハイドレーション時にのみ設定され、ユーザーは編集時にこの値を変更できません。他のすべての値は編集時にユーザーによって設定できます。

最小が1、最大が10、ターゲットが5に設定されている例を取り上げます。初期デプロイメントでは、5つのアプライアンスのインスタンスが作成されます。ただし、ユーザーはアプライアンスを拡張すると決定した場合に、後からさらに5つのアプライアンスを追加できます。

リソース要件

リソース要件は、アプライアンスに必要なシステム・リソースを定義します。現在のリソース要件タイプ: CPU_MHZ、MEMORY_MBおよびNUMBER_CPUS。デプロイメント時に、これらの値を使用して、このアプライアンスがデプロイされている仮想マシンが定義済の値を満たすか超えているように保証できます。

含まれるコンポーネント

このアプライアンスに含まれているコンポーネントのリストです。一般に、これはプラグイン名と同じで、単一の項目のみになります。

タイプ

アプライアンスのタイプ。これはプラグインによって設定されることがあります。プラグインによって設定されていない場合は、デフォルトでプラグイン名になります。

入力

入力は、定義では、あるプロトコル・セットを使用してあるポートをリッスンするソケットです。入力の作成時にはポートとプロトコルの値を提供する必要があります。

出力

出力は製品が確立する他の入力への接続です。接続に使用するプロトコルを指定する必要があります。また、リハイドレーション時に出力に関する追加情報が必要な場合は、プロパティとシステム・プロパティを出力に追加できます。これらのプロパティはOVABによって直接使用されることはなく、単に他のメタデータと一緒に渡されます。プロパティとシステム・プロパティの相違は、プロパティはユーザーによって編集可能であるのに対し、システム・プロパティは編集不可である点です。

ユーザー・プロパティ

プロパティによって、プラグインは任意の名前/値ペアをリハイドレーションに使用するアプライアンスにアタッチできます。ユーザー・プロパティはユーザーによって編集可能です。

システム・プロパティ

システム・プロパティによって、プラグインは任意の名前/値ペアをリハイドレーションで使用するアプライアンスにアタッチできます。ユーザーはシステム・プロパティを編集できません。

コンテンツ・リソース

コンテンツ・リソースはファイルと考えることができます。これによって、デプロイ済システムへ転送するためにファイルをアプライアンスにアタッチできます。発想は、必要なすべてのファイルをグラブするのではなく、ゴールデン・システムからデプロイ済システムまでの途中でなんらか方法で変更する必要のあるファイルのみをグラブするというものです。たとえば、構成ファイルを元の形式からVelocityテンプレートに変換する場合があります。その後、リハイドレーション時にこれらのテンプレートを使用して、新しい入力/出力、プロパティおよびシステム・プロパティ情報を追加しなおします。これらの変換されたファイルは、その後元の構成ファイルの場所に戻されます。また、デハイドレーション時にスクリプトを生成し、その後コンテンツ・リソースとして追加して、後からリハイドレーション時に実行できるようにする場合があります。

注意:

コンテンツ・リソースは、ファイルを参照システムからデプロイ済システムへ転送する方法を示してるわけではありません。パッケージ定義は、パッケージ化し、後からデプロイ済システムへ移動するファイル・セットを識別するために使用されます。

バージョン

これは、メタデータにそのバージョンを示す番号をマークするために使用されます。これは製品バージョンではなく、マーカーです。たとえば、初期リリースはバージョン1で始まります。後から追加のメタデータが必要だと判断した場合は、このバージョンを2に変更します。このように、プラグインがメタデータを参照する場合、最初にバージョン番号をチェックして存在すると予測される要素を把握し、その処理を適切に変更します。発想は、同じプラグインの以前のリリースで生成されたデータを処理するためにより最新のバージョンのプラグインを使用するというものです。

7.6 アセンブリ[oracle.as.assemblybuilder.introspector.metadata.assembly.Assembly]

アセンブリは、アプライアンスとサブアセンブリのコンテナです。アセンブリには、アプライアンスと同様に、入力、出力、プロパティ、システム・プロパティ、コンテンツ・リソースおよびバージョンがあります。アプライアンスとアセンブリの主な相違は、アセンブリが他のアプライアンスとアセンブリのコンテナである点です。

7.7 カタログ[oracle.as.assemblybuilder.catalog.api]

カタログ・モジュールは、OVABに関連するすべてのデータを含むデータ・モデルです。カタログは、OVABのすべてのデーズからのデータが格納される階層構造とみなします。このデータはメタデータ、コンテンツ・リソース、パッケージ、テンプレートおよびデプロイメント・プランから構成されています。

メタデータはアセンブリとアプライアンスが保持される場所です。メタデータはイントロスぺクション・プロセスから生成されるプラグインの出力です。このデータは後からデプロイメント時に編集できますが、それはプラグインから生成されます。

パッケージはバンドリング中の収集されたバイナリ・データが格納されり場所です。パッケージ化は、デハイドレーションの直後に発生するプロセスで、テンプレートの生成の前兆です。パッケージ化は後述のテンプレートの生成に関する項で詳しく説明されています。

テンプレートはデプロイ可能なVMイメージが格納される場所です。テンプレートは、テンプレートの生成プロセスの結果として生成され、デプロイメント・プロセスへの入力として使用されます。これらはどちらも、後述のテンプレートの生成とデプロイヤに関する項で詳しく説明されています。

7.8 イントロスペクタ・プラグイン・ユーティリティ[oracle.as.assemblybuilder.introspector.plugin.util]

イントロスペクタ・プラグイン・ユーティリティ・モジュールはプラグイン開発用の一連のユーティリティを提供します。このモジュールは、ユーティリティ・インスタンスを作成するためのSPIFサービス'oracle.as.assemblybuilder.introspector.plugin.util.UtilFactory'を定義します。このファクトリ・クラスによって提供される各ユーティリティの詳細はJavadocドキュメントを参照してください。特に注目すべきなのは、リハイドレーション時のファイルのコピー、それらの権限の変更、特定ユーザーとしてのコマンドの実行またはテンプレートでのVelocityの実行に使用できるRehydrateUtilユーティリティ・クラスです。

8 サンプル・アプリケーション: WebサービスAPI

次の項では、WebサービスAPIを使用しているサンプル・アプリケーションについて説明します。

- 第8.1項「サンプル・アプリケーション」

8.1 サンプル・アプリケーション

次のサンプル・アプリケーションは、一般的なOracle VM 3.0プラットフォームでアセンブリ・アーカイブをデプロイするための各手順の実行方法を示しています。

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyStore;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Hashtable;
import java.util.Map;
import java.util.HashMap;
import java.util.LinkedList;
import javax.net.SocketFactory;
import javax.net.ssl.*;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class OvabSamples
{

private static final String OVM_URL = "https://myovm:7001";
private static final String OVM_POOL_NAME = "mypool";
private static final String OVM_ADMIN_NAME = "admin";
private static final String OVM_ADMIN_PWD = "your ovm admin password";
private static final String TARGET_NAME = "ovm-target";

private static final String KEYSTORE_FILE = "/ab_home/ab_instance/config/deployer/DeployerTrust.jks";
private static final String TRUSTSTORE_FILE = "/ab_home/ab_instance/config/deployer/DeployerTrust.jks";
private static final String TRUSTSTORE_PASSWORD = "your truststore password";

private static final String ASSEMBLY_NAME = "MyAssembly";

private static final String OVA_FILE="/archives/BaseWLS.ova";
private static final String PLAN_FILE="/plans/BaseWLSQAPlan.xml";

private static final String DEPLOYER_URL = "https://localhost:7002";
private static final String CLOUD_ADMIN_USERNAME="cloudAdmin";
private static final String CLOUD_ADMIN_PASSWORD="cloud admin password";
private static final String APPLICATION_ADMIN_USERNAME="applicationAdmin";
private static final String APPLICATION_ADMIN_PASSWORD="application administrator";

/*
* This example shows how to deploy an OVA end-to-end on the standard OVAB Deployer.
*/
public static void main(String[] args) throws Exception {

createOvmTarget();
addOvmTargetUser();
uploadAssemblyArchive();

int version = registerAssemblyArchive();
if (version >= 0) {
String assemblyInstanceId = createAssemblyInstance(version);
if (deployAssemblyInstance(assemblyInstanceId)) {
message("Creation of Assembly Instance Succeeded");
} else {
message("Creation of Assembly Instance Failed");
}
} else {
message("Registration Failed");
}

}

/*
* When using the generic Deployer, you need to define a target.
* The target includes configuration for the backend system. In
* this example, the backend system is Oracle VM 3.2.
*/
public static void createOvmTarget() throws Exception {

message("CREATE Oracle VM target "+TARGET_NAME);

// Set up connection
HttpURLConnection conn = getConnection(DEPLOYER_URL+"/ovab/admin");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
String params =
"Action=CreateTarget" +
"&target=" + TARGET_NAME +
"&type=ovm" +
"&default=false" +
"&ovm.poolName=" + OVM_POOL_NAME +
"&ovm.vmOperationTimeout=600000" +
"&ovm.vmmversion=3.0" +
"&ovm.user=" + OVM_ADMIN_NAME +
"&ovm.url=" + OVM_URL +
"&ovm.pwd=" + OVM_ADMIN_PWD;
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", "" + params.length());

// Use Cloud Admin Credentials
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String encodedCredentials =
enc.encode(new String(CLOUD_ADMIN_USERNAME + ":" + CLOUD_ADMIN_PASSWORD).getBytes());
conn.setRequestProperty("Authorization", "Basic " + encodedCredentials);

// Make the request
try {
conn.connect();
// send the parameters
OutputStream os = conn.getOutputStream();
os.write(params.getBytes("UTF-8"));
os.close();

// Read the response
Map<String, String> info = handleSuccessResponse(conn);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}
message("Create result: "+info);
message("SUCCESS");

} catch (Exception e) {
Map<String, String> info = handleException(conn, e);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}
}

}

/*
* For Oracle VM 3, users must be authorized by the administrator to use a target
*/
public static void addOvmTargetUser() throws Exception {

message("ADD Oracle VM target user "+TARGET_NAME);

// Set up connection
HttpURLConnection conn = getConnection(DEPLOYER_URL+"/ovab/admin");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
String params =
"Action=AddTargetUser"+
"&user=" + APPLICATION_ADMIN_USERNAME +
"&target=" + TARGET_NAME;
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", "" + params.length());

// Use Admin credentials
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String encodedCredentials =
enc.encode(new String(CLOUD_ADMIN_USERNAME + ":" + CLOUD_ADMIN_PASSWORD).getBytes());
conn.setRequestProperty("Authorization", "Basic " + encodedCredentials);

// Make the request
try {
conn.connect();
// send the parameters
OutputStream os = conn.getOutputStream();
os.write(params.getBytes("UTF-8"));
os.close();
// Read the response
Map<String, String> info = handleSuccessResponse(conn);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}
message("SUCCESS");

} catch (Exception e) {
Map<String, String> info = handleException(conn, e);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}
}

}

/*
* This is an example of how to upload an OVA from the client to the Deployer repository.
*/
public static void uploadAssemblyArchive() throws Exception {
message("UPLOAD OVA");
// Set up connection
HttpURLConnection conn =
getConnection(DEPLOYER_URL+
"/ovab/deployer"+
"?Action=UploadAssemblyArchive"+
"&assembly.name="+ASSEMBLY_NAME+
"&assembly.desc="+"my sample assembly");

conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/octet-stream");
conn.setChunkedStreamingMode(0);

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String encodedCredentials =
enc.encode(new String(APPLICATION_ADMIN_USERNAME + ":" + APPLICATION_ADMIN_PASSWORD).getBytes());
conn.setRequestProperty("Authorization", "Basic " + encodedCredentials);

// Make the request
try {
conn.connect();

int bytesRead, bufferSize;
int maxBufferSize = 1 * 1024 * 1024;
byte[] buffer;
File f = new File(OVA_FILE);
FileInputStream fis = new FileInputStream(f);
bufferSize = Math.min(fis.available(), maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fis.read(buffer, 0, bufferSize);

OutputStream os = conn.getOutputStream();
while (bytesRead > 0) {
os.write(buffer, 0, bufferSize);
bufferSize = Math.min(fis.available(), maxBufferSize);
bytesRead = fis.read(buffer, 0, bufferSize);
}
fis.close();
os.flush();
os.close();

// Read the response
Map<String, String> info = handleSuccessResponse(conn);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}
message("SUCCESS");

} catch (Exception e) {
Map<String, String> info = handleException(conn, e);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}
}

}

/*
* This is an example of how to register an assembly archive from the Deployer
* repository to the backend system
*
* Registration is an asynchronous task, so this method calls
* another method to wait for the asynchronous request to complete
* before returning.
*/
public static int registerAssemblyArchive() throws Exception {

message("REGISTER Assembly Archive");

// Set up connection
String params =
"Action=RegisterAssemblyArchive"+
"&assembly.name="+ASSEMBLY_NAME+
"&target="+TARGET_NAME;
HttpURLConnection conn = getConnection(DEPLOYER_URL+"/ovab/deployer?"+params);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", "" + params.length());

// Use Application Admin Credentials
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String encodedCredentials =
enc.encode(new String(APPLICATION_ADMIN_USERNAME + ":" + APPLICATION_ADMIN_PASSWORD).getBytes());
conn.setRequestProperty("Authorization", "Basic " + encodedCredentials);

// Make the request
try {
conn.connect();

// Read the response
message("    Async Registration Request Initiated");
Map<String, String> info = handleSuccessResponse(conn);
String requestId =  info.get("RegisterAssemblyArchiveResult.requestId");

// Wait for the request to complete
if (waitForRequest(requestId)) {
// return the version registered. This is used later for creating the deployment
int version = Integer.parseInt(info.get("RegisterAssemblyArchiveResult.version"));
return version;
} else {
return -1;
}

} catch (Exception e) {
Map<String, String> info = handleException(conn, e);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}
return -1;
}

}

/*
* This method shows how to wait for the completion of an asynchronous Deployer request.
* This is used by the examples for registration and deployment of an assembly archive.
*/
public static boolean waitForRequest(String id) throws Exception {

String status = "RUNNING";

while ("RUNNING".equals(status)) {
message("    Async request "+id+" is still in progress");

// Set up connection
String params =
"Action=DescribeRequests"+
"&request.id="+id;

HttpURLConnection conn = getConnection(DEPLOYER_URL+"/ovab/deployer?"+params);
conn.setDoInput(true);
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", "" + params.length());

// Use Application Admin Credentials
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String encodedCredentials =
enc.encode(new String(APPLICATION_ADMIN_USERNAME + ":" + APPLICATION_ADMIN_PASSWORD).getBytes());
conn.setRequestProperty("Authorization", "Basic " + encodedCredentials);

// Make the request
try {
conn.connect();

// Read the response
Map<String, String> info = handleSuccessResponse(conn);
status = info.get("DescribeRequestsResult.requestInfo.requestStatus");

try { Thread.sleep(30*1000); } catch (InterruptedException e) { }

} catch (Exception e) {
Map<String, String> info = handleException(conn, e);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}
return false;
}
}

message("    Request status is "+status);
if ("SUCCEEDED".equals(status)) {
return true;
} else {
return false;
}
}

/*
* This is an example of creating an assembly instance. This is a POST
* operation because the deployment plan is supplied in this step.
*/
public static String createAssemblyInstance(int version) throws Exception {
message("CREATE Deployment");
// Set up connection

String urlStr =
DEPLOYER_URL+
"/ovab/deployer?"+
"Action=CreateAssemblyInstance&assembly.name="+ASSEMBLY_NAME+
"&assembly.version="+version+
"&target="+TARGET_NAME;

HttpURLConnection conn =
getConnection(urlStr);

conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/octet-stream");
conn.setChunkedStreamingMode(0);

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String encodedCredentials =
enc.encode(new String(APPLICATION_ADMIN_USERNAME + ":" + APPLICATION_ADMIN_PASSWORD).getBytes());
conn.setRequestProperty("Authorization", "Basic " + encodedCredentials);

// Make the request
try {
conn.connect();

// Read plan document from a file and write to the web service
int bytesRead, bufferSize;
int maxBufferSize = 1 * 1024 * 1024;
byte[] buffer;
File f = new File(PLAN_FILE);
FileInputStream fis = new FileInputStream(f);
bufferSize = Math.min(fis.available(), maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fis.read(buffer, 0, bufferSize);
OutputStream os = conn.getOutputStream();
while (bytesRead > 0) {
os.write(buffer, 0, bufferSize);
bufferSize = Math.min(fis.available(), maxBufferSize);
bytesRead = fis.read(buffer, 0, bufferSize);
}
fis.close();
os.flush();
os.close();

// Read the response
Map<String, String> info = handleSuccessResponse(conn);
message("Deployment Created");
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}

String assemblyInstanceId = info.get("CreateAssemblyInstanceResult.assemblyInstanceId");
return assemblyInstanceId;

} catch (Exception e) {
Map<String, String> info = handleException(conn, e);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}

}

return null;

}

/*
* This is an example of how to deploy an Assembly Instance
*
* Deployment is an asynchronous task, so this method calls
* another method to wait for the asynchronous request to complete
* before returning.
*
*/
public static boolean deployAssemblyInstance(String assemblyInstanceId) throws Exception {

message("Deploy Assembly Instance");

// Set up connection
String params =
"Action=DeployAssemblyInstance"+
"&assembly.instance.id="+assemblyInstanceId;
HttpURLConnection conn = getConnection(DEPLOYER_URL+"/ovab/deployer?"+params);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", "" + params.length());

// Use Application Admin Credentials
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String encodedCredentials =
enc.encode(new String(APPLICATION_ADMIN_USERNAME + ":" + APPLICATION_ADMIN_PASSWORD).getBytes());
conn.setRequestProperty("Authorization", "Basic " + encodedCredentials);

// Make the request
try {
conn.connect();

// Read the response
message("    Async Deployment Request Initiated");
Map<String, String> info = handleSuccessResponse(conn);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}

// Wait for the deployment to complete
String requestId = info.get("DeployAssemblyInstanceResult.requestId");
return waitForRequest(requestId);

} catch (Exception e) {
Map<String, String> info = handleException(conn, e);
for (Map.Entry<String, String> entry : info.entrySet()) {
message("    "+entry.getKey()+"="+entry.getValue());
}
return false;
}

}

/*
* This is a convenient method for creating an SSL connection to the Deployer
*/
public static HttpURLConnection getConnection(String urlString) throws Exception {
URL url = new URL(urlString);

if (false) {
return (HttpURLConnection) url.openConnection();
}

// Need to setup SSL connection
SocketFactory sf = null;
final String ALGORITHM = "sunx509";
// For Testing
// For testing
String pw = TRUSTSTORE_PASSWORD;
final char[] keystorePass = pw.toCharArray();
final char[] truststorePass = pw.toCharArray();

// create the private keyStore
KeyStore ksPrivate;
ksPrivate = KeyStore.getInstance("JKS");
ksPrivate.load(new FileInputStream(KEYSTORE_FILE), keystorePass);

// create the factory for the private key
KeyManagerFactory keyManagerFactory;
keyManagerFactory = KeyManagerFactory.getInstance(ALGORITHM);
keyManagerFactory.init(ksPrivate, keystorePass);

// create now the trusted keyStore
KeyStore ksTrusted;
ksTrusted = KeyStore.getInstance("JKS");
ksTrusted.load(new FileInputStream(TRUSTSTORE_FILE), truststorePass);

// create a trust manager factory using the same algorithm.
TrustManagerFactory trustManagerFactory;
trustManagerFactory = TrustManagerFactory.getInstance(ALGORITHM);
trustManagerFactory.init(ksTrusted);

SSLContext sslc = SSLContext.getInstance("TLS");
sslc.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

sf = sslc.getSocketFactory();
HttpsURLConnection httpsURLConn = (HttpsURLConnection)url.openConnection();
httpsURLConn.setSSLSocketFactory((SSLSocketFactory) sf);

httpsURLConn.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String host, SSLSession sslsession) {
return true;
}
});
return (HttpURLConnection)httpsURLConn;

}

/*
* This is a convenience method for extracting the information in the
* response from a failed Deployer Web service call.
*/
public static Map<String,String> handleException(HttpURLConnection conn, Exception e) throws IOException, SAXException {

Map<String,String> result = new HashMap<String,String>();

message("ERROR: "+e.getMessage());
message("RESPONSE CODE: "+conn.getResponseCode());
if (conn.getResponseCode() == (HttpURLConnection.HTTP_NOT_FOUND)) {
message("Invalid request, web service not found");
return result;
} else if (conn.getResponseCode() == (HttpURLConnection.HTTP_UNAUTHORIZED)) {
message("User is not authorized to perform this action");
return result;
} else if (conn.getResponseCode() == (HttpURLConnection.HTTP_FORBIDDEN)) {
message("User is not authorized to perform this action");
return result;
}

// Read the response
DataInputStream input = new DataInputStream(conn.getErrorStream());
String str;
StringBuffer response = new StringBuffer();
try {
while (null != ((str = input.readLine()))) {
response.append(str);
}
input.close();

// Parse the response
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(new ResponseHandler(result));
reader.parse(new InputSource(new StringReader(response.toString())));

} catch (Exception e2) {
message("Failure reading error stream: "+e2);
}

return result;
}

/*
* This is a convenience method for extracting the information in the
* response from a successful Deployer Web service call.
*/
public static Map<String,String> handleSuccessResponse(HttpURLConnection conn) throws IOException, SAXException {
HashMap<String,String> result = new HashMap<String,String>();
DataInputStream input = new DataInputStream(conn.getInputStream());
String str;
StringBuffer response = new StringBuffer();
while (null != ((str = input.readLine()))) {
response.append(str);
}
input.close();

// Parse the response
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(new ResponseHandler(result));
reader.parse(new InputSource(new StringReader(response.toString())));

return result;
}

/*
* The responses returned from the Deployer Web service are XML
* documents. This handler translates the structure of the document
* into a Map which is useful for picking out certain element.  It
* also prints the entries to System.out.
*/
public static class ResponseHandler extends DefaultHandler {

private Map<String,String> info;

public ResponseHandler(Map<String,String> info) {
this.info = info;
}

LinkedList<String> elements = new LinkedList<String>();

public void startElement(String namespaceURI, String elementName, String qName, Attributes attrs) {
elements.add(elementName);
}

public void characters(char ch[], int start, int length) {
String str = new String(ch,start,length);

//message(String.format("    %s=%s", getCurrentKey(), str));
info.put(getCurrentKey(), str);
}

private String getCurrentKey() {
String result = null;
for (String s : elements) {
if (result != null) {
result = result + "." +s;
} else {
result = s;
}
}
return result;
}

public void endElement(String namespaceURI, String elementName, String qName) {
elements.removeLast();
}
}

private static void message(String msg) {
System.out.println("["+new Date(System.currentTimeMillis())+"] "+msg);
}

}

A Webサービス・スキーマ

この付録では、デプロイヤWebサービスによって返されるレスポンス情報のスキーマが定義されています。このスキーマで定義されるタイプは、このマニュアルの前半にある章の「レスポンスのコンテンツ」の説明で参照されています。

- 第A.1項「スキーマ」

A.1 スキーマ

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.oracle.com/ovab/deployer/webservice/bindings"
xmlns:tns="http://www.oracle.com/ovab/deployer/webservice/bindings"
elementFormDefault="qualified">
<xsd:element name="Path">
<xsd:complexType>
<xsd:attribute name="value" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="InstancePath">
<xsd:complexType>
<xsd:attribute name="value" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="AppliancePath">
<xsd:complexType>
<xsd:attribute name="value" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Paths">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="tns:Path" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="AssemblyInstanceId">
<xsd:complexType>
<xsd:attribute name="value" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="AssemblyInstanceState">
<xsd:complexType>
<xsd:attribute name="id" type="xsd:string"/>
<xsd:attribute name="state" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="UploadAssemblyArchiveResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="CopyAssemblyArchiveResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="CanUploadAssemblyArchiveResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="canUpload" type="tns:canUploadType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeleteAssemblyArchiveResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="versions" type="tns:VersionsType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="ErrorDetail">
<xsd:sequence>
<xsd:element name="code" minOccurs="1" maxOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
</xsd:element>
<xsd:element name="message" minOccurs="1" maxOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
</xsd:element>
<xsd:element name="cause" minOccurs="0" maxOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
</xsd:element>
<xsd:element name="action" minOccurs="0" maxOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="ErrorResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="type">
<xsd:simpleType>
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
</xsd:element>
<xsd:element name="error-detail" type="tns:ErrorDetail" minOccurs="1" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="VersionsType">
<xsd:sequence>
<xsd:element name="version" maxOccurs="unbounded" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:element name="RegisterAssemblyArchiveResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
<xsd:element name="targetName" type="tns:targetNameType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="UnregisterAssemblyArchiveResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
<xsd:element name="targetName" type="tns:targetNameType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="requestIdType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:simpleType name="nameType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:simpleType name="canUploadType">
<xsd:restriction base="xsd:boolean"/>
</xsd:simpleType>
<xsd:simpleType name="versionType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:simpleType name="patchIdType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:simpleType name="payloadNameType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:simpleType name="applianceInstanceIdType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:element name="DescribeAssemblyArchivesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assembly" type="tns:Assembly" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="AssemblyVersion">
<xsd:sequence>
<xsd:element name="version" type="tns:versionType"></xsd:element>
<xsd:element name="description" type="tns:descriptionType"></xsd:element>
<xsd:element name="appliances">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="appliance" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="plans">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="plan" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="versionHistory">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="version" type="xsd:string" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="appliedPatches">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="patchId" type="xsd:string" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Assembly">
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="owner" type="xsd:boolean"></xsd:element>
<xsd:element name="versions">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="version" type="tns:AssemblyVersion" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="plans">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="plan" maxOccurs="unbounded" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="users">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="user" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="descriptionType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:element name="UpdateAssemblyArchiveResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="assemblyInstanceIdType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:element name="CreateAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeleteAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeployAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="UndeployAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="StartAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="StopAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="instanceIdType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:complexType name="InstancesType">
<xsd:sequence>
<xsd:element name="instanceId" type="tns:instanceIdType" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="targetNameType">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:complexType name="Instance">
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="instanceId" type="xsd:string"></xsd:element>
<xsd:element name="instanceState" type="xsd:string"></xsd:element>
<xsd:element name="applianceId" type="xsd:string"></xsd:element>
<xsd:element name="appliancePath" type="xsd:string"></xsd:element>
<xsd:element name="vmName" type="xsd:string"></xsd:element>
<xsd:element name="vmId" type="xsd:string"></xsd:element>
<xsd:element name="ipaddresses">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ipaddress" maxOccurs="unbounded" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="vnets">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="vnet" maxOccurs="unbounded" type="tns:Vnet"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="volumes">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="volume" maxOccurs="unbounded" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="meteringMap">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="metering" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="value" type="xsd:long"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="networkInterfaces">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="interface" maxOccurs="unbounded" type="tns:NetworkInterface"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="AssemblyInstance">
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="assemblyName" type="xsd:string"></xsd:element>
<xsd:element name="assemblyVersion" type="xsd:string"></xsd:element>
<xsd:element name="state" type="xsd:string"></xsd:element>
<xsd:element name="targetName" type="xsd:string"></xsd:element>
<xsd:element name="appliances">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="appliance" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="versionHistory">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="version" type="xsd:string" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DescribeAssemblyInstancesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstance" type="tns:AssemblyInstance" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="RequestInfo">
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="requestStatus" type="xsd:string"></xsd:element>
<xsd:element name="requestType" type="xsd:string"></xsd:element>
<xsd:element name="operationType" type="xsd:string"></xsd:element>
<xsd:element name="assemblyName" type="xsd:string"></xsd:element>
<xsd:element name="assemblyVersion" type="xsd:string"></xsd:element>
<xsd:element name="message" type="xsd:string"></xsd:element>
<xsd:element name="errorDetails">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="error-detail" type="tns:ErrorDetail" minOccurs="1" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="creationTimeStamp" type="xsd:long"></xsd:element>
<xsd:element name="completionTimeStamp" type="xsd:long"></xsd:element>
<xsd:element name="progressMessages">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="progressMessage" maxOccurs="unbounded" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DescribeRequestsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestInfo" type="tns:RequestInfo" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeDeployerResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="specificationVersion" type="xsd:string"></xsd:element>
<xsd:element name="implementationVersion" type="xsd:string"></xsd:element>
<xsd:element name="assemblyStoreFreeSpace" type="xsd:long"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="CreateTargetResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="target" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeTargetNamesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="target" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeleteTargetResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="target" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="SetDefaultTargetResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="targetName" type="xsd:string"></xsd:element>
<xsd:element name="targetType" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeApplianceInstancesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="instance" type="tns:Instance" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="AddTargetUserResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="target" type="xsd:string"></xsd:element>
<xsd:element name="user" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="RemoveTargetUsersResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="target" type="xsd:string"></xsd:element>
<xsd:element name="users">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="user" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Properties">
<xsd:sequence>
<xsd:element name="entry" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="key" minOccurs="1" maxOccurs="1" type="xsd:string"/>
<xsd:element name="value" minOccurs="1" maxOccurs="1" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="TargetUser">
<xsd:sequence>
<xsd:element name="userName" type="xsd:string"></xsd:element>
<xsd:element name="targetProperties" type="tns:Properties"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DescribeTargetUsersResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="user" type="tns:TargetUser" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeUserTargetsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="target" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="GetTargetTypeResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="targetType" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="GetDefaultTargetResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="targetName" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="ScalingGroup">
<xsd:sequence>
<xsd:element name="scalingGroupId" type="xsd:string"></xsd:element>
<xsd:element name="min" type="xsd:int"></xsd:element>
<xsd:element name="max" type="xsd:int"></xsd:element>
<xsd:element name="target" type="xsd:int"></xsd:element>
<xsd:element name="current" type="xsd:int"></xsd:element>
<xsd:element name="initial" type="xsd:int"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DescribeScalingGroupsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="scalingGroups" type="tns:ScalingGroup" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ScaleApplianceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="scalingGroupId" type="xsd:string"></xsd:element>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Vnet">
<xsd:sequence>
<xsd:element name="vnetId" type="xsd:string" minOccurs="0" maxOccurs="1"></xsd:element>
<xsd:element name="vnetName" type="xsd:string" minOccurs="0" maxOccurs="1"></xsd:element>
<xsd:element name="private" type="xsd:boolean" minOccurs="0" maxOccurs="1"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DescribeVnetsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="vnet" type="tns:Vnet" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Target">
<xsd:sequence>
<xsd:element name="targetName" type="tns:targetNameType"></xsd:element>
<xsd:element name="targetType" type="xsd:string"></xsd:element>
<xsd:element name="targetCapability" type="xsd:string"></xsd:element>
<xsd:element name="status" type="xsd:string"></xsd:element>
<xsd:element name="vnets">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="vnet"  minOccurs="0" maxOccurs="unbounded" type="tns:Vnet"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="volumeNames">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="volumeName"  minOccurs="0" maxOccurs="unbounded" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="availabilityMap">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="metering"  minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="value" type="xsd:long"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DescribeTargetsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="target" type="tns:Target" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="RegistrationInfo">
<xsd:sequence>
<xsd:element name="assemblyName" type="xsd:string"></xsd:element>
<xsd:element name="assemblyVersion" type="xsd:string"></xsd:element>
<xsd:element name="targetName" type="xsd:string"></xsd:element>
<xsd:element name="registrationId" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DescribeRegistrationsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="registration" type="tns:RegistrationInfo" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="TargetConfiguration">
<xsd:sequence>
<xsd:element name="targetName" type="xsd:string"></xsd:element>
<xsd:element name="targetType" type="xsd:string"></xsd:element>
<xsd:element name="properties">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="property" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="value" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DescribeTargetConfigurationsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="targetConfiguration" type="tns:TargetConfiguration" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="RestartAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="RedeployAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeleteRequestsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestsPurged" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeAssemblyUsersResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyName" type="xsd:string"></xsd:element>
<xsd:element name="users" type="xsd:string" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="AddAssemblyUsersResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyName" type="xsd:string"></xsd:element>
<xsd:element name="users" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="RemoveAssemblyUsersResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyName" type="xsd:string"></xsd:element>
<xsd:element name="users" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="CreateTagsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="resources" type="xsd:string" maxOccurs="unbounded"></xsd:element>
<xsd:element name="tags">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="tag" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="key" type="xsd:string"></xsd:element>
<xsd:element name="value" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeleteTagsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="resources" type="xsd:string" maxOccurs="unbounded"></xsd:element>
<xsd:element name="tags" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeTagsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="tags">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="tag" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="key" type="xsd:string"></xsd:element>
<xsd:element name="value" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="UpdateTargetResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="targetName" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeleteFailedApplianceInstancesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="applianceId" type="xsd:string"></xsd:element>
<xsd:element name="applianceInstanceIds" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ValidateAssemblyInstanceResourcesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="status" type="xsd:string"></xsd:element>
<xsd:element name="errors" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="SuspendAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="requestId" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ResumeAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="requestId" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="NetworkInterface">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="ipAddress" type="xsd:string"></xsd:element>
<xsd:element name="networkName" type="xsd:string"></xsd:element>
<xsd:element name="private" type="xsd:boolean"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="UploadDeploymentPlanResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
<xsd:element name="plan" type="tns:nameType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeleteDeploymentPlanResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
<xsd:element name="plan" type="tns:nameType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="UploadAssemblyResourcesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="UploadPatchResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
<xsd:element name="patchId" type="tns:patchIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="PatchAssemblyArchiveResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="assemblyName" type="tns:nameType"></xsd:element>
<xsd:element name="originalVersion" type="tns:versionType"></xsd:element>
<xsd:element name="patchedVersion" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="PatchAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
<xsd:element name="originalVersion" type="tns:versionType"></xsd:element>
<xsd:element name="patchedVersion" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="RevAssemblyInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
<xsd:element name="originalVersion" type="tns:versionType"></xsd:element>
<xsd:element name="patchedVersion" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="PatchApplianceInstanceResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="applianceInstanceId" type="tns:applianceInstanceIdType"></xsd:element>
<xsd:element name="originalVersion" type="tns:versionType"></xsd:element>
<xsd:element name="patchedVersion" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="UploadPayloadResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="payloadName" type="tns:payloadNameType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="SendPayloadResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeletePayloadResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="payloadName" type="tns:payloadNameType"></xsd:element>
<xsd:element name="assemblyName" type="tns:nameType"></xsd:element>
<xsd:element name="assemblyVersion" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ExecuteCommandResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="applianceInstanceId" type="tns:applianceInstanceIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="RollbackInstancePatchResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="assemblyInstanceId" type="tns:assemblyInstanceIdType"></xsd:element>
<xsd:element name="patchId" type="tns:patchIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="RollbackArchivePatchResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="patchId" type="tns:patchIdType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeletePatchResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="patchId" type="tns:patchIdType"></xsd:element>
<xsd:element name="assemblyName" type="tns:nameType"></xsd:element>
<xsd:element name="assemblyVersion" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeAssemblyInstancePatchesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="patch" type="tns:AssemblyPatch" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribePatchesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="patch" type="tns:AssemblyPatch" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribePayloadsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="payload" type="tns:Payload" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:complexType name="SoftwarePatch">
<xsd:sequence>
<xsd:element name="targetAppliance" type="xsd:string"></xsd:element>
<xsd:element name="nativeId" type="xsd:string"></xsd:element>
<xsd:element name="format" type="xsd:string"></xsd:element>
<xsd:element name="resolvedIssues" type="xsd:string" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="AssemblyPatch">
<xsd:sequence>
<xsd:element name="patchId" type="tns:patchIdType"></xsd:element>
<xsd:element name="creationTime" type="xsd:long"></xsd:element>
<xsd:element name="assemblyName" type="tns:nameType"></xsd:element>
<xsd:element name="assemblyVersion" type="tns:versionType"></xsd:element>
<xsd:element name="softwarePatch" type="tns:SoftwarePatch" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Payload">
<xsd:sequence>
<xsd:element name="payloadName" type="tns:payloadNameType"></xsd:element>
<xsd:element name="creationTime" type="xsd:long"></xsd:element>
<xsd:element name="assemblyName" type="tns:nameType"></xsd:element>
<xsd:element name="assemblyVersion" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DeleteAssemblyResourcesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeAssemblyResourcesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="tns:nameType"></xsd:element>
<xsd:element name="version" type="tns:versionType"></xsd:element>
<xsd:element name="resources">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="resource" maxOccurs="unbounded" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="ResourceType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="APPLIANCE_INSTANCE"/>
<xsd:enumeration value="OVA"/>
<xsd:enumeration value="DEPLOYMENT"/>
<xsd:enumeration value="REGISTRATION"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="LogEventType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="VM_STATE"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="VMState">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="CREATED"/>
<xsd:enumeration value="STARTED"/>
<xsd:enumeration value="STOPPED"/>
<xsd:enumeration value="DESTROYED"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="LogEvent" abstract="true">
<xsd:sequence>
<xsd:element name="timeStamp" type="xsd:long"></xsd:element>
<xsd:element name="user" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="VMStateEvent">
<xsd:complexContent>
<xsd:extension base="tns:LogEvent">
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="assemblyName" type="xsd:string"></xsd:element>
<xsd:element name="appliancePath" type="xsd:string"></xsd:element>
<xsd:element name="instanceIndex" type="xsd:int"></xsd:element>
<xsd:element name="cpu" type="xsd:long"></xsd:element>
<xsd:element name="disk" type="xsd:long"></xsd:element>
<xsd:element name="memory" type="xsd:long"></xsd:element>
<xsd:element name="vmState" type="tns:VMState"></xsd:element>
<xsd:element name="eventType" type="tns:LogEventType"></xsd:element>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="DescribeResourcesByTagsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="resources">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="resource" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="resourceName" minOccurs="1" maxOccurs="1" type="xsd:string"></xsd:element>
<xsd:element name="resourceType" minOccurs="1" maxOccurs="1" type="tns:ResourceType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DeleteLogEventsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="eventType" type="tns:LogEventType"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeLogEventsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="events">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="unbounded" name="event" type="tns:LogEvent"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeApplianceInstanceMetricsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="metrics" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="instanceId" type="xsd:string"></xsd:element>
<xsd:element name="vmId" type="xsd:string"></xsd:element>
<xsd:element name="metric" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="values">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" minOccurs="0" maxOccurs="unbounded" type="xsd:double"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="StartMetricsPollingResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="watchItemId" type="xsd:long"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="StopMetricsPollingResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="watchItemId" type="xsd:long"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="AddRuleSetResult">
<xsd:complexType>
</xsd:complexType>
</xsd:element>

<xsd:element name="DeleteRuleSetResult">
<xsd:complexType>
</xsd:complexType>
</xsd:element>

<xsd:element name="DeleteRuleResult">
<xsd:complexType>
</xsd:complexType>
</xsd:element>

<xsd:element name="EnableRuleResult">
<xsd:complexType>
</xsd:complexType>
</xsd:element>

<xsd:element name="DisableRuleResult">
<xsd:complexType>
</xsd:complexType>
</xsd:element>

<xsd:element name="DisableRuleSetResult">
<xsd:complexType>
</xsd:complexType>
</xsd:element>

<xsd:element name="EnableRuleSetResult">
<xsd:complexType>
</xsd:complexType>
</xsd:element>

<xsd:complexType name="RuleInformation">
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="ruleSetName" type="xsd:string"></xsd:element>
<xsd:element name="ruleName" type="xsd:string"></xsd:element>
<xsd:element name="status" type="xsd:string"></xsd:element>
<xsd:element name="message" type="xsd:string"></xsd:element>
<xsd:element name="lastTriggered" type="xsd:long"></xsd:element>
<xsd:element name="contiguousTriggers" type="xsd:int"></xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:element name="DescribeRulesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="rule-information" minOccurs="0" maxOccurs="unbounded" type="tns:RuleInformation"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:complexType name="RuleMetricInformation">
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="ruleSetName" type="xsd:string"></xsd:element>
<xsd:element name="metricName" type="xsd:string"></xsd:element>
<xsd:element name="status" type="xsd:string"></xsd:element>
<xsd:element name="message" type="xsd:string"></xsd:element>
<xsd:element name="lastEvaluated" type="xsd:long"></xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:element name="DescribeRuleMetricsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="rule-metric-information" minOccurs="0" maxOccurs="unbounded" type="tns:RuleMetricInformation"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:complexType name="RuleActionInformation">
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="ruleSetName" type="xsd:string"></xsd:element>
<xsd:element name="ruleName" type="xsd:string"></xsd:element>
<xsd:element name="status" type="xsd:string"></xsd:element>
<xsd:element name="message" type="xsd:string"></xsd:element>
<xsd:element name="started" type="xsd:long"></xsd:element>
<xsd:element name="completed" type="xsd:long"></xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:element name="DescribeRuleActionsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="rule-action-information" minOccurs="0" maxOccurs="unbounded" type="tns:RuleActionInformation"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="CreateAssemblyInstanceSnapshotResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="requestId" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="CreateDiskSnapshotResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="applianceInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="diskName" type="xsd:string"></xsd:element>
<xsd:element name="requestId" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="CreateDisksSnapshotResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="diskName" type="xsd:string"></xsd:element>
<xsd:element name="requestId" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="CreateApplianceInstanceSnapshotResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="applianceInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="requestId" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="DeleteSnapshotsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="snapshotIds">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="snapshotId" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:complexType name="Snapshot">
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="snapshotId" type="xsd:string"></xsd:element>
<xsd:element name="snapshotName" type="xsd:string"></xsd:element>
<xsd:element name="snapshotDescription" type="xsd:string"></xsd:element>
<xsd:element name="creationTime" type="xsd:long"></xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="SnapshotDisk">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="ovfId" type="xsd:string"></xsd:element>
<xsd:element name="nativeDiskId" type="xsd:string"></xsd:element>
<xsd:element name="memberId" type="xsd:string"></xsd:element>
<xsd:element name="sharable" type="xsd:boolean"></xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Snapshots">
<xsd:sequence>
<xsd:element name="snapshot" minOccurs="0" maxOccurs="unbounded" type="tns:Snapshot"></xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="SnapshotDisks">
<xsd:sequence>
<xsd:element name="snapshotDisk" minOccurs="0" maxOccurs="unbounded" type="tns:SnapshotDisk"></xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:element name="DescribeSnapshotsResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="snapshots" type="tns:Snapshots"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="RestoreSnapshotResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="assemblyInstanceId" type="xsd:string"></xsd:element>
<xsd:element name="requestId" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="DescribeSnapshotDisksResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="snapshotDisks" type="tns:SnapshotDisks"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DescribeRequestDetailResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="xsd:string"></xsd:element>
<xsd:element name="status" type="xsd:string"></xsd:element>
<xsd:element name="totalSteps" type="xsd:int"></xsd:element>
<xsd:element name="completedSteps" type="xsd:int"></xsd:element>
<xsd:element name="messages">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="message" maxOccurs="unbounded" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="StartApplianceInstancesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="applianceInstanceIds" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="StopApplianceInstancesResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="requestId" type="tns:requestIdType"></xsd:element>
<xsd:element name="applianceInstanceIds" type="xsd:string" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.