canonical-ubuntu-qa team mailing list archive
-
canonical-ubuntu-qa team
-
Mailing list archive
-
Message #00998
[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