Source code for chaosmonkey.cm.cm

import logging
import signal
import click


from gevent.wsgi import WSGIServer
from chaosmonkey.engine.app import configure_engine, shutdown_engine
from chaosmonkey.api.app import flask_app
from .profiling import PROFILER_FILE_PATH, profile_ctx


@click.command(name='chaos-monkey-engine')
@click.option("--port", "-p", default=5000, help="Port used to expose the CM API. Default 5000")
@click.option("--timezone", "-t", default="Europe/Madrid", help="Timezone to configure the scheduler. "
                                                                "Default 'Europe/Madrid'")
@click.option("--profiling", "-x", default=False, help="Enable cProfile module, dumping data in /tmp/profile.prof")
@click.option("--database-uri", "-d", required=True, help="SQLAlchemy database uri")
@click.option("--attacks-folder", "-a", required=True, help="Path to the folder where the attacks are stored")
@click.option("--planners-folder", "-p", required=True, help="Path to the folder where the planners are stored")
def cm(port, timezone, profiling, database_uri, attacks_folder, planners_folder):
    """
    Chaos Monkey Engine command line utility
    """
    with profile_ctx(profiling):

        log = logging.getLogger(__name__)

        configure_engine(database_uri, attacks_folder, planners_folder, timezone)

        log.info("Engine configured")
        log.debug("database: %s", database_uri)
        log.debug("attacks folder: %s", attacks_folder)
        log.debug("planners folder: %s", planners_folder)
        log.debug("timezone: %s", timezone)

        try:
            # Catch SIGTERM and convert it to a SystemExit
            signal.signal(signal.SIGTERM, sigterm_handler)
            log.info("Serving API at port %s", port)
            run_api_server(flask_app, port)
        except (KeyboardInterrupt, SystemExit):
            shutdown_engine()


[docs]def run_api_server(app, port=5000): """ Runs a gevent server on a given port. Default port is 5000. :param app: WSGI-compliant app to be run :param port: port for the gevent server :type port: int :return: None """ log = logging.getLogger('api') http_server = WSGIServer(('', port), app, log=log) http_server.serve_forever()
[docs]def sigterm_handler(): raise SystemExit(1)