VMware: fix instance lookup against vSphere
Modifies the logic to search the vsphere vm for a given instance. The change now makes use of the config.extraConfig property to search for the instance. Change-Id: Id11f44b9792f196ad627879d082ad829869efcdf Closes-Bug: #1257038
This commit is contained in:
@@ -50,6 +50,7 @@ from nova.virt.vmwareapi import driver
|
||||
from nova.virt.vmwareapi import error_util
|
||||
from nova.virt.vmwareapi import fake as vmwareapi_fake
|
||||
from nova.virt.vmwareapi import vim
|
||||
from nova.virt.vmwareapi import vim_util
|
||||
from nova.virt.vmwareapi import vm_util
|
||||
from nova.virt.vmwareapi import vmops
|
||||
from nova.virt.vmwareapi import vmware_images
|
||||
@@ -388,7 +389,7 @@ class VMwareAPIVMTestCase(test.NoDBTestCase):
|
||||
|
||||
found_vm_uuid = False
|
||||
found_iface_id = False
|
||||
for c in vm.get("config.extraConfig"):
|
||||
for c in vm.get("config.extraConfig").OptionValue:
|
||||
if (c.key == "nvp.vm-uuid" and c.value == self.instance['uuid']):
|
||||
found_vm_uuid = True
|
||||
if (c.key == "nvp.iface-id.0" and c.value == "vif-xxx-yyy-zzz"):
|
||||
@@ -591,6 +592,31 @@ class VMwareAPIVMTestCase(test.NoDBTestCase):
|
||||
self.assertEqual(instance, self.instance)
|
||||
self.assertEqual(kwargs['disk_type'], 'preallocated')
|
||||
|
||||
def test_get_vm_ref_using_extra_config(self):
|
||||
self._create_vm()
|
||||
vm_ref = vm_util._get_vm_ref_from_extraconfig(self.conn._session,
|
||||
self.instance['uuid'])
|
||||
self.assertIsNotNone(vm_ref, 'VM Reference cannot be none')
|
||||
# Disrupt the fake Virtual Machine object so that extraConfig
|
||||
# cannot be matched.
|
||||
fake_vm = vmwareapi_fake._get_objects("VirtualMachine").objects[0]
|
||||
fake_vm.get('config.extraConfig["nvp.vm-uuid"]').value = ""
|
||||
# We should not get a Virtual Machine through extraConfig.
|
||||
vm_ref = vm_util._get_vm_ref_from_extraconfig(self.conn._session,
|
||||
self.instance['uuid'])
|
||||
self.assertIsNone(vm_ref, 'VM Reference should be none')
|
||||
# Check if we can find the Virtual Machine using the name.
|
||||
vm_ref = vm_util.get_vm_ref(self.conn._session, self.instance)
|
||||
self.assertIsNotNone(vm_ref, 'VM Reference cannot be none')
|
||||
|
||||
def test_get_object_for_optionvalue(self):
|
||||
self._create_vm()
|
||||
vms = self.conn._session._call_method(vim_util, "get_objects",
|
||||
"VirtualMachine", ['config.extraConfig["nvp.vm-uuid"]'])
|
||||
vm_ref = vm_util._get_object_for_optionvalue(vms,
|
||||
self.instance["uuid"])
|
||||
self.assertIsNotNone(vm_ref, 'VM Reference cannot be none')
|
||||
|
||||
def _test_snapshot(self):
|
||||
expected_calls = [
|
||||
{'args': (),
|
||||
|
||||
@@ -103,6 +103,13 @@ def _convert_to_array_of_mor(mors):
|
||||
return array_of_mors
|
||||
|
||||
|
||||
def _convert_to_array_of_opt_val(optvals):
|
||||
"""Wraps the given array into a DataObject."""
|
||||
array_of_optv = DataObject()
|
||||
array_of_optv.OptionValue = optvals
|
||||
return array_of_optv
|
||||
|
||||
|
||||
class FakeRetrieveResult(object):
|
||||
"""Object to retrieve a ObjectContent list."""
|
||||
|
||||
@@ -335,7 +342,12 @@ class VirtualMachine(ManagedObject):
|
||||
self.set("summary.config.memorySizeMB", kwargs.get("mem", 1))
|
||||
self.set("summary.config.instanceUuid", kwargs.get("instanceUuid"))
|
||||
self.set("config.hardware.device", kwargs.get("virtual_device", None))
|
||||
self.set("config.extraConfig", kwargs.get("extra_config", None))
|
||||
exconfig_do = kwargs.get("extra_config", None)
|
||||
self.set("config.extraConfig",
|
||||
_convert_to_array_of_opt_val(exconfig_do))
|
||||
if exconfig_do:
|
||||
for optval in exconfig_do:
|
||||
self.set('config.extraConfig["%s"]' % optval.key, optval)
|
||||
self.set('runtime.host', kwargs.get("runtime_host", None))
|
||||
self.device = kwargs.get("virtual_device")
|
||||
# Sample of diagnostics data is below.
|
||||
|
||||
@@ -666,6 +666,13 @@ def _get_object_for_value(results, value):
|
||||
return object.obj
|
||||
|
||||
|
||||
def _get_object_for_optionvalue(results, value):
|
||||
for object in results.objects:
|
||||
if hasattr(object, "propSet") and object.propSet:
|
||||
if object.propSet[0].val.value == value:
|
||||
return object.obj
|
||||
|
||||
|
||||
def _get_object_from_results(session, results, value, func):
|
||||
while results:
|
||||
token = _get_token(results)
|
||||
@@ -740,11 +747,20 @@ def _get_vm_ref_from_vm_uuid(session, instance_uuid):
|
||||
return vm_refs[0]
|
||||
|
||||
|
||||
def _get_vm_ref_from_extraconfig(session, instance_uuid):
|
||||
"""Get reference to the VM with the uuid specified."""
|
||||
vms = session._call_method(vim_util, "get_objects",
|
||||
"VirtualMachine", ['config.extraConfig["nvp.vm-uuid"]'])
|
||||
return _get_object_from_results(session, vms, instance_uuid,
|
||||
_get_object_for_optionvalue)
|
||||
|
||||
|
||||
@vm_ref_cache_from_instance
|
||||
def get_vm_ref(session, instance):
|
||||
"""Get reference to the VM through uuid or vm name."""
|
||||
uuid = instance['uuid']
|
||||
vm_ref = (_get_vm_ref_from_vm_uuid(session, uuid) or
|
||||
_get_vm_ref_from_extraconfig(session, uuid) or
|
||||
_get_vm_ref_from_uuid(session, uuid) or
|
||||
_get_vm_ref_from_name(session, instance['name']))
|
||||
if vm_ref is None:
|
||||
|
||||
Reference in New Issue
Block a user