From dcb68d436edbbe57dac6a2a9dd8b36cbc42af867 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Fri, 14 Jun 2013 13:34:14 -0700 Subject: Fill context on objects in lists This fixes object lists to not contain orphaned objects after making an RPC trip. Fixes bug 1191113 Change-Id: Ia90321da2f480835e1c7213a52eb5731840dbd6a --- nova/objects/base.py | 12 ++++++++---- nova/tests/objects/test_instance.py | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/nova/objects/base.py b/nova/objects/base.py index 398e70ce9..008ea667c 100644 --- a/nova/objects/base.py +++ b/nova/objects/base.py @@ -236,7 +236,7 @@ class NovaObject(object): return value @classmethod - def obj_from_primitive(cls, primitive): + def obj_from_primitive(cls, primitive, context=None): """Simple base-case hydration. This calls self._attr_from_primitive() for each item in fields. @@ -252,6 +252,7 @@ class NovaObject(object): objdata = primitive['nova_object.data'] objclass = cls.obj_class_from_name(objname, objver) self = objclass() + self._context = context for name in self.fields: if name in objdata: setattr(self, name, @@ -409,7 +410,11 @@ class ObjectListBase(object): def _attr_objects_from_primitive(self, value): """Deserialization of object list.""" - return [NovaObject.obj_from_primitive(x) for x in value] + objects = [] + for entity in value: + obj = NovaObject.obj_from_primitive(entity, context=self._context) + objects.append(obj) + return objects class NovaObjectSerializer(nova.openstack.common.rpc.serializer.Serializer): @@ -428,6 +433,5 @@ class NovaObjectSerializer(nova.openstack.common.rpc.serializer.Serializer): def deserialize_entity(self, context, entity): if isinstance(entity, dict) and 'nova_object.name' in entity: - entity = NovaObject.obj_from_primitive(entity) - entity._context = context + entity = NovaObject.obj_from_primitive(entity, context=context) return entity diff --git a/nova/tests/objects/test_instance.py b/nova/tests/objects/test_instance.py index fa0a536fd..a55c5d502 100644 --- a/nova/tests/objects/test_instance.py +++ b/nova/tests/objects/test_instance.py @@ -284,6 +284,7 @@ class _TestInstanceListObject(object): self.assertTrue(isinstance(inst_list.objects[i], instance.Instance)) self.assertEqual(inst_list.objects[i].uuid, fakes[i]['uuid']) + self.assertEqual(inst_list.objects[i]._context, ctxt) self.assertEqual(inst_list.obj_what_changed(), set()) self.assertRemotes() -- cgit