From 0366529cc9f018fdcce4b2f56e884f332278ef35 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Tue, 17 Jan 2017 09:03:50 -0500 Subject: [PATCH] initial take at merging local.conf code --- devstack/cmd.py | 22 +++++++++++++++++++--- devstack/dsconf.py | 24 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/devstack/cmd.py b/devstack/cmd.py index da8a502..5e54219 100644 --- a/devstack/cmd.py +++ b/devstack/cmd.py @@ -50,6 +50,11 @@ def setlc_conf(local_conf, args): local_conf.set(args.group, args.conf, args.section, args.name, args.value) +def merge(local_conf, args): + for source in args.sources: + local_conf.merge_lc(source) + + def parse_args(argv): parser = argparse.ArgumentParser(prog='dsconf') subparsers = parser.add_subparsers(title='commands', @@ -120,14 +125,25 @@ def parse_args(argv): parser_setlc_conf.add_argument('name') parser_setlc_conf.add_argument('value') - return parser.parse_args() + parser_merge = subparsers.add_parser( + 'merge_lc', help='merge local.conf files') + parser_merge.set_defaults(func=merge) + parser_merge.add_argument('local_conf') + parser_merge.add_argument('sources', nargs='+') + + return parser.parse_args(), parser def main(argv=None): - args = parse_args(argv or sys.argv) + args, parser = parse_args(argv or sys.argv) if hasattr(args, 'inifile'): f = devstack.dsconf.IniFile(args.inifile) elif hasattr(args, 'local_conf'): f = devstack.dsconf.LocalConf(args.local_conf) - args.func(f, args) + + if hasattr(args, 'func'): + args.func(f, args) + else: + parser.print_help() + return 1 return diff --git a/devstack/dsconf.py b/devstack/dsconf.py index 9e9ff6c..66071cd 100644 --- a/devstack/dsconf.py +++ b/devstack/dsconf.py @@ -145,6 +145,17 @@ class LocalConf(object): if m2: yield current_section, m2.group(1), m2.group(2) + def groups(self): + """Return a list of all groups in the local.conf""" + groups = [] + with open(self.fname) as reader: + for line in reader.readlines(): + m = re.match(r"\[\[([^\[\]]+)\|([^\[\]]+)\]\]", line) + if m: + group = (m.group(1), m.group(2)) + groups.append(group) + return groups + def _section(self, group, conf): """Yield all the lines out of a meta section.""" in_section = False @@ -283,3 +294,16 @@ class LocalConf(object): def _do_set(writer, line): writer.write("%s = %s\n" % (name, value)) self._at_insert_point(group, conf, section, name, _do_set) + + def merge_lc(self, lcfile): + lc = LocalConf(lcfile) + groups = lc.groups() + for group, conf in groups: + if group == "local": + for line in lc._section(group, conf): + m = re.match(r"(\w+)\s*\=\s*(.+)", line) + if m: + self.set_local(m.group(1), m.group(2)) + else: + for section, name, value in lc._conf(group, conf): + lc.set(group, conf, section, name, value)