Эффективный способ обхода инвентаризации vcenter и извлечения свойств

Я использую yavijava, и мне нужно пройти через 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?


person darkstar    schedule 21.07.2015    source источник


Ответы (1)


Вы захотите создать сборщик свойств вручную, и в зависимости от инвентаря вы захотите создать систему инвентаризации для связи объектов. У меня есть пример на 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);
    }
}
person Michael Rice    schedule 29.07.2015
comment
Спасибо, Майкл. Это именно то, что я искал. Я не смог найти никакой документации по свойствам, доступным для определенного объекта. Например, summary.hardware.memorySize. Как мне получить свойства, скажем, первой сетевой карты? - person darkstar; 30.07.2015
comment
Все свойства перечислены в документах SOAP для данного объекта. Например: yavijava.com/docs/vim.VirtualMachine.html Эти сборщики может стать действительно продвинутым. - person Michael Rice; 30.07.2015
comment
О да, я хотел знать, как перевести это в точечную нотацию, скажем, для нескольких сетевых карт на виртуальной машине. - person darkstar; 31.07.2015
comment
Для vmnics они являются частью config.hardware.device, который будет массивом устройств. Вам нужно найти экземпляр VirtualEthernetCard. После этого вы можете получить доступ к свойствам из yavijava.com/docs/vim.vm.device.VirtualEthernetCard.html - person Michael Rice; 31.07.2015