import io import json import tarfile import tempfile from urllib.request import urlopen import urllib.error import flask from flask import Flask, jsonify, redirect from launchpadlib.launchpad import Launchpad app = Flask(__name__) tmpdir = tempfile.TemporaryDirectory() launchpad = Launchpad.login_anonymously("just testing", "production", tmpdir.name, version="devel") @app.route("/", methods=["GET"]) def index_root(): return redirect("/ogayot", code=302) @app.route("/", methods=["GET"]) def index_lpuser(LPUSER): lpuser = launchpad.people[LPUSER] return jsonify([ppa.name for ppa in lpuser.ppas]) @app.route("//", methods=["GET"]) def index_ppa(LPUSER, PPA): lpuser = launchpad.people[LPUSER] runs = [] ppa = next(filter(lambda p: p.name == PPA, lpuser.ppas)) series_set = set() for source_pkg in ppa.getPublishedSources(): series_set.add(source_pkg.distro_series.name) for series in series_set: RELEASE = series try: urlopen(f"https://autopkgtest.ubuntu.com/results/autopkgtest-{RELEASE}-{LPUSER}-{PPA}/?format=json").read() except urllib.error.HTTPError: continue return jsonify(list(set([pkg.source_package_name for pkg in ppa.getPublishedSources()]))) @app.route("///", methods=["GET"]) def index_package(LPUSER, PPA, PACKAGE): lpuser = launchpad.people[LPUSER] runs = [] ppa = next(filter(lambda p: p.name == PPA, lpuser.ppas)) series_set = set() for source_pkg in ppa.getPublishedSources(): if source_pkg.source_package_name != PACKAGE: continue series_set.add(source_pkg.distro_series.name) return jsonify(list(series_set)) @app.route("////") def index_release(LPUSER, PPA, PACKAGE, RELEASE): autopkgtest_url_base = f"https://autopkgtest.ubuntu.com/results/autopkgtest-{RELEASE}-{LPUSER}-{PPA}" data = json.loads(urlopen(f"{autopkgtest_url_base}?format=json").read()) try: data = json.loads(urlopen(f"https://autopkgtest.ubuntu.com/results/autopkgtest-{RELEASE}-{LPUSER}-{PPA}/?format=json").read()) except urllib.error.HTTPError: return jsonify([]) arches_set = set() for section in data: arches_set.add(section["name"].split("/")[1]) return jsonify(list(arches_set)) @app.route("/////") def index_results(LPUSER, PPA, PACKAGE, RELEASE, ARCH): autopkgtest_url_base = f"https://autopkgtest.ubuntu.com/results/autopkgtest-{RELEASE}-{LPUSER}-{PPA}" data = json.loads(urlopen(f"{autopkgtest_url_base}?format=json").read()) # Use the prefix as index runs = {} for info in data: index, suffix = info["name"].rsplit("/", maxsplit=1) if suffix != "result.tar": continue runs[index] = info headers = ("version", "triggers", "date", "duration", "requester", "result", "url_prefix") package_results = [] for idx, info in runs.items(): date = " ".join(idx.split("/")[-1].split("_")[0:2]), tar_stream = io.BytesIO(urlopen(f"{autopkgtest_url_base}/{info['name']}").read()) file = tarfile.open(fileobj=tar_stream) exitcode = int(file.extractfile("exitcode").read().decode().splitlines()[0]) duration = int(file.extractfile("duration").read().decode().splitlines()[0]) version = file.extractfile("testpkg-version").read().decode().splitlines()[0].split(" ")[-1] requester = file.extractfile("requester").read().decode().splitlines()[0] testinfo = json.loads(file.extractfile("testinfo.json").read().decode()) for entry in testinfo["custom_environment"]: key, value = entry.split("=", maxsplit=1) if key == "ADT_TEST_TRIGGERS": triggers = value break else: triggers = "?" result = { "version": version, "triggers": triggers, "date": " ".join(idx.split("/")[-1].split("_")[0:2]), "duration": duration, "requester": requester, "result": exitcode, "url_prefix": f"{autopkgtest_url_base}/{idx}", } package_results.append([result[h] for h in headers]) return flask.render_template("browse-results.html", package=PACKAGE, release=RELEASE, arch=ARCH, package_results=package_results, title_suffix=f"{LPUSER} {PPA} {PACKAGE}", base_url="https://autopkgtest.ubuntu.com/", )