#!/usr/bin/env python3 # # Copyright (C) 2021 Red Hat, Inc. # SPDX-License-Identifier: LGPL-2.1-or-later import argparse import pathlib import pty 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( dest="action", metavar="ACTION", ) subparsers.required = True # list-images action listimagesparser = subparsers.add_parser( "list-images", help="list known container images", ) listimagesparser.set_defaults(func=Application.action_list_images) # 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() class Application: def __init__(self): 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 make_run(self, target): args = [ "-C", self.basedir, target, ] if pty.spawn(["make"] + args) != 0: sys.exit("error: 'make' failed") 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" outpath = outdir.joinpath(outfile) print(outpath) output = self.lcitool_run(args) with open(outpath, "w") as f: f.write(output) def generate_vars(self, host): args = ["variables", host, "libvirt"] outdir = self.basedir.joinpath("cirrus") outfile = f"{host}.vars" outpath = outdir.joinpath(outfile) print(outpath) output = self.lcitool_run(args) with open(outpath, "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 self.generate_dockerfile(host) if host == "fedora-rawhide": for cross in fedora_cross: self.generate_dockerfile(host, cross) if host.startswith("debian-"): for cross in debian_cross: if host == "debian-sid" and cross == "mips": continue 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 self.generate_vars(host) def action_list_images(self): self.make_run(f"ci-list-images") def action_refresh(self): self.refresh_containers() self.refresh_cirrus() def run(self): self.args.func(self) if __name__ == "__main__": Application().run()