#!/usr/bin/env python3 """Part E teardown on 9202 — every app removed THROUGH THE PRODUCT, then the leftovers read by name. R-658's second half is measured here: does the remove of a RESTORED app (volumes without the compose label) leave its volumes behind? docmost, navidrome and vikunja were restored tonight; romm, nextcloud, adventurelog were not (the control).""" import json, sys, time sys.path.insert(0, ".") import walk as w w.login() apps = ["docmost", "navidrome", "vikunja", "romm", "nextcloud", "adventurelog", "actualbudget"] before = w.guest("for p in " + " ".join(apps) + "; do echo \"$p all=$(docker volume ls -q | grep -c ^${p}_) labeled=$(docker volume ls -q --filter label=com.docker.compose.project=$p | wc -l) copies=$(docker volume ls -q --filter label=felhom.undo-copy-of=$p | wc -l)\"; done") w.say("volumes before the removes:\n" + before) res = {} for a in apps: st = w.stack(a) if not st.get("deployed"): res[a] = "not deployed"; continue code = w.remove(a) res[a] = code after = w.guest("for p in " + " ".join(apps) + "; do echo \"$p containers=$(docker ps -aq --filter label=com.docker.compose.project=$p | wc -l) volumes=$(docker volume ls -q | grep ^${p}_ | tr '\\n' ' ') copies=$(docker volume ls -q --filter label=felhom.undo-copy-of=$p | wc -l)\"; done") w.say("after the removes (the product's own):\n" + after) json.dump({"before": before, "remove": res, "after": after}, open("E2-teardown-removes.json", "w"), indent=2) open("E2-teardown-removes.log", "w").write("\n".join(w.LOG) + "\n")