#!/usr/bin/python3 import argparse import subprocess import json import os import sys import tempfile ''' This script generates a json test case. It accepts a test_case_request as input through standard input. { "boot": { "type": "qemu" }, "compose-request": { "distro": "fedora-30", "arch": "x86_64", "image-type": "qcow2", "filename": "disk.qcow2", "blueprint": {} } } It then outputs a json test case as standard output. ''' def get_subprocess_stdout(*args, **kwargs): sp = subprocess.run(*args, **kwargs, stdout=subprocess.PIPE) if sp.returncode != 0: sys.stderr.write(sp.stdout) sys.exit(1) return sp.stdout def run_osbuild(manifest, store, output): subprocess.run(["osbuild", "--store", store, "--output-directory", output, "--json", "-"], check=True, encoding="utf-8", input=json.dumps(manifest)) def main(test_case, store): boot_type = test_case["boot"]["type"] compose_request = json.dumps(test_case["compose-request"]) pipeline_command = ["go", "run", "./cmd/osbuild-pipeline", "-"] test_case["manifest"] = json.loads(get_subprocess_stdout(pipeline_command, input=compose_request, encoding="utf-8")) pipeline_command = ["go", "run", "./cmd/osbuild-pipeline", "-rpmmd", "-"] test_case["rpmmd"] = json.loads(get_subprocess_stdout(pipeline_command, input=compose_request, encoding="utf-8")) if boot_type != "nspawn-extract": with tempfile.TemporaryDirectory(dir=store, prefix="test-case-output-") as output: run_osbuild(test_case["manifest"], store, output) image_file = os.path.join(output, test_case["compose-request"]["filename"]) test_case["image-info"] = json.loads(get_subprocess_stdout(["tools/image-info", image_file], encoding="utf-8")) return test_case if __name__ == '__main__': parser = argparse.ArgumentParser(description="Generate test cases") parser.add_argument("store", metavar="DIRECTORY", type=os.path.abspath, help="path to the osbuild store") args = parser.parse_args() test_case_request = json.load(sys.stdin) test_case = main(test_case_request, args.store) sys.stdout.write(json.dumps(test_case)) sys.exit()