Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Decided to drop id?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For now, yes. I think we can add it whenever we want unless you think otherwise.

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