From df35f26910a64cbbb5cc074345ce992d605b7740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Sedl=C3=A1=C5=99?= Date: Wed, 21 Nov 2018 14:58:16 +0100 Subject: [PATCH] Add script to merge and dump multiple configuration files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The script can either take config from an existing compose, or load files by path. By default it will perform full validation (and add default values and resolved git references). This can be turned off. The final JSON is printed to stdout. JIRA: COMPOSE-3066 Signed-off-by: Lubomír Sedlář --- bin/pungi-config-dump | 74 +++++++++++++++++++++++++++++++++++++++++++ pungi.spec | 1 + setup.py | 1 + 3 files changed, 76 insertions(+) create mode 100755 bin/pungi-config-dump diff --git a/bin/pungi-config-dump b/bin/pungi-config-dump new file mode 100755 index 00000000..0b05c1bb --- /dev/null +++ b/bin/pungi-config-dump @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from __future__ import print_function + +import argparse +import json +import os +import sys + +import kobo.conf +import pungi.checks + + +def load_file(source, conf): + try: + with open(source) as f: + conf.load_from_dict(json.load(f)) + except ValueError: + conf.load_from_file(source) + + +def load_source(source, conf): + if os.path.isfile(source): + load_file(source, conf) + else: + load_file(os.path.join(source, "logs/global/config-dump.global.log"), conf) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "sources", + metavar="SOURCE", + nargs="+", + help=( + "Source for the configuration; either a compose " + "or arbitrary number of config files." + ), + ) + group = parser.add_mutually_exclusive_group() + group.add_argument( + "--just-dump", + action="store_true", + help=( + "Do not transform the config in any way. Default values are not " + "added, git references are not resolved." + ), + ) + group.add_argument( + "--offline", action="store_true", help="Do not resolve git references." + ) + + args = parser.parse_args() + + conf = kobo.conf.PyConfigParser() + + for source in args.sources: + load_source(source, conf) + + if not args.just_dump: + errors, _ = pungi.checks.validate(conf, offline=args.offline) + if errors: + for error in errors: + print(error, file=sys.stderr) + return False + + json.dump(conf, sys.stdout, sort_keys=True, indent=4) + return True + + +if __name__ == "__main__": + if not main(): + sys.exit(1) diff --git a/pungi.spec b/pungi.spec index 8f5d8eff..081b28b2 100644 --- a/pungi.spec +++ b/pungi.spec @@ -96,6 +96,7 @@ rm -rf %{buildroot} %files utils %{python_sitelib}/%{name}_utils %{_bindir}/%{name}-create-unified-isos +%{_bindir}/%{name}-config-dump %{_bindir}/%{name}-config-validate %{_bindir}/%{name}-fedmsg-notification %{_bindir}/%{name}-patch-iso diff --git a/setup.py b/setup.py index e5abdd36..7b588b5e 100755 --- a/setup.py +++ b/setup.py @@ -36,6 +36,7 @@ setup( scripts = [ 'bin/comps_filter', 'bin/pungi', + 'bin/pungi-config-dump', 'bin/pungi-config-validate', 'bin/pungi-create-unified-isos', 'bin/pungi-fedmsg-notification',