This provides the same functionality as the two refresh scripts
that are currently in the repository, with the following
advantages:
* all files are refreshed with a single command;
* if lcitool is present in the user's $PATH, it will be
discovered and used automatically;
* some output is produced, so the user can follow along with
the progress of the operation.
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
ci/helper | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 102 insertions(+)
diff --git a/ci/helper b/ci/helper
index 2a59b8e5ab..05ecdcb426 100755
--- a/ci/helper
+++ b/ci/helper
@@ -18,10 +18,22 @@
import argparse
import pathlib
+import shutil
+import subprocess
+import sys
class Parser:
def __init__(self):
+ # Options that are common to all actions that use lcitool
+ lcitoolparser = argparse.ArgumentParser(add_help=False)
+ lcitoolparser.add_argument(
+ "--lcitool",
+ metavar="PATH",
+ default="lcitool",
+ help="path to lcitool binary",
+ )
+
# Main parser
self.parser = argparse.ArgumentParser()
subparsers = self.parser.add_subparsers(
@@ -30,6 +42,14 @@ class Parser:
)
subparsers.required = True
+ # refresh action
+ refreshparser = subparsers.add_parser(
+ "refresh",
+ help="refresh data generated with lcitool",
+ parents=[lcitoolparser],
+ )
+ refreshparser.set_defaults(func=Application.action_refresh)
+
def parse(self):
return self.parser.parse_args()
@@ -39,6 +59,88 @@ class Application:
self.basedir = pathlib.Path(__file__).resolve().parent
self.args = Parser().parse()
+ if self.args.action == "refresh":
+ if not shutil.which(self.args.lcitool):
+ sys.exit("error: 'lcitool' not installed")
+
+ def lcitool_run(self, args):
+ output = subprocess.check_output([self.args.lcitool] + args)
+ return output.decode("utf-8")
+
+ def lcitool_get_hosts(self):
+ output = self.lcitool_run(["hosts"])
+ return output.splitlines()
+
+ def generate_dockerfile(self, host, cross=None):
+ args = ["dockerfile", host, "libvirt"]
+ outdir = self.basedir.joinpath("containers")
+ outfile = f"ci-{host}.Dockerfile"
+
+ if cross:
+ args.extend(["--cross", cross])
+ outfile = f"ci-{host}-cross-{cross}.Dockerfile"
+
+ output = self.lcitool_run(args)
+ with open(outdir.joinpath(outfile), "w") as f:
+ f.write(output)
+
+ def generate_vars(self, host):
+ args = ["variables", host, "libvirt"]
+ outdir = self.basedir.joinpath("cirrus")
+ outfile = f"{host}.vars"
+
+ output = self.lcitool_run(args)
+ with open(outdir.joinpath(outfile), "w") as f:
+ f.write(output)
+
+ def refresh_containers(self):
+ debian_cross = [
+ "aarch64",
+ "armv6l",
+ "armv7l",
+ "i686",
+ "mips",
+ "mips64el",
+ "mipsel",
+ "ppc64le",
+ "s390x",
+ ]
+ fedora_cross = [
+ "mingw32",
+ "mingw64",
+ ]
+
+ for host in self.lcitool_get_hosts():
+ if host.startswith("freebsd-") or
host.startswith("macos-"):
+ continue
+
+ print(f"containers/{host}")
+ self.generate_dockerfile(host)
+
+ if host == "fedora-rawhide":
+ for cross in fedora_cross:
+ print(f"containers/{host} ({cross})")
+ self.generate_dockerfile(host, cross)
+
+ if host.startswith("debian-"):
+ for cross in debian_cross:
+ if host == "debian-sid" and cross == "mips":
+ continue
+ print(f"containers/{host} ({cross})")
+ self.generate_dockerfile(host, cross)
+
+ def refresh_cirrus(self):
+ for host in self.lcitool_get_hosts():
+ if not (host.startswith("freebsd-") or
host.startswith("macos-")):
+ continue
+
+ print(f"cirrus/{host}")
+ self.generate_vars(host)
+
+ def action_refresh(self):
+ self.refresh_containers()
+ self.refresh_cirrus()
+
def run(self):
self.args.func(self)
--
2.26.2