Skip to content
2 changes: 2 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
---------------------
Expand Down
3 changes: 2 additions & 1 deletion st2common/st2common/content/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
8 changes: 7 additions & 1 deletion st2common/st2common/script_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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.

Expand All @@ -60,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)
Copy link
Member

@arm4b arm4b Jun 30, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe it worth to register trigger types only when --register-triggers is requested from the st2-register-content script?

Move this logic here: https://github.com/StackStorm/st2/blob/master/st2common/st2common/content/bootstrap.py#L128 instead of doing that every time in setup.


:param config: Config object to use to parse args.
"""
Expand Down Expand Up @@ -91,6 +94,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():
"""
Expand Down
19 changes: 13 additions & 6 deletions st2common/st2common/triggers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -35,19 +37,24 @@ 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...' %
# We ignore conflict error since this operation is idempotent and race is not an issue
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 not trigger_type_db.parameters_schema:
LOG.info('Registered trigger: %s.', trigger_definition['name'])
if trigger_type_db and not trigger_type_db.parameters_schema:
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.',
Expand Down