Пример #1
0
 def execute(self, action, *args, **kwargs):
     action_logger.debug("Executing action %s" % action)
     action = action.upper()
     try:
         res = self(action, *args, **kwargs)
         action_logger.info("Done executing chaos action: %s" % action)
         action_logger.warning(banner("=", pad=False))
         return res
     except AttributeError as e:
         raise UnknownAction(e)
Пример #2
0
 def execute(self, event, *args, **kwargs):
     exe_logger.debug("Executing event %s" % event)
     event = event.upper()
     try:
         res = self(event, *args, **kwargs)
         exe_logger.info("Done executing chaos event: %s" % event)
         exe_logger.warning(banner("=", pad=False))
         if not res:
             exe_logger.critical("Shit happened!! , event: %s, args: %s, "
                                 "kwargs: %s" % (event, args, kwargs))
         return res
     except AttributeError as e:
         raise UnknownChaosEvent(e)
Пример #3
0
 def random_run(self, *args, **kwargs):
     event = self.event_gen.next()
     exe_logger.warning(banner("=", pad=False))
     exe_logger.info("Running random event :%s" % event)
     return self.run(event, *args, **kwargs)
Пример #4
0
 def run(self, event, *args, **kwargs):
     exe_logger.warning(banner("=", pad=False))
     exe_logger.info("Running event :%s" % event)
     return self.execute(event, *args, **kwargs)
Пример #5
0
def main(args):
    # Initialize
    log_level = args.log_level

    log_file = args.file_log
    logger = init_logger(log_level=log_level,
                         file_log=True if log_file is not None else False,
                         console_log=not args.no_console_log)
    if args.subparser == "server":
        logger.warning(banner("=") + "\n")
        logger.info("Starting Chaos webserver on %s:%s , minicloud network "
                    "%s \n" % (args.host, args.port, args.network))
        logger.warning(banner("=") + "\n")
        # Set environment variables for network
        os.environ["NETWORK"] = args.network
        from apocalypse.server.app import web_app

        debug = True if log_level == "debug" else False
        web_app.run(args.host, args.port, debug=debug)
    else:
        error_threshold = args.error_threshold if args.error_threshold > 0 else 1
        trigger_every = getattr(args, 'trigger', 10)
        try:
            float(trigger_every)
            trigger_unit = "s"
        except ValueError:
            trigger_unit = ""
        filter_categories = {
            "resource": args.run_resource_chaos,
            "generic": args.run_generic_chaos,
            "network": args.run_network_chaos
        }
        max_workers = getattr(args, 'max_workers', 10)
        ChaosGenerator.set_threshold(error_threshold)
        network = args.network
        app = ChaosApp(network)
        events = filter_event_args(args)
        if events:
            network_chaos_enabled = args.enable_network_chaos
            extra = {'network_chaos': network_chaos_enabled}
            if network_chaos_enabled:
                app.init_network_emulator()

        gen = ChaosGenerator(app,
                             every=trigger_every,
                             max_workers=max_workers,
                             **extra)
        categorized_events = [
            e for k, v in filter_categories.items() if v
            for e in gen._chaos_executor.get_events_by_category(k)
        ]
        if categorized_events:
            events = {
                k: v
                for k, v in events.items() if k.lower() in categorized_events
            }
        background_run = args.background_run

        start = args.start
        stop = args.stop
        status = args.status

        if start:
            logger.warning(banner("info"))
            config = getattr(args, "config", None)
            if config:
                logger.warning("Chaos configuration read from '%s'" % config)
            logger.warning("Starting Chaos with events on network: '%s'" %
                           network)
            logger.warning(banner("="))

            logger.warning(pprint.pformat(events))
            logger.warning(banner("="))
            logger.warning("Chaos would be triggered "
                           "every %s%s" % (trigger_every, trigger_unit))
            logger.warning("Error Threshold set to %s" % error_threshold)

            gen.update_events(events)
            if background_run:
                logger.warning("Logfile @ %s " % LOGFILE)
                logger.warning(banner("=", pad=False))
                startstop(stdout=LOGFILE, pidfile=PIDFILE, action="start")
            else:
                pid = os.getpid()
                logger.warning("use 'kill %s' to stop chaos\n" % pid)
                logger.warning(banner("=", pad=False))
            gen.start()
        elif stop:
            startstop(stdout=LOGFILE, pidfile=PIDFILE, action="stop")
        elif status:
            startstop(stdout=LOGFILE, pidfile=PIDFILE, action="status")
        else:
            logger.error("Chaos action not specified use one from [start,stop,"
                         "status]")
Пример #6
0
 def random_run(self, *args, **kwargs):
     action = random.choice(self._actions.keys())
     action_logger.warning(banner("=", pad=False))
     action_logger.info("Running random action :%s" % action)
     return self.run(action, *args, **kwargs)
Пример #7
0
 def run(self, action, *args, **kwargs):
     action_logger.warning(banner("=", pad=False))
     action_logger.info("Running action :%s" % action)
     return self.execute(action, *args, **kwargs)