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

简介: 在整个获取监视信息的过程中,最难获取的就是根据虚拟机的名称获得对应主机的IP地址的功能。(个人觉得比较绕,绕了好久我才找到) 首先根据虚拟机的名称获得对应主机(HostSystem)的ManagedObjectReference对象。

在整个获取监视信息的过程中,最难获取的就是根据虚拟机的名称获得对应主机的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;
	}


目录
相关文章
|
1月前
|
Ubuntu 网络安全 虚拟化
VMware虚拟机ping不通原因排查及分析
下面以 VMware 虚拟机为例进行介绍。
519 3
|
1月前
|
存储 SQL 数据库
虚拟化数据恢复—Vmware虚拟机误还原快照的数据恢复案例
虚拟化数据恢复环境: 一台虚拟机从物理机迁移到ESXI虚拟化平台,迁移完成后做了一个快照。虚拟机上运行了一个SQL Server数据库,记录了数年的数据。 ESXI虚拟化平台上有数十台虚拟机,EXSI虚拟化平台连接了一台EVA存储,所有的虚拟机都存放在EVA存储上。 虚拟化故障: 工组人员误操作将数年前迁移完成后做的快照还原了,也就意味着虚拟机状态还原到数年前,近几年数据都被删除了。 还原快照相当于删除数据,意味着部分存储空间会被释放。为了不让这部分释放的空间被重用,需要将连接到这台存储的所有虚拟机都关掉,需要将不能长时间宕机的虚拟机迁移到别的EXSI虚拟化平台上。
107 50
|
2月前
|
安全 虚拟化 数据中心
Xshell 连接 VMware虚拟机操作 截图和使用
Xshell 连接 VMware虚拟机操作 截图和使用
67 4
|
2月前
|
Linux 虚拟化
vmware虚拟机安装2024(超详细)
vmware虚拟机安装2024(超详细)
370 6
|
2月前
|
虚拟化 网络虚拟化 网络架构
虚拟机 VMware Workstation 16 PRO 的网络配置
虚拟机 VMware Workstation 16 PRO 的网络配置
91 2
|
3月前
|
存储 SQL 数据挖掘
虚拟化数据恢复—VMware虚拟机vmdk文件被误删除的数据恢复案例
虚拟化数据恢复环境: 某品牌服务器(部署VMware EXSI虚拟机)+同品牌存储(存放虚拟机文件)。 虚拟化故障: 意外断电导致服务器上某台虚拟机无法正常启动。查看虚拟机配置文件发现这台故障虚拟机除了磁盘文件以外其他配置文件全部丢失,xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还在。管理员联系VMware工程师寻求帮助。VMware工程师尝试新建一个虚拟机来解决故障,但发现ESXi存储空间不足。于是将故障虚拟机下的xxx-flat.vmdk磁盘文件删除,然后重建一个虚拟机并且分配固定大小的虚拟磁盘。
|
4月前
|
测试技术 Linux 虚拟化
iOS自动化测试方案(五):保姆级VMware虚拟机安装MacOS
详细的VMware虚拟机安装macOS Big Sur的保姆级教程,包括下载VMware和macOS镜像、图解安装步骤和遇到问题时的解决方案,旨在帮助读者顺利搭建macOS虚拟机环境。
184 3
iOS自动化测试方案(五):保姆级VMware虚拟机安装MacOS
|
4月前
|
编解码 Linux 虚拟化
超详细VMware虚拟机安装Win10操作系统过程图解
这篇文章提供了一个详细的VMware虚拟机安装Windows 10操作系统的图解教程,包括了从创建虚拟机到安装操作系统的全过程,以及安装后的一些基本设置,如屏幕分辨率调整等。作者还提到了后续会分享关于磁盘分区的创建过程。
超详细VMware虚拟机安装Win10操作系统过程图解
|
4月前
|
虚拟化
vmware虚拟机使用主机代理访问谷歌
vmware虚拟机使用主机代理访问谷歌
|
5月前
|
存储 Linux 虚拟化
入职必会-开发环境搭建32-VMware虚拟机下载和安装
VMware虚拟机是一种基于VMware虚拟化技术的软件解决方案,它可以在一台物理计算机上创建多个独立的虚拟计算机环境。这些虚拟机可以运行不同的操作系统,如Windows、Linux等,使用户能够在单台计算机上同时运行多个操作系统。
141 0
入职必会-开发环境搭建32-VMware虚拟机下载和安装