← Back to team overview

canonical-ubuntu-qa team mailing list archive

[Merge] ~andersson123/autopkgtest-cloud:no_queue_duplicate_requests into autopkgtest-cloud:master

 

Tim Andersson has proposed merging ~andersson123/autopkgtest-cloud:no_queue_duplicate_requests into autopkgtest-cloud:master.

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

For more details, see:
https://code.launchpad.net/~andersson123/autopkgtest-cloud/+git/autopkgtest-cloud/+merge/447108
-- 
Your team Canonical's Ubuntu QA is requested to review the proposed merge of ~andersson123/autopkgtest-cloud:no_queue_duplicate_requests into autopkgtest-cloud:master.
diff --git a/charms/focal/autopkgtest-web/webcontrol/request/app.py b/charms/focal/autopkgtest-web/webcontrol/request/app.py
index 8654ec2..78dba99 100644
--- a/charms/focal/autopkgtest-web/webcontrol/request/app.py
+++ b/charms/focal/autopkgtest-web/webcontrol/request/app.py
@@ -53,6 +53,76 @@ SUCCESS = """
 </dl>
 """
 
+QUEUE_FP = "/var/lib/cache-amqp/queued.json"
+RUNNING_FP = "/run/amqp-status-collector/running.json"
+
+
+def is_test_running(req_series, req_arch, req_package, req_triggers):
+    data = {}
+    with open(RUNNING_FP, "r") as f:
+        data = json.load(f)
+    for pkg in data:
+        for submitted in data[pkg]:
+            releases = data[pkg][submitted].keys()
+            for release in data[pkg][submitted]:
+                architectures = data[pkg][submitted][release].keys()
+                triggers = submitted[submitted.find(";triggers_") + 1 :]
+                triggers = triggers[: triggers.find(";")]
+                triggers = triggers[
+                    triggers.find("[") + 1 : triggers.find("]")
+                ]
+                triggers = triggers.replace("'", "").split(", ")
+                if (
+                    req_arch in architectures
+                    and req_series in releases
+                    and req_package == pkg
+                    and sorted(triggers) == sorted(req_triggers)
+                ):
+                    return True
+    return False
+
+
+def is_test_in_queue(req_series, req_arch, req_package, req_triggers):
+    data = {}
+    with open(QUEUE_FP, "r") as f:
+        data = json.load(f)
+    data = data["queues"]
+    this_test = {
+        "release": req_series,
+        "arch": req_arch,
+        "package": req_package,
+        "triggers": sorted(req_triggers),
+    }
+    for test_type in data:
+        for release in data[test_type]:
+            for arch in data[test_type][release]:
+                packages = data[test_type][release][arch]
+                if packages["size"] != 0:
+                    for req in packages["requests"]:
+                        pkg = req[: req.find("{")].rstrip()
+                        details = json.loads(req[req.find("{") :])
+                        triggers = details["triggers"]
+                        test = {
+                            "release": release,
+                            "arch": arch,
+                            "package": pkg,
+                            "triggers": sorted(triggers),
+                        }
+                        if test == this_test:
+                            return True
+    return False
+
+
+def is_request_queued_or_running(
+    req_series, req_arch, req_package, req_triggers
+):
+    if is_test_running(req_series, req_arch, req_package, req_triggers):
+        return True, "<p>Requested test is already running.</p>"
+
+    if is_test_in_queue(req_series, req_arch, req_package, req_triggers):
+        return True, "<p>Requested test is already queued.</p>"
+    return False, ""
+
 
 def check_github_sig(request):
     """Validate github signature of request.
@@ -146,6 +216,16 @@ def index_root():
             splitenv += e.split(";")
         params["env"] = splitenv
 
+    # Check if requested test is currently running or queued
+    not_needed, msg_str = is_request_queued_or_running(
+        params["release"],
+        params["arch"],
+        params["package"],
+        params["triggers"],
+    )
+    if not_needed:
+        return HTML.format(msg_str), 403
+
     # request from github?
     if b"api.github.com" in request.data:
         if not check_github_sig(request):

Follow ups