From 81a9042ff16d15ef945bd993deedcb887a37ebd9 Mon Sep 17 00:00:00 2001 From: pran1990 Date: Wed, 21 May 2014 11:53:30 -0700 Subject: [PATCH] Add some more checks to engine creation Add a field called enabled in the engine cfg file that keeps track of files. This can be used to keep track of stopped engines, and monitored using watchdog/similar. Also added some more checks at engine creation time. Partially Closes-bug:1309406 Change-Id: I1c365c2c438e6ed0a44413e1d09c69d3fab7ab7b --- entropy/__main__.py | 37 ++++++++++++++++++++++++++----------- entropy/utils.py | 43 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 14 deletions(-) diff --git a/entropy/__main__.py b/entropy/__main__.py index 65a2839..1cb4fed 100644 --- a/entropy/__main__.py +++ b/entropy/__main__.py @@ -90,18 +90,33 @@ def start_engine(args): if not (args.name and args.engine_cfg): LOG.error('Need name and engine cfg') return - cfg_data = dict(utils.load_yaml(args.engine_cfg))[args.name] - cfg = { - args.name: { - 'cfg': os.path.join(os.getcwd(), args.engine_cfg), - 'pid': os.getpid(), - 'backend': cfg_data['backend'] + utils.create_files([engine_cfg]) + if args.purge: + utils.purge_disabled(engine_cfg) + if utils.check_exists_and_enabled(args.name, engine_cfg): + LOG.error("An engine of the same name %s is already " + "registered and running", args.name) + return + if utils.check_exists_and_disabled(args.name, engine_cfg): + LOG.error("And engine of the same name %s is already " + "registered, but disabled. Run with purge?", args.name) + return + try: + cfg_data = dict(utils.load_yaml(args.engine_cfg))[args.name] + cfg = { + args.name: { + 'cfg': os.path.join(os.getcwd(), args.engine_cfg), + 'pid': os.getpid(), + 'backend': cfg_data['backend'] + } } - } - utils.write_yaml(cfg, engine_cfg) - LOG.info('Added %s to engine cfg', args.name) - entropy_engine = Engine(args.name, **cfg_data) - entropy_engine.run() + utils.write_yaml(cfg, engine_cfg) + LOG.info('Added %s to engine cfg', args.name) + entropy_engine = Engine(args.name, **cfg_data) + entropy_engine.run() + except Exception: + LOG.exception("Could not start engine %s", args.name) + return def parse(): diff --git a/entropy/utils.py b/entropy/utils.py index d355d39..01bc048 100644 --- a/entropy/utils.py +++ b/entropy/utils.py @@ -106,11 +106,47 @@ class WatchdogHandler(FileSystemEventHandler): def watch_dir_for_change(dir_to_watch, event_fn): event_handler = WatchdogHandler(event_fn) observer = Observer() - observer.schedule(event_handler, path=dir_to_watch, recursive=True) + observer.schedule(event_handler, path=dir_to_watch) observer.start() return observer +def check_exists_and_enabled(name, cfg_file): + engines = load_yaml(cfg_file) + return engines and name in engines and engines[name]['enabled'] + + +def check_exists_and_disabled(name, cfg_file): + engines = load_yaml(cfg_file) + return engines and name in engines and not engines[name]['enabled'] + + +def purge_disabled(cfg_file): + engines = load_yaml(cfg_file) + final_engines = {} + if not engines: + return + for engine in engines: + if engines[engine]['enabled']: + final_engines[engine] = engines[engine] + if final_engines: + write_yaml(final_engines, cfg_file, append=False) + else: + with open(cfg_file, 'w'): + pass + + +def disable_engine(name, cfg_file): + engines = load_yaml(cfg_file) + if not engines: + raise Exception("No engines at all!") + if name not in engines: + raise Exception("No such engine!") + engines[name]['enabled'] = False + write_yaml(engines, cfg_file, append=False) + return engines[name]['pid'] + + def reset_logger(log): if not log: return @@ -123,8 +159,9 @@ def reset_logger(log): log.addHandler(logging.NullHandler()) -def write_yaml(data, filename): - with open(filename, "a") as cfg_file: +def write_yaml(data, filename, append=True): + mode = "a" if append else "w" + with open(filename, mode) as cfg_file: cfg_file.write(yaml.safe_dump(data, default_flow_style=False, canonical=False))