2016-10-26 14 views
0

Привет, Я использую API pyvmomi, чтобы выполнить vmotions против кластера, когда DRS настроен на ручной режим. Я прохожу через vcenter и запрашиваю кластер, получая рекомендации и используя это для выполнения Vmotions. Код выглядит примерно так.pyvmomi: ошибка при вызове RelocateVM

content=getVCContent(thisHost, {'user':username,'pwd':decoded_password},logger) 
     allClusterObj = content.viewManager.CreateContainerView(content.rootFolder, [pyVmomi.vim.ClusterComputeResource], True) 

     allCluster = allClusterObj.view 



     for thisDrsRecommendation in thisCluster.drsRecommendation: 
      print thisDrsRecommendation.reason 
     for thisMigration in thisDrsRecommendation.migrationList: 
      print ' vm:', thisMigration.vm.name 
    while True: 
      relocate_vm_to_host(thisMigration.vm.name,thisMigration.destination.name, allClusterObj.view) 

#FUNCTION definition 
    def relocate_vm_to_host(vm, host , allCluster): 
     for thisCluster in allCluster: 
      for thisHost in thisCluster.host: 
       if thisHost.name == host: 
        for thisVm in thisHost.vm: 
         print 'Relocating vm:%s to host:%s on cluster:%s' %(thisVm.name,thisHost.name,thisCluster.name) 
         task = thisVm.RelocateVM(priority='defaultpriority') 

Я получаю сообщение об ошибке, когда атрибут не существует. AttributeError: объект 'vim.VirtualMachine' не имеет атрибута 'RelocateVM'

Но pyvmomi documentaion здесь https://github.com/vmware/pyvmomi/blob/master/docs/vim/VirtualMachine.rst имеет подробное объяснение метода RelocateVM (спецификации, приоритет):

Каждый знает, в чем причина метод отсутствует? Я также попытался проверить доступные методы объекта, который имеет RelocateVM_Task, вместо RelocateVM (для которого я не мог найти в документации) Когда я, что я получаю эту ошибку

TypeError: For "spec" expected type vim.vm.RelocateSpec, but got str 

Я проверил документацию по Vim. vm.RelocateSpec, я вызываю его в функции, но все равно выдает ошибку.

def relocate_vm(VmToRelocate,destination_host,content): 
    allvmObj = content.viewManager.CreateContainerView(content.rootFolder, [pyVmomi.vim.VirtualMachine], True) 
    allvms = allvmObj.view 
    for vm in allvms: 
     if vm.name == VmToRelocate: 
     print 'vm:%s to relocate %s' %(vm.name , VmToRelocate) 
     task = vm.RelocateVM_Task(spec = destination_host) 

Любая помощь приветствуется. Thanks

ответ

0

Похоже, ошибки в документации. Метод называется Relocate (а не RelocateVM).

Обратите внимание, что в вашем первом образце вы не передаете хост назначения на звонок до Relocate, поэтому там что-то определенно отсутствует.

Вы можете увидеть некоторые образцы по адресу https://gist.github.com/rgerganov/12fdd2ded8d80f36230f или по телефону https://github.com/sijis/pyvmomi-examples/blob/master/migrate-vm.py.

И, наконец, один из способов понять, что вы используете неправильное имя, - это вызвать метод Python dir на объекте VirtualMachine. Это список всех свойств объекта, так что вы можете увидеть, какие методы он имеет:

>>> vm = vim.VirtualMachine('vm-1234', None) 
>>> dir(vm) 
['AcquireMksTicket', [...] 'Relocate', 'RelocateVM_Task', [...] ] 

(сокращенно выход)

+0

Я получаю сообщение об ошибке, когда я называю передислокации/RelocateVM_Task, какие-либо идеи? Я установил спецификацию с хостом. Но это порождает эту ошибку. pyVmomi.VmomiSupport.ManagedObjectNotFound: (vmodl.fault.ManagedObjectNotFound) { dynamicType = , dynamicProperty = (vmodl.DynamicProperty) [], MSG = '', faultCause = , faultMessage = (vmodl.LocalizableMessage) [], obj = 'vim.VirtualMachine: xxxx' } – jramacha

+0

@jramacha Можете ли вы опубликовать обновленный код в вопросе? Обратите внимание, что вам нужно создать новый объект 'vim.vm.RelocateSpec' (вы не можете передать' spec = host'). См. Пример на странице https://github.com/sijis/pyvmomi-examples/blob/master/migrate-vm.py. – YSK

+0

На самом деле это работает сейчас, у меня была опечатка. Я сделал spec.host = host obj. большое спасибо – jramacha