From 1bd5f7f3a1c6089d9bd0b8dce0a983f7b2e25e19 Mon Sep 17 00:00:00 2001 From: Lin Tan Date: Mon, 13 Jul 2015 16:26:32 +0800 Subject: [PATCH] Migrate IronicObjectSerializer to subclass from oslo This replace Ironic's IronicObjectSerializer with oslo.versionedobjects's VersionedObjectSerializer. IPA's lookup should not return node as object anymore, because Node object is not Json serializable. So return node as a pure dict. Partial-Bug: #1461239 Change-Id: Ieec505613469536d941e54548cc228e5d05708b0 --- ironic/drivers/modules/agent_base_vendor.py | 2 +- ironic/objects/base.py | 47 ++----------------- .../tests/drivers/test_agent_base_vendor.py | 4 +- ironic/tests/objects/test_objects.py | 10 ---- 4 files changed, 7 insertions(+), 56 deletions(-) diff --git a/ironic/drivers/modules/agent_base_vendor.py b/ironic/drivers/modules/agent_base_vendor.py index 91d4236d12..9d061df8f5 100644 --- a/ironic/drivers/modules/agent_base_vendor.py +++ b/ironic/drivers/modules/agent_base_vendor.py @@ -348,7 +348,7 @@ class BaseAgentVendor(base.VendorInterface): return { 'heartbeat_timeout': CONF.agent.heartbeat_timeout, - 'node': node + 'node': node.as_dict() } def _get_completed_cleaning_command(self, task): diff --git a/ironic/objects/base.py b/ironic/objects/base.py index c2150dd9f2..75aff8c26a 100644 --- a/ironic/objects/base.py +++ b/ironic/objects/base.py @@ -19,7 +19,6 @@ import copy from oslo_context import context from oslo_log import log as logging -import oslo_messaging as messaging from oslo_utils import versionutils from oslo_versionedobjects import base as object_base import six @@ -177,6 +176,7 @@ class IronicObject(object_base.VersionedObjectDictCompat): as appropriate. """ + OBJ_SERIAL_NAMESPACE = 'ironic_object' # Version of this object (see rules above check_object_version()) VERSION = '1.0' @@ -420,48 +420,9 @@ class ObjectListBase(object_base.ObjectListBase): } -class IronicObjectSerializer(messaging.NoOpSerializer): - """A IronicObject-aware Serializer. - - This implements the Oslo Serializer interface and provides the - ability to serialize and deserialize IronicObject entities. Any service - that needs to accept or return IronicObjects as arguments or result values - should pass this to its RpcProxy and RpcDispatcher objects. - """ - - def _process_iterable(self, context, action_fn, values): - """Process an iterable, taking an action on each value. - - :param:context: Request context - :param:action_fn: Action to take on each item in values - :param:values: Iterable container of things to take action on - :returns: A new container of the same type (except set) with - items from values having had action applied. - """ - iterable = values.__class__ - if iterable == set: - # NOTE(danms): A set can't have an unhashable value inside, such as - # a dict. Convert sets to tuples, which is fine, since we can't - # send them over RPC anyway. - iterable = tuple - return iterable([action_fn(context, value) for value in values]) - - def serialize_entity(self, context, entity): - if isinstance(entity, (tuple, list, set)): - entity = self._process_iterable(context, self.serialize_entity, - entity) - elif (hasattr(entity, 'obj_to_primitive') and - callable(entity.obj_to_primitive)): - entity = entity.obj_to_primitive() - return entity - - def deserialize_entity(self, context, entity): - if isinstance(entity, dict) and 'ironic_object.name' in entity: - entity = IronicObject.obj_from_primitive(entity, context=context) - elif isinstance(entity, (tuple, list, set)): - entity = self._process_iterable(context, self.deserialize_entity, - entity) - return entity +class IronicObjectSerializer(object_base.VersionedObjectSerializer): + # Base class to use for object hydration + OBJ_BASE_CLASS = IronicObject def obj_to_primitive(obj): diff --git a/ironic/tests/drivers/test_agent_base_vendor.py b/ironic/tests/drivers/test_agent_base_vendor.py index 13710f91f0..6c64ec7d71 100644 --- a/ironic/tests/drivers/test_agent_base_vendor.py +++ b/ironic/tests/drivers/test_agent_base_vendor.py @@ -111,7 +111,7 @@ class TestBaseAgentVendor(db_base.DbTestCase): find_mock.return_value = self.node with task_manager.acquire(self.context, self.node.uuid) as task: node = self.passthru.lookup(task.context, **kwargs) - self.assertEqual(self.node, node['node']) + self.assertEqual(self.node.as_dict(), node['node']) def test_lookup_v2_missing_inventory(self): with task_manager.acquire(self.context, self.node.uuid) as task: @@ -156,7 +156,7 @@ class TestBaseAgentVendor(db_base.DbTestCase): mock_get_node.return_value = self.node with task_manager.acquire(self.context, self.node.uuid) as task: node = self.passthru.lookup(task.context, **kwargs) - self.assertEqual(self.node, node['node']) + self.assertEqual(self.node.as_dict(), node['node']) mock_get_node.assert_called_once_with(mock.ANY, 'fake uuid') @mock.patch.object(objects.port.Port, 'get_by_address', diff --git a/ironic/tests/objects/test_objects.py b/ironic/tests/objects/test_objects.py index 93eda0ff77..58fa4206e1 100644 --- a/ironic/tests/objects/test_objects.py +++ b/ironic/tests/objects/test_objects.py @@ -471,16 +471,6 @@ class TestObject(_LocalTest, _TestObject): class TestObjectSerializer(test_base.TestCase): - def test_serialize_entity_primitive(self): - ser = base.IronicObjectSerializer() - for thing in (1, 'foo', [1, 2], {'foo': 'bar'}): - self.assertEqual(thing, ser.serialize_entity(None, thing)) - - def test_deserialize_entity_primitive(self): - ser = base.IronicObjectSerializer() - for thing in (1, 'foo', [1, 2], {'foo': 'bar'}): - self.assertEqual(thing, ser.deserialize_entity(None, thing)) - def test_object_serialization(self): ser = base.IronicObjectSerializer() obj = MyObj(self.context)