失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 使用VMware VSphere WebService SDK进行开发 (五)——根据虚拟机的名称获取对应主机的IP地址

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

时间:2023-11-14 20:38:55

相关推荐

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

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:/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", "work.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("work.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", "work.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("work.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;}

欢迎跳转到本文的原文链接:/backend/vmware-vsphere-webservice-sdk-host-name-and-ip/

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

如果觉得《使用VMware VSphere WebService SDK进行开发 (五)——根据虚拟机的名称获取对应主机的IP地址》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。