summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-06-27 07:22:44 +0000
committerGerrit Code Review <review@openstack.org>2013-06-27 07:22:44 +0000
commit5659a60ce64b8fc3feea525945262f1249bf3130 (patch)
tree907c3dd7d7f123d1e3b08318f0422661dbe937c5 /nova
parent6aff2c92b366bf4b0c3c6ef72fec5cdde3b7381c (diff)
parent68cb4d53385821c3ffdc40c299a77d11a7f98f27 (diff)
downloadnova-5659a60ce64b8fc3feea525945262f1249bf3130.tar.gz
nova-5659a60ce64b8fc3feea525945262f1249bf3130.tar.xz
nova-5659a60ce64b8fc3feea525945262f1249bf3130.zip
Merge "Add obj_to_primitive() to recursively primitiveize objects"
Diffstat (limited to 'nova')
-rw-r--r--nova/objects/base.py17
-rw-r--r--nova/tests/objects/test_objects.py25
2 files changed, 42 insertions, 0 deletions
diff --git a/nova/objects/base.py b/nova/objects/base.py
index 147d55c23..4f973de0c 100644
--- a/nova/objects/base.py
+++ b/nova/objects/base.py
@@ -464,3 +464,20 @@ class NovaObjectSerializer(nova.openstack.common.rpc.serializer.Serializer):
entity = self._process_iterable(context, self.deserialize_entity,
entity)
return entity
+
+
+def obj_to_primitive(obj):
+ """Recrusively turn an object into a python primitive.
+
+ A NovaObject becomes a dict, and anything that implements ObjectListBase
+ becomes a list.
+ """
+ if isinstance(obj, ObjectListBase):
+ return [obj_to_primitive(x) for x in obj]
+ elif isinstance(obj, NovaObject):
+ result = {}
+ for key, value in obj.iteritems():
+ result[key] = obj_to_primitive(value)
+ return result
+ else:
+ return obj
diff --git a/nova/tests/objects/test_objects.py b/nova/tests/objects/test_objects.py
index 40ad8bb81..03a270386 100644
--- a/nova/tests/objects/test_objects.py
+++ b/nova/tests/objects/test_objects.py
@@ -178,6 +178,31 @@ class TestUtils(test.TestCase):
self.assertEqual(utils.dt_deserializer(None, None), None)
self.assertRaises(ValueError, utils.dt_deserializer, None, 'foo')
+ def test_obj_to_primitive_list(self):
+ class MyList(base.ObjectListBase, base.NovaObject):
+ pass
+ mylist = MyList()
+ mylist.objects = [1, 2, 3]
+ self.assertEqual([1, 2, 3], base.obj_to_primitive(mylist))
+
+ def test_obj_to_primitive_dict(self):
+ myobj = MyObj()
+ myobj.foo = 1
+ myobj.bar = 'foo'
+ self.assertEqual({'foo': 1, 'bar': 'foo'},
+ base.obj_to_primitive(myobj))
+
+ def test_obj_to_primitive_recursive(self):
+ class MyList(base.ObjectListBase, base.NovaObject):
+ pass
+
+ mylist = MyList()
+ mylist.objects = [MyObj(), MyObj()]
+ for i, value in enumerate(mylist):
+ value.foo = i
+ self.assertEqual([{'foo': 0}, {'foo': 1}],
+ base.obj_to_primitive(mylist))
+
class _BaseTestCase(test.TestCase):
def setUp(self):