diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-09-10 10:48:10 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-09-10 10:48:10 +0000 |
commit | 188b4dd632a9e63ade6d01fcb7777da93bdc61c0 (patch) | |
tree | 6ac5ae3c7e530ff4097cf5f33cbbd4bfc464b6f9 | |
parent | 6e8cb5921a90bf852886dbd7f9230f75412804f7 (diff) | |
parent | 9d3d947f802a8beb6438d2cf911ee78c820f3555 (diff) | |
download | nova-188b4dd632a9e63ade6d01fcb7777da93bdc61c0.tar.gz |
Merge "VMware: Add check for datacenter with no datastore" into stable/havana
-rw-r--r-- | nova/tests/virt/vmwareapi/test_vmwareapi_vmops.py | 67 | ||||
-rw-r--r-- | nova/virt/vmwareapi/fake.py | 7 | ||||
-rwxr-xr-x | nova/virt/vmwareapi/vmops.py | 22 |
3 files changed, 83 insertions, 13 deletions
diff --git a/nova/tests/virt/vmwareapi/test_vmwareapi_vmops.py b/nova/tests/virt/vmwareapi/test_vmwareapi_vmops.py index fe7fbeffaf..3bd3ba3dde 100644 --- a/nova/tests/virt/vmwareapi/test_vmwareapi_vmops.py +++ b/nova/tests/virt/vmwareapi/test_vmwareapi_vmops.py @@ -15,12 +15,30 @@ # License for the specific language governing permissions and limitations # under the License. +import mock + from nova.network import model as network_model from nova import test from nova import utils +from nova.virt.vmwareapi import fake as vmwareapi_fake +from nova.virt.vmwareapi import vim_util from nova.virt.vmwareapi import vmops +class fake_session(object): + def __init__(self, ret=None): + self.ret = ret + + def _get_vim(self): + return vmwareapi_fake.FakeVim() + + def _call_method(self, module, method, *args, **kwargs): + return self.ret + + def _wait_for_task(self, task_ref): + return + + class VMwareVMOpsTestCase(test.NoDBTestCase): def setUp(self): super(VMwareVMOpsTestCase, self).setUp() @@ -55,6 +73,7 @@ class VMwareVMOpsTestCase(test.NoDBTestCase): rxtx_cap=3) ]) utils.reset_is_neutron() + self._session = fake_session() def test_get_machine_id_str(self): result = vmops.VMwareVMOps._get_machine_id_str(self.network_info) @@ -103,3 +122,51 @@ class VMwareVMOpsTestCase(test.NoDBTestCase): value = vmops.VMwareVMOps.decide_linked_clone("yes", False) self.assertTrue(value, "image level metadata failed to override global") + + def _test_get_datacenter_ref_and_name(self, ds_ref_exists=False): + instance_ds_ref = mock.Mock() + instance_ds_ref.value = "ds-1" + _vcvmops = vmops.VMwareVCVMOps(self._session, None, None) + if ds_ref_exists: + ds_ref = mock.Mock() + ds_ref.value = "ds-1" + else: + ds_ref = None + + def fake_call_method(module, method, *args, **kwargs): + fake_object1 = vmwareapi_fake.FakeRetrieveResult() + fake_object1.add_object(vmwareapi_fake.Datacenter( + ds_ref=ds_ref)) + if not ds_ref: + # Token is set for the fake_object1, so it will continue to + # fetch the next object. + setattr(fake_object1, 'token', 'token-0') + if method == "continue_to_get_objects": + fake_object2 = vmwareapi_fake.FakeRetrieveResult() + fake_object2.add_object(vmwareapi_fake.Datacenter()) + return fake_object2 + + return fake_object1 + + with mock.patch.object(self._session, '_call_method', + side_effect=fake_call_method) as fake_call: + dc_info = _vcvmops.get_datacenter_ref_and_name(instance_ds_ref) + + if ds_ref: + self.assertEqual(1, len(_vcvmops._datastore_dc_mapping)) + fake_call.assert_called_once_with(vim_util, "get_objects", + "Datacenter", ["name", "datastore", "vmFolder"]) + self.assertEqual("ha-datacenter", dc_info.name) + else: + calls = [mock.call(vim_util, "get_objects", "Datacenter", + ["name", "datastore", "vmFolder"]), + mock.call(vim_util, "continue_to_get_objects", + "token-0")] + fake_call.assert_has_calls(calls) + self.assertIsNone(dc_info) + + def test_get_datacenter_ref_and_name(self): + self._test_get_datacenter_ref_and_name(ds_ref_exists=True) + + def test_get_datacenter_ref_and_name_with_no_datastore(self): + self._test_get_datacenter_ref_and_name() diff --git a/nova/virt/vmwareapi/fake.py b/nova/virt/vmwareapi/fake.py index dc77f64cba..19834a6cb5 100644 --- a/nova/virt/vmwareapi/fake.py +++ b/nova/virt/vmwareapi/fake.py @@ -694,8 +694,11 @@ class Datacenter(ManagedObject): network_do = DataObject() network_do.ManagedObjectReference = [net_ref] self.set("network", network_do) - datastore = DataObject() - datastore.ManagedObjectReference = [ds_ref] + if ds_ref: + datastore = DataObject() + datastore.ManagedObjectReference = [ds_ref] + else: + datastore = None self.set("datastore", datastore) diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index c900b587d1..9cb7d867dc 100755 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -1658,19 +1658,19 @@ class VMwareVCVMOps(VMwareVMOps): while dcs: token = vm_util._get_token(dcs) for dco in dcs.objects: - name = None - vmFolder = None dc_ref = dco.obj ds_refs = [] - for p in dco.propSet: - if p.name == 'name': - name = p.val - if p.name == 'datastore': - datastore_refs = p.val.ManagedObjectReference - for ds in datastore_refs: - ds_refs.append(ds.value) - if p.name == 'vmFolder': - vmFolder = p.val + prop_dict = vm_util.propset_dict(dco.propSet) + name = prop_dict.get('name') + vmFolder = prop_dict.get('vmFolder') + datastore_refs = prop_dict.get('datastore') + if datastore_refs: + datastore_refs = datastore_refs.ManagedObjectReference + for ds in datastore_refs: + ds_refs.append(ds.value) + else: + LOG.debug("Datacenter %s doesn't have any datastore " + "associated with it, ignoring it", name) for ds_ref in ds_refs: self._datastore_dc_mapping[ds_ref] = DcInfo(ref=dc_ref, name=name, vmFolder=vmFolder) |