pyvmomi:调用RelocateVM

时间:2016-10-26 22:40:00

标签: python vmware pyvmomi

您好我正在使用pyvmomi API,在DRS设置为手动模式时对群集执行vmotions。我正在通过一个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' object没有属性' RelocateVM'

但是这里的pyvmomi文档https://github.com/vmware/pyvmomi/blob/master/docs/vim/VirtualMachine.rst  对该方法有详细的解释     重定位VM(规范,优先级):

任何人都知道该方法缺失的原因是什么?我也尝试检查对象的可用方法,它有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)  

感谢任何帮助。 感谢

1 个答案:

答案 0 :(得分:0)

看起来像文档中的错误。该方法称为Relocate(而不是RelocateVM)。

请注意,顺便说一句,在您的第一个示例中,您没有将目标主机传递给Relocate,因此肯定会遗漏某些内容。

您可以在https://gist.github.com/rgerganov/12fdd2ded8d80f36230fhttps://github.com/sijis/pyvmomi-examples/blob/master/migrate-vm.py处看到一些示例。

最后,实现您使用错误名称的一种方法是在VirtualMachine对象上调用Python的dir方法。这将列出对象的所有属性,以便您可以看到它具有哪些方法:

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

(缩写输出)