Require repository informaiton to be passed as input, rather than read from the current directory. Reading from the repository informaiton meant to be used by weldr has several drawbacks. - it makes it impractical to use the tool outside a git checkout - it makes it awkward to adapt the repositories to different use cases - it means that the shipped repositories cannot be extended with update repos, as the same repos are used for testing, and that would render our tests non-reproducible. Overall, we are moving towards making repositories something the caller must always pass in, rather than something that composer maintains. For the weldr API we need to keep working as before, but for new APIs we are avoiding that. Signed-off-by: Tom Gundersen <teg@jklm.no>
70 lines
2.3 KiB
Python
Executable file
70 lines
2.3 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 run_osbuild(manifest, store):
|
|
osbuild_cmd = ["osbuild", "--store", store, "--json", "-"]
|
|
result = json.loads(subprocess.check_output(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(subprocess.check_output(pipeline_command, input=compose_request, encoding="utf-8"))
|
|
|
|
pipeline_command = ["go", "run", "./cmd/osbuild-pipeline", "-rpmmd", "-"]
|
|
test_case["rpmmd"] = json.loads(subprocess.check_output(pipeline_command, input=compose_request, encoding="utf-8"))
|
|
|
|
return test_case
|
|
|
|
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(subprocess.check_output(["tools/image-info", image_file]))
|
|
|
|
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()
|