vmware: Use oslo.vmware's get_moref_value()

With switching the SOAP library backing oslo.vmware [1], the internal
representation of ManagedObjectReference's attributes changes. To be able
to make the switch without interruption, we introduced helper functions
in oslo.vmware. This commit uses one of those - get_moref_value()
- to make the access to the "value" attribute compatible with both
backing libraries.

Bump oslo.vmware lower-constraint to a version containing the helper
function. We bump one version higher, because we already merged a patch
(I3c769d3499f906b33725171a57313c8ae35b6a1d) that uses the cookiejar
access contained in that version.

[1] https://specs.openstack.org/openstack/oslo-specs/specs/victoria/oslo-vmware-soap-library-switch.html

Change-Id: I48841a777aaa2e515c141857099c16483ab619e0
This commit is contained in:
Johannes Kulik 2021-04-16 12:45:40 +02:00
parent cf4b152b6b
commit 0997ad15fc
8 changed files with 24 additions and 17 deletions

View File

@ -85,7 +85,7 @@ oslo.service==2.5.0
oslo.upgradecheck==1.3.0 oslo.upgradecheck==1.3.0
oslo.utils==4.8.0 oslo.utils==4.8.0
oslo.versionedobjects==1.35.0 oslo.versionedobjects==1.35.0
oslo.vmware==2.17.0 oslo.vmware==3.6.0
oslotest==3.8.0 oslotest==3.8.0
osprofiler==1.4.0 osprofiler==1.4.0
ovs==2.10.0 ovs==2.10.0

View File

@ -136,7 +136,8 @@ class VMwareVCDriver(driver.ComputeDriver):
"found in vCenter") "found in vCenter")
% self._cluster_name) % self._cluster_name)
self._vcenter_uuid = self._get_vcenter_uuid() self._vcenter_uuid = self._get_vcenter_uuid()
self._nodename = self._create_nodename(self._cluster_ref.value) self._nodename = \
self._create_nodename(vim_util.get_moref_value(self._cluster_ref))
self._volumeops = volumeops.VMwareVolumeOps(self._session, self._volumeops = volumeops.VMwareVolumeOps(self._session,
self._cluster_ref) self._cluster_ref)
self._vmops = vmops.VMwareVMOps(self._session, self._vmops = vmops.VMwareVMOps(self._session,

View File

@ -470,7 +470,7 @@ def _update_datacenter_cache_from_objects(session, dcs):
if datastore_refs: if datastore_refs:
datastore_refs = datastore_refs.ManagedObjectReference datastore_refs = datastore_refs.ManagedObjectReference
for ds in datastore_refs: for ds in datastore_refs:
ds_refs.append(ds.value) ds_refs.append(vutil.get_moref_value(ds))
else: else:
LOG.debug("Datacenter %s doesn't have any datastore " LOG.debug("Datacenter %s doesn't have any datastore "
"associated with it, ignoring it", name) "associated with it, ignoring it", name)
@ -481,12 +481,12 @@ def _update_datacenter_cache_from_objects(session, dcs):
def get_dc_info(session, ds_ref): def get_dc_info(session, ds_ref):
"""Get the datacenter name and the reference.""" """Get the datacenter name and the reference."""
dc_info = _DS_DC_MAPPING.get(ds_ref.value) dc_info = _DS_DC_MAPPING.get(vutil.get_moref_value(ds_ref))
if not dc_info: if not dc_info:
dcs = session._call_method(vim_util, "get_objects", dcs = session._call_method(vim_util, "get_objects",
"Datacenter", ["name", "datastore", "vmFolder"]) "Datacenter", ["name", "datastore", "vmFolder"])
_update_datacenter_cache_from_objects(session, dcs) _update_datacenter_cache_from_objects(session, dcs)
dc_info = _DS_DC_MAPPING.get(ds_ref.value) dc_info = _DS_DC_MAPPING.get(vutil.get_moref_value(ds_ref))
return dc_info return dc_info
@ -509,6 +509,6 @@ def get_connected_hosts(session, datastore):
connected_hosts = [] connected_hosts = []
for host_mount in host_mounts.DatastoreHostMount: for host_mount in host_mounts.DatastoreHostMount:
connected_hosts.append(host_mount.key.value) connected_hosts.append(vutil.get_moref_value(host_mount.key))
return connected_hosts return connected_hosts

View File

@ -116,12 +116,12 @@ class ImageCacheManager(imagecache.ImageCacheManager):
return timeutils.parse_strtime(ts, fmt=TIMESTAMP_FORMAT) return timeutils.parse_strtime(ts, fmt=TIMESTAMP_FORMAT)
def _get_ds_browser(self, ds_ref): def _get_ds_browser(self, ds_ref):
ds_browser = self._ds_browser.get(ds_ref.value) ds_browser = self._ds_browser.get(vutil.get_moref_value(ds_ref))
if not ds_browser: if not ds_browser:
ds_browser = vutil.get_object_property(self._session.vim, ds_browser = vutil.get_object_property(self._session.vim,
ds_ref, ds_ref,
"browser") "browser")
self._ds_browser[ds_ref.value] = ds_browser self._ds_browser[vutil.get_moref_value(ds_ref)] = ds_browser
return ds_browser return ds_browser
def _list_datastore_images(self, ds_path, datastore): def _list_datastore_images(self, ds_path, datastore):

View File

@ -1623,15 +1623,18 @@ def create_folder(session, parent_folder_ref, name):
""" """
LOG.debug("Creating folder: %(name)s. Parent ref: %(parent)s.", LOG.debug("Creating folder: %(name)s. Parent ref: %(parent)s.",
{'name': name, 'parent': parent_folder_ref.value}) {'name': name,
'parent': vutil.get_moref_value(parent_folder_ref)})
try: try:
folder = session._call_method(session.vim, "CreateFolder", folder = session._call_method(session.vim, "CreateFolder",
parent_folder_ref, name=name) parent_folder_ref, name=name)
LOG.info("Created folder: %(name)s in parent %(parent)s.", LOG.info("Created folder: %(name)s in parent %(parent)s.",
{'name': name, 'parent': parent_folder_ref.value}) {'name': name,
'parent': vutil.get_moref_value(parent_folder_ref)})
except vexc.DuplicateName as e: except vexc.DuplicateName as e:
LOG.debug("Folder already exists: %(name)s. Parent ref: %(parent)s.", LOG.debug("Folder already exists: %(name)s. Parent ref: %(parent)s.",
{'name': name, 'parent': parent_folder_ref.value}) {'name': name,
'parent': vutil.get_moref_value(parent_folder_ref)})
val = e.details['object'] val = e.details['object']
folder = vutil.get_moref(val, 'Folder') folder = vutil.get_moref(val, 'Folder')
return folder return folder

View File

@ -1583,8 +1583,9 @@ class VMwareVMOps(object):
ds_hosts = self._session._call_method(vutil, 'get_object_property', ds_hosts = self._session._call_method(vutil, 'get_object_property',
ds_ref, 'host') ds_ref, 'host')
for ds_host in ds_hosts.DatastoreHostMount: for ds_host in ds_hosts.DatastoreHostMount:
ds_host_ref_value = vutil.get_moref_value(ds_host.key)
for cluster_host in cluster_hosts.ManagedObjectReference: for cluster_host in cluster_hosts.ManagedObjectReference:
if ds_host.key.value == cluster_host.value: if ds_host_ref_value == vutil.get_moref_value(cluster_host):
return cluster_host return cluster_host
def _find_datastore_for_migration(self, instance, vm_ref, cluster_ref, def _find_datastore_for_migration(self, instance, vm_ref, cluster_ref,
@ -1604,8 +1605,9 @@ class VMwareVMOps(object):
return None return None
# check if the current datastore is connected to the destination # check if the current datastore is connected to the destination
# cluster # cluster
ds_ref_value = vutil.get_moref_value(ds_ref)
for datastore in cluster_datastores.ManagedObjectReference: for datastore in cluster_datastores.ManagedObjectReference:
if datastore.value == ds_ref.value: if vutil.get_moref_value(datastore) == ds_ref_value:
ds = ds_obj.get_datastore_by_ref(self._session, ds_ref) ds = ds_obj.get_datastore_by_ref(self._session, ds_ref)
if (datastore_regex is None or if (datastore_regex is None or
datastore_regex.match(ds.name)): datastore_regex.match(ds.name)):
@ -1819,13 +1821,14 @@ class VMwareVMOps(object):
instance=instance) instance=instance)
def _get_ds_browser(self, ds_ref): def _get_ds_browser(self, ds_ref):
ds_browser = self._datastore_browser_mapping.get(ds_ref.value) ds_ref_value = vutil.get_moref_value(ds_ref)
ds_browser = self._datastore_browser_mapping.get(ds_ref_value)
if not ds_browser: if not ds_browser:
ds_browser = self._session._call_method(vutil, ds_browser = self._session._call_method(vutil,
"get_object_property", "get_object_property",
ds_ref, ds_ref,
"browser") "browser")
self._datastore_browser_mapping[ds_ref.value] = ds_browser self._datastore_browser_mapping[ds_ref_value] = ds_browser
return ds_browser return ds_browser
def _create_folder_if_missing(self, ds_name, ds_ref, folder): def _create_folder_if_missing(self, ds_name, ds_ref, folder):

View File

@ -300,7 +300,7 @@ class VMwareVolumeOps(object):
'initiator': iqn, 'initiator': iqn,
'host': CONF.vmware.host_ip} 'host': CONF.vmware.host_ip}
if vm_ref: if vm_ref:
connector['instance'] = vm_ref.value connector['instance'] = vutil.get_moref_value(vm_ref)
return connector return connector
def _get_volume_ref(self, volume_ref_name): def _get_volume_ref(self, volume_ref_name):

View File

@ -24,4 +24,4 @@ gabbi>=1.35.0 # Apache-2.0
wsgi-intercept>=1.7.0 # MIT License wsgi-intercept>=1.7.0 # MIT License
# vmwareapi driver specific dependencies # vmwareapi driver specific dependencies
oslo.vmware>=2.17.0 # Apache-2.0 oslo.vmware>=3.6.0 # Apache-2.0