2016-01-08 5 views
0

Я использую nodejs и коды узла достаточно просты (с использованием некоторых из сказочных здесь, но задача похожа на обещание):Vsphere CreateContainerView/RetrievePropertiesEx возвращает только 100 объектов

const connect = (vcenter) => { 
    return new Task((reject, resolve) => { 
     const Vsphere = require('vsphere'); 
     const vc = new Vsphere.Client(vcenter, 'me', 'myPass', false); 

     vc.once('ready',() => resolve(vc)); 
     vc.once('error', reject); 
    }) 
} 
const getVirtualMachines = (vc) => { 
    return new Task((reject, resolve) => { 
     const rootFolder = vc.serviceContent.rootFolder; 
     const vms = vc.getMORefsInContainerByType(rootFolder, 'VirtualMachine'); 
     vms.once('result', resolve) 
     vms.once('error', reject) 
    }) 
} 

connect(vcenterIp). 
    chain(getVirtualMachines). 
    // SNIP (this isn't significant) 
    fork(e2,f2) 

и результаты в отправка этих запросов

CreateContainerView 
{ 
    "_this": { 
     "attributes": { 
     "type": "ViewManager" 
     }, 
     "$value": "ViewManager" 
    }, 
    "container": { 
     "attributes": { 
     "type": "Folder" 
     }, 
     "$value": "group-d1" 
    }, 
    "type": "VirtualMachine", 
    "recursive": true 
} 



RetrievePropertiesEx 
{ 
    "_this": { 
     "attributes": { 
     "type": "PropertyCollector" 
     }, 
     "$value": "propertyCollector" 
    }, 
    "specSet": [ 
     { 
     "attributes": { 
      "xsi:type": "PropertyFilterSpec" 
     }, 
     "propSet": [ 
      { 
       "attributes": { 
        "xsi:type": "PropertySpec" 
       }, 
       "type": "VirtualMachine", 
       "all": true 
      } 
     ], 
     "objectSet": [ 
      { 
       "attributes": { 
        "xsi:type": "ObjectSpec" 
       }, 
       "obj": { 
        "attributes": { 
        "type": "ContainerView" 
        }, 
        "$value": "session[520e031b-3c15-9c1d-408a-45ab98bde1dc]52dfe626-a128-c94f-8c4c-df52a68d97c0" 
       }, 
       "skip": true, 
       "selectSet": [ 
        { 
        "attributes": { 
         "xsi:type": "TraversalSpec" 
        }, 
        "type": "ContainerView", 
        "path": "view", 
        "skip": false 
        } 
       ] 
      } 
     ] 
     } 
    ], 
    "options": {} 
} 

Который возвращает

{ returnval: 
    { token: '0', 
    objects: 
     [ [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object], 
     [Object] ] } } 

Проблема я вижу я s, что API возвращает всего 100 элементов, в то время как в моей среде более 100VM.

Я действительно хочу, чтобы запрос, чтобы вернуть все мои виртуальные машины


обновления 1:

Чтобы вызвать одну операцию сбора свойство, вызовите метод RetrievePropertiesEx. Пример приложения передает заполненный PropertyFilterSpec и пустую структуру опций в метод . По умолчанию для RetrieveOptions.maxObjects указано, что не установлено максимальное количество возвращаемых объектов. PropertyCollector может наложить максимум. Если количество собранных объектов больше, чем максимум, PropertyCollector возвращает значения маркеров в объекте RetrieveResult данных и этот маркер используется для извлечения остальных свойств, используя ContinueRetrievePropertiesEx метод API

https://pubs.vmware.com/vsphere-50/index.jsp?topic=%2Fcom.vmware.wssdk.pg.doc_50%2FPG_Ch5_PropertyCollector.7.5.html


обновление 2

ОК, глядя на возвращаемые результаты vSPehere возвращает меня к ken код. и библиотека node-vsphere не должна извлекать все результаты. Мне нужно выяснить способ получить все результаты за один шаг.

ответ

2

мне нужно следить с этим запросом

ContinueRetrievePropertiesEx 
{ 
    "_this": { 
     "attributes": { 
     "type": "PropertyCollector" 
     }, 
     "$value": "propertyCollector" 
    }, 
    "token": "0" 
} 

Вот как я достиг этого с библиотекой:

const connect = (vcenter) => { 
    return new Task((reject, resolve) => { 
     const Vsphere = require('vsphere'); 
     const vc = new Vsphere.Client(vcenter, 'xyz\\tbrown', 'ijhi', false); 

     vc.once('ready',() => resolve(vc)); 
     vc.once('error', reject); 
    }) 
} 

const getVirtualMachines = (vc) => { 
    return new Task((reject, resolve) => { 
     const rootFolder = vc.serviceContent.rootFolder; 
     const vms = vc.getMORefsInContainerByType(rootFolder, 'VirtualMachine'); 
     vms.once('result', (initial) =>{ 
      if(initial.returnval.token == undefined) { 
       resolve(initial) 
       return 
      }else { 
       const thisReceiveAll = receiveAll(reject, resolve) 
       thisReceiveAll(vc, initial) 
      } 
     }) 
     vms.once('error', reject) 
    }) 
} 

const receiveAll = (reject, resolve) => (vc, initial) => { 
    const executeContinueReceive = function executeContinueReceive(previous) { 
     const args = { 
      _this: {"attributes":{"type":"PropertyCollector"},"$value":"propertyCollector"}, 
      token: previous.returnval.token 
     } 
     vc.vc.runCommand('ContinueRetrievePropertiesEx', args).once('result', function(current){ 
      const previousObjects = previous.returnval.objects 
      const currentObjects = current.returnval.objects 
      const allObjects = previousObjects.concat(currentObjects) 

      current.returnval.objects = allObjects 
      if(current.returnval.token == undefined) { 
       resolve(current); 
       return 
      } 
      return executeContinueReceive(current) 

     }).once('error', reject); 
    } 
    executeContinueReceive(initial) 
} 

По существу, когда я извлечь в intial набор результатов, и проверить знак , Если токен есть, я ввожу рекурсивную функцию «receiveAll», которая вызывает runCommand («ContinueRetrievePropertiesEx», args) и добавляет ее результаты. Снова проверяя токен в конце и возвращая результат ИЛИ делаем другой рекурсивный вызов ... возможно, это должно вернуться в библиотеку.

+0

Есть ли способ изменить значение RetrieveOptions.maxObjects? –

+0

Не то, что мог бы найти. – akaphenom

0

Вы можете просто использовать RetrieveProperties, и вам не нужно будет совершать какие-либо перемещения.