2015-07-21 5 views
2

Я использую yavijava, и мне необходимо пройти через vCenter и создать на нем список всех хостов и виртуальных машин. Для каждого хоста и VM, мне нужно, чтобы получить несколько свойств, таких как имя, количество RAM/CPU и т.д. Мой текущий код выглядит следующим образом:Эффективный способ перемещения инвентаря vcenter и получения свойств

ManagedEntity[] hosts = new InventoryNavigator.searchManagedEntities("VirtualMachine"); 
for(int i=0;i<hosts.length;i++) { 
    String name = hosts[i].getName(); 
    String xxx = hosts[i].XXXXX; 
..... 

и так далее для виртуальных машин тоже.

Мой вопрос: есть ли более эффективный способ сделать это, учитывая тот факт, что существует значительное количество объектов, и каждый вызов (например, getName) отправляет новый запрос в vSphere?

ответ

3

Вы захотите создать сборщик свойств вручную, и в зависимости от инвентаря вы захотите создать систему инвентаризации для связывания объектов. У меня есть образец на github для кластеров: https://github.com/yavijava/yavijava_cluster_prop_example

RetrieveOptions options = new RetrieveOptions(); 
    options.setMaxObjects(100); 
    String[] vmProps = new String[2]; 
    vmProps[0] = "name"; 
    vmProps[1] = "runtime.host"; 
    PropertySpec vmSpec = new PropertySpec(); 
    vmSpec.setAll(false); 
    vmSpec.setType("VirtualMachine"); 
    vmSpec.setPathSet(vmProps); 

    String[] hostProps = new String[4]; 
    hostProps[0] = "name"; 
    hostProps[1] = "summary.hardware.numCpuCores"; 
    hostProps[2] = "summary.hardware.cpuModel"; 
    hostProps[3] = "summary.hardware.memorySize"; 
    PropertySpec hostSpec = new PropertySpec(); 
    hostSpec.setAll(false); 
    hostSpec.setType("HostSystem"); 
    hostSpec.setPathSet(hostProps); 

    String[] clusterProps = new String[2]; 
    clusterProps[0] = "name"; 
    clusterProps[1] = "parent"; 
    PropertySpec clusterSpec = new PropertySpec(); 
    clusterSpec.setAll(false); 
    clusterSpec.setType("ClusterComputeResource"); 
    clusterSpec.setPathSet(clusterProps); 

    ObjectSpec oSpec = new ObjectSpec(); 
    oSpec.setObj(clusterMe.getMOR()); 
    oSpec.setSelectSet(com.vmware.vim25.mo.util.PropertyCollectorUtil.buildFullTraversalV4()); 
    PropertyFilterSpec[] pfSpec = new PropertyFilterSpec[1]; 
    pfSpec[0] = new PropertyFilterSpec(); 

    ObjectSpec[] oo = new ObjectSpec[1]; 
    oo[0] = oSpec; 

    pfSpec[0].setObjectSet(oo); 
    PropertySpec[] pp = new PropertySpec[3]; 
    pp[0] = vmSpec; 
    pp[1] = hostSpec; 
    pp[2] = clusterSpec; 

    pfSpec[0].setPropSet(pp); 
    RetrieveResult ret = serviceInstance.getPropertyCollector().retrievePropertiesEx(pfSpec, options); 

    for (ObjectContent aRet : ret.getObjects()) { 
     if(aRet.getObj().type.equalsIgnoreCase("ClusterComputeResource")) { 
      printInfo(aRet); 
     } 
     if(aRet.getObj().type.equalsIgnoreCase("HostSystem")) { 
      System.out.println("Host Info: "); 
      printInfo(aRet); 
      System.out.println("#######################"); 
     } 
     if(aRet.getObj().type.equalsIgnoreCase("VirtualMachine")) { 
      System.out.println("VirtualMachine: "); 
      printInfo(aRet); 
      System.out.println("#######################################"); 
     } 
    } 
} 

private static void printInfo(ObjectContent objectContent) { 
    // This is super generic here... To actually relate the objects so you 
    // know which HostSystem a VirtualMachine lives on you need to implement 
    // some kind of inventory system and use the MOR from the HostSystem 
    // and the MOR from the vm.runtime.host 
    for(DynamicProperty props: objectContent.getPropSet()) { 
     System.out.println(props.val); 
    } 
} 
+0

Спасибо, Майкл. Это именно то, что я искал. Я не смог найти документацию о свойствах, доступных для определенного объекта. Например, summary.hardware.memorySize, Как получить свойства, скажем, первой сетевой карты? – darkstar

+0

Все свойства перечислены в документах SOAP для данного объекта. Например: http://www.yavijava.com/docs/vim.VirtualMachine.html Эти сборщики могут стать действительно продвинутыми. –

+0

О да, я хотел бы знать, как перевести это на точечную нотацию, скажем, на несколько сетевых карт на виртуальной машине. – darkstar