summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Kulik <johannes.kulik@sap.com>2021-04-16 11:01:24 +0200
committerJohannes Kulik <johannes.kulik@sap.com>2021-04-16 11:05:02 +0200
commit4f1608846265ef76b4aad7922b3f43ed766bdee7 (patch)
tree4c7add4fd9b30a5fb7c3424f30d3da0ea6afe2c0
parent6d2f6dd50d4525e5d920dbf21f64d884af2aeca6 (diff)
downloadoslo-vmware-4f1608846265ef76b4aad7922b3f43ed766bdee7.tar.gz
Add serialize_object() helper function
This function converts a SUDS object to a dictionary. Originally implemented in Nova as "object_to_dict()", this function moves to oslo.vmware to stop leaking the abstraction around the backing SOAP library into depending projects. This is especially necessary since we want to switch the backing SOAP library in [1]. [1] https://specs.openstack.org/openstack/oslo-specs/specs/victoria/oslo-vmware-soap-library-switch.html Change-Id: Ie1d42609104e604f9386c1b1a46be7dcd286e855
-rw-r--r--oslo_vmware/tests/test_vim_util.py30
-rw-r--r--oslo_vmware/vim_util.py18
2 files changed, 48 insertions, 0 deletions
diff --git a/oslo_vmware/tests/test_vim_util.py b/oslo_vmware/tests/test_vim_util.py
index 43c02bc..e35294c 100644
--- a/oslo_vmware/tests/test_vim_util.py
+++ b/oslo_vmware/tests/test_vim_util.py
@@ -527,3 +527,33 @@ class VimUtilTest(base.TestCase):
self.assertEqual({"test_name_0": "test_val_0",
"test_name_1": "test_val_1"},
vim_util.propset_dict(mock_propset))
+
+ def test_serialize_object(self):
+ self.assertEqual({}, vim_util.serialize_object({}))
+
+ mobj1 = mock.MagicMock()
+ mobj1.__keylist__ = ['asdf']
+ mobj1.keys = lambda: ['asdf']
+ mobj1.__getitem__.side_effect = [1]
+
+ mobj2 = mock.Mock()
+
+ mobj3 = mock.MagicMock()
+ mobj3.__keylist__ = ['subkey1', 'subkey2']
+ mobj3.keys = lambda: ['subkey1', 'subkey2']
+ mobj3.__getitem__.side_effect = ['subvalue1', True]
+
+ mobj4 = 12
+
+ obj = {
+ 'foo': mobj1,
+ 'bar': [mobj2, mobj3],
+ 'baz': mobj4
+ }
+
+ expected = {
+ 'foo': {'asdf': 1},
+ 'bar': [mobj2, {'subkey1': 'subvalue1', 'subkey2': True}],
+ 'baz': 12
+ }
+ self.assertEqual(expected, vim_util.serialize_object(obj))
diff --git a/oslo_vmware/vim_util.py b/oslo_vmware/vim_util.py
index b2c9d2c..945c98a 100644
--- a/oslo_vmware/vim_util.py
+++ b/oslo_vmware/vim_util.py
@@ -694,3 +694,21 @@ def storage_placement_spec(client_factory,
spec.resourcePool = res_pool_ref
spec.host = host_ref
return spec
+
+
+def serialize_object(obj):
+ """Convert Suds object into serializable format - a dict."""
+ d = {}
+ for k, v in dict(obj).items():
+ if hasattr(v, '__keylist__'):
+ d[k] = serialize_object(v)
+ elif isinstance(v, list):
+ d[k] = []
+ for item in v:
+ if hasattr(item, '__keylist__'):
+ d[k].append(serialize_object(item))
+ else:
+ d[k].append(item)
+ else:
+ d[k] = v
+ return d