debian-forge-composer/tools/test-case-generators/generate-test-case
Tom Gundersen f945c5057e osbuild-pipeline: always pass repositories as input
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>
2020-03-29 16:08:36 +02:00

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()