debian-forge/test/cases/ostree-images
Thomas Lavocat bb30ffa062 Add the option of compressing using lz4
Using lz4 in squashfs reduces the time to complete the stage from 446s
to 4s on my laptop while making the produced iso going from 1.6G to
2.0G.
2022-01-11 13:20:11 +01:00

179 lines
4.5 KiB
Python
Executable file

#!/usr/bin/python3
"""OSTree Image Tests"""
import argparse
import os
import tempfile
import time
import subprocess
import sys
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-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"
}
},
}
}
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()