使用VMware VSphere WebService SDK进行开发 (七)——获取数据中心、集群、主机、虚拟机的目录结构
歡迎跳轉到本文的原文鏈接:https://honeypps.com/backend/vmware-vsphere-webservice-sdk-directory/
?
在實際應用中,需要顯示出數據中心(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修飾的方法就是通過數據中心的名稱獲取集群、主機、虛擬機的名稱列表的方法。
?
如有疑問,歡迎提出。本文展示的代碼都經過真實環境運行并投入使用中。
?
歡迎跳轉到本文的原文鏈接:https://honeypps.com/backend/vmware-vsphere-webservice-sdk-directory/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。總結
以上是生活随笔為你收集整理的使用VMware VSphere WebService SDK进行开发 (七)——获取数据中心、集群、主机、虚拟机的目录结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用VMware VSphere Web
- 下一篇: Spring+Mybatis多数据源配置