Test Failed
Push — master ( e380d0...f5671d )
by W
02:58
created

st2common/st2common/content/bootstrap.py (1 issue)

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
Specify string format arguments as logging function parameters
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