From 0997ad15fcaff33443d31d1dc26516b3aed8a802 Mon Sep 17 00:00:00 2001 From: Johannes Kulik Date: Fri, 16 Apr 2021 12:45:40 +0200 Subject: [PATCH] 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 --- lower-constraints.txt | 2 +- nova/virt/vmwareapi/driver.py | 3 ++- nova/virt/vmwareapi/ds_util.py | 8 ++++---- nova/virt/vmwareapi/imagecache.py | 4 ++-- nova/virt/vmwareapi/vm_util.py | 9 ++++++--- nova/virt/vmwareapi/vmops.py | 11 +++++++---- nova/virt/vmwareapi/volumeops.py | 2 +- test-requirements.txt | 2 +- 8 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lower-constraints.txt b/lower-constraints.txt index 4b376a433a1c..4bcb6015ecd6 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -85,7 +85,7 @@ oslo.service==2.5.0 oslo.upgradecheck==1.3.0 oslo.utils==4.8.0 oslo.versionedobjects==1.35.0 -oslo.vmware==2.17.0 +oslo.vmware==3.6.0 oslotest==3.8.0 osprofiler==1.4.0 ovs==2.10.0 diff --git a/nova/virt/vmwareapi/driver.py b/nova/virt/vmwareapi/driver.py index 36671d66de76..6f2451150ffd 100644 --- a/nova/virt/vmwareapi/driver.py +++ b/nova/virt/vmwareapi/driver.py @@ -136,7 +136,8 @@ class VMwareVCDriver(driver.ComputeDriver): "found in vCenter") % self._cluster_name) 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._cluster_ref) self._vmops = vmops.VMwareVMOps(self._session, diff --git a/nova/virt/vmwareapi/ds_util.py b/nova/virt/vmwareapi/ds_util.py index dd52e3627235..35b5f8bfb366 100644 --- a/nova/virt/vmwareapi/ds_util.py +++ b/nova/virt/vmwareapi/ds_util.py @@ -470,7 +470,7 @@ def _update_datacenter_cache_from_objects(session, dcs): if datastore_refs: datastore_refs = datastore_refs.ManagedObjectReference for ds in datastore_refs: - ds_refs.append(ds.value) + ds_refs.append(vutil.get_moref_value(ds)) else: LOG.debug("Datacenter %s doesn't have any datastore " "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): """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: 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) + dc_info = _DS_DC_MAPPING.get(vutil.get_moref_value(ds_ref)) return dc_info @@ -509,6 +509,6 @@ def get_connected_hosts(session, datastore): connected_hosts = [] 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 diff --git a/nova/virt/vmwareapi/imagecache.py b/nova/virt/vmwareapi/imagecache.py index 8345f0ad6e51..01a39bfe0cee 100644 --- a/nova/virt/vmwareapi/imagecache.py +++ b/nova/virt/vmwareapi/imagecache.py @@ -116,12 +116,12 @@ class ImageCacheManager(imagecache.ImageCacheManager): return timeutils.parse_strtime(ts, fmt=TIMESTAMP_FORMAT) 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: ds_browser = vutil.get_object_property(self._session.vim, ds_ref, "browser") - self._ds_browser[ds_ref.value] = ds_browser + self._ds_browser[vutil.get_moref_value(ds_ref)] = ds_browser return ds_browser def _list_datastore_images(self, ds_path, datastore): diff --git a/nova/virt/vmwareapi/vm_util.py b/nova/virt/vmwareapi/vm_util.py index 1baed661973a..2deb9a6c0ce8 100644 --- a/nova/virt/vmwareapi/vm_util.py +++ b/nova/virt/vmwareapi/vm_util.py @@ -1623,15 +1623,18 @@ def create_folder(session, parent_folder_ref, name): """ 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: folder = session._call_method(session.vim, "CreateFolder", parent_folder_ref, name=name) 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: 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'] folder = vutil.get_moref(val, 'Folder') return folder diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index c1c9d4421d78..02ba1371d888 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -1583,8 +1583,9 @@ class VMwareVMOps(object): ds_hosts = self._session._call_method(vutil, 'get_object_property', ds_ref, 'host') 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: - if ds_host.key.value == cluster_host.value: + if ds_host_ref_value == vutil.get_moref_value(cluster_host): return cluster_host def _find_datastore_for_migration(self, instance, vm_ref, cluster_ref, @@ -1604,8 +1605,9 @@ class VMwareVMOps(object): return None # check if the current datastore is connected to the destination # cluster + ds_ref_value = vutil.get_moref_value(ds_ref) 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) if (datastore_regex is None or datastore_regex.match(ds.name)): @@ -1819,13 +1821,14 @@ class VMwareVMOps(object): instance=instance) 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: ds_browser = self._session._call_method(vutil, "get_object_property", ds_ref, "browser") - self._datastore_browser_mapping[ds_ref.value] = ds_browser + self._datastore_browser_mapping[ds_ref_value] = ds_browser return ds_browser def _create_folder_if_missing(self, ds_name, ds_ref, folder): diff --git a/nova/virt/vmwareapi/volumeops.py b/nova/virt/vmwareapi/volumeops.py index eddb7b870511..9accc840de11 100644 --- a/nova/virt/vmwareapi/volumeops.py +++ b/nova/virt/vmwareapi/volumeops.py @@ -300,7 +300,7 @@ class VMwareVolumeOps(object): 'initiator': iqn, 'host': CONF.vmware.host_ip} if vm_ref: - connector['instance'] = vm_ref.value + connector['instance'] = vutil.get_moref_value(vm_ref) return connector def _get_volume_ref(self, volume_ref_name): diff --git a/test-requirements.txt b/test-requirements.txt index 9f695c612463..d1a2ecbe2e01 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -24,4 +24,4 @@ gabbi>=1.35.0 # Apache-2.0 wsgi-intercept>=1.7.0 # MIT License # vmwareapi driver specific dependencies -oslo.vmware>=2.17.0 # Apache-2.0 +oslo.vmware>=3.6.0 # Apache-2.0