diff --git a/contrib/examples/rules/sample-rule.json b/contrib/examples/rules/sample-rule.json index 58372b706d..4d3bbd3471 100644 --- a/contrib/examples/rules/sample-rule.json +++ b/contrib/examples/rules/sample-rule.json @@ -14,9 +14,7 @@ }, "action": { - "type": { - "name": "st2.test.action" - }, + "name": "st2.test.action", "parameters": { "ip1": "{{trigger.t1_p}}", "ip2": "{{system.k1}}" diff --git a/st2common/st2common/models/api/reactor.py b/st2common/st2common/models/api/reactor.py index 5dedf6e3be..6b9c5b9d67 100644 --- a/st2common/st2common/models/api/reactor.py +++ b/st2common/st2common/models/api/reactor.py @@ -1,6 +1,7 @@ import datetime from wsme import types as wstypes +from mirantis.resource import Resource from st2common.models.api.stormbase import StormBaseAPI, StormFoundationAPI from st2common.models.db.reactor import RuleDB, ActionExecutionSpecDB, TriggerDB import st2common.validators.api.reactor as validator @@ -60,6 +61,11 @@ def from_model(kls, model): return trigger_instance +class ActionSpec(Resource): + name = wstypes.text + parameters = wstypes.DictType(str, str) + + class RuleAPI(StormBaseAPI): """ Attribute: @@ -75,10 +81,10 @@ class RuleAPI(StormBaseAPI): , "operator": "contain" } } action: Specification of the action to execute and the mappings to apply. - expected arguments are type, mapping. + expected arguments are name, parameters. e.g. "action": - { "type": {"id": "2345678901"} + { "name": "st2.action.foo" , "parameters": { "command": "{{ system.foo }}" , "args": "--email {{ trigger.from }} --subject \'{{ user[stanley].ALERT_SUBJECT }}\'"} @@ -88,7 +94,7 @@ class RuleAPI(StormBaseAPI): """ trigger = wstypes.DictType(str, str) criteria = wstypes.DictType(str, wstypes.DictType(str, str)) - action = wstypes.DictType(str, wstypes.DictType(str, str)) + action = ActionSpec enabled = wstypes.wsattr(bool, default=True) @classmethod @@ -96,8 +102,9 @@ def from_model(kls, model): rule = StormBaseAPI.from_model(kls, model) rule.trigger = model.trigger rule.criteria = dict(model.criteria) - rule.action = {'type': model.action.action, - 'parameters': dict(model.action.parameters)} + rule.action = ActionSpec() + rule.action.name = model.action.name + rule.action.parameters = model.action.parameters rule.enabled = model.enabled return rule @@ -108,10 +115,8 @@ def to_model(kls, rule): model.criteria = dict(rule.criteria) validator.validate_criteria(model.criteria) model.action = ActionExecutionSpecDB() - if 'type' in rule.action: - model.action.action = rule.action['type'] - if 'parameters' in rule.action: - model.action.parameters = rule.action['parameters'] + model.action.name = rule.action.name + model.action.parameters = rule.action.parameters model.enabled = rule.enabled return model diff --git a/st2common/st2common/models/db/reactor.py b/st2common/st2common/models/db/reactor.py index fdd02b9122..fa589e1994 100644 --- a/st2common/st2common/models/db/reactor.py +++ b/st2common/st2common/models/db/reactor.py @@ -43,7 +43,7 @@ class TriggerInstanceDB(StormFoundationDB): class ActionExecutionSpecDB(me.EmbeddedDocument): - action = me.DictField() + name = me.StringField(required=True, unique=True) parameters = me.DictField() diff --git a/st2common/tests/test_db.py b/st2common/tests/test_db.py index 6dafa64981..076cc5d61d 100644 --- a/st2common/tests/test_db.py +++ b/st2common/tests/test_db.py @@ -200,7 +200,7 @@ def _create_save_rule(trigger, action=None, enabled=True): created.trigger = reference.get_ref_from_model(trigger) created.criteria = {} created.action = ActionExecutionSpecDB() - created.action.action = reference.get_ref_from_model(action) + created.action.name = action.name created.action.parameters = {} return Rule.add_or_update(created) diff --git a/st2reactor/st2reactor/rules/enforcer.py b/st2reactor/st2reactor/rules/enforcer.py index 42d4bf8da0..fecb739741 100644 --- a/st2reactor/st2reactor/rules/enforcer.py +++ b/st2reactor/st2reactor/rules/enforcer.py @@ -24,9 +24,9 @@ def enforce(self): rule_enforcement.rule = reference.get_ref_from_model(self.rule) data = self.data_transformer(self.rule.action.parameters) LOG.info('Invoking action %s for trigger_instance %s with data %s.', - RuleEnforcer.__get_action_name(self.rule.action), self.trigger_instance.id, + self.rule.action.name, self.trigger_instance.id, json.dumps(data)) - action_execution = RuleEnforcer.__invoke_action(self.rule.action.action, data) + action_execution = RuleEnforcer.__invoke_action(self.rule.action.name, data) if action_execution is not None: rule_enforcement.action_execution = action_execution rule_enforcement = RuleEnforcement.add_or_update(rule_enforcement) @@ -37,12 +37,6 @@ def enforce(self): LOG.error('Action execution failed. Trigger: id: %s, Rule: %s', self.trigger_instance.id, self.rule) - @staticmethod - def __get_action_name(action_exec_spec): - if action_exec_spec is None or action_exec_spec.action is None: - return '' - return action_exec_spec.action['name'] - @staticmethod def __invoke_action(action, action_args): payload = json.dumps({'action': action, diff --git a/st2reactorcontroller/tests/controllers/test_rules.py b/st2reactorcontroller/tests/controllers/test_rules.py index c79d056538..fd454a267a 100644 --- a/st2reactorcontroller/tests/controllers/test_rules.py +++ b/st2reactorcontroller/tests/controllers/test_rules.py @@ -40,9 +40,7 @@ } }, 'action': { - 'type': { - 'name': 'st2.test.action' - }, + 'name': 'st2.test.action', 'parameters': { 'ip2': '{{rule.k1}}', 'ip1': '{{trigger.t1_p}}'