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):
-- 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