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)
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)
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)
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)
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]")
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)
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)