This is intended to be the entry point for a number of CI-related
operations that currently are implemented in various different
scripts written in various different programming languages; in
this first iteration, it simply replaces the two existing refresh
scripts.
Advantages:
* it refreshes all lcitool-generated files in one go;
* it can be called from the top-level source directory;
* it automatically finds lcitool if it's somewhere in the
user's $PATH;
* it produces some output to keep the user updated on the
progress of the current operation;
* it's written in a real programming language, which will
hopefully help maintainability.
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
ci/cirrus/refresh | 22 --------
ci/containers/refresh | 41 ---------------
ci/helper | 118 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 118 insertions(+), 63 deletions(-)
delete mode 100755 ci/cirrus/refresh
delete mode 100755 ci/containers/refresh
create mode 100755 ci/helper
diff --git a/ci/cirrus/refresh b/ci/cirrus/refresh
deleted file mode 100755
index 63ca794134..0000000000
--- a/ci/cirrus/refresh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-
-if test -z "$1"
-then
- echo "syntax: $0 PATH-TO-LCITOOL"
- exit 1
-fi
-
-LCITOOL=$1
-
-if ! test -x "$LCITOOL"
-then
- echo "$LCITOOL is not executable"
- exit 1
-fi
-
-HOSTS=$($LCITOOL hosts | grep -E 'freebsd|macos')
-
-for host in $HOSTS
-do
- $LCITOOL variables "$host" libvirt >"$host.vars"
-done
diff --git a/ci/containers/refresh b/ci/containers/refresh
deleted file mode 100755
index f38d3634b5..0000000000
--- a/ci/containers/refresh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/sh
-
-if test -z "$1"
-then
- echo "syntax: $0 PATH-TO-LCITOOL"
- exit 1
-fi
-
-LCITOOL=$1
-
-if ! test -x "$LCITOOL"
-then
- echo "$LCITOOL is not executable"
- exit 1
-fi
-
-HOSTS=$($LCITOOL hosts | grep -Ev 'freebsd|macos')
-
-for host in $HOSTS
-do
- case "$host" in
- fedora-rawhide)
- for cross in mingw32 mingw64
- do
- $LCITOOL dockerfile $host libvirt --cross $cross >
ci-$host-cross-$cross.Dockerfile
- done
- ;;
- debian-*)
- for cross in aarch64 armv6l armv7l i686 mips mips64el mipsel ppc64le s390x
- do
- if test "$host-cross-$cross" = "debian-sid-cross-mips"
- then
- continue
- fi
- $LCITOOL dockerfile $host libvirt --cross $cross >
ci-$host-cross-$cross.Dockerfile
- done
- ;;
- esac
-
- $LCITOOL dockerfile $host libvirt > ci-$host.Dockerfile
-done
diff --git a/ci/helper b/ci/helper
new file mode 100755
index 0000000000..c0ca34bd28
--- /dev/null
+++ b/ci/helper
@@ -0,0 +1,118 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2021 Red Hat, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see
+# <
http://www.gnu.org/licenses/>.
+
+import argparse
+import os
+import shutil
+import subprocess
+import sys
+
+def lcitool_run(lcitool_path, lcitool_args):
+ if not lcitool_path:
+ lcitool_path = "lcitool"
+ if not shutil.which(lcitool_path):
+ sys.exit("error: 'lcitool' not installed")
+
+ lcitool_out = subprocess.check_output([lcitool_path] + lcitool_args)
+ return lcitool_out.decode("utf-8")
+
+def lcitool_get_hosts(context):
+ lcitool_path = context["lcitool"]
+
+ lcitool_out = lcitool_run(lcitool_path, ["hosts"])
+ return lcitool_out.splitlines()
+
+def generate_dockerfile(context, host, cross=None):
+ basedir = context["basedir"]
+ lcitool_path = context["lcitool"]
+
+ lcitool_args = ["dockerfile", host, "libvirt"]
+ outfile = f"{basedir}/containers/ci-{host}.Dockerfile"
+
+ if cross:
+ lcitool_args.extend(["--cross", cross])
+ outfile = f"{basedir}/containers/ci-{host}-cross-{cross}.Dockerfile"
+
+ lcitool_out = lcitool_run(lcitool_path, lcitool_args)
+ with open(outfile, "w") as f:
+ f.write(lcitool_out)
+
+def generate_vars(context, host):
+ basedir = context["basedir"]
+ lcitool_path = context["lcitool"]
+
+ lcitool_out = lcitool_run(lcitool_path, ["variables", host,
"libvirt"])
+ with open(f"{basedir}/cirrus/{host}.vars", "w") as f:
+ f.write(lcitool_out)
+
+def refresh_containers(context):
+ for host in lcitool_get_hosts(context):
+ if "freebsd" in host or "macos" in host:
+ continue
+
+ if host == "fedora-rawhide":
+ for cross in ["mingw32", "mingw64"]:
+ print(f"containers/{host} ({cross})")
+ generate_dockerfile(context, host, cross)
+
+ if "debian-" in host:
+ for cross in ["aarch64", "armv6l", "armv7l",
"i686", "mips", "mips64el", "mipsel",
"ppc64le", "s390x"]:
+ if host == "debian-sid" and cross == "mips":
+ continue
+ print(f"containers/{host} ({cross})")
+ generate_dockerfile(context, host, cross)
+
+ print(f"containers/{host}")
+ generate_dockerfile(context, host)
+
+def refresh_cirrus(context):
+ for host in lcitool_get_hosts(context):
+ if "freebsd" not in host and "macos" not in host:
+ continue
+
+ print(f"cirrus/{host}")
+ generate_vars(context, host)
+
+def refresh(context):
+ refresh_containers(context)
+ refresh_cirrus(context)
+
+def main():
+ parser = argparse.ArgumentParser()
+ subparsers = parser.add_subparsers(dest="action",
metavar="ACTION")
+ subparsers.required = True
+ refreshparser = subparsers.add_parser(
+ "refresh",
+ help="refresh data in containers/ and cirrus/ directories",
+ )
+ refreshparser.add_argument(
+ "--lcitool",
+ metavar="PATH",
+ help="path to lcitool",
+ )
+ args = parser.parse_args()
+
+ if args.action == "refresh":
+ context = {
+ "lcitool": args.lcitool,
+ "basedir": os.path.dirname(os.path.realpath(__file__)),
+ }
+ refresh(context)
+
+if __name__ == "__main__":
+ main()
--
2.26.2