Skip to content

Commit

Permalink
Merge pull request #303 from StackStorm/STORM-338/action_name_top_level
Browse files Browse the repository at this point in the history
RFR:  Action model in rule should be referred by name #2
  • Loading branch information
lakshmi-kannan committed Jul 30, 2014
2 parents 07551b2 + 53c5a69 commit 0853da4
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 25 deletions.
4 changes: 1 addition & 3 deletions contrib/examples/rules/sample-rule.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@
},

"action": {
"type": {
"name": "st2.test.action"
},
"name": "st2.test.action",
"parameters": {
"ip1": "{{trigger.t1_p}}",
"ip2": "{{system.k1}}"
Expand Down
23 changes: 14 additions & 9 deletions st2common/st2common/models/api/reactor.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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 }}\'"}
Expand All @@ -88,16 +94,17 @@ 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
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

Expand All @@ -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

Expand Down
2 changes: 1 addition & 1 deletion st2common/st2common/models/db/reactor.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class TriggerInstanceDB(StormFoundationDB):


class ActionExecutionSpecDB(me.EmbeddedDocument):
action = me.DictField()
name = me.StringField(required=True, unique=True)
parameters = me.DictField()


Expand Down
2 changes: 1 addition & 1 deletion st2common/tests/test_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
10 changes: 2 additions & 8 deletions st2reactor/st2reactor/rules/enforcer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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,
Expand Down
4 changes: 1 addition & 3 deletions st2reactorcontroller/tests/controllers/test_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,7 @@
}
},
'action': {
'type': {
'name': 'st2.test.action'
},
'name': 'st2.test.action',
'parameters': {
'ip2': '{{rule.k1}}',
'ip1': '{{trigger.t1_p}}'
Expand Down

0 comments on commit 0853da4

Please sign in to comment.