summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oslo_vmware/api.py2
-rw-r--r--oslo_vmware/dvs_util.py2
-rw-r--r--oslo_vmware/pbm.py6
-rw-r--r--oslo_vmware/service.py5
-rw-r--r--oslo_vmware/tests/objects/test_datastore.py9
-rw-r--r--oslo_vmware/tests/test_api.py3
-rw-r--r--oslo_vmware/tests/test_dvs_util.py5
-rw-r--r--oslo_vmware/tests/test_pbm.py9
-rw-r--r--oslo_vmware/tests/test_service.py44
-rw-r--r--oslo_vmware/tests/test_vim_util.py9
-rw-r--r--oslo_vmware/vim_util.py40
-rw-r--r--releasenotes/notes/bp-oslo-vmware-soap-library-switch-helper-functions-21330be61cf7922a.yaml9
12 files changed, 97 insertions, 46 deletions
diff --git a/oslo_vmware/api.py b/oslo_vmware/api.py
index 6e18e6d..b286c71 100644
--- a/oslo_vmware/api.py
+++ b/oslo_vmware/api.py
@@ -424,7 +424,7 @@ class VMwareAPISession(object):
"task: %s.",
task)
else:
- task_detail = {'id': task.value}
+ task_detail = {'id': vim_util.get_moref_value(task)}
# some internal tasks do not have 'name' set
if getattr(task_info, 'name', None):
task_detail['name'] = task_info.name
diff --git a/oslo_vmware/dvs_util.py b/oslo_vmware/dvs_util.py
index 9ee54dd..e0b724d 100644
--- a/oslo_vmware/dvs_util.py
+++ b/oslo_vmware/dvs_util.py
@@ -112,7 +112,7 @@ def add_port_group(session, dvs_moref, name, vlan_id=None,
task_info = session.wait_for_task(task)
LOG.info("%(name)s create on %(dvs)s with %(value)s.",
{'name': name,
- 'dvs': dvs_moref.value,
+ 'dvs': vim_util.get_moref_value(dvs_moref),
'value': task_info.result.value})
return task_info.result
diff --git a/oslo_vmware/pbm.py b/oslo_vmware/pbm.py
index c0a92ab..84c6d3a 100644
--- a/oslo_vmware/pbm.py
+++ b/oslo_vmware/pbm.py
@@ -161,7 +161,7 @@ def convert_datastores_to_hubs(pbm_client_factory, datastores):
hubs = []
for ds in datastores:
hub = pbm_client_factory.create('ns0:PbmPlacementHub')
- hub.hubId = ds.value
+ hub.hubId = vim_util.get_moref_value(ds)
hub.hubType = 'Datastore'
hubs.append(hub)
return hubs
@@ -177,7 +177,7 @@ def filter_datastores_by_hubs(hubs, datastores):
filtered_dss = []
hub_ids = [hub.hubId for hub in hubs]
for ds in datastores:
- if ds.value in hub_ids:
+ if vim_util.get_moref_value(ds) in hub_ids:
filtered_dss.append(ds)
return filtered_dss
@@ -216,7 +216,7 @@ def get_profiles(session, vm):
profile_manager = pbm.service_content.profileManager
object_ref = pbm.client.factory.create('ns0:PbmServerObjectRef')
- object_ref.key = vm.value
+ object_ref.key = vim_util.get_moref_value(vm)
object_ref.objectType = 'virtualMachine'
return session.invoke_api(pbm, 'PbmQueryAssociatedProfile',
diff --git a/oslo_vmware/service.py b/oslo_vmware/service.py
index f61ce60..09702f4 100644
--- a/oslo_vmware/service.py
+++ b/oslo_vmware/service.py
@@ -274,7 +274,8 @@ class Service(object):
f_name = f_type.__class__.__name__
fault_list.append(f_name)
if f_name == exceptions.NO_PERMISSION:
- details['object'] = f_type.object.value
+ details['object'] = \
+ vim_util.get_moref_value(f_type.object)
details['privilegeId'] = f_type.privilegeId
if fault_list:
@@ -349,7 +350,7 @@ class Service(object):
op_id = '%s-%s' % (self.op_id_prefix,
uuidutils.generate_uuid())
LOG.debug('Invoking %s.%s with opID=%s',
- managed_object._type,
+ vim_util.get_moref_type(managed_object),
attr_name,
op_id)
self._set_soap_headers(op_id)
diff --git a/oslo_vmware/tests/objects/test_datastore.py b/oslo_vmware/tests/objects/test_datastore.py
index 68cc0ea..991c746 100644
--- a/oslo_vmware/tests/objects/test_datastore.py
+++ b/oslo_vmware/tests/objects/test_datastore.py
@@ -179,7 +179,8 @@ class DatastoreClusterTestCase(base.TestCase):
dsc_moid = 'group-p123'
dsc_ref, dsc_name = datastore.get_dsc_ref_and_name(session, dsc_moid)
self.assertEqual((dsc_moid, 'StoragePod'),
- (dsc_ref.value, dsc_ref._type))
+ (vim_util.get_moref_value(dsc_ref),
+ vim_util.get_moref_type(dsc_ref)))
self.assertEqual('ds-cluster', dsc_name)
session.invoke_api.assert_called_once_with(vim_util,
'get_object_property',
@@ -205,8 +206,10 @@ class DatastoreClusterTestCase(base.TestCase):
session.invoke_api.return_value = retrieve_result
name = 'ds-cluster'
dsc_ref, dsc_name = datastore.get_dsc_ref_and_name(session, name)
- self.assertEqual((pod_ref.value, pod_ref._type),
- (dsc_ref.value, dsc_ref._type))
+ self.assertEqual((vim_util.get_moref_value(pod_ref),
+ vim_util.get_moref_type(pod_ref)),
+ (vim_util.get_moref_value(dsc_ref),
+ vim_util.get_moref_type(dsc_ref)))
class DatastorePathTestCase(base.TestCase):
diff --git a/oslo_vmware/tests/test_api.py b/oslo_vmware/tests/test_api.py
index 499436d..af2a42d 100644
--- a/oslo_vmware/tests/test_api.py
+++ b/oslo_vmware/tests/test_api.py
@@ -587,8 +587,7 @@ class VMwareAPISessionTest(base.TestCase):
with (
mock.patch.object(api_session, 'invoke_api', fake_invoke_api)
):
- fake_task = mock.Mock()
- fake_task.value = 'task-1'
+ fake_task = vim_util.get_moref('Task', 'task-1')
ctx = mock.Mock()
self.assertRaises(expected_exception,
api_session._poll_task,
diff --git a/oslo_vmware/tests/test_dvs_util.py b/oslo_vmware/tests/test_dvs_util.py
index 8382a40..6403a47 100644
--- a/oslo_vmware/tests/test_dvs_util.py
+++ b/oslo_vmware/tests/test_dvs_util.py
@@ -32,8 +32,9 @@ class DvsUtilTest(base.TestCase):
def test_get_dvs_moref(self):
moref = dvs_util.get_dvs_moref('dvs-123')
- self.assertEqual('dvs-123', moref.value)
- self.assertEqual('VmwareDistributedVirtualSwitch', moref._type)
+ self.assertEqual('dvs-123', vim_util.get_moref_value(moref))
+ self.assertEqual('VmwareDistributedVirtualSwitch',
+ vim_util.get_moref_type(moref))
def test_get_vlan_spec(self):
session = mock.Mock()
diff --git a/oslo_vmware/tests/test_pbm.py b/oslo_vmware/tests/test_pbm.py
index 2a3b29f..e4dcd10 100644
--- a/oslo_vmware/tests/test_pbm.py
+++ b/oslo_vmware/tests/test_pbm.py
@@ -23,6 +23,7 @@ import urllib.request as urllib
from oslo_vmware import pbm
from oslo_vmware.tests import base
+from oslo_vmware import vim_util
class PBMUtilityTest(base.TestCase):
@@ -108,8 +109,7 @@ class PBMUtilityTest(base.TestCase):
profile=profile_id)
def _create_datastore(self, value):
- ds = mock.Mock()
- ds.value = value
+ ds = vim_util.get_moref(value, 'Datastore')
return ds
def test_convert_datastores_to_hubs(self):
@@ -144,7 +144,8 @@ class PBMUtilityTest(base.TestCase):
filtered_ds = pbm.filter_datastores_by_hubs(hubs, datastores)
self.assertEqual(len(hubs), len(filtered_ds))
- filtered_ds_values = [ds.value for ds in filtered_ds]
+ filtered_ds_values = [vim_util.get_moref_value(ds)
+ for ds in filtered_ds]
self.assertEqual(set(hub_ids), set(filtered_ds_values))
def test_get_pbm_wsdl_location(self):
@@ -180,7 +181,7 @@ class PBMUtilityTest(base.TestCase):
session.invoke_api.return_value = profile_id
value = 'vm-1'
- vm = mock.Mock(value=value)
+ vm = vim_util.get_moref(value, 'VirtualMachine')
ret = pbm.get_profiles(session, vm)
self.assertEqual(profile_id, ret)
diff --git a/oslo_vmware/tests/test_service.py b/oslo_vmware/tests/test_service.py
index c3cc23f..8fc9945 100644
--- a/oslo_vmware/tests/test_service.py
+++ b/oslo_vmware/tests/test_service.py
@@ -95,8 +95,8 @@ class ServiceTest(base.TestCase):
resp = mock.Mock()
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
return resp
svc_obj = service.Service()
@@ -110,8 +110,8 @@ class ServiceTest(base.TestCase):
managed_object = 'Datacenter'
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
return None
svc_obj = service.Service()
@@ -129,8 +129,8 @@ class ServiceTest(base.TestCase):
doc = mock.Mock()
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
fault = mock.Mock(faultstring="MyFault")
fault_children = mock.Mock()
@@ -180,8 +180,8 @@ class ServiceTest(base.TestCase):
doc = mock.Mock()
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
fault = mock.Mock(faultstring="MyFault")
fault_children = mock.Mock()
@@ -215,8 +215,8 @@ class ServiceTest(base.TestCase):
doc = mock.Mock()
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
fault = mock.Mock(faultstring="MyFault")
fault_children = mock.Mock()
@@ -257,8 +257,8 @@ class ServiceTest(base.TestCase):
managed_object = 'VirtualMachine'
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
raise httplib.CannotSendRequest()
svc_obj = service.Service()
@@ -273,8 +273,8 @@ class ServiceTest(base.TestCase):
managed_object = 'VirtualMachine'
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
raise httplib.ResponseNotReady()
svc_obj = service.Service()
@@ -289,8 +289,8 @@ class ServiceTest(base.TestCase):
managed_object = 'VirtualMachine'
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
raise httplib.CannotSendHeader()
svc_obj = service.Service()
@@ -305,8 +305,8 @@ class ServiceTest(base.TestCase):
managed_object = 'VirtualMachine'
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
raise requests.ConnectionError()
svc_obj = service.Service()
@@ -321,8 +321,8 @@ class ServiceTest(base.TestCase):
managed_object = 'VirtualMachine'
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
raise requests.HTTPError()
svc_obj = service.Service()
@@ -344,8 +344,8 @@ class ServiceTest(base.TestCase):
managed_object = 'VirtualMachine'
def side_effect(mo, **kwargs):
- self.assertEqual(managed_object, mo._type)
- self.assertEqual(managed_object, mo.value)
+ self.assertEqual(managed_object, vim_util.get_moref_type(mo))
+ self.assertEqual(managed_object, vim_util.get_moref_value(mo))
raise Exception(message)
svc_obj = service.Service()
diff --git a/oslo_vmware/tests/test_vim_util.py b/oslo_vmware/tests/test_vim_util.py
index e73bf6e..43c02bc 100644
--- a/oslo_vmware/tests/test_vim_util.py
+++ b/oslo_vmware/tests/test_vim_util.py
@@ -27,8 +27,8 @@ class VimUtilTest(base.TestCase):
def test_get_moref(self):
moref = vim_util.get_moref("vm-0", "VirtualMachine")
- self.assertEqual("vm-0", moref.value)
- self.assertEqual("VirtualMachine", moref._type)
+ self.assertEqual("vm-0", vim_util.get_moref_value(moref))
+ self.assertEqual("VirtualMachine", vim_util.get_moref_type(moref))
def test_build_selection_spec(self):
client_factory = mock.Mock()
@@ -214,8 +214,7 @@ class VimUtilTest(base.TestCase):
@mock.patch('oslo_vmware.vim_util.cancel_retrieval')
def test_get_object_properties(self, cancel_retrieval):
vim = mock.Mock()
- moref = mock.Mock()
- moref._type = "VirtualMachine"
+ moref = vim_util.get_moref('fake-ref', 'VirtualMachine')
retrieve_result = mock.Mock()
def vim_RetrievePropertiesEx_side_effect(pc, specSet, options,
@@ -231,7 +230,7 @@ class VimUtilTest(base.TestCase):
prop_spec = propSet[0]
self.assertTrue(prop_spec.all)
self.assertEqual(['name'], prop_spec.pathSet)
- self.assertEqual(moref._type, prop_spec.type)
+ self.assertEqual(vim_util.get_moref_type(moref), prop_spec.type)
objSet = property_filter_spec.objectSet
self.assertEqual(1, len(objSet))
diff --git a/oslo_vmware/vim_util.py b/oslo_vmware/vim_util.py
index 85a7fd8..b2c9d2c 100644
--- a/oslo_vmware/vim_util.py
+++ b/oslo_vmware/vim_util.py
@@ -37,6 +37,44 @@ def get_moref(value, type_):
return moref
+def get_moref_value(moref):
+ """Get the value/id of a managed object reference
+
+ This function accepts a string representation of a ManagedObjectReference
+ like `VirtualMachine:vm-123` or only `vm-123`, but is also able to extract
+ it from the actual object as returned by the API.
+ """
+ if isinstance(moref, str):
+ # handle strings like VirtualMachine:vm-12312, but also vm-123123
+ if ':' in moref:
+ splits = moref.split(':')
+ return splits[1]
+ return moref
+
+ # assume it's a ManagedObjectReference object as created by `get_moref()`
+ # or returned by a request
+ return moref.value
+
+
+def get_moref_type(moref):
+ """Get the type of a managed object reference
+
+ This function accepts a string representation of a ManagedObjectReference
+ like `VirtualMachine:vm-123`, but is also able to extract it from the
+ actual object as returned by the API.
+ """
+ if isinstance(moref, str):
+ # handle strings like VirtualMachine:vm-12312
+ if ':' in moref:
+ splits = moref.split(':')
+ return splits[0]
+ return None
+
+ # assume it's a ManagedObjectReference object as created by `get_moref()`
+ # or returned by a request
+ return moref._type
+
+
def build_selection_spec(client_factory, name):
"""Builds the selection spec.
@@ -309,7 +347,7 @@ def get_object_properties(vim, moref, properties_to_collect, skip_op_id=False):
len(properties_to_collect) == 0)
property_spec = build_property_spec(
client_factory,
- type_=moref._type,
+ type_=get_moref_type(moref),
properties_to_collect=properties_to_collect,
all_properties=all_properties)
object_spec = build_object_spec(client_factory, moref, [])
diff --git a/releasenotes/notes/bp-oslo-vmware-soap-library-switch-helper-functions-21330be61cf7922a.yaml b/releasenotes/notes/bp-oslo-vmware-soap-library-switch-helper-functions-21330be61cf7922a.yaml
new file mode 100644
index 0000000..f2ef8d2
--- /dev/null
+++ b/releasenotes/notes/bp-oslo-vmware-soap-library-switch-helper-functions-21330be61cf7922a.yaml
@@ -0,0 +1,9 @@
+---
+upgrade:
+ - |
+ ``ManagedObjectReference``'s ``value`` and ``_type`` attributes must not be
+ used anymore in depending projects. Instead, ``vim_util.get_moref_value()``
+ and ``vim_util.get_moref_type()`` have to be used, because with
+ `this spec <https://specs.openstack.org/openstack/oslo-specs/specs/victoria/oslo-vmware-soap-library-switch.html>`_
+ we switch the backing SOAP library and different libraries have different
+ representations of those attributes.