← Back to team overview

canonical-ubuntu-qa team mailing list archive

[Merge] ~andersson123/autopkgtest-cloud:auto-queue-cleanup into autopkgtest-cloud:master

 

Tim Andersson has proposed merging ~andersson123/autopkgtest-cloud:auto-queue-cleanup 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/463146
-- 
Your team Canonical's Ubuntu QA is requested to review the proposed merge of ~andersson123/autopkgtest-cloud:auto-queue-cleanup into autopkgtest-cloud:master.
diff --git a/charms/focal/autopkgtest-web/webcontrol/queue-merger b/charms/focal/autopkgtest-web/webcontrol/queue-merger
new file mode 100755
index 0000000..f1f9f81
--- /dev/null
+++ b/charms/focal/autopkgtest-web/webcontrol/queue-merger
@@ -0,0 +1,111 @@
+#!/usr/bin/python3
+
+# import argparse
+import apt_pkg
+import json
+import itertools
+import os
+import apt.progress.base
+# import urllib
+
+# steal from here:
+# https://gist.github.com/julian-klode/2785b07e76abaed78d34242a39d9bf0b
+
+
+"""
+I think maybe this has to run on the cloud worker to run filter-amqp? Needs some more thought.
+
+contexts = ["huge", "ppa", "upstream", "ubuntu"]
+
+Steps:
+for release in releases:
+    for arch in arches:
+        for queue in queue_names:
+            get queue
+            get proposed packages
+            calculate merged queue
+            empty context/release/arch queue
+            re-queue the merged queue
+
+make sure to differentiate between huge and non-huge queues
+remember to add logging!!!
+"""
+
+def get_queue(release, arch, context, all_queues):
+    """Build a single queue of package, args tuples."""
+    queue = [
+        (i.split()[0], json.loads(i.split(None, 1)[1]))
+        for i in all_queues["queues"][context][release][arch]["requests"]
+    ]
+    return queue
+
+
+def get_proposed_packages():
+    """Get all valid triggers in proposed, returns set of package/version strings."""
+    tmpdir = "merge-requests.tmp"
+    os.makedirs(os.path.join(tmpdir, "etc/apt"), exist_ok=True)
+    os.makedirs(os.path.join(tmpdir, "var/lib/apt"), exist_ok=True)
+    with open(os.path.join(tmpdir, "etc/apt/sources.list"), "w") as sources:
+        print(
+            "deb-src [signed-by=/usr/share/keyrings/ubuntu-archive-keyring.gpg] https://snapshot.ubuntu.com/ubuntu noble-proposed main universe restricted multiverse",
+            file=sources,
+        )
+
+    apt_pkg.config["Dir"] = tmpdir
+    apt_pkg.init()
+    sl = apt_pkg.SourceList()
+    sl.read_main_list()
+    cache = apt_pkg.Cache(None)
+    cache.update(apt.progress.base.AcquireProgress(), sl)
+
+    srcrecords = apt_pkg.SourceRecords()
+
+    proposed = set()
+    while srcrecords.step():
+        proposed.add(srcrecords.package + "/" + srcrecords.version)
+    return proposed
+
+
+def merge_queue(queue, proposed):
+    """Calculate the merged queue"""
+    out = []
+    for package, runs in itertools.groupby(
+        sorted(queue, key=lambda i: i[0]), lambda i: i[0]
+    ):
+        triggers = set()
+        for package, args in runs:
+            for trigger in args["triggers"]:
+                if trigger in proposed or trigger == "migration-reference/0":
+                    triggers.add(trigger)
+                else:
+                    print(
+                        "Dropping obsolete trigger",
+                        trigger,
+                        "for",
+                        package,
+                        file=sys.stderr,
+                    )
+
+        if "migration-reference/0" in triggers:
+            out.append((package, {"triggers": ["migration-reference/0"]}))
+            triggers.remove("migration-reference/0")
+        if triggers:
+            out.append((package, {"all-proposed": "1", "triggers": sorted(triggers)}))
+    return out
+
+
+def main():
+    with open("/var/lib/cache-amqp/queued.json", "r") as f:
+        all_queue_info  = json.load(f)
+    contexts = ["huge", "ppa", "upstream", "ubuntu"]
+    arches = all_queue_info.get("arches")
+    releases = all_queue_info.get("releases")
+    proposed_packages = get_proposed_packages()
+    for context in contexts:
+        for release in releases:
+            for arch in arches:
+                queue_name = f"debci-{context}-{release}-{arch}" if context != "ubuntu" else f"debci-{release}-{arch}"
+                individual_queue = get_queue(release, arch, context, all_queue_info)
+                merged_queue = merge_queue(individual_queue, proposed_packages)
+                for pkg, run_args in merged_queue:
+                    print(run_args)

References