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
This commit is contained in:
pran1990 2014-05-21 11:53:30 -07:00 committed by Pranesh Pandurangan
parent 1d739dea9c
commit 81a9042ff1
2 changed files with 66 additions and 14 deletions

View File

@ -90,18 +90,33 @@ def start_engine(args):
if not (args.name and args.engine_cfg): if not (args.name and args.engine_cfg):
LOG.error('Need name and engine cfg') LOG.error('Need name and engine cfg')
return return
cfg_data = dict(utils.load_yaml(args.engine_cfg))[args.name] utils.create_files([engine_cfg])
cfg = { if args.purge:
args.name: { utils.purge_disabled(engine_cfg)
'cfg': os.path.join(os.getcwd(), args.engine_cfg), if utils.check_exists_and_enabled(args.name, engine_cfg):
'pid': os.getpid(), LOG.error("An engine of the same name %s is already "
'backend': cfg_data['backend'] "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)
utils.write_yaml(cfg, engine_cfg) LOG.info('Added %s to engine cfg', args.name)
LOG.info('Added %s to engine cfg', args.name) entropy_engine = Engine(args.name, **cfg_data)
entropy_engine = Engine(args.name, **cfg_data) entropy_engine.run()
entropy_engine.run() except Exception:
LOG.exception("Could not start engine %s", args.name)
return
def parse(): def parse():

View File

@ -106,11 +106,47 @@ class WatchdogHandler(FileSystemEventHandler):
def watch_dir_for_change(dir_to_watch, event_fn): def watch_dir_for_change(dir_to_watch, event_fn):
event_handler = WatchdogHandler(event_fn) event_handler = WatchdogHandler(event_fn)
observer = Observer() observer = Observer()
observer.schedule(event_handler, path=dir_to_watch, recursive=True) observer.schedule(event_handler, path=dir_to_watch)
observer.start() observer.start()
return observer 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): def reset_logger(log):
if not log: if not log:
return return
@ -123,8 +159,9 @@ def reset_logger(log):
log.addHandler(logging.NullHandler()) log.addHandler(logging.NullHandler())
def write_yaml(data, filename): def write_yaml(data, filename, append=True):
with open(filename, "a") as cfg_file: mode = "a" if append else "w"
with open(filename, mode) as cfg_file:
cfg_file.write(yaml.safe_dump(data, cfg_file.write(yaml.safe_dump(data,
default_flow_style=False, default_flow_style=False,
canonical=False)) canonical=False))