Permalink
Fetching contributors…
Cannot retrieve contributors at this time
84 lines (71 sloc) 2.96 KB
# Copyright 2014-2017 Canonical Limited.
#
# This file is part of charms.reactive
#
# charms.reactive is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License version 3 as
# published by the Free Software Foundation.
#
# charms.reactive is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with charm-helpers. If not, see <http://www.gnu.org/licenses/>.
import os
import sys
import traceback
from .flags import * # noqa
from .relations import * # noqa
from .endpoints import * # noqa
from .decorators import * # noqa
from .helpers import * # noqa
from . import bus
from . import flags
from . import helpers
from charmhelpers.core import hookenv
from charmhelpers.core import unitdata
# DEPRECATED: transitional imports for backwards compatibility
bus.StateList = flags.StateList
bus.set_state = flags.set_flag
bus.remove_state = flags.clear_flag
bus.get_state = flags.get_state
bus.get_states = flags.get_states
helpers.is_state = flags.is_flag_set
helpers.toggle_state = flags.toggle_flag
helpers.all_states = flags.all_flags_set
helpers.any_states = flags.any_flags_set
def main(relation_name=None):
"""
This is the main entry point for the reactive framework. It calls
:func:`~bus.discover` to find and load all reactive handlers (e.g.,
:func:`@when <decorators.when>` decorated blocks), and then
:func:`~bus.dispatch` to trigger handlers until the queue settles out.
Finally, :meth:`unitdata.kv().flush <charmhelpers.core.unitdata.Storage.flush>`
is called to persist the flags and other data.
:param str relation_name: Optional name of the relation which is being handled.
"""
restricted_mode = hookenv.hook_name() in ['meter-status-changed', 'collect-metrics']
hookenv.log('Reactive main running for hook %s' % hookenv.hook_name(), level=hookenv.INFO)
if restricted_mode:
hookenv.log('Restricted mode.', level=hookenv.INFO)
# work-around for https://bugs.launchpad.net/juju-core/+bug/1503039
# ensure that external handlers can tell what hook they're running in
if 'JUJU_HOOK_NAME' not in os.environ:
os.environ['JUJU_HOOK_NAME'] = os.path.basename(sys.argv[0])
try:
bus.discover()
if not restricted_mode: # limit what gets run in restricted mode
hookenv._run_atstart()
bus.dispatch(restricted=restricted_mode)
except Exception:
tb = traceback.format_exc()
hookenv.log('Hook error:\n{}'.format(tb), level=hookenv.ERROR)
raise
except SystemExit as x:
if x.code not in (None, 0):
raise
if not restricted_mode: # limit what gets run in restricted mode
hookenv._run_atexit()
unitdata._KV.flush()