From 11f236a785a13cdf90f4feca33ab20c555540a3b Mon Sep 17 00:00:00 2001 From: Renat Akhmerov Date: Mon, 14 Apr 2014 17:16:25 +0700 Subject: [PATCH] BP mistral-actions-design (raw action spec -> ActionSpec) * Switched from raw action spec (dict) to using ActionSpec in ad-hoc actions TODO: * Fix all samples in mistral-extra * Action plugin architecture Change-Id: Id8da3642bcd9549bf2e64c07eb4d79fd856a01de --- mistral/actions/action_factory.py | 12 +++++++----- mistral/actions/std_actions.py | 6 ++---- .../unit/actions/test_std_adhoc_action.py | 18 ++++++++++++++---- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/mistral/actions/action_factory.py b/mistral/actions/action_factory.py index 287bdec5c..dabf68a4c 100644 --- a/mistral/actions/action_factory.py +++ b/mistral/actions/action_factory.py @@ -20,6 +20,7 @@ from mistral.actions import base from mistral.actions import std_actions from mistral import exceptions as exc from mistral.workbook import tasks +from mistral.workbook import actions from mistral.openstack.common import log as logging LOG = logging.getLogger(__name__) @@ -98,17 +99,18 @@ def _create_adhoc_action(db_task): full_action_name = task_spec.get_full_action_name() # TODO(rakhmerov): Fix model attributes during refactoring. - # TODO(rakhmerov): ActionSpec should be used instead. - adhoc_action_spec = db_task['action_spec'] + raw_action_spec = db_task['action_spec'] - if not adhoc_action_spec: + if not raw_action_spec: return None + action_spec = actions.ActionSpec(raw_action_spec) + LOG.info('Using ad-hoc action [action=%s, db_task=%s]' % (full_action_name, db_task)) # Create an ad-hoc action. - base_cls = get_action_class(adhoc_action_spec['class']) + base_cls = get_action_class(action_spec.clazz) action_context = None if _has_action_context_param(base_cls): @@ -124,7 +126,7 @@ def _create_adhoc_action(db_task): return std_actions.AdHocAction(action_context, base_cls, - adhoc_action_spec, + action_spec, **action_params) diff --git a/mistral/actions/std_actions.py b/mistral/actions/std_actions.py index 639733ed2..45cf1cb28 100644 --- a/mistral/actions/std_actions.py +++ b/mistral/actions/std_actions.py @@ -201,8 +201,7 @@ class AdHocAction(base.Action): self.base_action = base_action_cls(**base_params) def _convert_params(self, params): - # TODO(rakhmerov): ActionSpec should be used instead of dict. - base_params_spec = self.action_spec.get('base-parameters') + base_params_spec = self.action_spec.base_parameters if not base_params_spec: return {} @@ -211,8 +210,7 @@ class AdHocAction(base.Action): for k, v in base_params_spec.iteritems()) def _convert_result(self, result): - # TODO(rakhmerov): ActionSpec should be used instead of dict. - transformer = self.action_spec.get('output') + transformer = self.action_spec.output if not transformer: return result diff --git a/mistral/tests/unit/actions/test_std_adhoc_action.py b/mistral/tests/unit/actions/test_std_adhoc_action.py index 2c226fa8c..d61ca789a 100644 --- a/mistral/tests/unit/actions/test_std_adhoc_action.py +++ b/mistral/tests/unit/actions/test_std_adhoc_action.py @@ -14,11 +14,15 @@ # See the License for the specific language governing permissions and # limitations under the License. +import copy + from mistral.actions import std_actions as std from mistral.tests import base +from mistral.workbook import namespaces as ns NS_SPEC = { - 'my_namespace': { + 'name': 'my_namespace', + 'actions': { 'my_action': { 'class': 'std.echo', 'base-parameters': { @@ -35,7 +39,9 @@ NS_SPEC = { class AdHocActionTest(base.BaseTest): def test_adhoc_echo_action(self): - action_spec = NS_SPEC['my_namespace']['my_action'].copy() + ns_raw_spec = copy.copy(NS_SPEC) + + action_spec = ns.NamespaceSpec(ns_raw_spec).actions.get('my_action') # With dic-like output formatter. action = std.AdHocAction(None, std.EchoAction, action_spec, @@ -44,7 +50,9 @@ class AdHocActionTest(base.BaseTest): self.assertDictEqual({'res': 'Tango and Cash'}, action.run()) # With list-like output formatter. - action_spec['output'] = ['$.base_output', '$.base_output'] + ns_raw_spec['actions']['my_action']['output'] =\ + ['$.base_output', '$.base_output'] + action_spec = ns.NamespaceSpec(ns_raw_spec).actions.get('my_action') action = std.AdHocAction(None, std.EchoAction, action_spec, first="Tango", second="Cash") @@ -53,7 +61,9 @@ class AdHocActionTest(base.BaseTest): action.run()) # With single-object output formatter. - action_spec['output'] = "'{$.base_output}' is a cool movie!" + ns_raw_spec['actions']['my_action']['output'] =\ + "'{$.base_output}' is a cool movie!" + action_spec = ns.NamespaceSpec(ns_raw_spec).actions.get('my_action') action = std.AdHocAction(None, std.EchoAction, action_spec, first="Tango", second="Cash")