From c7a1ff64e1fedae67069eca29d2d4c1f521815e2 Mon Sep 17 00:00:00 2001 From: Tomaz Muraus Date: Fri, 30 Jun 2017 17:50:21 +0200 Subject: [PATCH 1/6] Also register internal trigger types in bootstrap phase of st2-register-content script. This should resolve the weird race issue @arma spotted on Ubuntu 16.04. --- st2common/st2common/content/bootstrap.py | 3 ++- st2common/st2common/script_setup.py | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/st2common/st2common/content/bootstrap.py b/st2common/st2common/content/bootstrap.py index 0160648e09..1221590a63 100644 --- a/st2common/st2common/content/bootstrap.py +++ b/st2common/st2common/content/bootstrap.py @@ -375,7 +375,8 @@ def register_content(): def setup(argv): - common_setup(config=config, setup_db=True, register_mq_exchanges=True) + common_setup(config=config, setup_db=True, register_mq_exchanges=True, + register_internal_trigger_types=True) def teardown(): diff --git a/st2common/st2common/script_setup.py b/st2common/st2common/script_setup.py index 1e540158e7..c192578fb0 100644 --- a/st2common/st2common/script_setup.py +++ b/st2common/st2common/script_setup.py @@ -29,6 +29,7 @@ from st2common import log as logging from st2common.database_setup import db_setup from st2common.database_setup import db_teardown +from st2common import triggers from st2common.logging.filters import LogLevelFilter from st2common.transport.bootstrap_utils import register_exchanges_with_retry @@ -50,7 +51,8 @@ def register_common_cli_options(): cfg.CONF.register_cli_opt(cfg.BoolOpt('verbose', short='v', default=False)) -def setup(config, setup_db=True, register_mq_exchanges=True): +def setup(config, setup_db=True, register_mq_exchanges=True, + register_internal_trigger_types=False): """ Common setup function. @@ -91,6 +93,9 @@ def setup(config, setup_db=True, register_mq_exchanges=True): if register_mq_exchanges: register_exchanges_with_retry() + if register_internal_trigger_types: + triggers.register_internal_trigger_types() + def teardown(): """ From 2d7e8c28aa39b80f89562cfd8f02167826296021 Mon Sep 17 00:00:00 2001 From: Tomaz Muraus Date: Fri, 30 Jun 2017 17:57:37 +0200 Subject: [PATCH 2/6] Update docstring. --- st2common/st2common/script_setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/st2common/st2common/script_setup.py b/st2common/st2common/script_setup.py index c192578fb0..1b6458b62a 100644 --- a/st2common/st2common/script_setup.py +++ b/st2common/st2common/script_setup.py @@ -62,6 +62,7 @@ def setup(config, setup_db=True, register_mq_exchanges=True, 2. Establishes DB connection 3. Suppress DEBUG log level if --verbose flag is not used 4. Registers RabbitMQ exchanges + 5. Registers internal trigger types (optional, disabled by default) :param config: Config object to use to parse args. """ From 94f3d10f17a1345b61a464634835a3b32f2d2430 Mon Sep 17 00:00:00 2001 From: Tomaz Muraus Date: Fri, 30 Jun 2017 22:05:18 +0200 Subject: [PATCH 3/6] Correctly ignore trigger dont exist errors and add missing error. --- st2common/st2common/triggers.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/st2common/st2common/triggers.py b/st2common/st2common/triggers.py index 834c706ecc..a2271b13c3 100644 --- a/st2common/st2common/triggers.py +++ b/st2common/st2common/triggers.py @@ -23,6 +23,8 @@ from st2common.constants.triggers import (INTERNAL_TRIGGER_TYPES, ACTION_SENSOR_TRIGGER) from st2common.exceptions.db import StackStormDBObjectConflictError from st2common.services.triggers import create_trigger_type_db, create_shadow_trigger +from st2common.services.triggers import get_trigger_type_db +from st2common.models.system.common import ResourceReference __all__ = [ 'register_internal_trigger_types' @@ -35,13 +37,16 @@ def _register_internal_trigger_type(trigger_definition): try: trigger_type_db = create_trigger_type_db(trigger_type=trigger_definition) except (NotUniqueError, StackStormDBObjectConflictError): - # We ignore conflict error since this operation is idempodent and race is not an - # issue - LOG.debug('Trigger type "%s" already exists, ignoring...' % - (trigger_definition['name']), exc_info=True) + # We ignore conflict error since this operation is idempotent and race is not an issue + LOG.debug('Trigger type "%s" already exists, ignoring...' % (trigger_definition['name']), + exc_info=True) + + ref = ResourceReference.to_string_reference(name=trigger_definition['name'], + pack=trigger_definition['pack']) + trigger_type_db = get_trigger_type_db(ref) # trigger types with parameters do no require a shadow trigger. - if not trigger_type_db.parameters_schema: + if trigger_type_db and not trigger_type_db.parameters_schema: LOG.info('Registered trigger: %s.', trigger_definition['name']) try: trigger_db = create_shadow_trigger(trigger_type_db) From f0c0f917da38fccdb5a421cbe1343ebd5c82ec1e Mon Sep 17 00:00:00 2001 From: Tomaz Muraus Date: Sat, 1 Jul 2017 11:24:05 +0200 Subject: [PATCH 4/6] Change log level from info to debug when logging successful internal trigger registration. --- st2common/st2common/triggers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/st2common/st2common/triggers.py b/st2common/st2common/triggers.py index a2271b13c3..568fcff881 100644 --- a/st2common/st2common/triggers.py +++ b/st2common/st2common/triggers.py @@ -47,7 +47,7 @@ def _register_internal_trigger_type(trigger_definition): # trigger types with parameters do no require a shadow trigger. if trigger_type_db and not trigger_type_db.parameters_schema: - LOG.info('Registered trigger: %s.', trigger_definition['name']) + LOG.debug('Registered trigger: %s.', trigger_definition['name']) try: trigger_db = create_shadow_trigger(trigger_type_db) From 4b4ea3a467375c4592ba81cb1e471e97967684a1 Mon Sep 17 00:00:00 2001 From: Tomaz Muraus Date: Sat, 1 Jul 2017 11:26:14 +0200 Subject: [PATCH 5/6] Add internal prefix to make it more clear and more "registered" log line to the correct place. --- st2common/st2common/triggers.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/st2common/st2common/triggers.py b/st2common/st2common/triggers.py index 568fcff881..38e38c6d50 100644 --- a/st2common/st2common/triggers.py +++ b/st2common/st2common/triggers.py @@ -38,21 +38,23 @@ def _register_internal_trigger_type(trigger_definition): trigger_type_db = create_trigger_type_db(trigger_type=trigger_definition) except (NotUniqueError, StackStormDBObjectConflictError): # We ignore conflict error since this operation is idempotent and race is not an issue - LOG.debug('Trigger type "%s" already exists, ignoring...' % (trigger_definition['name']), - exc_info=True) + LOG.debug('Internal trigger type "%s" already exists, ignoring...' % + (trigger_definition['name']), exc_info=True) ref = ResourceReference.to_string_reference(name=trigger_definition['name'], pack=trigger_definition['pack']) trigger_type_db = get_trigger_type_db(ref) + if trigger_type_db: + LOG.debug('Registered internal trigger: %s.', trigger_definition['name']) + # trigger types with parameters do no require a shadow trigger. if trigger_type_db and not trigger_type_db.parameters_schema: - LOG.debug('Registered trigger: %s.', trigger_definition['name']) try: trigger_db = create_shadow_trigger(trigger_type_db) extra = {'trigger_db': trigger_db} - LOG.audit('Trigger created for parameter-less TriggerType. Trigger.id=%s' % + LOG.audit('Trigger created for parameter-less internal TriggerType. Trigger.id=%s' % (trigger_db.id), extra=extra) except StackStormDBObjectConflictError: LOG.debug('Shadow trigger "%s" already exists. Ignoring.', From 2cad943016064ec9d439e03cf37df9db350b5011 Mon Sep 17 00:00:00 2001 From: armab Date: Sat, 1 Jul 2017 14:35:22 +0300 Subject: [PATCH 6/6] Add a CHANGELOG note --- CHANGELOG.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c261fc68e2..98867d9069 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -54,6 +54,8 @@ Fixed (``False``, ``None``, ``0``, etc.) (bug-fix) #3504 #3531 Reported by Simas Čepaitis. +* Fix ``st2ctl register`` failure to register rules in some race conditions. + ``st2-register-content`` will now register internal trigger types by default. (bug-fix) #3542 2.3.0 - June 19, 2017 ---------------------