Skip to content

Commit c052d38

Browse files
committed
Merge pull request #927 from StackStorm/fix_sensor_registration
Fix sensor registration and webhook trigger registration
2 parents 6e0ca76 + 8a446bc commit c052d38

File tree

14 files changed

+348
-14
lines changed

14 files changed

+348
-14
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ Docs: http://docks.stackstorm.com/latest
2121
actions were executed through SSH, now they are executed directly without the overhead of SSH.
2222
* Fix local runner so it correctly executes a command under the provider system user if ``user``
2323
parameter is provided. (bug-fix)
24+
* Fix a bug with a Trigger database object in some cases being created twice when registering a
25+
rule. (bug-fix)
2426

2527
v0.6.0 - December 8, 2014
2628
-------------------------

contrib/examples/actions/mistral-basic.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
name: 'examples.mistral-basic'
22
version: '2.0'
3+
description: 'Basic mistral workflow example'
34
workflows:
45
demo:
56
type: direct

contrib/packs/actions/install.meta.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
Will download pack, load the actions, sensors and rules from the pack.
66
Note that install require reboot of some st2 services."
77
enabled: true
8-
entry_point: "install.yaml"
8+
entry_point: "workflows/install.yaml"
99
parameters:
1010
packs:
1111
type: "array"

contrib/packs/actions/uninstall.meta.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
Removes pack and content from st2. Note that uninstall
66
require reboot of some st2 services."
77
enabled: true
8-
entry_point: "uninstall.yaml"
8+
entry_point: "workflows/uninstall.yaml"
99
parameters:
1010
packs:
1111
type: "array"
1212
items:
1313
type: "string"
1414
required: true
15-
File renamed without changes.

st2common/st2common/models/system/action.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def __init__(self, name, action_exec_id, command, user, env_vars=None, sudo=Fals
5151
self.env_vars = env_vars or {}
5252
self.user = user
5353
self.sudo = sudo
54+
self.timeout = timeout
5455

5556
def get_full_command_string(self):
5657
if self.sudo:
@@ -250,6 +251,7 @@ def __init__(self, name, action_exec_id, script_local_path_abs, script_local_lib
250251
self.on_behalf_user = on_behalf_user
251252
self.remote_script = os.path.join(self.remote_dir, pipes.quote(self.script_name))
252253
self.hosts = hosts
254+
self.parallel = parallel
253255
self.command = self._format_command()
254256
LOG.debug('RemoteScriptAction: command to run on remote box: %s', self.command)
255257

st2common/st2common/services/triggers.py

Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@
1818
from st2common.models.system.common import ResourceReference
1919
from st2common.persistence.reactor import (Trigger, TriggerType)
2020

21+
__all__ = [
22+
'get_trigger_db',
23+
'get_trigger_type_db',
24+
25+
'create_trigger_db',
26+
'create_trigger_type_db',
27+
28+
'create_or_update_trigger_db',
29+
'create_or_update_trigger_type_db'
30+
]
31+
2132
LOG = logging.getLogger(__name__)
2233

2334

@@ -92,12 +103,12 @@ def _get_trigger_api_given_rule(rule):
92103
trigger = rule.trigger
93104
triggertype_ref = ResourceReference.from_string_reference(trigger.get('type'))
94105
trigger_dict = {}
95-
trigger_name = trigger.get('name', None)
96-
if trigger_name:
97-
trigger_dict['name'] = trigger_name
106+
107+
trigger_dict['name'] = triggertype_ref.name
98108
trigger_dict['pack'] = triggertype_ref.pack
99109
trigger_dict['type'] = triggertype_ref.ref
100110
trigger_dict['parameters'] = rule.trigger.get('parameters', {})
111+
101112
trigger_api = TriggerAPI(**trigger_dict)
102113

103114
return trigger_api
@@ -110,11 +121,44 @@ def create_trigger_db(trigger):
110121
trigger_db = get_trigger_db(trigger_api)
111122
if not trigger_db:
112123
trigger_db = TriggerAPI.to_model(trigger_api)
113-
LOG.debug('verified trigger and formulated TriggerDB=%s', trigger_db)
124+
LOG.debug('Verified trigger and formulated TriggerDB=%s', trigger_db)
114125
trigger_db = Trigger.add_or_update(trigger_db)
115126
return trigger_db
116127

117128

129+
def create_or_update_trigger_db(trigger):
130+
"""
131+
Create a new TriggerDB model if one doesn't exist yet or update existing
132+
one.
133+
134+
:param trigger: Trigger info.
135+
:type trigger: ``dict``
136+
"""
137+
assert isinstance(trigger, dict)
138+
139+
trigger_api = TriggerAPI(**trigger)
140+
trigger_api = TriggerAPI.to_model(trigger_api)
141+
142+
existing_trigger_db = get_trigger_db(trigger_api)
143+
144+
if existing_trigger_db:
145+
is_update = True
146+
else:
147+
is_update = False
148+
149+
if is_update:
150+
trigger_api.id = existing_trigger_db.id
151+
152+
trigger_db = Trigger.add_or_update(trigger_api)
153+
154+
if is_update:
155+
LOG.audit('Trigger updated. Trigger=%s', trigger_db)
156+
else:
157+
LOG.audit('Trigger created. Trigger=%s', trigger_db)
158+
159+
return trigger_db
160+
161+
118162
def create_trigger_db_from_rule(rule):
119163
trigger_api = _get_trigger_api_given_rule(rule)
120164
return create_trigger_db(trigger_api)
@@ -133,8 +177,45 @@ def create_trigger_type_db(trigger_type):
133177
ref = ResourceReference.to_string_reference(name=trigger_type_api.name,
134178
pack=trigger_type_api.pack)
135179
trigger_type_db = get_trigger_type_db(ref)
180+
136181
if not trigger_type_db:
137182
trigger_type_db = TriggerTypeAPI.to_model(trigger_type_api)
138183
LOG.debug('verified trigger and formulated TriggerDB=%s', trigger_type_db)
139184
trigger_type_db = TriggerType.add_or_update(trigger_type_db)
140185
return trigger_type_db
186+
187+
188+
def create_or_update_trigger_type_db(trigger_type):
189+
"""
190+
Create or update a trigger type db object in the db given trigger_type definition as dict.
191+
192+
:param trigger_type: Trigger type model.
193+
:type trigger_type: ``dict``
194+
195+
:rtype: ``object``
196+
"""
197+
assert isinstance(trigger_type, dict)
198+
199+
trigger_type_api = TriggerTypeAPI(**trigger_type)
200+
trigger_type_api = TriggerTypeAPI.to_model(trigger_type_api)
201+
202+
ref = ResourceReference.to_string_reference(name=trigger_type_api.name,
203+
pack=trigger_type_api.pack)
204+
205+
existing_trigger_type_db = get_trigger_type_db(ref)
206+
if existing_trigger_type_db:
207+
is_update = True
208+
else:
209+
is_update = False
210+
211+
if is_update:
212+
trigger_type_api.id = existing_trigger_type_db.id
213+
214+
trigger_type_db = TriggerType.add_or_update(trigger_type_api)
215+
216+
if is_update:
217+
LOG.audit('TriggerType updated. TriggerType=%s', trigger_type_db)
218+
else:
219+
LOG.audit('TriggerType created. TriggerType=%s', trigger_type_db)
220+
221+
return trigger_type_db

st2common/tests/unit/test_fabric_system_model.py renamed to st2common/tests/unit/test_action_system_models.py

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,57 @@
1515

1616
import unittest2
1717

18-
from st2common.models.system.action import (FabricRemoteAction, FabricRemoteScriptAction)
18+
from st2common.models.system.action import RemoteAction
19+
from st2common.models.system.action import RemoteScriptAction
20+
from st2common.models.system.action import FabricRemoteAction
21+
from st2common.models.system.action import FabricRemoteScriptAction
1922

2023

21-
class FabricRemoteActionsTest(unittest2.TestCase):
24+
class RemoteActionTestCase(unittest2.TestCase):
25+
def test_instantiation(self):
26+
action = RemoteAction(name='name', action_exec_id='aeid', command='ls -la',
27+
env_vars={'a': 1}, on_behalf_user='onbehalf', user='user',
28+
hosts=['localhost'], parallel=False, sudo=True, timeout=10)
29+
self.assertEqual(action.name, 'name')
30+
self.assertEqual(action.action_exec_id, 'aeid')
31+
self.assertEqual(action.command, 'ls -la')
32+
self.assertEqual(action.env_vars, {'a': 1})
33+
self.assertEqual(action.on_behalf_user, 'onbehalf')
34+
self.assertEqual(action.user, 'user')
35+
self.assertEqual(action.hosts, ['localhost'])
36+
self.assertEqual(action.parallel, False)
37+
self.assertEqual(action.sudo, True)
38+
self.assertEqual(action.timeout, 10)
2239

40+
41+
class RemoteScriptActionTestCase(unittest2.TestCase):
42+
def test_instantiation(self):
43+
action = RemoteScriptAction(name='name', action_exec_id='aeid',
44+
script_local_path_abs='/tmp/sc/ma_script.sh',
45+
script_local_libs_path_abs='/tmp/sc/libs', named_args=None,
46+
positional_args=None, env_vars={'a': 1},
47+
on_behalf_user='onbehalf', user='user',
48+
remote_dir='/home/mauser', hosts=['localhost'],
49+
parallel=False, sudo=True, timeout=10)
50+
self.assertEqual(action.name, 'name')
51+
self.assertEqual(action.action_exec_id, 'aeid')
52+
self.assertEqual(action.script_local_libs_path_abs, '/tmp/sc/libs')
53+
self.assertEqual(action.env_vars, {'a': 1})
54+
self.assertEqual(action.on_behalf_user, 'onbehalf')
55+
self.assertEqual(action.user, 'user')
56+
self.assertEqual(action.remote_dir, '/home/mauser')
57+
self.assertEqual(action.hosts, ['localhost'])
58+
self.assertEqual(action.parallel, False)
59+
self.assertEqual(action.sudo, True)
60+
self.assertEqual(action.timeout, 10)
61+
62+
self.assertEqual(action.script_local_dir, '/tmp/sc')
63+
self.assertEqual(action.script_name, 'ma_script.sh')
64+
self.assertEqual(action.remote_script, '/home/mauser/ma_script.sh')
65+
self.assertEqual(action.command, '/home/mauser/ma_script.sh')
66+
67+
68+
class FabricRemoteActionTestCase(unittest2.TestCase):
2369
def test_fabric_remote_action_method(self):
2470
remote_action = FabricRemoteAction('foo', 'foo-id', 'ls -lrth', on_behalf_user='stan',
2571
parallel=True, sudo=False)

st2reactor/st2reactor/bootstrap/sensorsregistrar.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ def _register_sensor_from_pack(self, pack, sensor):
6363
trigger_types = metadata.get('trigger_types', [])
6464
poll_interval = metadata.get('poll_interval', None)
6565

66+
# Add pack to each trigger type item
67+
for trigger_type in trigger_types:
68+
trigger_type['pack'] = pack
69+
6670
# Add TrigerType models to the DB
6771
trigger_type_dbs = container_utils.add_trigger_models(trigger_types=trigger_types)
6872

0 commit comments

Comments
 (0)