目次


Linux でのテスト用にダミーの CIM インジケーションを生成する

OpenPegasus を使って CIM インジケーションを作成し、インジケーション・リスナーをテストする

Comments

皆さんが CIM (Common Information Model) 標準を使ってハードウェア管理を行おうとする場合、通常は、皆さんが使用している (あるいは開発している) 管理アプリケーションがハードウェア・レベルのインジケーションをリッスンして処理しなければなりません。理想的な状況では、皆さんが使用する予定のハードウェア・システムは既に稼働しており、そのシステムを利用できるはずですが、当然のことながら現実は必ずしも理想的な状況にあるわけではありません。

では、手軽に利用できるハードウェアがない場合にはどうすればよいのでしょう。その場合には、管理アプリケーションのリスナー・コンポーネントをテストするための、ハードウェア・レベルのダミー・インジケーションを作成します。この記事では、OpenPegasus のソース・コードに同梱されているプロバイダーを使用して、OpenPegasus の CIMOM (Common Information Model Object Manager) 上でダミーのインジケーションを生成する方法を説明します。

CIM (Common Information Model) の概要

CIM (Common Information Model) はネットワーク環境やエンタープライズ環境で管理情報を記述するためのモデルです。CIM は仕様とスキーマで構成されています。仕様は他の管理モデルとの統合方法を定義し、スキーマは実際のモデルの記述をします。

CIM のスキーマを表現するために MOF (Managed Object Format) がよく使われますが、これは MOF を直接コンパイルして CIMOM リポジトリーに入れることができるためです。CIMOM はメディエーター (サーバー) であり、CIMOM リポジトリーの中にあるコンパイルされた情報モデルを使用して、クライアントとプロバイダーの間で交換されるリクエストとレスポンスを仲介します。CIMOM はクライアントとプロバイダーの間に置かれます。

プロバイダーは CIMOM のバックエンドにあり、実際に管理対象リソース (ディスク・ドライブや CPU など) と通信してデータにアクセスします。プロバイダーはそのデータを CIMOM に送信し、CIMOM はそのデータをクライアントに転送します。CIMOM がクライアントからリクエストを受信したものの、要求されたデータが CIMOM のリポジトリーの中にない場合には、CIMOM はこのリクエストを適切なプロバイダーに転送します。

クライアントは多くの場合、管理アプリケーションであり、CIMOM にリクエストを送信してレスポンスを受信します。ほとんどの場合、インジケーション・リスナーはクライアントの一部であり、情報を受信することしかできず、リクエストを送信することはできません。CIMOM モデルの全体を単純に表現したものが図 1 です。

図 1. CIMOM モデルの概要
CIMOM モデルの概要
CIMOM モデルの概要

インジケーションを生成するためのステップ

インジケーションを生成するための主なステップには、以下の 3 つがあります。

  1. OpenPegasus のソース・コードに同梱されている RT_Indication プロバイダーをコンパイルしてインストールします。
  2. CIMOM にリクエストを送信することでインジケーションを生成するための、簡単な Java™ プログラムを作成します。
  3. 生成されたインジケーションをリッスンするための簡単な Java プログラムを作成します。

ステップ 1. RT_Indication プロバイダーをコンパイルしてインストールする

このプロセスは、OpenPegasus.org から OpenPegasus をダウンロードしてインストールすることから始めます (「参考文献」のリンクを参照)。この記事では OpenPegasus のソース・ビルドとして pegasus-2.9.0.tar.gz を使用しましたが、OpenPegasus のどのリリースでも同じ手順が使えるはずです。OpenPegasus のインストールは、適当なバイナリー・リリースから行うことも、あるいはソース・コードをコンパイルしてインストールすることもできます。ソース・コードには doc が含まれており、そこに前提条件やコンパイル方法が説明されています。

OpenPegasus をインストールしたら、基本的なスキーマ・リポジトリーにデータを追加します。

CIMOM にプロバイダーをインストールするためには、以下の 3 つのステップに従います。

  • プロバイダーの MOF を CIMOM リポジトリーにコンパイルします。
  • プロバイダーをCIMOM に登録します。
  • MOF とは関連していないソース・コードをコンパイルし、CIMOM の共有ライブラリーの中に入れます。

プロバイダーの MOF をコンパイルする

pegasus-2.9.0.tar.gz を任意のディレクトリーに解凍します (この作業を OpenPegasus のインストール・プロセスでまだ行っていない場合に、この作業を行います)。環境変数 PEGASUS_ROOT を作成します。PEGASUS_ROOT を、解凍された pegasus-2.9.0.tar.gz ファイルのベース・ディレクトリーに設定します。PEGASUS_ROOT をエクスポートします。

このベース・ディレクトリーの直下には、cgi、doc、Dummy、installs、InterfaceArchive、mak、rpm、Schemas、src、test などのディレクトリーと Configure、Makefile などに関連するファイルがあります。

環境変数 PEGASUS_HOME を、OpenPegasus が既にインストールされているベース・ディレクトリーに設定する必要があります。環境変数 PEGASUS_PLATFORMLINUX_IX86_GNU に設定します。PEGASUS_HOMEPEGASUS_PLATFORM をエクスポートします。

CIM サーバーを起動します (リスト 1)。

リスト 1. CIMOM を起動する
LinuxMint:/ # cimserver

上記は $PEGASUS_HOME/bin が既に PATH に含まれていることを前提にしています。

今度はプロバイダーの MOF を名前空間 SDKExamples/DefaultCXX にコンパイルします。ただしプロバイダーの MOF はベースとなる CIM スキーマの MOF から派生するため、最初にベースとなる CIM スキーマの MOF をコンパイルし、次にプロバイダーの MOF をコンパイルします。このコンパイル順序は厳密に守らなければなりません。

カレント・ディレクトリーを「/」に変更し (必ずしも必要な操作ではありません)、リスト 2 に示すようにコマンドを発行します (ベース・スキーマが $PEGASUS_ROOT/Schemas/CIM217 からコンパイルされるものとしています)。

リスト 2. ベース・スキーマを SDKExamples 名前空間にコンパイルする
LinuxMint:/ # cimmof -n SDKExamples/DefaultCXX \$PEGASUS_ROOT/Schemas/CIM217/DMTF/qualifiers.mof

LinuxMint:/ # cimmof -n SDKExamples/DefaultCXX \$PEGASUS_ROOT/Schemas/CIM217/DMTF/Core/CIM_ManagedElement.mof

LinuxMint:/ # cimmof -n SDKExamples/DefaultCXX \$PEGASUS_ROOT/Schemas/CIM217/CIM_Event.mof

プロバイダーの MOF をリスト 3 のようにコンパイルします。

リスト 3. プロバイダーの MOF を SDKExamples 名前空間にコンパイルする
LinuxMint:/ # cimmof -n SDKExamples/DefaultCXX \$PEGASUS_ROOT/src/SDK/samples/Providers/Load/SampleProviderSchema.mof

プロバイダーを登録する

以下のコマンドを発行し、プロバイダーを CIMOM に登録します。

リスト 4. プロバイダーを CIMOM に登録する
LinuxMint:/ # cimmof -n root/PG_InterOp \$PEGASUS_ROOT/src/SDK/samples/Providers/Load/IndicationProviderR.mof

共有ライブラリーをコンパイルする

C++ コンパイラーを使って共有ライブラリーを CIMOM にコンパイルします。この例では g++ と GNU の make を使って共有ライブラリーをコンパイルしています (リスト 5)。カレント・ディレクトリーを $PEGASUS_ROOT/src/SDK/samples/Providers/DefaultC++/IndicationProvider に変更し、make と入力したら Return キーを押します。

リスト 5. 共有ライブラリーをコンパイルする
LinuxMint:/pegasus/src/SDK/samples/Providers/DefaultC++/IndicationProvider # make
g++ -c -o /cimserver/pegasus/obj/sdk/IndicationProviderMain.o -O2 -W -Wall -Wno-
unused -D_GNU_SOURCE -DTHREAD_SAFE -D_REENTRANT -fPIC -m32 -I /pegasus/src -DPEG
ASUS_PLATFORM_LINUX_IX86_GNU IndicationProviderMain.cpp

g++ -c -o /cimserver/pegasus/obj/sdk/IndicationProvider.o  -O2 -W -Wall -Wno-unu
sed -D_GNU_SOURCE -DTHREAD_SAFE -D_REENTRANT -fPIC -m32 -I /pegasus/src -DPEGASU
S_PLATFORM_LINUX_IX86_GNU IndicationProvider.cpp

g++ -shared -Xlinker -rpath -Xlinker /cimserver/pegasus/lib -m32 -DPEGASUS_PLATF
ORM_LINUX_IX86_GNU -o/cimserver/pegasus/lib/sdk/libSDKIndicationProvider.so /cim
server/pegasus/obj/sdk/IndicationProviderMain.o /cimserver/pegasus/obj/sdk/Indic
ationProvider.o -ldl -lpthread -lcrypt -L/cimserver/pegasus/lib -lpegcommon -L/c
imserver/pegasus/lib -lpegprovider

make -i unlink

make[1]: Entering directory `/pegasus/src/SDK/samples/Providers/DefaultC++/Indic
ationProvider'

rm -f /cimserver/pegasus/lib/libSDKIndicationProvider.so

make[1]: Leaving directory `/pegasus/src/SDK/samples/Providers/DefaultC++/Indica
tionProvider'

ln -f -s /cimserver/pegasus/lib/sdk/libSDKIndicationProvider.so /cimserver/pegas
us/lib/libSDKIndicationProvider.so

すると、共有ライブラリー libSDKIndicationProvider.so が $PEGASUS_HOME/lib/sdk に追加され、共有ライブラリーへのリンクが $PEGASUS_HOME/lib に追加されます。

cimserver -s を実行して CIMOM をシャット・ダウンしてから、再び (リスト 1 と同じように) cimserver を実行して CIMOM を起動します。UltimateCIM Explorer (「参考文献」を参照) で表示した SDKExamples/DefaultCXX 名前空間のスナップショットは図 2 のようになります。

図 2. UltimateCIM のスナップショット
UltimateCIM のスナップショット
UltimateCIM のスナップショット

ステップ 2. インジケーション生成用の Java プログラムを作成する

RT_TestIndication のインスタンスを生成するためには、CIMOM の RT_TestIndicationSendTestIndication メソッドを呼び出します。このメソッドを呼び出すためには、SBLIM (「サブライム」と発音します) CIM クライアント・ライブラリーを使用します。(SBLIM は、Linux® での WBEM (Web-Based Enterprise Management) 実現のための多様なシステム管理ツールからなる包括的なプロジェクトです。)

SBLIM CIM クライアント・ライブラリー (「参考文献」のリンクを参照) をダウンロードして解凍し、lib/sblim-cim-client2-2.1.1.jar という JAR を取得して CLASSPATH に含めます。SendTestIndication を呼び出すためにはリスト 6 のようにします。

リスト 6. SendTestIndication を呼び出すためのクライアント・コード
// Creating a CIM client instance

WBEMClient cli = WBEMClientFactory.getClient("CIM-XML");

CIMObjectPath cop = new CIMObjectPath("http", "cimomIP", "cimomPort", 
                                      "SDKExamples/DefaultCXX", null, null);

Principal principal = new UserPrincipal("username");
PasswordCredential password = new PasswordCredential("userPassword");
Subject subject = new Subject(false,Collections.singleton(principal),
                              Collections.singleton(password),Collections.EMPTY_SET);

cli.initialize(cop, subject, null);

CIMArgument<?>[] input = new CIMArgument[10];
CIMArgument<?>[] output = new CIMArgument[10];

// Invoking SendTestIndication on RT_TestIndication

Object obj = cli.invokeMethod(new CIMObjectPath(
      "/SDKExamples/DefaultCXX:RT_TestIndication"), "SendTestIndication", input, output);

if (obj.toString().equals("0")) 
{
    System.out.println("Indication generated successfully...");
}

別の方法として、pegasus-2.9.0.tar.gz に含まれているクライアント・プログラムをコンパイルすることで RT_TestIndication を生成することもできます。このクライアント・コードをコンパイルするためには、g++ と GNU の make を使います (リスト 7)。

リスト 7. クライアントをコンパイルする
LinuxMint:/pegasus/src/SDK/samples/Clients/DefaultC++/SendTestIndications # make
g++ -O2 -W -Wall -Wno-unused -D_GNU_SOURCE -DTHREAD_SAFE -D_REENTRANT -fPIC -m32
 -c -o /cimserver/pegasus/obj/sdk/SendTestIndications.o -I /pegasus/src -DPEGASU
S_PLATFORM_LINUX_IX86_GNU SendTestIndications.cpp

g++ -Xlinker -rpath -Xlinker /cimserver/pegasus/lib -m32 -o/cimserver/pegasus/bi
n/sdk/SendTestIndications /cimserver/pegasus/obj/sdk/SendTestIndications.o -L/ci
mserver/pegasus/lib -lpegcommon -L/cimserver/pegasus/lib -lpegclient -ldl -lpthr
ead -lcrypt

実行可能ファイル SendTestIndications を $PEGASUS_HOME/bin/sdk ディレクトリーに追加しています。

ステップ 3. インジケーションをリッスンする Java プログラムを作成する

このセクションで説明するインジケーション・リスナーは、RT_TestIndication をリッスンすることができます。基本的に、RT_TestIndicationCIM_Indication から派生します。このリスナー・プログラムは RT_TestIndication に登録する必要があります。

リスナーの作成と登録には 3 つのステップがあります。リスナーが継続的にインジケーションをリッスンできるように、下記の 3 つのコード・リストを別のスレッドの一部として作成する必要があります。

  • CIM インジケーション・フィルターのインスタンスを作成する
  • CIM インジケーション・ハンドラーのインスタンスを作成する
  • CIM インジケーション・サブスクリプションのインスタンスを作成する

フィルター・インスタンスを作成する

CIM インジケーション・フィルターはインジケーションをフィルタリングし、適切なインジケーションをリスナーに提供します。CIM インジケーション・フィルターを作成するためには、CIM_IndicationFilter クラスのインスタンスを取得し、そのインスタンスに適切なプロパティーを設定します。安全のため、同じ名前のフィルターが既に存在していないかどうかを調べるようにします。同じ名前のフィルターが既に存在している場合には、そのフィルター・インスタンスを削除するか、あるいは現在作成しているフィルター・インスタンスを別の名前に変更します。リスト 8 はフィルター・インスタンスを作成する方法を示しています。

リスト 8. フィルター・インスタンスを作成する
// Setting property values to the filter instance
CIMProperty<?> name = new CIMProperty<String>("Name", CIMDataType.STRING_T,
                                   "TestFilter");

CIMProperty<?> namespace = new CIMProperty<String>("SourceNamespace",
                                        CIMDataType.STRING_T, "SDKExamples/DefaultCXX");
CIMProperty<?> query = new CIMProperty<String>("Query", CIMDataType.STRING_T, 
                                    "SELECT * FROM RT_TestIndication");
CIMProperty<?> language = new CIMProperty<String>("QueryLanguage",
                                       CIMDataType.STRING_T, "WQL");

CIMProperty<?>[] properties = new CIMProperty[] {name, namespace, query, language};
CIMObjectPath path = new CIMObjectPath("/SDKExamples/DefaultCXX:CIM_IndicationFilter");

// Creating an instance of CIM_IndicationFilter

CIMObjectPath copFilter = cli.createInstance(new CIMInstance(path, properties));

ハンドラー・インスタンスを作成する

CIMOM がハンドラーを呼び出す場合、CIMOM はハンドラーに対して、インジケーションのインスタンスと CIM_ListenerDestination のインスタンスを渡します。するとハンドラーは、このインジケーションのインスタンスを適切なエクスポート・フォーマットで Listener プログラムに渡すことができます。リスト 9 はハンドラー・インスタンスを作成する方法を示しています。

リスト 9. ハンドラー・インスタンスを作成する
WBEMListener listener = WBEMListenerFactory.getListener("CIM-XML");
int port = listener.addListener(new IndicationListener()
            {
              public void indicationOccured(String indicationURL, CIMInstance indication)
                                       	{ System.out.println(indication.toString()); }
            }, 0, "http");

String host = "http://"+InetAddress.getLocalHost().getHostAddress()+":"+port+"/create";

CIMProperty<?> name = new CIMProperty<String>("Name", CIMDataType.STRING_T,
                                   "TestListener");
CIMProperty<?> creationClassName = new CIMProperty<String>
            ("CreationClassName", CIMDataType.STRING_T, "CIM_ListenerDestinationCIMXML");
CIMProperty<?> destination = new CIMProperty<String>("Destination",
                                          CIMDataType.STRING_T, host);

CIMProperty<?>[] properties = new CIMProperty[] { name, creationClassName,
                                           destination };
CIMObjectPath path = new CIMObjectPath(
                                "/SDKExamples/DefaultCXX:CIM_ListenerDestinationCIMXML");

CIMObjectPath copHandler = cli.createInstance(new CIMInstance(path, properties));

サブスクリプション・インスタンスを作成する

この場合の (RT_TestIndication をサブスクライブする) リスナー・プログラムでは、どんな種類のインジケーションを対象にするのか、また CIMOM がどんなハンドラーにインジケーションを渡すのかを記述します。リスト 10 は RT_TestIndication をサブスクライブする方法を示しています。

リスト 10. サブスクリプション・インスタンスを作成する
CIMProperty<?> filter = new CIMProperty<CIMObjectPath>("Filter", 
                         new CIMDataType("CIM_IndicationFilter"), copFilter);

CIMProperty<?> handler = new CIMProperty<CIMObjectPath>("Handler", 
                          new CIMDataType("CIM_ListenerDestinationCIMXML"), copHandler);

CIMProperty<?>[] properties = new CIMProperty[] { filter, handler };
CIMObjectPath path = new CIMObjectPath("/root/PG_InterOp:CIM_IndicationSubscription");

CIMObjectPath copSubscription = cli.createInstance(new CIMInstance(path, properties));

ダミーの CIM インジケーションを使用してリスナーをテストする

いよいよ、ダミー・インジケーションを使ってテストを行う準備が整いました。cimserver がまだ実行されていない場合には、cimserver を起動します。cimserver が起動したら、インジケーション・リスナー・プログラムを実行します。そして、インジケーション生成プログラムを使ってインジケーションを生成し、インジケーション・リスナーのコンソールで出力を見てみます。この記事の実装による出力のスナップショットを示したものが図 3 です。

図 3. サンプル出力
サンプル出力
サンプル出力

これで完成です。これでハードウェア・レベルのダミー・インジケーションが無事に作成できました。そして、作成したダミー・インジケーションを使って CIM 管理アプリケーションのリスナー・コンポーネントをテストすることができました。


ダウンロード可能なリソース


関連トピック

  • Work the CIM event model efficiently」(developerWorks、2008年8月) は複数の CIM イベント・ハンドラーを特定の 1 つの接続ポートに登録する方法を説明しているため、実際の実装に役立ちます。(さらに、SBLIM CIM クライアント・ライブラリーを使ってコードを作成する方法も説明しています。)
  • Enabling Web Service with Common Information Model」(developerWorks、2009年5月) は CIM と相互運用性について説明した記事です。この記事では WS-Management の SOAP メッセージを使って CIM 操作を転送する方法を説明しています。
  • Distributed Management Task Force (分散管理タスク・フォース) による CIM のチュートリアルは、初級、上級どちらの管理アプリケーション開発者にも有用であり、また実装開発者にも有用です。このチュートリアルには CIM の仕様や関連情報も説明されています。
  • Open Group による OpenPegasus オープンソース・プロジェクトは DMTF の CIM 標準と WBEM 標準のオープンソース実装であり、C++ でコーディングされています。また移植が容易なように、非常にモジュール化された設計になっています。このサイトのドキュメントの一部には OpenPegasus の CIMOM の内部構造が説明されています。
  • WBEM/CIM のクラスと MOF の階層構造を見てください。
  • SBLIM は、Linux での WBEM 実現のための多様なシステム管理ツール・プロジェクトの下にある、サブ・プロジェクトです。これらのツールを使うことで、オープン・スタンダード・ベースの技術を使って Linux システムを管理することができます。
  • developerWorks の Linux ゾーンには、他にも Linux 開発者のためのリソースが豊富に用意されています。また最も人気の高かった記事とチュートリアルの一覧もご覧ください。
  • developerWorks に掲載されているすべての「Linux のヒント」シリーズの記事と Linux チュートリアルを参照してください。
  • OpenPegasus のソース・コードを入手してください。
  • UltimateCIM Explorer は Eclipse のプラグインです。UltimateCIM Explorer を利用すると、CIMOM や関連付けを調べることができ、WQL を実行することができ、またクラスの階層構造をグラフィカルに表示することができます。
  • IBM alphaWorks は、DMTF スキーマを WMI (Windows Management Instrumentation) スキーマに変換する簡単なツール、CIM Schema Converter をホストしています。
  • SBLIM CIM クライアント・ライブラリーをダウンロードしてください。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=468828
ArticleTitle=Linux でのテスト用にダミーの CIM インジケーションを生成する
publish-date=01262010