用Java获取vSphere相关数据

1.到官网下载SDK,VMware-vSphere-SDK-6.0.0-2561048.zip解压下来会有5个目录,VMware-vSphere-SDK里面有几种类型的包,它们的功能在解压下来的vSphereManagementSDKReadme.html有说明,通常每个包里面都有依赖包,例子。
2.这边根据需求选取vsphere-ws包,导入vsphere-ws\java\JAXWS\lib下面的包到工程

不了解它的内部结构使用它的SDK还真没那么简单,先看它几个基本概念:

vSphere API
Managed Object(MO)   服务(services)和组件(components),服务包括 PropertyCollector, SearchIndex、PerformanceManager 和 ViewManager 等,组件包括 VirtualMachine、Datastore 和 Folder 等,他们都直接或间接继承自 ManagedEntity 抽象类,可以通过api看ManagedEntity 的子孙类,
Managed Object Reference(MOR) 客户端对象,可以理解为客户端通过mor对象调用服务端mo的方法,
Data Objects 封装了MO的数据,客户端发送数据到服务端。

vSphere Inventory 介绍
vSphere inventory 其实就是 一堆对象组成的结构。在 vSphere inventory 中包含了以下三种类型的对象:
    在 datacenter 中被管理的系统,比如 Host、VirtualMachine、VirtualApp 等。
    具有一定功能的组件,比如 ComputeResource、DataStore,、Network 等。
    负责组织归类的组件,它们负责把 datacenter 中的对象按照层级关系组织起来形成了一个树状结构,比如 Folder 和 DataCenter。
下面图出自 vSphere Web Servicess SDK Programming Guide,给出了 inventory 的结构。

用Java获取vSphere相关数据_第1张图片

使用 SDK 开发自己的 vSphere 客户端程序,首要的问题就是如何访问和遍历在 vSphere Inventory 中的对象。下面我们将介绍这方面的内容。

ServiceInstance 对象在 inventory 的结构树中处于根位置,因此遍历整个 inventory 或者要查找 inventory 中的某个对象,必须先从 ServiceInstance 开始。ServiceInstance 类中最重要的一个属性(property,可以理解为类的成员变量)是 content,它指向数据类型(Data Object)ServiceContent 的一个实例。
ServiceContent 类含有很多该 vSphere 服务实例的重要属性和服务的引用,比如整个 inventory 的 root folder,session manager,property collector(用于查找和遍历对象),以及 EventManager, TaskManager 等。下面的类图展示了 ServiceInstance 和 ServiceContent 的部分属性。

 

使用 PropertyCollector 查询对象
vSphere API 中,PropertyCollector 类是用来遍历、查询和监控 MO 的状态的。使用 PropertyCollector 时,要指定一或多个 filter 来限定查找的范围,而每个 filter 都含有一组对象来描述(XXXSpec):
    查询或遍历的起点,即从上文描述的 inventory 树的哪个节点开始遍历。
    查询的路径。
    要查询哪些对象及它们的哪些属性。
PropertyCollector 中的 filter 只对当前 session 有效,因此 PropertyCollector 不能在 session 中共享。vSphere server 会给当前 session 创建一个默认的 PropertyCollector 实例。当然也可以自己在多线程中创建多个 PropertyCollector 实例,以便进行互相独立的查询操作。
PropertyCollector 有两种方法来获取数据:
    调用 RetrievePropertiesEx/ContinueRetrievePropertiesEx 一次性的获取数据。
    如果想持续获得 inventory 中数据对象的状态变化,可以使用 WaitForUpdatesEx 方法。第一次调用这个方法会得到目标对象的初始数据,后续调用会得到相对上一次调用时的增量变化值。

 

使用API获取数据
第一步要做的就是到api文档根据inventory路径找到对应的对象,然后用该对象获取数据。
例如:找到最上层HostSystem,然后依次往下找自己想要的,根据每个层次下面的属性来获取数据

用Java获取vSphere相关数据_第2张图片

代码例子

官方例子:https://developercenter.vmware.com/samples?id=772&h=Java 这是获取集群的cpu核数,其例子VMwareConnection中封装了登录和获取MOR对象,所以我们只需要把它copy过来使用即可,

查询所有主机的名称及其cpu和内存,根据api文档定位到对应的属性,代码如下:

public static void findAllHosts() {
	try {
		//查询所有物理机
		List<ObjectContent> contents = conn.findAllObjects("HostSystem", "name",
				"summary.hardware.memorySize","summary.hardware.numCpuCores");
		for (com.vmware.vim25.ObjectContent content : contents) {
			//下面获取属性
            List<DynamicProperty> propSet = content.getPropSet();
            for (DynamicProperty dynamicProperty : propSet) {
                String propertyName = dynamicProperty.getName();
                Object val = dynamicProperty.getVal();
                if("name".equals(propertyName)) {
                	System.out.print(val + " ");
                } else if("summary.hardware.memorySize".equals(propertyName)) {
                	System.out.print(val + " ");
                } else if("summary.hardware.numCpuCores".equals(propertyName)) {
                	System.out.print(val + " ");
                }
            }
            System.out.println();
        }
	} catch (Exception e) {
		logger.error("", e);
	}
}

 

你可能感兴趣的:(vmware,vsphere)