debian-forge/test/cases/ostree-images
Ondřej Budai 08d4bbf4dd test/ostree: parallelize the test
Building 7 images on one machine is quite slow. Instead, let's spawn build
them on separate ones to save some time.
2024-03-05 12:49:21 +02:00

124 lines
2.9 KiB
Python
Executable file

#!/usr/bin/python3
"""OSTree Image Tests"""
import argparse
import os
import subprocess
import sys
import tempfile
import time
RESET = "\033[0m"
GREEN = "\033[32m"
BOLD = "\033[1m"
RED = "\033[31m"
class OSBuild:
def __init__(self, store, outdir):
self.store = store
self.outdir = outdir
self.checkpoints = []
def run(self, manifest, exports, checkpoints=None):
cmd = [
"osbuild",
"--store", os.fspath(self.store),
"--output-dir", os.fspath(self.outdir),
os.fspath(manifest)
]
for checkpoint in self.checkpoints + (checkpoints or []):
cmd += [
"--checkpoint", checkpoint
]
for export in exports:
cmd += [
"--export", export
]
subprocess.run(cmd, check=True)
def run_tests(args, tmpdir):
outdir, store = args.output_directory, args.store
if not outdir:
outdir = os.path.join(tmpdir, "outdir")
os.makedirs(outdir)
if not store:
store = os.path.join(tmpdir, "store")
os.makedirs(store)
print(f"Store at: {os.path.realpath(store)}")
print(f"Output at: {os.path.realpath(outdir)}")
osbuild = OSBuild(store, outdir)
osbuild.checkpoints = [
"build",
"ostree-tree",
"ostree-commit"
]
print(f"Testing {BOLD}{args.manifest}{RESET}", flush=True)
path = os.path.join("test", "data", "manifests", args.manifest)
success = True
export_names = map(lambda p: p.split("/")[0], args.export)
osbuild.run(path, export_names)
for export in args.export:
path = os.path.join(outdir, export)
if not os.path.exists(path):
print(f"{RED}Error{RESET}: {path} does not exist")
success = False
return success
def main():
parser = argparse.ArgumentParser(description="ostree image tests")
parser.add_argument(
"--store",
metavar="DIRECTORY",
type=os.path.abspath,
default=None,
help="directory where intermediary os trees are stored")
parser.add_argument(
"--output-directory",
metavar="DIRECTORY",
type=os.path.abspath,
default=None,
help="directory where result objects are stored")
parser.add_argument(
"--manifest",
metavar="FILE",
type=str,
required=True,
help="manifest to build")
parser.add_argument(
"--export",
metavar="ID",
type=str,
nargs="+",
required=True,
help="expected export filepaths (can be passed multiple times)")
args = parser.parse_args()
print(f"Running in {os.path.realpath(os.curdir)}")
tmpdir = "/var/osbuild/tmp"
os.makedirs(tmpdir, exist_ok=True)
with tempfile.TemporaryDirectory(dir=tmpdir) as tmp:
success = run_tests(args, tmp)
if not success:
sys.exit(1)
if __name__ == "__main__":
main()