From 4f1608846265ef76b4aad7922b3f43ed766bdee7 Mon Sep 17 00:00:00 2001 From: Johannes Kulik Date: Fri, 16 Apr 2021 11:01:24 +0200 Subject: [PATCH] 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 --- oslo_vmware/tests/test_vim_util.py | 30 ++++++++++++++++++++++++++++++ oslo_vmware/vim_util.py | 18 ++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/oslo_vmware/tests/test_vim_util.py b/oslo_vmware/tests/test_vim_util.py index 43c02bc1..e35294cd 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 b2c9d2c7..945c98a0 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