Serialize the notification payload in json

When a notification payload is passed to the oslo.messaging the
payload must be correctly serialized.

This change encode the payload into json as the old rpc did.

Closes bug: #1279881

Change-Id: I99fc2a4b0e0146c9faa6abeddbd15cb24169e024
This commit is contained in:
Mehdi Abaakouk 2014-02-20 10:25:23 +01:00
parent 9bfb055c7c
commit a83d5f11e4
2 changed files with 14 additions and 2 deletions

View File

@ -31,6 +31,7 @@ from oslo import messaging
import nova.context
import nova.exception
from nova.openstack.common import jsonutils
CONF = cfg.CONF
TRANSPORT = None
@ -60,8 +61,8 @@ def init(conf):
TRANSPORT = messaging.get_transport(conf,
allowed_remote_exmods=exmods,
aliases=TRANSPORT_ALIASES)
NOTIFIER = messaging.Notifier(TRANSPORT,
serializer=RequestContextSerializer(None))
serializer = RequestContextSerializer(JsonPayloadSerializer())
NOTIFIER = messaging.Notifier(TRANSPORT, serializer=serializer)
def cleanup():
@ -88,6 +89,12 @@ def get_allowed_exmods():
return ALLOWED_EXMODS + EXTRA_EXMODS
class JsonPayloadSerializer(messaging.NoOpSerializer):
@staticmethod
def serialize_entity(context, entity):
return jsonutils.to_primitive(entity, convert_instances=True)
class RequestContextSerializer(messaging.Serializer):
def __init__(self, base):

View File

@ -15,6 +15,7 @@
import collections
import functools
import anyjson
from oslo import messaging
from nova import rpc
@ -50,6 +51,10 @@ class FakeNotifier(object):
def _notify(self, priority, ctxt, event_type, payload):
payload = self._serializer.serialize_entity(ctxt, payload)
# NOTE(sileht): simulate the kombu serializer
# this permit to raise an exception if something have not
# been serialized correctly
anyjson.serialize(payload)
msg = FakeMessage(self.publisher_id, priority, event_type, payload)
NOTIFICATIONS.append(msg)