The current implementation does not report any errors because it uses the subprocess.check_output function from Python std library. The function is convenient to use but it hides all the errors from us which makes it very inconvenient when the test generation often fails (like developing support for alternative architecture). This patch introduces a wrapper around the subprocess.run function which dumps the subprocess's stdout to stderr in case of failure and forwards it to the caller in case of success. This way the generation code is still very straight forward, but the errors are reported properly.
77 lines
2.5 KiB
Python
Executable file
77 lines
2.5 KiB
Python
Executable file
#!/usr/bin/python3
|
|
|
|
import argparse
|
|
import subprocess
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
'''
|
|
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):
|
|
osbuild_cmd = ["osbuild", "--store", store, "--json", "-"]
|
|
result = json.loads(get_subprocess_stdout(osbuild_cmd, encoding="utf-8", input=json.dumps(manifest)))
|
|
return result.get("output_id")
|
|
|
|
|
|
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":
|
|
output_id = run_osbuild(test_case["manifest"], store)
|
|
image_file = os.path.join(store, "refs", output_id, test_case["compose-request"]["filename"])
|
|
|
|
# we don't yet support image-info on directory trees
|
|
if boot_type == "qemu-extract":
|
|
fn, ex = os.path.splitext(image_file)
|
|
if ex == ".xz":
|
|
with open(fn, "w") as f:
|
|
subprocess.run(["xz", "--decompress", "--stdout", image_file], stdout=f)
|
|
image_file = fn
|
|
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()
|