Make the ActionContext serializable

Currently if Mistral needs to pass the ActionContext  via it's internal
rpc calls it wont be serialised. This change should have no end-user
impact, but makes it easier for Mistral to use internally.

Change-Id: I238355d52c77d622740527e43ddb2b7484cc58db
This commit is contained in:
Dougal Matthews 2018-07-20 11:20:23 +01:00
parent d190925999
commit 9f5162fa5a
2 changed files with 43 additions and 1 deletions

View File

@ -12,8 +12,10 @@
import warnings
from mistral_lib import serialization
class ActionContext(object):
class ActionContext(serialization.MistralSerializable):
def __init__(self, security_ctx=None, execution_ctx=None):
self.security = security_ctx
@ -86,3 +88,19 @@ class ExecutionContext(object):
def task_id(self):
self._deprecate_task_id_warning()
return self.task_execution_id
class ActionContextSerializer(serialization.DictBasedSerializer):
def serialize_to_dict(self, entity):
return {
'security': vars(entity.security),
'execution': vars(entity.execution),
}
def deserialize_from_dict(self, entity_dict):
return ActionContext(
security_ctx=SecurityContext(**entity_dict['security']),
execution_ctx=ExecutionContext(**entity_dict['execution'])
)
serialization.register_serializer(ActionContext, ActionContextSerializer())

View File

@ -69,3 +69,27 @@ class TestActionsBase(tests_base.TestCase):
old = getattr(ctx, deprecated)
new = getattr(ctx.security, deprecated)
self.assertEqual(old, new)
class TestActionContextSerializer(tests_base.TestCase):
def test_serialization(self):
ctx = _fake_context()
serialiser = context.ActionContextSerializer()
dict_ctx = serialiser.serialize_to_dict(ctx)
self.assertEqual(dict_ctx['security'], vars(ctx.security))
self.assertEqual(dict_ctx['execution'], vars(ctx.execution))
def test_deserialization(self):
ctx = _fake_context()
serialiser = context.ActionContextSerializer()
dict_ctx = serialiser.serialize_to_dict(ctx)
ctx_2 = serialiser.deserialize_from_dict(dict_ctx)
self.assertEqual(ctx.security.auth_uri, ctx_2.security.auth_uri)
self.assertEqual(
ctx.execution.workflow_name,
ctx_2.execution.workflow_name)