summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-09-10 10:48:10 +0000
committerGerrit Code Review <review@openstack.org>2014-09-10 10:48:10 +0000
commit188b4dd632a9e63ade6d01fcb7777da93bdc61c0 (patch)
tree6ac5ae3c7e530ff4097cf5f33cbbd4bfc464b6f9
parent6e8cb5921a90bf852886dbd7f9230f75412804f7 (diff)
parent9d3d947f802a8beb6438d2cf911ee78c820f3555 (diff)
downloadnova-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.py67
-rw-r--r--nova/virt/vmwareapi/fake.py7
-rwxr-xr-xnova/virt/vmwareapi/vmops.py22
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)