canonical-ubuntu-qa team mailing list archive
-
canonical-ubuntu-qa team
-
Mailing list archive
-
Message #03562
[Merge] ~juliank/autopkgtest-cloud:feat-web-release-health into autopkgtest-cloud:master
Julian Andres Klode has proposed merging ~juliank/autopkgtest-cloud:feat-web-release-health into autopkgtest-cloud:master.
Requested reviews:
Canonical's Ubuntu QA (canonical-ubuntu-qa)
For more details, see:
https://code.launchpad.net/~juliank/autopkgtest-cloud/+git/autopkgtest-cloud/+merge/463210
I quickly whipped up this release health dashboard to give a quick overview of migration-reference/0 test status (which is what britney looks at when it investigates if a failure is a regression).
This may be useful for noble specifically after migrating the time_t changes.
--
Your team Canonical's Ubuntu QA is requested to review the proposed merge of ~juliank/autopkgtest-cloud:feat-web-release-health into autopkgtest-cloud:master.
diff --git a/charms/focal/autopkgtest-web/webcontrol/browse.cgi b/charms/focal/autopkgtest-web/webcontrol/browse.cgi
index e9bf6b3..7c6a99e 100755
--- a/charms/focal/autopkgtest-web/webcontrol/browse.cgi
+++ b/charms/focal/autopkgtest-web/webcontrol/browse.cgi
@@ -430,6 +430,58 @@ def package_release_arch(package, release, arch, _=None):
)
+@app.route("/releases/<release>")
+@app.route("/releases/<release>/<arch>")
+def release(release, arch=None):
+ arches = [arch] if arch else get_release_arches()[release]
+ reference_results = {}
+ # The query gives us all packages that have autopkgtests (are in the test column),
+ # but the result columns may be NULL thanks to the left join, so we can print N/A.
+ # We order by ascending run_id so a later run overrides an earlier one.
+ for package, version, run_id, run_arch, raw_code in db_con.execute(
+ "SELECT current_version.package, current_version.version, run_id, arch, exitcode "
+ "FROM current_version "
+ "JOIN test ON test.release = current_version.release "
+ " AND test.package = current_version.package "
+ "LEFT JOIN result ON test.id == result.test_id "
+ " AND result.version == current_version.version "
+ "WHERE current_version.release = ? "
+ "AND (triggers == 'migration-reference/0' OR triggers IS NULL) "
+ "ORDER BY current_version.package, run_id ASC",
+ (release,),
+ ):
+ code = None
+ show_retry = False
+ url = None
+ if run_id:
+ code = human_exitcode(raw_code)
+ # Version + triggers uniquely identifies this result
+ show_retry = code != "pass"
+ url = os.path.join(
+ swift_container_url % release,
+ release,
+ run_arch,
+ srchash(package),
+ package,
+ run_id,
+ )
+ reference_results.setdefault((package, version), {})[run_arch] = {
+ "version": version,
+ "run_id": run_id,
+ "code": code,
+ "show_retry": show_retry,
+ "url": url,
+ }
+
+ return render(
+ "browse-health.html",
+ release=release,
+ arches=arches,
+ reference_results=reference_results,
+ title_suffix="- %s/%s" % (release, arch) if arch else "- %s" % release,
+ )
+
+
@app.route("/running")
def running():
(releases, arches, queues_info) = get_queues_info()
diff --git a/charms/focal/autopkgtest-web/webcontrol/templates/browse-health.html b/charms/focal/autopkgtest-web/webcontrol/templates/browse-health.html
new file mode 100644
index 0000000..5d36cab
--- /dev/null
+++ b/charms/focal/autopkgtest-web/webcontrol/templates/browse-health.html
@@ -0,0 +1,45 @@
+{% extends "browse-layout.html" %}
+{% import "macros.html" as macros %}
+
+{% block content %}
+ <h2><a href="{{base_url}}packages/{{package}}">{{package}}</a> <small>[{{release}}/{{arch}}]</small></h2>
+ <ul class="external-links">
+ <li>
+ {{ macros.launchpad_link(package, release) }}
+ </li>
+ <li>
+ {{ macros.excuses_link(package, release) }}
+ </li>
+ </ul>
+
+ <table class="table">
+ <tr>
+ <td><b>Package</b></td>
+ <td><b>Version</b></td>
+ {% for arch in arches %}
+ <td>{{arch}}</td>
+ {% endfor %}
+ </tr>
+
+ {% for package, version in reference_results %}
+ <tr>
+ <td>{{package}}</td>
+ <td>{{version}}</td>
+ {% for arch in arches %}
+ {% set values = reference_results[package, version].get(arch, None) %}
+ {% set code = values["code"] if values else "N/A" %}
+ <td class="nowrap {{code}}" title={{code}}>
+ {% if values %}
+ <a href="{{values["url"]}}/log.gz">{{values["code"]}}</a>  
+ {% if values["show_retry"] %}
+ <a href="{{base_url}}request.cgi?release={{release}}&arch={{values["arch"]}}&package={{package|urlencode}}&trigger=migration-reference/0">♻</a>
+ {% endif %}
+ {% else %}
+ N/A
+ {% endif %}
+ </td>
+ {% endfor %}
+ </tr>
+ {% endfor %}
+ </table>
+{% endblock %}