关键词搜索

源码搜索 ×
×

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

发布2015-11-11浏览8120次

详情内容

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

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

 

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

首先根据虚拟机的名称获得对应主机(HostSystem)的ManagedObjectReference对象。

 

  1. RetrieveResult props = getRetrieveResultObjectWithProperty("VirtualMachine", "summary.runtime.host");
  2. ManagedObjectReference mor = null;
  3. if (props != null)
  4. {
  5. Boolean flag = false;
  6. for (ObjectContent oc : props.getObjects())
  7. {
  8. if (flag == true)
  9. {
  10. break;
  11. }
  12. String path = null;
  13. List<DynamicProperty> dps = oc.getPropSet();
  14. if (dps != null)
  15. {
  16. for (DynamicProperty dp : dps)
  17. {
  18. path = dp.getName();
  19. if (path.equalsIgnoreCase("name"))
  20. {
  21. String value = (String) dp.getVal();
  22. if (value.equals(VmName))
  23. {
  24. flag = true;
  25. }
  26. }
  27. if (path.equalsIgnoreCase("summary.runtime.host"))
  28. {
  29. mor = (ManagedObjectReference) dp.getVal();
  30. if (flag == true)
  31. {
  32. break;
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }

然后根据这个(HostSystem)的ManagedObjectReference对象获取对应的主机的名称:

 

 

  1. private static String getObjectName(ManagedObjectReference mor) throws Exception
  2. {
  3. String objectName = null;
  4. PropertySpec propSpec = new PropertySpec();
  5. propSpec.setAll(new Boolean(false));
  6. propSpec.getPathSet().add("name");
  7. propSpec.setType(mor.getType());
  8. ObjectSpec objSpec = new ObjectSpec();
  9. objSpec.setObj(mor);
  10. objSpec.setSkip(new Boolean(false));
  11. PropertyFilterSpec spec = new PropertyFilterSpec();
  12. spec.getPropSet().add(propSpec);
  13. spec.getObjectSet().add(objSpec);
  14. ArrayList<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>();
  15. listpfs.add(spec);
  16. List<ObjectContent> listobjcont = retrievePropertiesAllObjects(listpfs);
  17. if(listobjcont != null)
  18. {
  19. ObjectContent oc = (ObjectContent) listobjcont.get(0);
  20. objectName = (String) oc.getPropSet().get(0).getVal();
  21. }
  22. return objectName;
  23. }

根据主机的名称分别获得对应的物理适配器的Map<"mac地址",“网卡名称”>和vSwitch的Map<"mac地址",“ip地址”>的信息,然后遍历获得具有相同mac地址的信息,那个mac地址对应的ip地址就是主机地址:

 

 

  1. private static Map<String,String> getHostPhyIpByHostName(String hostName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg
  2. {
  3. Map<String,String> map = new HashMap<String,String>();
  4. RetrieveResult propsHost = getRetrieveResultObjectWithProperty("HostSystem", "config.network.pnic");
  5. List<PhysicalNic> listpnic = null;
  6. if(propsHost != null)
  7. {
  8. Boolean flagpnic = false;
  9. for (ObjectContent oc : propsHost.getObjects())
  10. {
  11. if (flagpnic == true)
  12. {
  13. break;
  14. }
  15. String path = null;
  16. List<DynamicProperty> dps = oc.getPropSet();
  17. if (dps != null)
  18. {
  19. for (DynamicProperty dp : dps)
  20. {
  21. path = dp.getName();
  22. if (path.equalsIgnoreCase("config.network.pnic"))
  23. {
  24. listpnic = ((ArrayOfPhysicalNic)dp.getVal()).getPhysicalNic();
  25. }
  26. if (path.equalsIgnoreCase("name"))
  27. {
  28. String value = (String) dp.getVal();
  29. if (value.equals(hostName))
  30. {
  31. flagpnic = true;
  32. break;
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. if(listpnic != null)
  40. {
  41. for(PhysicalNic pnic : listpnic)
  42. {
  43. PhysicalNicSpec pns = pnic.getSpec();
  44. String mac = pnic.getMac();
  45. if(pns != null)
  46. {
  47. HostIpConfig hic = pns.getIp();
  48. if(hic != null)
  49. {
  50. String ipAddress = hic.getIpAddress();
  51. map.put(mac, ipAddress);
  52. }
  53. }
  54. }
  55. }
  56. return map;
  57. }
  1. private static Map<String,String> getHostVirIpByHostName(String hostName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg
  2. {
  3. Map<String,String> map = new HashMap<String,String>();
  4. RetrieveResult propsHost = getRetrieveResultObjectWithProperty("HostSystem", "config.network.vnic");
  5. List<HostVirtualNic> listpnic = null;
  6. if(propsHost != null)
  7. {
  8. Boolean flagpnic = false;
  9. for (ObjectContent oc : propsHost.getObjects())
  10. {
  11. if (flagpnic == true)
  12. {
  13. break;
  14. }
  15. String path = null;
  16. List<DynamicProperty> dps = oc.getPropSet();
  17. if (dps != null)
  18. {
  19. for (DynamicProperty dp : dps)
  20. {
  21. path = dp.getName();
  22. if (path.equalsIgnoreCase("config.network.vnic"))
  23. {
  24. listpnic = ((ArrayOfHostVirtualNic)dp.getVal()).getHostVirtualNic();
  25. }
  26. if (path.equalsIgnoreCase("name"))
  27. {
  28. String value = (String) dp.getVal();
  29. if (value.equals(hostName))
  30. {
  31. flagpnic = true;
  32. break;
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. if(listpnic != null)
  40. {
  41. for(HostVirtualNic pnic : listpnic)
  42. {
  43. HostVirtualNicSpec pns = pnic.getSpec();
  44. if(pns != null)
  45. {
  46. HostIpConfig hic = pns.getIp();
  47. String mac = pns.getMac();
  48. if(hic != null)
  49. {
  50. String ipAddress = hic.getIpAddress();
  51. map.put(mac, ipAddress);
  52. }
  53. }
  54. }
  55. }
  56. return map;
  57. }

最后展示主要的方法(完整版):

 

 

  1. public static String getVmHostIpByVmName(String VmName) throws Exception
  2. {
  3. List<String> ret = new ArrayList<String>();
  4. RetrieveResult props = getRetrieveResultObjectWithProperty("VirtualMachine", "summary.runtime.host");
  5. ManagedObjectReference mor = null;
  6. if (props != null)
  7. {
  8. Boolean flag = false;
  9. for (ObjectContent oc : props.getObjects())
  10. {
  11. if (flag == true)
  12. {
  13. break;
  14. }
  15. String path = null;
  16. List<DynamicProperty> dps = oc.getPropSet();
  17. if (dps != null)
  18. {
  19. for (DynamicProperty dp : dps)
  20. {
  21. path = dp.getName();
  22. if (path.equalsIgnoreCase("name"))
  23. {
  24. String value = (String) dp.getVal();
  25. if (value.equals(VmName))
  26. {
  27. flag = true;
  28. }
  29. }
  30. if (path.equalsIgnoreCase("summary.runtime.host"))
  31. {
  32. mor = (ManagedObjectReference) dp.getVal();
  33. if (flag == true)
  34. {
  35. break;
  36. }
  37. }
  38. }
  39. }
  40. }
  41. }
  42. String hostName = null;
  43. if (mor != null)
  44. {
  45. hostName = getObjectName(mor);
  46. }
  47. if(hostName != null)
  48. {
  49. Map<String,String> phyMap = getHostPhyIpByHostName(hostName);
  50. Map<String,String> virMap = getHostVirIpByHostName(hostName);
  51. for(Map.Entry<String, String> entry : phyMap.entrySet())
  52. {
  53. String phyMac = entry.getKey();
  54. for(Map.Entry<String, String> entryvir : virMap.entrySet())
  55. {
  56. String virMac = entryvir.getKey();
  57. if(phyMac.equalsIgnoreCase(virMac))
  58. {
  59. ret.add(entryvir.getValue());
  60. }
  61. }
  62. }
  63. }
  64. String ipAddress = ret.get(0);
  65. return ipAddress;
  66. }

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

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

相关技术文章

最新源码

下载排行榜

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载