1 | # Licensed to the StackStorm, Inc ('StackStorm') under one or more |
||
2 | # contributor license agreements. See the NOTICE file distributed with |
||
3 | # this work for additional information regarding copyright ownership. |
||
4 | # The ASF licenses this file to You under the Apache License, Version 2.0 |
||
5 | # (the "License"); you may not use this file except in compliance with |
||
6 | # the License. You may obtain a copy of the License at |
||
7 | # |
||
8 | # http://www.apache.org/licenses/LICENSE-2.0 |
||
9 | # |
||
10 | # Unless required by applicable law or agreed to in writing, software |
||
11 | # distributed under the License is distributed on an "AS IS" BASIS, |
||
12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||
13 | # See the License for the specific language governing permissions and |
||
14 | # limitations under the License. |
||
15 | |||
16 | from __future__ import absolute_import |
||
17 | import os |
||
18 | import sys |
||
19 | import logging |
||
20 | |||
21 | from oslo_config import cfg |
||
22 | |||
23 | import st2common |
||
24 | from st2common import config |
||
25 | from st2common.script_setup import setup as common_setup |
||
26 | from st2common.script_setup import teardown as common_teardown |
||
27 | from st2common.bootstrap.base import ResourceRegistrar |
||
28 | import st2common.bootstrap.triggersregistrar as triggers_registrar |
||
29 | import st2common.bootstrap.sensorsregistrar as sensors_registrar |
||
30 | import st2common.bootstrap.actionsregistrar as actions_registrar |
||
31 | import st2common.bootstrap.aliasesregistrar as aliases_registrar |
||
32 | import st2common.bootstrap.policiesregistrar as policies_registrar |
||
33 | import st2common.bootstrap.runnersregistrar as runners_registrar |
||
34 | import st2common.bootstrap.rulesregistrar as rules_registrar |
||
35 | import st2common.bootstrap.ruletypesregistrar as rule_types_registrar |
||
36 | import st2common.bootstrap.configsregistrar as configs_registrar |
||
37 | import st2common.content.utils as content_utils |
||
38 | from st2common.util.virtualenvs import setup_pack_virtualenv |
||
39 | |||
40 | __all__ = [ |
||
41 | 'main' |
||
42 | ] |
||
43 | |||
44 | LOG = logging.getLogger('st2common.content.bootstrap') |
||
45 | |||
46 | cfg.CONF.register_cli_opt(cfg.BoolOpt('experimental', default=False)) |
||
47 | |||
48 | |||
49 | def register_opts(): |
||
50 | content_opts = [ |
||
51 | cfg.BoolOpt('all', default=False, help='Register sensors, actions and rules.'), |
||
52 | cfg.BoolOpt('triggers', default=False, help='Register triggers.'), |
||
53 | cfg.BoolOpt('sensors', default=False, help='Register sensors.'), |
||
54 | cfg.BoolOpt('actions', default=False, help='Register actions.'), |
||
55 | cfg.BoolOpt('runners', default=False, help='Register runners.'), |
||
56 | cfg.BoolOpt('rules', default=False, help='Register rules.'), |
||
57 | cfg.BoolOpt('aliases', default=False, help='Register aliases.'), |
||
58 | cfg.BoolOpt('policies', default=False, help='Register policies.'), |
||
59 | cfg.BoolOpt('configs', default=False, help='Register and load pack configs.'), |
||
60 | |||
61 | cfg.StrOpt('pack', default=None, help='Directory to the pack to register content from.'), |
||
62 | cfg.StrOpt('runner-dir', default=None, help='Directory to load runners from.'), |
||
63 | cfg.BoolOpt('setup-virtualenvs', default=False, help=('Setup Python virtual environments ' |
||
64 | 'all the Python runner actions.')), |
||
65 | |||
66 | # General options |
||
67 | # Note: This value should default to False since we want fail on failure behavior by |
||
68 | # default. |
||
69 | cfg.BoolOpt('no-fail-on-failure', default=False, |
||
70 | help=('Don\'t exit with non-zero if some resource registration fails.')), |
||
71 | # Note: Fail on failure is now a default behavior. This flag is only left here for backward |
||
72 | # compatibility reasons, but it's not actually used. |
||
73 | cfg.BoolOpt('fail-on-failure', default=True, |
||
74 | help=('Exit with non-zero if some resource registration fails.')) |
||
75 | ] |
||
76 | try: |
||
77 | cfg.CONF.register_cli_opts(content_opts, group='register') |
||
78 | except: |
||
79 | sys.stderr.write('Failed registering opts.\n') |
||
80 | |||
81 | |||
82 | register_opts() |
||
83 | |||
84 | |||
85 | def setup_virtualenvs(): |
||
86 | """ |
||
87 | Setup Python virtual environments for all the registered or the provided pack. |
||
88 | """ |
||
89 | |||
90 | LOG.info('=========================================================') |
||
91 | LOG.info('########### Setting up virtual environments #############') |
||
92 | LOG.info('=========================================================') |
||
93 | pack_dir = cfg.CONF.register.pack |
||
94 | fail_on_failure = not cfg.CONF.register.no_fail_on_failure |
||
95 | |||
96 | registrar = ResourceRegistrar() |
||
97 | |||
98 | if pack_dir: |
||
99 | pack_name = os.path.basename(pack_dir) |
||
100 | pack_names = [pack_name] |
||
101 | |||
102 | # 1. Register pack |
||
103 | registrar.register_pack(pack_name=pack_name, pack_dir=pack_dir) |
||
104 | else: |
||
105 | # 1. Register pack |
||
106 | base_dirs = content_utils.get_packs_base_paths() |
||
107 | registrar.register_packs(base_dirs=base_dirs) |
||
108 | |||
109 | # 2. Retrieve available packs (aka packs which have been registered) |
||
110 | pack_names = registrar.get_registered_packs() |
||
111 | |||
112 | setup_count = 0 |
||
113 | for pack_name in pack_names: |
||
114 | try: |
||
115 | setup_pack_virtualenv(pack_name=pack_name, update=True, logger=LOG) |
||
116 | except Exception as e: |
||
117 | exc_info = not fail_on_failure |
||
118 | LOG.warning('Failed to setup virtualenv for pack "%s": %s', pack_name, e, |
||
119 | exc_info=exc_info) |
||
120 | |||
121 | if fail_on_failure: |
||
122 | raise e |
||
123 | else: |
||
124 | setup_count += 1 |
||
125 | |||
126 | LOG.info('Setup virtualenv for %s pack(s).' % (setup_count)) |
||
127 | |||
128 | |||
129 | def register_triggers(): |
||
130 | pack_dir = cfg.CONF.register.pack |
||
131 | fail_on_failure = not cfg.CONF.register.no_fail_on_failure |
||
132 | |||
133 | registered_count = 0 |
||
134 | |||
135 | try: |
||
136 | LOG.info('=========================================================') |
||
137 | LOG.info('############## Registering triggers #####################') |
||
138 | LOG.info('=========================================================') |
||
139 | registered_count = triggers_registrar.register_triggers(pack_dir=pack_dir, |
||
140 | fail_on_failure=fail_on_failure) |
||
141 | except Exception as e: |
||
142 | exc_info = not fail_on_failure |
||
143 | LOG.warning('Failed to register sensors: %s', e, exc_info=exc_info) |
||
144 | |||
145 | if fail_on_failure: |
||
146 | raise e |
||
147 | |||
148 | LOG.info('Registered %s triggers.' % (registered_count)) |
||
0 ignored issues
–
show
Coding Style
Best Practice
introduced
by
Loading history...
|
|||
149 | |||
150 | |||
151 | def register_sensors(): |
||
152 | pack_dir = cfg.CONF.register.pack |
||
153 | fail_on_failure = not cfg.CONF.register.no_fail_on_failure |
||
154 | |||
155 | registered_count = 0 |
||
156 | |||
157 | try: |
||
158 | LOG.info('=========================================================') |
||
159 | LOG.info('############## Registering sensors ######################') |
||
160 | LOG.info('=========================================================') |
||
161 | registered_count = sensors_registrar.register_sensors(pack_dir=pack_dir, |
||
162 | fail_on_failure=fail_on_failure) |
||
163 | except Exception as e: |
||
164 | exc_info = not fail_on_failure |
||
165 | LOG.warning('Failed to register sensors: %s', e, exc_info=exc_info) |
||
166 | |||
167 | if fail_on_failure: |
||
168 | raise e |
||
169 | |||
170 | LOG.info('Registered %s sensors.' % (registered_count)) |
||
171 | |||
172 | |||
173 | def register_runners(): |
||
174 | # Register runners |
||
175 | runner_dir = cfg.CONF.register.runner_dir |
||
176 | if runner_dir: |
||
177 | runner_dir = [runner_dir] |
||
178 | registered_count = 0 |
||
179 | fail_on_failure = cfg.CONF.register.fail_on_failure |
||
180 | |||
181 | # 1. Register runner types |
||
182 | try: |
||
183 | LOG.info('=========================================================') |
||
184 | LOG.info('############## Registering runners ######################') |
||
185 | LOG.info('=========================================================') |
||
186 | registered_count = runners_registrar.register_runners(runner_dirs=runner_dir, |
||
187 | fail_on_failure=fail_on_failure, |
||
188 | experimental=False) |
||
189 | except Exception as error: |
||
190 | exc_info = not fail_on_failure |
||
191 | |||
192 | # TODO: Narrow exception window |
||
193 | LOG.warning('Failed to register runners: %s', error, exc_info=exc_info) |
||
194 | |||
195 | if fail_on_failure: |
||
196 | raise error |
||
197 | |||
198 | LOG.info('Registered %s runners.', registered_count) |
||
199 | |||
200 | |||
201 | def register_actions(): |
||
202 | # Register runnertypes and actions. The order is important because actions require action |
||
203 | # types to be present in the system. |
||
204 | pack_dir = cfg.CONF.register.pack |
||
205 | fail_on_failure = not cfg.CONF.register.no_fail_on_failure |
||
206 | |||
207 | registered_count = 0 |
||
208 | |||
209 | try: |
||
210 | LOG.info('=========================================================') |
||
211 | LOG.info('############## Registering actions ######################') |
||
212 | LOG.info('=========================================================') |
||
213 | registered_count = actions_registrar.register_actions(pack_dir=pack_dir, |
||
214 | fail_on_failure=fail_on_failure) |
||
215 | except Exception as e: |
||
216 | exc_info = not fail_on_failure |
||
217 | LOG.warning('Failed to register actions: %s', e, exc_info=exc_info) |
||
218 | |||
219 | if fail_on_failure: |
||
220 | raise e |
||
221 | |||
222 | LOG.info('Registered %s actions.' % (registered_count)) |
||
223 | |||
224 | |||
225 | def register_rules(): |
||
226 | # Register ruletypes and rules. |
||
227 | pack_dir = cfg.CONF.register.pack |
||
228 | fail_on_failure = not cfg.CONF.register.no_fail_on_failure |
||
229 | |||
230 | registered_count = 0 |
||
231 | |||
232 | try: |
||
233 | LOG.info('=========================================================') |
||
234 | LOG.info('############## Registering rules ########################') |
||
235 | LOG.info('=========================================================') |
||
236 | rule_types_registrar.register_rule_types() |
||
237 | except Exception as e: |
||
238 | LOG.warning('Failed to register rule types: %s', e, exc_info=True) |
||
239 | return |
||
240 | |||
241 | try: |
||
242 | registered_count = rules_registrar.register_rules(pack_dir=pack_dir, |
||
243 | fail_on_failure=fail_on_failure) |
||
244 | except Exception as e: |
||
245 | exc_info = not fail_on_failure |
||
246 | LOG.warning('Failed to register rules: %s', e, exc_info=exc_info) |
||
247 | |||
248 | if fail_on_failure: |
||
249 | raise e |
||
250 | |||
251 | LOG.info('Registered %s rules.', registered_count) |
||
252 | |||
253 | |||
254 | def register_aliases(): |
||
255 | pack_dir = cfg.CONF.register.pack |
||
256 | fail_on_failure = not cfg.CONF.register.no_fail_on_failure |
||
257 | |||
258 | registered_count = 0 |
||
259 | |||
260 | try: |
||
261 | LOG.info('=========================================================') |
||
262 | LOG.info('############## Registering aliases ######################') |
||
263 | LOG.info('=========================================================') |
||
264 | registered_count = aliases_registrar.register_aliases(pack_dir=pack_dir, |
||
265 | fail_on_failure=fail_on_failure) |
||
266 | except Exception as e: |
||
267 | if fail_on_failure: |
||
268 | raise e |
||
269 | |||
270 | LOG.warning('Failed to register aliases.', exc_info=True) |
||
271 | |||
272 | LOG.info('Registered %s aliases.', registered_count) |
||
273 | |||
274 | |||
275 | def register_policies(): |
||
276 | # Register policy types and policies. |
||
277 | pack_dir = cfg.CONF.register.pack |
||
278 | fail_on_failure = not cfg.CONF.register.no_fail_on_failure |
||
279 | |||
280 | registered_type_count = 0 |
||
281 | |||
282 | try: |
||
283 | LOG.info('=========================================================') |
||
284 | LOG.info('############## Registering policy types #################') |
||
285 | LOG.info('=========================================================') |
||
286 | registered_type_count = policies_registrar.register_policy_types(st2common) |
||
287 | except Exception: |
||
288 | LOG.warning('Failed to register policy types.', exc_info=True) |
||
289 | |||
290 | LOG.info('Registered %s policy types.', registered_type_count) |
||
291 | |||
292 | registered_count = 0 |
||
293 | try: |
||
294 | LOG.info('=========================================================') |
||
295 | LOG.info('############## Registering policies #####################') |
||
296 | LOG.info('=========================================================') |
||
297 | registered_count = policies_registrar.register_policies(pack_dir=pack_dir, |
||
298 | fail_on_failure=fail_on_failure) |
||
299 | except Exception as e: |
||
300 | exc_info = not fail_on_failure |
||
301 | LOG.warning('Failed to register policies: %s', e, exc_info=exc_info) |
||
302 | |||
303 | if fail_on_failure: |
||
304 | raise e |
||
305 | |||
306 | LOG.info('Registered %s policies.', registered_count) |
||
307 | |||
308 | |||
309 | def register_configs(): |
||
310 | pack_dir = cfg.CONF.register.pack |
||
311 | fail_on_failure = not cfg.CONF.register.no_fail_on_failure |
||
312 | |||
313 | registered_count = 0 |
||
314 | |||
315 | try: |
||
316 | LOG.info('=========================================================') |
||
317 | LOG.info('############## Registering configs ######################') |
||
318 | LOG.info('=========================================================') |
||
319 | registered_count = configs_registrar.register_configs(pack_dir=pack_dir, |
||
320 | fail_on_failure=fail_on_failure, |
||
321 | validate_configs=True) |
||
322 | except Exception as e: |
||
323 | exc_info = not fail_on_failure |
||
324 | LOG.warning('Failed to register configs: %s', e, exc_info=exc_info) |
||
325 | |||
326 | if fail_on_failure: |
||
327 | raise e |
||
328 | |||
329 | LOG.info('Registered %s configs.' % (registered_count)) |
||
330 | |||
331 | |||
332 | def register_content(): |
||
333 | register_all = cfg.CONF.register.all |
||
334 | |||
335 | if register_all: |
||
336 | register_triggers() |
||
337 | register_sensors() |
||
338 | register_runners() |
||
339 | register_actions() |
||
340 | register_rules() |
||
341 | register_aliases() |
||
342 | register_policies() |
||
343 | register_configs() |
||
344 | |||
345 | if cfg.CONF.register.triggers and not register_all: |
||
346 | register_triggers() |
||
347 | |||
348 | if cfg.CONF.register.sensors and not register_all: |
||
349 | register_sensors() |
||
350 | |||
351 | if cfg.CONF.register.runners and not register_all: |
||
352 | register_runners() |
||
353 | |||
354 | if cfg.CONF.register.actions and not register_all: |
||
355 | # If --register-runners is passed, registering runners again would be duplicate. |
||
356 | # If it's not passed, we still want to register runners. Otherwise, actions will complain |
||
357 | # about runners not being registered. |
||
358 | if not cfg.CONF.register.runners: |
||
359 | register_runners() |
||
360 | register_actions() |
||
361 | |||
362 | if cfg.CONF.register.rules and not register_all: |
||
363 | register_rules() |
||
364 | |||
365 | if cfg.CONF.register.aliases and not register_all: |
||
366 | register_aliases() |
||
367 | |||
368 | if cfg.CONF.register.policies and not register_all: |
||
369 | register_policies() |
||
370 | |||
371 | if cfg.CONF.register.configs and not register_all: |
||
372 | register_configs() |
||
373 | |||
374 | if cfg.CONF.register.setup_virtualenvs: |
||
375 | setup_virtualenvs() |
||
376 | |||
377 | |||
378 | def setup(argv): |
||
379 | common_setup(config=config, setup_db=True, register_mq_exchanges=True, |
||
380 | register_internal_trigger_types=True) |
||
381 | |||
382 | |||
383 | def teardown(): |
||
384 | common_teardown() |
||
385 | |||
386 | |||
387 | def main(argv): |
||
388 | setup(argv) |
||
389 | register_content() |
||
390 | teardown() |
||
391 | |||
392 | |||
393 | # This script registers actions and rules from content-packs. |
||
394 | if __name__ == '__main__': |
||
395 | main(sys.argv[1:]) |
||
396 |