使用VMware VSphere WebService SDK进行开发 (五)——根据虚拟机的名称获取对应主机的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;
	}
时间: 2024-09-20 04:21:10

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

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

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

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

在实际应用中,需要显示出数据中心(Datacenter).集群(ClusterComputeResource).主机(HostSystem).虚拟机(VirtualMachine)之间的目录关系.这里忽略VAPP以及APP. 正所谓无图无真相,先展示一张vSphere Client上的截图,以便形象的描述本文所要呈现的内容. 左边的目录树形象的展示了数据中心(Datacenter).集群(ClusterComputeResource).主机(HostSystem).虚拟机(VirtualMach

使用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 虚拟化编程(3) —VMware vSphere Web Service API 解析

目录 目录 前文列表 VMware vSphere Web Services API VMware vSphere Web Services SDK vSphere WS API 中的托管对象 Managed Object 托管对象引用 Managed Object References 托管对象属性收集器 PropertyCollector 连接 vCenter 并获取 MO 最后 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VM

VMware vSphere 关键概念理解与速查手册

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1414113 此篇文章结合vCenter帮助手册和vSphere中文文档对VMware虚拟化中涉及的一些关键字或专有名词进行了部分整理,刚接触VMware虚拟化不久的朋友可以从中得到一些借鉴和提示.PS:本文概念基于VMware vSphere 5.5,同样适用于先前的vSphere发行版本. 参考: VMware

VMware vSphere Client WIN10安装问题

VMware vSphere Client WIN10安装问题 VMware vSphere Client 这个软件在百度一搜一大把,下面是我的版本 VMware-viclient-all-6.0.0-2502222.exe.当然你也可以在ESXI安装完成后,输入主机的IP地址进行下载 VMware Vsphere Client 肯定是要管理ESXI主机,如果你想安装ESXI主机,可以看我之前的博客 http://blog.csdn.net/wanglei_storage/article/det

《VMware vSphere企业运维实战》——2.4 在VMware ESXi中配置虚拟机

2.4 在VMware ESXi中配置虚拟机 使用vSphere Client连接到VMware ESXi之后,就管理并配置VMware ESXi,包括添加存储.网络,以及在VMware ESXi创建虚拟机.在虚拟机中安装操作系统.重新配置虚拟机等.首先介绍在VMware ESXi中创建虚拟机的操作,稍后介绍管理VMware ESXi的内容. 2.4.1 创建虚拟机 在vSphere Client控制台中,创建虚拟机与在VMware Workstation中相类似,主要步骤如下. (1)用鼠标右