diff options
author | Johannes Kulik <johannes.kulik@sap.com> | 2021-04-16 11:01:24 +0200 |
---|---|---|
committer | Johannes Kulik <johannes.kulik@sap.com> | 2021-04-16 11:05:02 +0200 |
commit | 4f1608846265ef76b4aad7922b3f43ed766bdee7 (patch) | |
tree | 4c7add4fd9b30a5fb7c3424f30d3da0ea6afe2c0 | |
parent | 6d2f6dd50d4525e5d920dbf21f64d884af2aeca6 (diff) | |
download | oslo-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.py | 30 | ||||
-rw-r--r-- | oslo_vmware/vim_util.py | 18 |
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 |