Adrien Nader has proposed merging 
~adrien/autopkgtest-cloud:browse-recent-filters-and-json into 
autopkgtest-cloud:master.

Commit message:
Add filtering by arch and release for the recent page. Use a dict for test
result fields rather than an array of fourteen elements. Expose a JSON file for
recent test results.

The JSON file is accessible at /api/experimental/recent.json. I figured that if
we were first spending time designing an API, we would likely never get to
finishing it. I'm using the same fields as the ones on HTML page; it should be
the same as the page but as JSON.

Since there is a commit that refactors some code, it's possible that some
regressions are introduced in other pages but that should be pretty safe
nonetheless.

Requested reviews:
  Canonical's Ubuntu QA (canonical-ubuntu-qa)

For more details, see:
https://code.launchpad.net/~adrien/autopkgtest-cloud/+git/autopkgtest-cloud/+merge/482540
-- 
Your team Canonical's Ubuntu QA is requested to review the proposed merge of 
~adrien/autopkgtest-cloud:browse-recent-filters-and-json into 
autopkgtest-cloud:master.
diff --git a/charms/focal/autopkgtest-web/webcontrol/browse.cgi b/charms/focal/autopkgtest-web/webcontrol/browse.cgi
index fe25701..c9ae1db 100755
--- a/charms/focal/autopkgtest-web/webcontrol/browse.cgi
+++ b/charms/focal/autopkgtest-web/webcontrol/browse.cgi
@@ -211,7 +211,11 @@ def db_has_result_requester_idx(cursor: sqlite3.Cursor):
     return False
 
 
-def get_results(limit: int, offset: int = 0, user: str = None) -> list:
+def get_results(limit: int, offset: int = 0, **kwargs) -> list:
+    requested_arch = kwargs.get("arch", None)
+    requested_release = kwargs.get("release", None)
+    requested_user = kwargs.get("user", None)
+
     results = []
     # We want to use sqlite3.Row here, so we need to create a cursor
     # as to not affect the overall db_con object, which could interfere
@@ -222,11 +226,11 @@ def get_results(limit: int, offset: int = 0, user: str = None) -> list:
         for row in cursor.execute(
             "SELECT test_id, run_id, version, triggers, "
             "duration, exitcode, requester, env, uuid FROM result "
-            + ("WHERE requester=:user " if user else "")
+            + ("WHERE requester=:requested_user " if requested_user else "")
             + "ORDER BY run_id DESC "
             "LIMIT :limit OFFSET :offset ",
             {
-                "user": user,
+                "user": requested_user,
                 "limit": limit,
                 "offset": offset,
             },
@@ -240,6 +244,8 @@ def get_results(limit: int, offset: int = 0, user: str = None) -> list:
             ]  # string of comma separated env variables e.g. all-proposed=1,test-name=mytest
             code = human_exitcode(row["exitcode"])
             package, release, arch = get_package_release_arch(test_id)
+            if (requested_release and release != requested_release) or (requested_arch and arch != requested_arch):
+                continue
             url = os.path.join(
                 CONFIG["swift_container_url"] % release,
                 release,
@@ -254,21 +260,21 @@ def get_results(limit: int, offset: int = 0, user: str = None) -> list:
                 and "all-proposed=1" in additional_params
             )
             results.append(
-                (
-                    version,
-                    triggers,
-                    additional_params,
-                    human_date(row["run_id"]),
-                    human_sec(int(row["duration"])),
-                    requester,
-                    code,
-                    url,
-                    show_retry,
-                    all_proposed,
-                    row["uuid"],
-                    package,
-                    release,
-                    arch,
+                dict(
+                    version=version,
+                    triggers=triggers,
+                    additional_params=additional_params,
+                    human_date=human_date(row["run_id"]),
+                    human_sec=human_sec(int(row["duration"])),
+                    requester=requester,
+                    code=code,
+                    url=url,
+                    show_retry=show_retry,
+                    all_proposed=all_proposed,
+                    uuid=row["uuid"],
+                    package=package,
+                    release=release,
+                    arch=arch,
                 )
             )
     else:
@@ -276,20 +282,21 @@ def get_results(limit: int, offset: int = 0, user: str = None) -> list:
         # the user that the issue is the db index not
         # being present
         results.append(
-            (
-                "No results are being displayed as",
-                "the db index required for this page",
-                "is not present, please contact an admin." "",
-                "",
-                "",
-                1,
-                "",
-                False,
-                False,
-                "",
-                "",
-                "",
-                "",
+            dict(
+                version="No results are being displayed as",
+                triggers="the db index required for this page",
+                additional_params="is not present, please contact an admin." "",
+                human_date="",
+                human_sec="",
+                requester=1,
+                code="",
+                url=False,
+                show_retry=False,
+                all_proposed="",
+                uuid="",
+                package="",
+                release="",
+                arch="",
             )
         )
     return results
@@ -527,9 +534,9 @@ def user_overview(user):
 
     # Get results for this user
     if show_results:
-        previous_test_results = get_results(limit, offset, user)
+        previous_test_results = get_results(limit, offset, user=user)
     else:
-        previous_test_results = []
+        previous_test_results = dict()
 
     # add queued tests for this user
     if show_queued:
@@ -578,7 +585,19 @@ def recent():
     except (AssertionError, ValueError):
         offset = 0
 
-    recent_test_results = get_results(limit, offset)
+    arch = args.get("arch")
+    release = args.get("release")
+    user = args.get("user")
+
+    recent_test_results = get_results(limit, offset, arch=arch,
+                                      release=release, user=user)
+
+    all_arches = set()
+    all_releases = []
+    for release, arches in get_release_arches(db_con).items():
+        all_releases.append(release)
+        for a in arches:
+            all_arches.add(a)
 
     return render(
         "browse-recent.html",
@@ -587,9 +606,38 @@ def recent():
         recent_test_results=recent_test_results,
         limit=limit,
         offset=offset,
+        releases=all_releases,
+        all_arches=all_arches,
     )
 
 
+@app.route("/api/experimental/recent.json")
+def recent_json():
+    args = flask.request.args
+    try:
+        limit = int(args.get("limit", 100))
+        assert limit > 0
+        assert limit <= 10000
+    except (AssertionError, ValueError):
+        limit = 100
+
+    try:
+        offset = int(args.get("offset", 0))
+        assert offset > 0
+        assert isinstance(offset, int)
+    except (AssertionError, ValueError):
+        offset = 0
+
+    arch = args.get("arch")
+    release = args.get("release")
+    user = args.get("user")
+
+    recent_test_results = get_results(limit, offset, arch=arch,
+                                      release=release, user=user)
+
+    return flask.jsonify(recent_test_results)
+
+
 @app.route("/user/<user>/ppa")
 def list_user_ppas(user):
     ppa_containers = load_ppa_cache()
@@ -771,42 +819,42 @@ def package_release_arch(package, release, arch, _=None):
                     item_info = json.loads(item.split("\n")[1])
                     results.insert(
                         0,
-                        (
-                            "N/A",
-                            item_info.get("triggers"),
-                            (
+                        dict(
+                            version="N/A",
+                            triggers=item_info.get("triggers"),
+                            additional_params=(
                                 "all-proposed=1"
                                 if "all-proposed" in item_info.keys()
                                 else ""
                             ),
-                            human_date(item_info.get("submit-time")),
-                            "N/A",
-                            "-",
-                            "queued",
-                            "",
-                            False,
-                            "",
-                            item_info.get("uuid", ""),
-                        ),
+                            human_date=human_date(item_info.get("submit-time")),
+                            human_sec="N/A",
+                            requester="-",
+                            code="queued",
+                            url="",
+                            show_retry=False,
+                            all_proposed="",
+                            uuid=item_info.get("uuid", ""),
+                        )
                     )
     except Exception:
         # We never want to fail in that block, even is there are issues with cache-amqp
         # Let's signal the error in the page, but still display other results
         results.insert(
             0,
-            (
-                "Unknown queued list",
-                "There are errors in cache-amqp",
-                "Please contact QA team",
-                "",
-                "",
-                "",
-                "",
-                "",
-                False,
-                "",
-                "",
-            ),
+            dict(
+                version="Unknown queued list",
+                triggers="There are errors in cache-amqp",
+                additional_params="Please contact QA team",
+                human_date="",
+                human_sec="",
+                requester="",
+                code="",
+                url="",
+                show_retry=False,
+                all_proposed="",
+                uuid="",
+            )
         )
 
     return render(
diff --git a/charms/focal/autopkgtest-web/webcontrol/templates/browse-recent.html b/charms/focal/autopkgtest-web/webcontrol/templates/browse-recent.html
index 4c35c52..12163ec 100644
--- a/charms/focal/autopkgtest-web/webcontrol/templates/browse-recent.html
+++ b/charms/focal/autopkgtest-web/webcontrol/templates/browse-recent.html
@@ -17,13 +17,13 @@
     </tr>
     {% for row in results %}
       <tr {% if row[6] in ["running", "queued"] %}class="unfinished"{% endif %}>
-        {% set package = row[11] %}
-        {% set release = row[12] %}
-        {% set arch = row[13] %}
+        {% set package = row["package"] %}
+        {% set release = row["release"] %}
+        {% set arch = row["arch"] %}
         <td>{{ package }}</td>
         <td>{{ release }}</td>
         <td>{{ arch }}</td>
-        {{ macros.results_table_core(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], package, release, arch) }}
+        {{ macros.results_table_core(row["version"], row["triggers"], row["additional_params"], row["human_date"], row["human_sec"], row["requester"], row["code"], row["url"], row["show_retry"], row["all_proposed"], row["uuid"], package, release, arch) }}
       </tr>
     {% endfor %}
   </table>
@@ -42,6 +42,20 @@
       <option value="5000" {% if limit == 5000 %}selected="selected"{% endif %}>5000</option>
       <option value="10000" {% if limit == 10000 %}selected="selected"{% endif %}>10000</option>
     </select>
+    <label for="arch">Architecture:</label>
+    <select name="arch" id="arch">
+      {% for a in all_arches %}
+        <option value="{{ a }}" {% if arch == a %}selected="selected"{% endif %}>{{ a }}</option>
+      {% endfor %}
+    </select>
+    <label for="release">Release:</label>
+    <select name="release" id="release">
+      {% for r in releases %}
+        <option value="{{ r }}" {% if release == r %}selected="selected"{% endif %}>{{ r }}</option>
+      {% endfor %}
+    </select>
+    <label for="release">Release:</label>
+    <input type="text" name="release" id="release"></input>
     <input type="submit" value="Show">
   </form>
 
diff --git a/charms/focal/autopkgtest-web/webcontrol/templates/browse-results.html b/charms/focal/autopkgtest-web/webcontrol/templates/browse-results.html
index 9d15751..1256acd 100644
--- a/charms/focal/autopkgtest-web/webcontrol/templates/browse-results.html
+++ b/charms/focal/autopkgtest-web/webcontrol/templates/browse-results.html
@@ -15,8 +15,8 @@
       <tr>{{ macros.set_up_results_table() }}</tr>
 
       {% for row in package_results %}
-        <tr {% if row[6] in ["running", "queued"] %}class="unfinished"{% endif %}>
-          {{ macros.results_table_core(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], package, release, arch) }}
+        <tr {% if row["code"] in ["running", "queued"] %}class="unfinished"{% endif %}>
+          {{ macros.results_table_core(row["version"], row["triggers"], row["additional_params"], row["human_date"], row["human_sec"], row["requester"], row["code"], row["url"], row["show_retry"], row["all_proposed"], row["uuid"], package, release, arch) }}
         </tr>
       {% endfor %}
     </table>
diff --git a/charms/focal/autopkgtest-web/webcontrol/templates/browse-user.html b/charms/focal/autopkgtest-web/webcontrol/templates/browse-user.html
index 388f23f..3e5e24d 100644
--- a/charms/focal/autopkgtest-web/webcontrol/templates/browse-user.html
+++ b/charms/focal/autopkgtest-web/webcontrol/templates/browse-user.html
@@ -16,14 +16,14 @@
       {{ macros.set_up_results_table() }}
     </tr>
     {% for row in user_results %}
-      <tr {% if row[6] in ["running", "queued"] %}class="unfinished"{% endif %}>
-        {% set package = row[11] %}
-        {% set release = row[12] %}
-        {% set arch = row[13] %}
+      <tr {% if row["code"] in ["running", "queued"] %}class="unfinished"{% endif %}>
+        {% set package = row["package"] %}
+        {% set release = row["release"] %}
+        {% set arch = row["arch"] %}
         <td>{{ package }}</td>
         <td>{{ release }}</td>
         <td>{{ arch }}</td>
-        {{ macros.results_table_core(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], package, release, arch) }}
+        {{ macros.results_table_core(row["version"], row["triggers"], row["additional_params"], row["human_date"], row["human_sec"], row["requester"], row["code"], row["url"], row["show_retry"], row["all_proposed"], row["uuid"], package, release, arch) }}
       </tr>
     {% endfor %}
   </table>
-- 
Mailing list: https://launchpad.net/~canonical-ubuntu-qa
Post to     : canonical-ubuntu-qa@lists.launchpad.net
Unsubscribe : https://launchpad.net/~canonical-ubuntu-qa
More help   : https://help.launchpad.net/ListHelp

Reply via email to