Blame tools/koji-compose.py

Packit Service 509fd4
#!/usr/bin/python3
Packit Service 509fd4
import json
Packit Service 509fd4
import sys
Packit Service 509fd4
import time
Packit Service 509fd4
Packit Service 509fd4
import requests
Packit Service 509fd4
Packit Service 509fd4
Packit Service 509fd4
# Composer API for Koji uses a slightly different repository format
Packit Service 509fd4
# that osbuild-composer does in /usr/share/osbuild-composer/repositories.
Packit Service 509fd4
#
Packit Service 509fd4
# This function does the conversion.
Packit Service 509fd4
def composer_repository_to_koji_repository(repository):
Packit Service 509fd4
    koji_repository = {
Packit Service 509fd4
        "baseurl": repository["baseurl"]
Packit Service 509fd4
    }
Packit Service 509fd4
Packit Service 509fd4
    if repository.get("check_gpg", False):
Packit Service 509fd4
        koji_repository["gpgkey"] = repository["gpgkey"]
Packit Service 509fd4
Packit Service 509fd4
    return koji_repository
Packit Service 509fd4
Packit Service 509fd4
Packit Service 509fd4
def compose_request(distro, koji, arch):
Packit Service 509fd4
    with open(f"/usr/share/tests/osbuild-composer/repositories/{distro}.json") as f:
Packit Service 509fd4
        test_repositories = json.load(f)
Packit Service 509fd4
Packit Service 509fd4
    repositories = [composer_repository_to_koji_repository(repo) for repo in test_repositories[arch]]
Packit Service 509fd4
Packit Service 509fd4
    req = {
Packit Service 509fd4
        "name": "name",
Packit Service 509fd4
        "version": "version",
Packit Service 509fd4
        "release": "release",
Packit Service 509fd4
        "distribution": distro,
Packit Service 509fd4
        "koji": {
Packit Service 509fd4
            "server": koji,
Packit Service 509fd4
            "task_id": 1
Packit Service 509fd4
        },
Packit Service 509fd4
        "image_requests": [{
Packit Service 509fd4
            "architecture": "x86_64",
Packit Service 509fd4
            "image_type": "qcow2",
Packit Service 509fd4
            "repositories": repositories
Packit Service 509fd4
        },{
Packit Service 509fd4
            "architecture": "x86_64",
Packit Service 509fd4
            "image_type": "ami",
Packit Service 509fd4
            "repositories": repositories
Packit Service 509fd4
        }]
Packit Service 509fd4
    }
Packit Service 509fd4
Packit Service 509fd4
    return req
Packit Service 509fd4
Packit Service 509fd4
Packit Service 509fd4
def main(distro, arch):
Packit Service 509fd4
    cr = compose_request(distro, "https://localhost:4343/kojihub", arch)
Packit Service 509fd4
    print(json.dumps(cr))
Packit Service 509fd4
Packit Service 509fd4
    r = requests.post("https://localhost/api/composer-koji/v1/compose", json=cr,
Packit Service 509fd4
                      cert=("/etc/osbuild-composer/worker-crt.pem", "/etc/osbuild-composer/worker-key.pem"),
Packit Service 509fd4
                      verify="/etc/osbuild-composer/ca-crt.pem")
Packit Service 509fd4
    if r.status_code != 201:
Packit Service 509fd4
        print("Failed to create compose")
Packit Service 509fd4
        print(r.text)
Packit Service 509fd4
        sys.exit(1)
Packit Service 509fd4
Packit Service 509fd4
    print(r.text)
Packit Service 509fd4
    compose_id = r.json()["id"]
Packit Service 509fd4
Packit Service 509fd4
    while True:
Packit Service 509fd4
        r = requests.get(f"https://localhost/api/composer-koji/v1/compose/{compose_id}",
Packit Service 509fd4
                         cert=("/etc/osbuild-composer/worker-crt.pem", "/etc/osbuild-composer/worker-key.pem"),
Packit Service 509fd4
                         verify="/etc/osbuild-composer/ca-crt.pem")
Packit Service 509fd4
        if r.status_code != 200:
Packit Service 509fd4
            print("Failed to get compose status")
Packit Service 509fd4
            print(r.text)
Packit Service 509fd4
            sys.exit(1)
Packit Service 509fd4
        status = r.json()["status"]
Packit Service 509fd4
        print(status)
Packit Service 509fd4
        if status == "success":
Packit Service 509fd4
            print("Compose worked!")
Packit Service 509fd4
            print(r.text)
Packit Service 509fd4
            break
Packit Service 509fd4
        elif status == "failure":
Packit Service 509fd4
            print("compose failed!")
Packit Service 509fd4
            print(r.text)
Packit Service 509fd4
            sys.exit(1)
Packit Service 509fd4
        elif status != "pending" and status != "running":
Packit Service 509fd4
            print(f"unexpected status: {status}")
Packit Service 509fd4
            print(r.text)
Packit Service 509fd4
            sys.exit(1)
Packit Service 509fd4
Packit Service 509fd4
        time.sleep(10)
Packit Service 509fd4
Packit Service 509fd4
    r = requests.get(f"https://localhost/api/composer-koji/v1/compose/{compose_id}/logs",
Packit Service 509fd4
                     cert=("/etc/osbuild-composer/worker-crt.pem", "/etc/osbuild-composer/worker-key.pem"),
Packit Service 509fd4
                     verify="/etc/osbuild-composer/ca-crt.pem")
Packit Service 509fd4
    logs = r.json()
Packit Service 509fd4
    assert "image_logs" in logs
Packit Service 509fd4
    assert type(logs["image_logs"]) == list
Packit Service 509fd4
    assert len(logs["image_logs"]) == len(cr["image_requests"])
Packit Service 509fd4
Packit Service 509fd4
Packit Service 509fd4
if __name__ == "__main__":
Packit Service 509fd4
    if len(sys.argv) != 3:
Packit Service 509fd4
        print(f"usage: {sys.argv[0]} DISTRO ARCH", file=sys.stderr)
Packit Service 509fd4
        sys.exit(1)
Packit Service 509fd4
    main(sys.argv[1], sys.argv[2])