Merge "VMware: create method for getting datacenter from datastore"
This commit is contained in:
commit
e6fc392347
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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 = {}
|
||||
|
|
|
@ -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."""
|
||||
|
|
Loading…
Reference in New Issue