跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

生成能够在 Linux 上进行测试的模拟 CIM 信号

如何创建使用 OpenPegasus 测试信号监听器的 CIM 信号

Srikanth Guttula, 系统软件工程师, EMC
Srikanth Guttula 的照片
Srikanth Guttula 是位于印度浦那市的 IBM Systems and Technology Group Labs 的系统软件工程师。他从 2007 年 2 月开始加入 IBM。他目前致力于 IBM Systems Director,他在此之前参与开发 BladeCenter 服务器的 Storage Configuration Manager。他拥有计算机科学学士学位。

简介: 使用 Common Information Model 进行硬件管理通常意味着用于管理的应用程序必须能够监听和处理硬件发出的指示信号。在开发期间指定的系统硬件不可用时,您必须使用模拟的指示信号来测试管理应用程序的信号监听器。本文解释如何使用随 OpenPegasus 源代码附带的供应程序在 OpenPegasus CIMOM (Common Information Model Object Manager) 上生成模拟指示信号。

分享您的技巧: 您有生成模拟指示信号的更好方法吗?请在下面 添加您的评论

发布日期: 2010 年 2 月 22 日
级别: 中级 其他语言版本: 英文
访问情况 : 6694 次浏览
评论: 


如果您将在硬件管理中用到 Common Information Model 标准,那么您使用(或开发)的管理应用程序通常需要具有监听和处理硬件指示信号的能力。在理想的条件下,您可以获得能够正常运行的硬件,不过我们常常不具备这种理想的条件。

那么,如果您没有能够正常运行的硬件,应该怎么做呢?您可以创建模拟的硬件指示信号来测试管理应用程序的监听器组件。我将演示如何使用随 OpenPegasus 源代码附带的供应程序在 OpenPegasus CIMOM (Common Information Model Object Manager) 上生成模拟指示信号。

CIM(Common Information Model)概述

CIM(Common Information Model)是一个用于在网络或企业环境中描述管理信息的模型。CIM 由一个规范 和一个模式 构成。规范定义如何与其他管理模型集成;模式提供实际的模型描述。

Managed Object Format (MOF) 通常用于表示 CIM 模式,因为 MOF 可以直接编译到 CIMOM 存储库。CIMOM 是一个中介(服务器),它在自己的储存库中使用已编译的信息模型来在客户机和供应程序之间引导请求和响应。CIMOM 位于客户机和供应程序之间。

供应程序位于 CIMOM 的后端;它实际上负责与受控的资源通信来获取数据,比如磁盘驱动器和 CPU。供应程序将获取到的数据发送到 CIMOM,然后由 CIMOM 转发到客户机。当 CIMOM 收到来自客户机的请求之后,如果它的储存库中不存在所请求的数据,CIMOM 将把该请求转发给适合的供应程序。

客户机通常是将请求发送给 CIMOM 并接收响应的管理应用程序。大部分情况下,指示信号监听器是该客户机的一部分,并且监听器仅能接收信息 —— 它不能发送任何请求。图 1 展示了该模型的概图。


图 1. CIMOM 模型概览
CIMOM 模型概览

生成指示信号的步骤

生成指示信号涉及到三个主要步骤:

  1. 编译并安装随 OpenPegasus 源代码附带的供应程序 RT_Indication
  2. 开发一个简单的 Java™ 程序,用于在向 CIMOM 发送请求时生成指示信号。
  3. 开发一个简单的 Java 程序,用于监听生成的指示信号。

步骤 1. 编译并安装 RT_Indication 供应程序

首先,从 OpenPegasus.org 下载并安装 OpenPegasus(参考资料 部分提供相关的链接)。在本文中,我使用 OpenPegasus 源代码版本 pegasus-2.9.0.tar.gz;这些步骤也适用于任何其他版本的 OpenPegasus。您可以从适当的二进制发行版安装 OpenPegasus,也可以从源代码编译和安装 OpenPegasus。该源代码包含一个介绍先决条件和编译说明的文档。

安装了 OpenPegasus 之后,需要填充基础的模式储存库。

在 CIMOM 上安装供应程序需要三个步骤:

  • 将供应程序 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 and files Configure 和 Makefile 等等。

环境变量 PEGASUS_HOME 应该设置为安装 OpenPegasus 的根目录。将环境变量 PEGASUS_PLATFORM 设置为 LINUX_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
			

按照清单 3 的方式编译供应程序 MOF:


清单 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 并返回。


清单 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,然后使用 cimserver 再次启动它(如 清单 1 所示)。图 2 显示了 SDKExamples/DefaultCXX 名称空间的屏幕截图,来自 UltimateCIM Explorer(参见 参考资料)。


图 2. 来自 UltimateCIM 的屏幕截图
来自 UltimateCIM 的屏幕截图

步骤 2. 开发用于生成指示信号的 Java 程序

可以通过调用 CIMOM 上的 RT_TestIndicationSendTestIndication 方法生成 RT_TestIndication 实例。可以使用 SBLIM(发音为 “sublime”)CIM 客户机库来调用该方法。(SBLIM 是一个综合项目,它包含许多支持在 Linux ® 上使用 Web-Based Enterprise Management (WBEM) 的系统管理工具)。

下载 SBLIM CIM 客户机库(参考资料 部分提供相关的链接),解压缩它,然后获取 JAR lib/sblim-cim-client2-2.1.1.jar 并添加到 CLASSPATH。可以以清单 6 所示的方式调用 SendTestIndication


清单 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_TestIndicationRT_TestIndication 基本上源自 CIM_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 调用事件处理程序时,将把指示信号的一个实例和 CIM_ListenerDestination 的一个实例传递给它。然后,事件处理程序可以使用适当的导出格式将该指示信号实例传递给监听程序。清单 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(如果它还没有运行的话)。启动指示信号监听程序。现在,使用指示信号生成程序生成一个信号。从指示信号监听器控制台查看输出。图 3 显示了来自我们的实现的输出的屏幕截图。


图 3. 样例输出
样例输出

就这么简单!您已经成功创建了模拟的硬件指示器,并使用它们来测试 CIM 管理应用程序的监听器组件。


参考资料

学习

  • 高效构建 CIM 事件模型”(developerWorks,2008 年 8 月)对实时实现非常有用,因为它演示了如何通过一个特定的连接端口注册多个 CIM 事件处理程序(并展示如何使用 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 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程

  • 在 developerWorks 上查阅所有 Linux 技巧 Linux 教程

  • 随时关注 developerWorks 技术活动网络广播

获得产品和技术

讨论

  • 加入 My developerWorks 社区。查看开发人员参与的博客、论坛、组和 wiki,并与其他 developerWorks 用户交流。

关于作者

Srikanth Guttula 的照片

Srikanth Guttula 是位于印度浦那市的 IBM Systems and Technology Group Labs 的系统软件工程师。他从 2007 年 2 月开始加入 IBM。他目前致力于 IBM Systems Director,他在此之前参与开发 BladeCenter 服务器的 Storage Configuration Manager。他拥有计算机科学学士学位。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux, Open source
ArticleID=469018
ArticleTitle=生成能够在 Linux 上进行测试的模拟 CIM 信号
publish-date=02222010
author1-email=sguttula@in.ibm.com
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。