pyvmomi: ошибка при вызове RelocateVM

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

    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 здесь https://github.com/vmware/pyvmomi/blob/master/docs/vim/VirtualMachine.rst содержит подробное объяснение метода RelocateVM(spec, priority):

Кто-нибудь знает, в чем причина отсутствия метода? Я также попытался проверить доступные методы объекта, у которого есть 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)  

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


person jramacha    schedule 26.10.2016    source источник


Ответы (1)


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

Обратите внимание, BTW, что в вашем первом примере вы не передаете хост назначения вызову 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', [...] ]

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

person YSK    schedule 27.10.2016
comment
Я получаю сообщение об ошибке, когда вызываю Relocate/RelocateVM_Task, есть идеи? Я установил спецификацию с хостом. Но выдает эту ошибку. pyVmomi.VmomiSupport.ManagedObjectNotFound: (vmodl.fault.ManagedObjectNotFound) { dynamicType = ‹unset›, dynamicProperty = (vmodl.DynamicProperty) [], msg = '', faultCause = ‹unset›, faultMessage = (vmodl.LocalizableMessage) [] , obj = 'vim.VirtualMachine:xxxx' } - person jramacha; 27.10.2016
comment
@jramacha Можете ли вы опубликовать свой обновленный код в вопросе? Обратите внимание, что вам нужно создать новый объект vim.vm.RelocateSpec (вы не можете передать spec=host). См. пример на github.com/sijis/pyvmomi-examples/ blob/master/migrate-vm.py. - person YSK; 27.10.2016
comment
На самом деле это работает сейчас, у меня была опечатка. Я сделал spec.host = host obj. Большое спасибо - person jramacha; 27.10.2016