debian-forge/test/cases/ostree-images
Dusty Mabe 0529ae79d1 tests: add metal output to fedora-coreos-container manifest
Also switch the qcow2 output to be a "qemu" platform image. This
change takes advantage of the recent org.osbuild.kernel-cmdline.bls-append
stage addition to modify kernel arguments in later pipelines.

To get a qemu image output:

- osbuild --output-directory out/ --export qemu test/data/manifests/fedora-coreos-container.json

To get a metal image output:

- osbuild --output-directory out/ --export metal test/data/manifests/fedora-coreos-container.json
2023-11-14 23:58:08 +01:00

197 lines
5.1 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):
tests = {
"fedora-ostree-tarball": {
"manifest": "fedora-ostree-tarball.json",
"exports": {
"tarball": {
"artifact": "fedora-commit.tar"
}
}
},
"fedora-ostree-container": {
"manifest": "fedora-ostree-container.json",
"exports": {
"container": {
"artifact": "fedora-container.tar"
}
},
},
"fedora-ostree-native-container": {
"manifest": "fedora-ostree-native-container.json",
"exports": {
"container": {
"artifact": "container.tar"
}
},
},
"fedora-ostree-bootiso": {
"manifest": "fedora-ostree-bootiso.json",
"exports": {
"bootiso": {
"artifact": "fedora-ostree-boot.iso"
}
},
},
"fedora-ostree-bootiso-xz": {
"manifest": "fedora-ostree-bootiso-xz.json",
"exports": {
"bootiso": {
"artifact": "fedora-ostree-boot-xz.iso"
}
},
},
"fedora-ostree-image": {
"manifest": "fedora-ostree-image.json",
"exports": {
"qcow2": {
"artifact": "disk.qcow2"
}
},
},
"fedora-coreos-container": {
"manifest": "fedora-coreos-container.json",
"exports": {
"qemu": {
"artifact": "qemu.qcow2"
},
"metal": {
"artifact": "metal.raw"
}
},
}
}
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"
]
results = []
for testname, test in tests.items():
print(f"Testing {BOLD}{testname}{RESET}", flush=True)
manifest = test["manifest"]
start = time.monotonic()
result = {
"test": manifest
}
path = os.path.join("test", "data", "manifests", manifest)
exports = test["exports"]
try:
osbuild.run(path, exports.keys())
for name, data in exports.items():
artifact = data["artifact"]
path = os.path.join(outdir, name, artifact)
assert os.path.exists(path)
print(f"{GREEN}success{RESET}", flush=True)
except Exception as e: # pylint: disable=broad-except
print(f"{RED}Error{RESET}: {e}")
result["error"] = str(e)
duration = time.monotonic() - start
result["duration"] = duration
print(f"Test duration: {duration}", flush=True)
results.append(result)
return results
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")
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:
results = run_tests(args, tmp)
n = len(results)
failed = len(list(filter(lambda x: x.get("error"), results)))
ok = n - failed
print("tests/ok/failed", end=": ")
print(f"{n}/{GREEN}{ok}{RESET}/{RED}{failed}{RESET}")
if failed:
sys.exit(1)
if __name__ == "__main__":
main()