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") use_json = False @app.route("/") def index_root(): return redirect("/ogayot", code=302) @app.route("/") def index_lpuser(LPUSER): lpuser = launchpad.people[LPUSER] ppas = [ppa.name for ppa in lpuser.ppas] if use_json: return jsonify(ppas) return flask.render_template("list-ppas.html", ppas=ppas, base_url=flask.request.base_url) @app.route("//") def index_ppa(LPUSER, PPA): lpuser = launchpad.people[LPUSER] ppa = next(filter(lambda p: p.name == PPA, lpuser.ppas)) packages = list(set([pkg.source_package_name for pkg in ppa.getPublishedSources()])) if use_json: return jsonify(packages) return flask.render_template("list-packages.html", packages=packages, base_url=flask.request.base_url) @app.route("///") 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) series = list(series_set) if use_json: return jsonify(series) return flask.render_template("list-series.html", series=series, base_url=flask.request.base_url) @app.route("////") def index_release(LPUSER, PPA, PACKAGE, RELEASE): autopkgtest_url_base = f"https://autopkgtest.ubuntu.com/results/autopkgtest-{RELEASE}-{LPUSER}-{PPA}" try: data = json.loads(urlopen(f"{autopkgtest_url_base}?format=json").read()) except urllib.error.HTTPError: data = [] arches_set = set() for section in data: arches_set.add(section["name"].split("/")[1]) arches = list(arches_set) if use_json: return jsonify(arches) return flask.render_template("list-arches.html", arches=arches, base_url=flask.request.base_url) @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": date, "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/", )