使用VMware VSphere WebService SDK进行开发 (七)——获取数据中心、集群、主机、虚拟机的目录结构

在实际应用中,需要显示出数据中心(Datacenter)、集群(ClusterComputeResource)、主机(HostSystem)、虚拟机(VirtualMachine)之间的目录关系。这里忽略VAPP以及APP。

正所谓无图无真相,先展示一张vSphere Client上的截图,以便形象的描述本文所要呈现的内容。

左边的目录树形象的展示了数据中心(Datacenter)、集群(ClusterComputeResource)、主机(HostSystem)、虚拟机(VirtualMachine)之间的目录关系。但是如何通过vSphere Webservice SDK进行获取相应的信息呢?

首先罗列本文所要展示的几个方法:

1. 根据主机名获取虚拟机的名称列表
public static List<String> getVmNameListByHostName(String hostName) throws Exception
2. 根据集群名获取主机的名称列表
public static List<String> getHostNameListByClusterName(String clusterName) throws Exception
3. 根据集群名获取虚拟机的名称列表
public static List<String> getVmNameListByClusterName(String clusterName) throws Exception
4. 根据数据中心名获取主机名称列表
public static List<String> getHostNameListByDCName(String dcName) throws Exception
5. 根据数据中心名获取虚拟机名称列表
public static List<String> getVmNameListByDCName(String dcName) throws Exception
6. 根据数据中心名称获取集群(ClusterComputeResource)列表
public static List<String> getClusterNameListByDCName(String dcName) throws Exception

首先根据主机名获取虚拟机的名称列表,这个比较简单,因为HostSystem有一个属性就是vm,关系一目了然。

根据主机名称遍历,获取匹配主机名称的记录,根据vm的属性名获取虚拟机的ArrayOfManagedObjectReference对象,然后通过:

List<ManagedObjectReference> vmTempList = ((ArrayOfManagedObjectReference)dp.getVal()).getManagedObjectReference();

获取每一个虚拟机的对象,最后根据虚拟机对象获得相应的名称。

同样,根据集群名获取主机名也是相同的。

下面展示出关键代码(所涉及的调用的方法如果未展示出来,可参考前面6篇同系列的博文,在其中会找到,如果真是本人疏忽遗漏,可在下方评论,我会尽快补上):

	private static List<String> getNameListByName(String paraName, String paraObject, String paraProperty) throws Exception
	{
		List<String> list = new ArrayList<String>();

		RetrieveResult props = getRetrieveResultObjectWithProperty(paraObject, paraProperty);
		List<ManagedObjectReference> vmList = null;

		if (props != null)
		{
			Boolean flag = false;
			if (paraProperty.compareToIgnoreCase("name") < 0)
			{
				for (ObjectContent oc : props.getObjects())
				{
					if (flag == true)
					{
						break;
					}
					List<ManagedObjectReference> vmTempList = null;
					String path = null;
					List<DynamicProperty> dps = oc.getPropSet();

					if (dps != null)
					{
						for (DynamicProperty dp : dps)
						{
							path = dp.getName();

							if (path.equalsIgnoreCase(paraProperty))
							{
								vmTempList = ((ArrayOfManagedObjectReference)dp.getVal()).getManagedObjectReference();
							}
							if (path.equalsIgnoreCase("name"))
							{
								String value = (String) dp.getVal();
								if (value.equals(paraName))
								{
									flag = true;
									vmList = vmTempList;
									break;
								}
							}
						}
					}
				}
			}
			else
			{
				for (ObjectContent oc : props.getObjects())
				{
					if (flag == true)
					{
						break;
					}
					String path = null;
					List<DynamicProperty> dps = oc.getPropSet();

					if (dps != null)
					{
						for (DynamicProperty dp : dps)
						{
							path = dp.getName();
							if (path.equalsIgnoreCase("name"))
							{
								String value = (String) dp.getVal();
								if (value.equals(paraName))
								{
									flag = true;
								}
							}
							if (path.equalsIgnoreCase(paraProperty))
							{
								List<ManagedObjectReference> vmTempList = ((ArrayOfManagedObjectReference)dp.getVal()).getManagedObjectReference();
								if (flag == true)
								{
									vmList = vmTempList;
									break;
								}
							}
						}
					}
				}
			}
		}

		if(vmList != null)
		{
			for(ManagedObjectReference mor:vmList)
			{
				String objectName = getObjectName(mor);
				if(objectName != null)
				{
					list.add(objectName);
				}
			}
		}

		return list;
	}

	public static List<String> getVmNameListByHostName(String hostName) throws Exception
	{
		return getNameListByName(hostName,"HostSystem","vm");
	}

	public static List<String> getHostNameListByClusterName(String clusterName) throws Exception
	{
		return getNameListByName(clusterName,"ComputeResource","host");
	}

在集群(ComputeResource)中没有像在HostSystem中有类似vm的虚拟机属性,但是我们可以根据集群获得主机,主机获得虚拟机的方式,获得一个虚拟机的列表,代码如下:

	public static List<String> getVmNameListByClusterName(String clusterName) throws Exception
	{
		List<String> ansList = new ArrayList<String>();

		List<String> hostList = getNameListByName(clusterName,"ComputeResource","host");
		if(hostList != null)
		{
			for(String hostName : hostList)
			{
				List<String> vmList = null;
				if(hostName != null)
				{
					vmList = getVmNameListByHostName(hostName);
				}
				if(vmList != null)
				{
					for(String vmName : vmList)
					{
						if(vmName != null)
						{
							ansList.add(vmName);
						}
					}
				}
			}
		}

		return ansList;
	}

接下去,通过数据中心(Datacenter)获取集群、主机、虚拟机的列表就比较绕了。首先看一下Datacenter的api:

我们可以发现其中有hostFolder,vmFolder的属性,hostFolder对应的是集群和主机,而vmFolder对应的是虚拟机,所以这里我们可以先通过数据中心的名称获取其对应的hostFolder以及vmFolder的对象,然后通过遍历这些对象多去相应的关键属性。对于如何遍历对象,相信看过我前面几篇博文的朋友应该了解了,关键理解这幅图:

好了,直接上代码,希望各位朋友能够很快理解。

	private static TraversalSpec getHostFolderTraversalSpec()
	{
		SelectionSpec ss = new SelectionSpec();
		ss.setName("VisitFolders");

		TraversalSpec computeResourceToHostSystem = new TraversalSpec();
		computeResourceToHostSystem.setName("computeResourceToHostSystem");
		computeResourceToHostSystem.setType("ComputeResource");
		computeResourceToHostSystem.setPath("host");
		computeResourceToHostSystem.setSkip(false);
		computeResourceToHostSystem.getSelectSet().add(ss);

		TraversalSpec hostFolderToComputeResource = new TraversalSpec();
		hostFolderToComputeResource.setName("hostFolderToComputeResource");
		hostFolderToComputeResource.setType("Folder");
		hostFolderToComputeResource.setPath("childEntity");
		hostFolderToComputeResource.setSkip(false);
		hostFolderToComputeResource.getSelectSet().add(ss);

		TraversalSpec traversalSpec = new TraversalSpec();
		traversalSpec.setName("VisitFolders");
		traversalSpec.setType("Folder");
		traversalSpec.setPath("childEntity");
		traversalSpec.setSkip(false);

		List<SelectionSpec> sSpecArr = new ArrayList<SelectionSpec>();
		sSpecArr.add(ss);
		sSpecArr.add(hostFolderToComputeResource);
		sSpecArr.add(computeResourceToHostSystem);
		traversalSpec.getSelectSet().addAll(sSpecArr);

		return traversalSpec;
	}

	private static TraversalSpec getHostFolderOfComputeResourceTraversalSpec()
	{
		SelectionSpec ss = new SelectionSpec();
		ss.setName("VisitFolders");

		TraversalSpec hostFolderToComputeResource = new TraversalSpec();
		hostFolderToComputeResource.setName("hostFolderToComputeResource");
		hostFolderToComputeResource.setType("Folder");
		hostFolderToComputeResource.setPath("childEntity");
		hostFolderToComputeResource.setSkip(false);
		hostFolderToComputeResource.getSelectSet().add(ss);

		TraversalSpec traversalSpec = new TraversalSpec();
		traversalSpec.setName("VisitFolders");
		traversalSpec.setType("Folder");
		traversalSpec.setPath("childEntity");
		traversalSpec.setSkip(false);

		List<SelectionSpec> sSpecArr = new ArrayList<SelectionSpec>();
		sSpecArr.add(ss);
		sSpecArr.add(hostFolderToComputeResource);
		traversalSpec.getSelectSet().addAll(sSpecArr);

		return traversalSpec;
	}

	private static TraversalSpec getVmFolderTraversalSpec()
	{
		TraversalSpec vAppToVM = new TraversalSpec();
		vAppToVM.setName("vAppToVM");
		vAppToVM.setType("VirtualApp");
		vAppToVM.setPath("vm");

		TraversalSpec vAppToVApp = new TraversalSpec();
		vAppToVApp.setName("vAppToVApp");
		vAppToVApp.setType("VirtualApp");
		vAppToVApp.setPath("resourcePool");

		SelectionSpec vAppRecursion = new SelectionSpec();
		vAppRecursion.setName("vAppToVApp");
		SelectionSpec vmInVApp = new SelectionSpec();
		vmInVApp.setName("vAppToVM");
		List<SelectionSpec> vAppToVMSS = new ArrayList<SelectionSpec>();
		vAppToVMSS.add(vAppRecursion);
		vAppToVMSS.add(vmInVApp);
		vAppToVApp.getSelectSet().addAll(vAppToVMSS);

		SelectionSpec sSpec = new SelectionSpec();
		sSpec.setName("VisitFolders");

		TraversalSpec traversalSpec = new TraversalSpec();
		traversalSpec.setName("VisitFolders");
		traversalSpec.setType("Folder");
		traversalSpec.setPath("childEntity");
		traversalSpec.setSkip(false);
		List<SelectionSpec> sSpecArr = new ArrayList<SelectionSpec>();
		sSpecArr.add(sSpec);
		sSpecArr.add(vAppToVM);
		sSpecArr.add(vAppToVApp);
		traversalSpec.getSelectSet().addAll(sSpecArr);
		return traversalSpec;
	}

	private static ManagedObjectReference getHostFolderObjectByDcName(String dcName) throws Exception
	{
		ManagedObjectReference hostFolder  = null;
		RetrieveResult props = getRetrieveResultObjectWithProperty("Datacenter", "hostFolder");
		if(props != null)
		{
			Boolean flag = false;
			for (ObjectContent oc : props.getObjects())
			{
				if (flag == true)
				{
					break;
				}
				String path = null;
				List<DynamicProperty> dps = oc.getPropSet();
				ManagedObjectReference mor = null;
				if (dps != null)
				{
					for (DynamicProperty dp : dps)
					{
						path = dp.getName();
						if (path.equalsIgnoreCase("hostFolder"))
						{
							mor = (ManagedObjectReference)dp.getVal();
						}
						if (path.equalsIgnoreCase("name"))
						{
							String value = (String) dp.getVal();
							if (value.equals(dcName))
							{
								flag = true;
								hostFolder = mor;
								break;
							}
						}
					}
				}
			}
		}
		return hostFolder;
	}

	private static ManagedObjectReference getVmFolderObjectByDcName(String dcName) throws Exception
	{
		ManagedObjectReference vmFolder = null;
		RetrieveResult props = getRetrieveResultObjectWithProperty("Datacenter", "vmFolder");
		if(props != null)
		{
			Boolean flag = false;
			for (ObjectContent oc : props.getObjects())
			{
				if (flag == true)
				{
					break;
				}
				String path = null;
				List<DynamicProperty> dps = oc.getPropSet();
				ManagedObjectReference mor = null;
				if (dps != null)
				{
					for (DynamicProperty dp : dps)
					{
						path = dp.getName();
						if (path.equalsIgnoreCase("name"))
						{
							String value = (String) dp.getVal();
							if (value.equals(dcName))
							{
								flag = true;
							}
						}
						if (path.equalsIgnoreCase("vmFolder"))
						{
							mor = (ManagedObjectReference)dp.getVal();
							if(flag == true)
							{
								vmFolder = mor;
								break;
							}
						}
					}
				}
			}
		}
		return vmFolder;
	}

	private static List<String> getHostNamesByHostFolder(ManagedObjectReference hostFolder) throws Exception
	{
		List<String> list = new ArrayList<String>();

		TraversalSpec tSpec = getHostFolderTraversalSpec();
		PropertySpec propertySpec = new PropertySpec();
		propertySpec.setAll(Boolean.FALSE);
		propertySpec.getPathSet().add("name");
		propertySpec.setType("HostSystem");

		ObjectSpec objectSpec = new ObjectSpec();
		objectSpec.setObj(hostFolder);
		objectSpec.setSkip(Boolean.TRUE);
		objectSpec.getSelectSet().add(tSpec);

		PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
		propertyFilterSpec.getPropSet().add(propertySpec);
		propertyFilterSpec.getObjectSet().add(objectSpec);

		List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(1);
		listpfs.add(propertyFilterSpec);
		List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs);

		if (listobjcont != null)
		{
			for (ObjectContent oc : listobjcont)
			{
				String hostnm = null;
				List<DynamicProperty> listDynamicProps = oc.getPropSet();
				DynamicProperty[] dps = listDynamicProps.toArray(new DynamicProperty[listDynamicProps.size()]);
				if (dps != null)
				{
					for (DynamicProperty dp : dps)
					{
						hostnm = (String) dp.getVal();
						if (hostnm != null)
						{
							list.add(hostnm);
						}
					}
				}
			}
		}

		return list;
	}

	private static List<String> getClusterNamesByHostFolder(ManagedObjectReference hostFolder) throws Exception
	{
		List<String> list = new ArrayList<String>();

		TraversalSpec tSpec = getHostFolderOfComputeResourceTraversalSpec();
		PropertySpec propertySpec = new PropertySpec();
		propertySpec.setAll(Boolean.FALSE);
		propertySpec.getPathSet().add("name");
		propertySpec.setType("ClusterComputeResource");

		ObjectSpec objectSpec = new ObjectSpec();
		objectSpec.setObj(hostFolder);
		objectSpec.setSkip(Boolean.TRUE);
		objectSpec.getSelectSet().add(tSpec);

		PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
		propertyFilterSpec.getPropSet().add(propertySpec);
		propertyFilterSpec.getObjectSet().add(objectSpec);

		List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(1);
		listpfs.add(propertyFilterSpec);
		List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs);

		if (listobjcont != null)
		{
			for (ObjectContent oc : listobjcont)
			{
				String hostnm = null;
				List<DynamicProperty> listDynamicProps = oc.getPropSet();
				DynamicProperty[] dps = listDynamicProps.toArray(new DynamicProperty[listDynamicProps.size()]);
				if (dps != null)
				{
					for (DynamicProperty dp : dps)
					{
						hostnm = (String) dp.getVal();
						if (hostnm != null)
						{
							list.add(hostnm);
						}
					}
				}
			}
		}

		return list;
	}

	private static List<String> getVmNamesByVmFolder(ManagedObjectReference vmFolder) throws Exception
	{
		List<String> list = new ArrayList<String>();

		TraversalSpec tSpec = getVmFolderTraversalSpec();
		PropertySpec propertySpec = new PropertySpec();
		propertySpec.setAll(Boolean.FALSE);
		propertySpec.getPathSet().add("name");
		propertySpec.setType("VirtualMachine");

		ObjectSpec objectSpec = new ObjectSpec();
		objectSpec.setObj(vmFolder);
		objectSpec.setSkip(Boolean.TRUE);
		objectSpec.getSelectSet().add(tSpec);

		PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
		propertyFilterSpec.getPropSet().add(propertySpec);
		propertyFilterSpec.getObjectSet().add(objectSpec);

		List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>(1);
		listpfs.add(propertyFilterSpec);
		List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs);

		if (listobjcont != null)
		{
			for (ObjectContent oc : listobjcont)
			{
				String vmName = null;
				List<DynamicProperty> listDynamicProps = oc.getPropSet();
				DynamicProperty[] dps = listDynamicProps.toArray(new DynamicProperty[listDynamicProps.size()]);
				if (dps != null)
				{
					for (DynamicProperty dp : dps)
					{
						vmName = (String) dp.getVal();
						if (vmName != null)
						{
							list.add(vmName);
						}
					}
				}
			}
		}

		return list;
	}

	public static List<String> getHostNameListByDCName(String dcName) throws Exception
	{
		ManagedObjectReference hostFolder = getHostFolderObjectByDcName(dcName);
		List<String> list = null;
		if(hostFolder != null)
		{
			list = getHostNamesByHostFolder(hostFolder);
		}
		return list;
	}

	public static List<String> getVmNameListByDCName(String dcName) throws Exception
	{
		List<String> list = null;
		ManagedObjectReference vmFolder = getVmFolderObjectByDcName(dcName);
		if(vmFolder != null)
		{
			list = getVmNamesByVmFolder(vmFolder);
		}

		return list;
	}

	public static List<String> getClusterNameListByDCName(String dcName) throws Exception
	{
		ManagedObjectReference hostFolder = getHostFolderObjectByDcName(dcName);
		List<String> list = null;
		if(hostFolder != null)
		{
			list = getClusterNamesByHostFolder(hostFolder);
		}
		return list;
	}

最后三个以public static修饰的方法就是通过数据中心的名称获取集群、主机、虚拟机的名称列表的方法。

如有疑问,欢迎提出。本文展示的代码都经过真实环境运行并投入使用中。

时间: 2024-09-22 07:08:34

使用VMware VSphere WebService SDK进行开发 (七)——获取数据中心、集群、主机、虚拟机的目录结构的相关文章

使用VMware VSphere WebService SDK进行开发 (一)——基本信息阐述

网上对于VSphere WebService SDK的介绍比较少(至少我能查到的资料比较少),官方提供的也是英文版的api,而且没有注明使用方法.最近接触到关于VSphere WebService SDK的开发,刚开始也是烦躁,比如要获取一个cpu使用情况的信息,按照惯例,API应该提供类似:long getCpuUsage() 之类的接口,但是绝逼没有那么easy,不过很快掌握了规律.我觉得有必要分享一下我所了解到的知识点,希望能够给各位读者有那么一点抛砖引玉的作用. 我准备通过几篇文章来主要

使用VMware VSphere WebService SDK进行开发 (二)——获取虚拟机cpu的使用情况

本文通过代码举例虚拟机cpu的使用情况来演示如何遍历搜寻VirtualMachine的对象,以及根据这个对象进行性能指标的见识.希望可以取到举一反三的效果. 首先下面先罗列出如何更具虚拟机的名称获得VirtualMachine的ManagedObjectReference对象. private static TraversalSpec getVmTraversalSpec() { TraversalSpec vAppToVM = new TraversalSpec(); vAppToVM.set

使用VMware VSphere WebService SDK进行开发 (六)——检测告警信息

获取告警信息相对而言比较简单点,这里先陈述告警信息的pojo类,作为存储告警信息的源头(省略getter和setter方法): public class AlarmItem { //对象 private String ObjectName; //状态 private ManagedEntityStatus overallStatus; //名称 private String alarmName; //触发时间 private Date time; //确认时间 private Date ackn

使用VMware VSphere WebService SDK进行开发 (三)——获取主机(HostSystem)的基本信息

通过前面两篇文章的了解,详细应该很快掌握的code路数,这里首先罗列如何获取主机(接下去也会成为HostSystem)的对象. private static TraversalSpec getHostSystemTraversalSpec() { SelectionSpec ss = new SelectionSpec(); ss.setName("VisitFolders"); TraversalSpec computeResourceToHostSystem = new Trave

使用VMware VSphere WebService SDK进行开发 (五)——根据虚拟机的名称获取对应主机的IP地址

在整个获取监视信息的过程中,最难获取的就是根据虚拟机的名称获得对应主机的IP地址的功能.(个人觉得比较绕,绕了好久我才找到) 首先根据虚拟机的名称获得对应主机(HostSystem)的ManagedObjectReference对象. RetrieveResult props = getRetrieveResultObjectWithProperty("VirtualMachine", "summary.runtime.host"); ManagedObjectRe

《构建高可用VMware vSphere 5.X虚拟化架构》——1.2 ESX 4.1主机升级

1.2 ESX 4.1主机升级 不少企业目前还使用VMware vSphere 4.0或者4.1虚拟化架构,虽然VMwware官方也发布了针对4.X版本的补丁程序修复BUG,但新版本的一些特性是老版本无法使用的.因此,升级是必要的. 1.2.1 升级ESX 4.1主机原因 ESXi 5.0/5.1版本解决了4.1版本存在的BUG,运行的稳定性更好,对硬件的支持更好,以及提供了新的特性,ESXi 5.0/5.1几个重要的变化. (1)ESXi 5.0/5.1 VMFS由原来的VMFS3升级为VMF

Facebook将开发生物降解的数据中心

据国外http://www.aliyun.com/zixun/aggregation/894.html">媒体报道,根据派克的一份研究报告显示,科技公司将花费高达45亿元,在2016年使数据中心更加绿色.但是Facebook希望可以通过开发生物降解的数据中心,使得"绿色"的这个概念更进一步. Facebook赞助了普渡大学学院的一个开放计算基础竞赛的技术来开发一个可持续的服务器底盘.据普度介绍,服务器底盘大约每年就进行一次更换,这导致了严重的了浪费 "开放计算

脸书在新墨西哥州建第七个数据中心

美国新墨西哥州11日为脸书公司设在该州洛斯卢纳斯市的高科技数据中心举行奠基仪式.这是脸书的第七个数据中心,将完全通过太阳能和风能提供电力. 新墨西哥州州长办公室当天表示,这个数据中心首期投资2.5亿美元,计划于2018年前建成并投入运营. 新墨西哥州州长苏珊娜.马丁内斯在奠基仪式上说,脸书行动迅速,几周前才宣布要设立这家数据中心,现在就已经开始动工兴建了.这家数据中心将给洛斯卢纳斯市及整个新墨西哥州带来重要影响. 今年9月,脸书宣布放弃犹他州,而选择在新墨西哥州兴建这个被视为世界上最先进.最节能

一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

1)集群规划:主机名        IP      安装的软件                     运行的进程master    192.168.199.130   jdk.hadoop                     NameNode.DFSZKFailoverController(zkfc)slaver1    192.168.199.131    jdk.hadoop                       NameNode.DFSZKFailoverController(