Skip to content

Commit 77649f5

Browse files
authored
Merge pull request #21 from copartit/master
1.3.0 Rules manipulation actions and aliases
2 parents f929336 + 8c0a7f9 commit 77649f5

File tree

11 files changed

+160
-4
lines changed

11 files changed

+160
-4
lines changed

CHANGES.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
# Change Log
22

3+
## 1.3.0
4+
5+
- Added `st2.rules.enable`, `st2.rules.disable` actions and chatops commands.
6+
- Added reading `ST2_ACTION_AUTH_API_KEY` environment variable if API Key is not provided in the pack's config.
7+
38
## 1.2.0
49

510
- Added `st2.executions.pause`, `st2.executions.resume`, `st2.executions.cancel` actions.
611

712
## 1.1.0
813

914
- Added decrypt and decompress parameters to `st2.kv.get_object`
10-
- Fixed cacert=True case in pack's configuration
15+
- Fixed `cacert=True` case in pack's configuration
1116

1217
## 1.0.7
1318

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ sensors and more.
7171
action execution.
7272
* ``!st2 executions re-run <execution id>`` - Re-run a particular action
7373
execution.
74-
* ``!st2 executions cancel <execution id>`` - Pause a particular action
74+
* ``!st2 executions cancel <execution id>`` - Cancel a particular action
7575
execution.
7676
* ``!st2 executions pause <execution id>`` - Pause a particular action
7777
execution.
7878
* ``!st2 executions resume <execution id>`` - Resume a particular action
7979
execution.
80+
* ``!st2 disable rule <name> from pack <pack>`` - Disable a particular rule.
81+
* ``!st2 enable rule <name> from pack <pack>`` - Enable a particular rule.

actions/lib/action.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
from lib.utils import filter_none_values
88

9-
109
__all__ = [
1110
'St2BaseAction'
1211
]
@@ -60,6 +59,12 @@ def _get_st2_urls(self):
6059

6160
def _get_api_key(self):
6261
api_key = self.config.get('api_key', None)
62+
63+
# not found look up from env vars. Assuming the pack is
64+
# configuered to work with current StackStorm instance.
65+
if not api_key:
66+
api_key = os.environ.get('ST2_ACTION_AUTH_API_KEY', None)
67+
6368
return api_key
6469

6570
def _get_auth_token(self):
@@ -104,3 +109,31 @@ def _run_client_method(self, method, method_kwargs, format_func, format_kwargs=N
104109
result = method(**method_kwargs)
105110
result = format_func(result, **format_kwargs or {})
106111
return result
112+
113+
def _manipulate_rule(self, name, pack, enabled):
114+
rule_name = '{}.{}'.format(pack, name)
115+
failure_reason = None
116+
rule = None
117+
try:
118+
rule = self.client.rules.get_by_name(name=name, pack=pack)
119+
if not rule:
120+
failure_reason = 'rule not found'
121+
except Exception as exc:
122+
failure_reason = exc
123+
124+
if failure_reason:
125+
return 'Could not get rule {}: {}'.format(rule_name, failure_reason)
126+
127+
rule_enabled = rule.enabled
128+
129+
if isinstance(rule_enabled, bool) and rule_enabled == enabled:
130+
# already enabled, so just return true and formatted results
131+
return rule
132+
133+
rule.enabled = enabled
134+
try:
135+
self.client.rules.update(rule)
136+
except Exception as exc:
137+
return 'Could not update rule {}: {}'.format(rule_name, exc)
138+
139+
return rule

actions/lib/formatters.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,7 @@ def format_client_list_result(result, exclude_attributes=None):
1818

1919
def format_result(item):
2020
return item.to_dict() if item else None
21+
22+
23+
def format_rule_update_result(result, exclude_attributes):
24+
return format_client_list_result(result=[result], exclude_attributes=exclude_attributes)[0]

actions/rules_disable.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from lib.action import St2BaseAction
2+
from lib.formatters import format_rule_update_result
3+
4+
__all__ = [
5+
'St2RulesDisableAction'
6+
]
7+
8+
9+
class St2RulesDisableAction(St2BaseAction):
10+
def run(self, pack=None, name=None, exclude=None):
11+
12+
rule = self._manipulate_rule(pack=pack, name=name, enabled=False)
13+
if rule is None or isinstance(rule, str):
14+
# error happened
15+
return False, rule
16+
else:
17+
# all good here
18+
return True, format_rule_update_result(rule, exclude)

actions/rules_disable.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
name: "rules.disable"
3+
enabled: true
4+
description: "Disable an existing rule"
5+
runner_type: python-script
6+
entry_point: rules_disable.py
7+
parameters:
8+
pack:
9+
type: "string"
10+
description: "Pack where the rule is in"
11+
required: true
12+
name:
13+
type: "string"
14+
description: "Rule name"
15+
required: true
16+
exclude:
17+
type: "array"
18+
description: "List of attributes to exclude from results"
19+
default: []

actions/rules_enable.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from lib.action import St2BaseAction
2+
from lib.formatters import format_rule_update_result
3+
4+
__all__ = [
5+
'St2RulesEnableAction'
6+
]
7+
8+
9+
class St2RulesEnableAction(St2BaseAction):
10+
def run(self, pack=None, name=None, exclude=None):
11+
12+
rule = self._manipulate_rule(pack=pack, name=name, enabled=True)
13+
if rule is None or isinstance(rule, str):
14+
# error happened
15+
return False, rule
16+
else:
17+
# all good here
18+
return True, format_rule_update_result(rule, exclude)

actions/rules_enable.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
name: "rules.enable"
3+
enabled: true
4+
description: "Enable an existing rule"
5+
runner_type: python-script
6+
entry_point: rules_enable.py
7+
parameters:
8+
pack:
9+
type: "string"
10+
description: "Pack where the rule is in"
11+
required: true
12+
name:
13+
type: "string"
14+
description: "Rule name"
15+
required: true
16+
exclude:
17+
type: "array"
18+
description: "List of attributes to exclude from results"
19+
default: []

aliases/rules_disable.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
name: "st2_rules_disable"
3+
action_ref: "st2.rules.disable"
4+
description: "Disable an existing rule."
5+
formats:
6+
- "st2 disable rule {{ name }} from pack {{ pack }}"
7+
ack:
8+
format: "Give me just a moment to disable the rule for you..."
9+
result:
10+
extra:
11+
slack:
12+
color: "{% if execution.status == 'succeeded' %}#219939{% else %}#d80015{% endif %}"
13+
format: |
14+
{% set res = execution.result.result %}
15+
{% if res is string %}
16+
{{ res }}
17+
{% else %}
18+
Disabled: {{ res.ref }} ({{ res.trigger.ref }} -> {{ res.action.ref }}){{ res.description and ' - ' + res.description }}
19+
{% endif %}

aliases/rules_enable.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
name: "st2_rules_enable"
3+
action_ref: "st2.rules.enable"
4+
description: "Enable an existing rule."
5+
formats:
6+
- "st2 enable rule {{ name }} from pack {{ pack }}"
7+
ack:
8+
format: "Give me just a moment to enable the rule for you..."
9+
result:
10+
extra:
11+
slack:
12+
color: "{% if execution.status == 'succeeded' %}#219939{% else %}#d80015{% endif %}"
13+
format: |
14+
{% set res = execution.result.result %}
15+
{% if res is string %}
16+
{{ res }}
17+
{% else %}
18+
Enabled: {{ res.ref }} ({{ res.trigger.ref }} -> {{ res.action.ref }}){{ res.description and ' - ' + res.description }}
19+
{% endif %}

0 commit comments

Comments
 (0)