Merge "VMware: create method for getting datacenter from datastore"

This commit is contained in:
Jenkins 2015-09-17 21:16:22 +00:00 committed by Gerrit Code Review
commit e6fc392347
5 changed files with 67 additions and 52 deletions

View File

@ -56,6 +56,7 @@ from nova.tests.unit.virt.vmwareapi import stubs
from nova.virt import driver as v_driver
from nova.virt.vmwareapi import constants
from nova.virt.vmwareapi import driver
from nova.virt.vmwareapi import ds_util
from nova.virt.vmwareapi import error_util
from nova.virt.vmwareapi import imagecache
from nova.virt.vmwareapi import images
@ -167,6 +168,7 @@ class VMwareAPIVMTestCase(test.NoDBTestCase):
@mock.patch.object(driver.VMwareVCDriver, '_register_openstack_extension')
def setUp(self, mock_register):
super(VMwareAPIVMTestCase, self).setUp()
ds_util.dc_cache_reset()
vm_util.vm_refs_cache_reset()
self.context = context.RequestContext('fake', 'fake', is_admin=False)
self.flags(cluster_name='test_cluster',
@ -2222,11 +2224,10 @@ class VMwareAPIVMTestCase(test.NoDBTestCase):
self.instance)
def test_datastore_dc_map(self):
vmops = self.conn._vmops
self.assertEqual({}, vmops._datastore_dc_mapping)
self.assertEqual({}, ds_util._DS_DC_MAPPING)
self._create_vm()
# currently there are 2 data stores
self.assertEqual(2, len(vmops._datastore_dc_mapping))
self.assertEqual(2, len(ds_util._DS_DC_MAPPING))
def test_rollback_live_migration_at_destination(self):
with mock.patch.object(self.conn, "destroy") as mock_destroy:

View File

@ -27,7 +27,6 @@ from nova.tests.unit import fake_instance
from nova.tests.unit.virt.vmwareapi import fake
from nova.virt.vmwareapi import ds_util
from nova.virt.vmwareapi import imagecache
from nova.virt.vmwareapi import vmops
CONF = cfg.CONF
@ -224,8 +223,8 @@ class ImageCacheManagerTestCase(test.NoDBTestCase):
_timestamp_cleanup):
timeutils.set_time_override(override_time=self._time)
datastore = ds_obj.Datastore(name='ds', ref='fake-ds-ref')
dc_info = vmops.DcInfo(ref='dc_ref', name='name',
vmFolder='vmFolder')
dc_info = ds_util.DcInfo(ref='dc_ref', name='name',
vmFolder='vmFolder')
self._get_timestamp_called = 0
self._imagecache.originals = set(['fake-image-1', 'fake-image-2',
'fake-image-3', 'fake-image-4'])
@ -273,7 +272,7 @@ class ImageCacheManagerTestCase(test.NoDBTestCase):
for instance in instances]
self.images = set(['1', '2'])
datastore = ds_obj.Datastore(name='ds', ref='fake-ds-ref')
dc_info = vmops.DcInfo(ref='dc_ref', name='name',
vmFolder='vmFolder')
dc_info = ds_util.DcInfo(ref='dc_ref', name='name',
vmFolder='vmFolder')
datastores_info = [(datastore, dc_info)]
self._imagecache.update('context', all_instances, datastores_info)

View File

@ -58,6 +58,7 @@ class DsPathMatcher(object):
class VMwareVMOpsTestCase(test.NoDBTestCase):
def setUp(self):
super(VMwareVMOpsTestCase, self).setUp()
ds_util.dc_cache_reset()
vmwareapi_fake.reset()
stubs.set_stubs(self.stubs)
self.flags(enabled=True, group='vnc')
@ -74,7 +75,7 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
ref=fake_ds_ref, name='fake_ds',
capacity=10 * units.Gi,
freespace=10 * units.Gi)
self._dc_info = vmops.DcInfo(
self._dc_info = ds_util.DcInfo(
ref='fake_dc_ref', name='fake_dc',
vmFolder='fake_vm_folder')
cluster = vmwareapi_fake.create_cluster('fake_cluster', fake_ds_ref)
@ -179,7 +180,7 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
ds_ref = mock.Mock()
ds_ref.value = 1
dc_ref = mock.Mock()
ops._datastore_dc_mapping[ds_ref.value] = vmops.DcInfo(
ds_util._DS_DC_MAPPING[ds_ref.value] = ds_util.DcInfo(
ref=dc_ref,
name='fake-name',
vmFolder='fake-folder')
@ -384,7 +385,7 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
dc_info = _vcvmops.get_datacenter_ref_and_name(instance_ds_ref)
if ds_ref:
self.assertEqual(1, len(_vcvmops._datastore_dc_mapping))
self.assertEqual(1, len(ds_util._DS_DC_MAPPING))
calls = [mock.call(vim_util, "get_objects", "Datacenter",
["name", "datastore", "vmFolder"]),
mock.call(vutil, 'continue_retrieval',
@ -587,8 +588,8 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
'fake-disk',
'fake-capacity',
device)
dc_info = vmops.DcInfo(ref='fake_ref', name='fake',
vmFolder='fake_folder')
dc_info = ds_util.DcInfo(ref='fake_ref', name='fake',
vmFolder='fake_folder')
extra_specs = vm_util.ExtraSpecs()
fake_get_extra_specs.return_value = extra_specs
with contextlib.nested(
@ -707,8 +708,8 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
'fake-disk',
self._instance.root_gb * units.Gi,
device)
dc_info = vmops.DcInfo(ref='fake_ref', name='fake',
vmFolder='fake_folder')
dc_info = ds_util.DcInfo(ref='fake_ref', name='fake',
vmFolder='fake_folder')
with mock.patch.object(self._vmops, 'get_datacenter_ref_and_name',
return_value=dc_info) as fake_get_dc_ref_and_name:
self._vmops._volumeops = mock.Mock()
@ -776,8 +777,8 @@ class VMwareVMOpsTestCase(test.NoDBTestCase):
'fake-disk',
'fake-capacity',
device)
dc_info = vmops.DcInfo(ref='fake_ref', name='fake',
vmFolder='fake_folder')
dc_info = ds_util.DcInfo(ref='fake_ref', name='fake',
vmFolder='fake_folder')
with contextlib.nested(
mock.patch.object(self._vmops, 'get_datacenter_ref_and_name',
return_value=dc_info),

View File

@ -15,6 +15,7 @@
"""
Datastore utility functions
"""
import collections
from oslo_log import log as logging
from oslo_vmware import exceptions as vexc
@ -35,6 +36,14 @@ ALL_SUPPORTED_DS_TYPES = frozenset([constants.DATASTORE_TYPE_VMFS,
constants.DATASTORE_TYPE_VSAN])
DcInfo = collections.namedtuple('DcInfo',
['ref', 'name', 'vmFolder'])
# A cache for datastore/datacenter mappings. The key will be
# the datastore moref. The value will the the DcInfo object.
_DS_DC_MAPPING = {}
def _select_datastore(session, data_stores, best_match, datastore_regex=None,
storage_policy=None,
allowed_ds_types=ALL_SUPPORTED_DS_TYPES):
@ -436,3 +445,42 @@ def _filter_datastores_matching_storage_policy(session, data_stores,
return data_stores
LOG.error(_LE("Unable to retrieve storage policy with name %s"),
storage_policy)
def _update_datacenter_cache_from_objects(session, dcs):
"""Updates the datastore/datacenter cache."""
while dcs:
for dco in dcs.objects:
dc_ref = dco.obj
ds_refs = []
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:
_DS_DC_MAPPING[ds_ref] = DcInfo(ref=dc_ref, name=name,
vmFolder=vmFolder)
dcs = session._call_method(vutil, 'continue_retrieval', dcs)
def get_dc_info(session, ds_ref):
"""Get the datacenter name and the reference."""
dc_info = _DS_DC_MAPPING.get(ds_ref.value)
if not dc_info:
dcs = session._call_method(vim_util, "get_objects",
"Datacenter", ["name", "datastore", "vmFolder"])
_update_datacenter_cache_from_objects(session, dcs)
dc_info = _DS_DC_MAPPING.get(ds_ref.value)
return dc_info
def dc_cache_reset():
global _DS_DC_MAPPING
_DS_DC_MAPPING = {}

View File

@ -88,9 +88,6 @@ VMWARE_POWER_STATES = {
RESIZE_TOTAL_STEPS = 6
DcInfo = collections.namedtuple('DcInfo',
['ref', 'name', 'vmFolder'])
class VirtualMachineInstanceConfigInfo(object):
"""Parameters needed to create and configure a new instance."""
@ -165,7 +162,6 @@ class VMwareVMOps(object):
self._datastore_regex = datastore_regex
self._base_folder = self._get_base_folder()
self._tmp_folder = 'vmware_temp'
self._datastore_dc_mapping = {}
self._datastore_browser_mapping = {}
self._imagecache = imagecache.ImageCacheManager(self._session,
self._base_folder)
@ -1902,39 +1898,9 @@ class VMwareVMOps(object):
vi.root_gb * units.Mi, linked_clone,
disk_io_limits=vi._extra_specs.disk_io_limits)
def _update_datacenter_cache_from_objects(self, dcs):
"""Updates the datastore/datacenter cache."""
while dcs:
for dco in dcs.objects:
dc_ref = dco.obj
ds_refs = []
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)
dcs = self._session._call_method(vutil, 'continue_retrieval',
dcs)
def get_datacenter_ref_and_name(self, ds_ref):
"""Get the datacenter name and the reference."""
dc_info = self._datastore_dc_mapping.get(ds_ref.value)
if not dc_info:
dcs = self._session._call_method(vim_util, "get_objects",
"Datacenter", ["name", "datastore", "vmFolder"])
self._update_datacenter_cache_from_objects(dcs)
dc_info = self._datastore_dc_mapping.get(ds_ref.value)
return dc_info
return ds_util.get_dc_info(self._session, ds_ref)
def list_instances(self):
"""Lists the VM instances that are registered with vCenter cluster."""