homelab: Arcane-Docker ehrlich zum Rückweg – Snapshot der VM nur mit Etikett watcher

Die Update-Liste zeigte bei Arcane „Snapshot vorher, bei Rot zurück“, obwohl das
Docker-Update keinen Snapshot anlegte (und der Ausführer VM 106 ohne Etikett gar
nicht anfassen darf). Jetzt:
- Gäste ohne Freigabe haben Rückweg „keiner“, Rückfrage und Plan sagen es.
- Echte Docker-Updates legen vorher einen Snapshot der VM an, wenn sie freigegeben
  ist, prüfen danach (Fehler-Container, Arcane antwortet binnen 3 min) und gehen
  bei Rot zurück – wie bei den Containern.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-25 10:29:07 +02:00
co-authored by Claude Opus 5.5
parent c37c0dccbb
commit 67ed0458a9
7 changed files with 117 additions and 25 deletions
+37
View File
@@ -284,6 +284,43 @@ def test_docker_ueber_arcane_erst_als_probelauf(ausfuehrer, monkeypatch):
assert updates.starten("vm-106", "docker")["ok"] is False
def test_docker_echt_mit_snapshot_nur_mit_etikett(ausfuehrer, monkeypatch):
starten, protokoll, meldungen, _ = ausfuehrer
monkeypatch.setenv("MC_ARCANE_KEY", "schluessel")
monkeypatch.setenv("MC_ARCANE_ECHT", "1")
monkeypatch.setattr(updates, "ARCANE_FRIST_S", 0)
monkeypatch.setattr(inventar.arcane, "images_mit_update", lambda url: [
{"name": "nginx:alpine", "aktuell": None, "neu": None, "umgebung": 0, "benutzt": ["web"]}])
ergebnis = {"local": {"checked": 7, "updated": 1, "failed": 0, "items": []}}
monkeypatch.setattr(updates.arcane, "updater", lambda url, probelauf: ergebnis)
starten("1.27.3")
# Ohne Etikett (wie VM 106 heute): kein Snapshot — Update-Liste und Rückfrage sagen es, statt einen zu versprechen.
arcane_ziel = _ziele(None)["vm-106"]
docker = {b["id"]: b for b in arcane_ziel["bausteine"]}["docker"]
assert arcane_ziel["rueckweg_art"] == "keiner" and "Etikett „watcher“ fehlt" in docker["aktion"]["frage"]
lauf = _auf_ende(updates.starten("vm-106", "docker")["lauf"])
assert (lauf["ergebnis"], protokoll) == ("eingespielt", [])
# Mit Etikett: vorher ein Snapshot der VM; ist die Prüfung rot, geht es darauf zurück.
bericht = json.loads(json.dumps(BERICHT))
next(g for g in bericht["gaeste"] if g["vmid"] == 106)["erlaubt"] = True
kanal.bericht_speichern(bericht)
arcane_ziel = next(z for z in inventar.ziele()["ziele"] if z["id"] == "vm-106")
docker = {b["id"]: b for b in arcane_ziel["bausteine"]}["docker"]
assert arcane_ziel["rueckweg_art"] == "snapshot" and "Vorher wird ein Snapshot angelegt" in docker["aktion"]["frage"]
ergebnis["local"]["failed"] = 1
lauf = _auf_ende(updates.starten("vm-106", "docker")["lauf"])
assert (lauf["ergebnis"], protokoll) == ("zurueckgerollt", ["snapshot", "zurueck"])
text, dringend = meldungen[-1]
assert dringend and "zurück auf den Snapshot mc2-20260924-190000" in text and "1 Container" in text
ergebnis["local"]["failed"] = 0
lauf = _auf_ende(updates.starten("vm-106", "docker")["lauf"])
assert lauf["ergebnis"] == "eingespielt" and protokoll[2:] == ["snapshot"]
assert meldungen[-1] == ("Arcane: 1 Container aktualisiert, Prüfung grün.", False)
def test_ausfuehrer_nur_lesen(monkeypatch):
a = _ausfuehrer_modul()
monkeypatch.setattr(a, "NUR_LESEN", True)