使用VMware VSphere WebService SDK进行开发 (五)——根据虚拟机的名称获取对应主机的IP地址
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                使用VMware VSphere WebService SDK进行开发 (五)——根据虚拟机的名称获取对应主机的IP地址
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。 
 
                        
                        
                        歡迎跳轉到本文的原文鏈接:https://honeypps.com/backend/vmware-vsphere-webservice-sdk-host-name-and-ip/
?
在整個獲取監視信息的過程中,最難獲取的就是根據虛擬機的名稱獲得對應主機的IP地址的功能。(個人覺得比較繞,繞了好久我才找到)
首先根據虛擬機的名稱獲得對應主機(HostSystem)的ManagedObjectReference對象。
?
RetrieveResult props = getRetrieveResultObjectWithProperty("VirtualMachine", "summary.runtime.host");ManagedObjectReference mor = null;if (props != null){Boolean flag = false;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(VmName)){flag = true;}}if (path.equalsIgnoreCase("summary.runtime.host")){mor = (ManagedObjectReference) dp.getVal();if (flag == true){break;}}}}}}然后根據這個(HostSystem)的ManagedObjectReference對象獲取對應的主機的名稱:
?
?
private static String getObjectName(ManagedObjectReference mor) throws Exception{String objectName = null;PropertySpec propSpec = new PropertySpec();propSpec.setAll(new Boolean(false));propSpec.getPathSet().add("name");propSpec.setType(mor.getType());ObjectSpec objSpec = new ObjectSpec();objSpec.setObj(mor);objSpec.setSkip(new Boolean(false));PropertyFilterSpec spec = new PropertyFilterSpec();spec.getPropSet().add(propSpec);spec.getObjectSet().add(objSpec);ArrayList<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>();listpfs.add(spec);List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs);if(listobjcont != null){ObjectContent oc = (ObjectContent) listobjcont.get(0);objectName = (String) oc.getPropSet().get(0).getVal();}return objectName;}根據主機的名稱分別獲得對應的物理適配器的Map<"mac地址",“網卡名稱”>和vSwitch的Map<"mac地址",“ip地址”>的信息,然后遍歷獲得具有相同mac地址的信息,那個mac地址對應的ip地址就是主機地址:
?
?
private static Map<String,String> getHostPhyIpByHostName(String hostName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg{Map<String,String> map = new HashMap<String,String>();RetrieveResult propsHost = getRetrieveResultObjectWithProperty("HostSystem", "config.network.pnic");List<PhysicalNic> listpnic = null;if(propsHost != null){Boolean flagpnic = false;for (ObjectContent oc : propsHost.getObjects()){if (flagpnic == true){break;}String path = null;List<DynamicProperty> dps = oc.getPropSet();if (dps != null){for (DynamicProperty dp : dps){path = dp.getName();if (path.equalsIgnoreCase("config.network.pnic")){listpnic = ((ArrayOfPhysicalNic)dp.getVal()).getPhysicalNic();}if (path.equalsIgnoreCase("name")){String value = (String) dp.getVal();if (value.equals(hostName)){flagpnic = true;break;}}}}}}if(listpnic != null){for(PhysicalNic pnic : listpnic){PhysicalNicSpec pns = pnic.getSpec();String mac = pnic.getMac();if(pns != null){HostIpConfig hic = pns.getIp();if(hic != null){String ipAddress = hic.getIpAddress();map.put(mac, ipAddress);}}}}return map;} private static Map<String,String> getHostVirIpByHostName(String hostName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg{Map<String,String> map = new HashMap<String,String>();RetrieveResult propsHost = getRetrieveResultObjectWithProperty("HostSystem", "config.network.vnic");List<HostVirtualNic> listpnic = null;if(propsHost != null){Boolean flagpnic = false;for (ObjectContent oc : propsHost.getObjects()){if (flagpnic == true){break;}String path = null;List<DynamicProperty> dps = oc.getPropSet();if (dps != null){for (DynamicProperty dp : dps){path = dp.getName();if (path.equalsIgnoreCase("config.network.vnic")){listpnic = ((ArrayOfHostVirtualNic)dp.getVal()).getHostVirtualNic();}if (path.equalsIgnoreCase("name")){String value = (String) dp.getVal();if (value.equals(hostName)){flagpnic = true;break;}}}}}}if(listpnic != null){for(HostVirtualNic pnic : listpnic){HostVirtualNicSpec pns = pnic.getSpec();if(pns != null){HostIpConfig hic = pns.getIp();String mac = pns.getMac();if(hic != null){String ipAddress = hic.getIpAddress();map.put(mac, ipAddress);}}}}return map;}最后展示主要的方法(完整版):
?
?
public static String getVmHostIpByVmName(String VmName) throws Exception{List<String> ret = new ArrayList<String>();RetrieveResult props = getRetrieveResultObjectWithProperty("VirtualMachine", "summary.runtime.host");ManagedObjectReference mor = null;if (props != null){Boolean flag = false;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(VmName)){flag = true;}}if (path.equalsIgnoreCase("summary.runtime.host")){mor = (ManagedObjectReference) dp.getVal();if (flag == true){break;}}}}}}String hostName = null;if (mor != null){hostName = getObjectName(mor);}if(hostName != null){Map<String,String> phyMap = getHostPhyIpByHostName(hostName);Map<String,String> virMap = getHostVirIpByHostName(hostName);for(Map.Entry<String, String> entry : phyMap.entrySet()){String phyMac = entry.getKey();for(Map.Entry<String, String> entryvir : virMap.entrySet()){String virMac = entryvir.getKey();if(phyMac.equalsIgnoreCase(virMac)){ret.add(entryvir.getValue());}}}}String ipAddress = ret.get(0);return ipAddress;}歡迎跳轉到本文的原文鏈接:https://honeypps.com/backend/vmware-vsphere-webservice-sdk-host-name-and-ip/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。總結
以上是生活随笔為你收集整理的使用VMware VSphere WebService SDK进行开发 (五)——根据虚拟机的名称获取对应主机的IP地址的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 使用VMware VSphere Web
- 下一篇: 使用VMware VSphere Web
