Neuer Menüpunkt „Snapshots“: alle Snapshots aller Server anzeigen und per Masse löschen #15

Closed
opened 2026-09-26 04:52:56 +00:00 by AxonByteDev · 0 comments
Owner

Problem

Snapshots lassen sich im Moment nur pro Server verwalten, über SnapshotBadge bzw. den Snapshot-Dialog des jeweiligen Servers. Wer nach einer Update-Runde auf vielen VMs/LXCs aufräumen will, muss jeden Server einzeln öffnen, dort die Snapshots auswählen und löschen, und das dann beim nächsten Server wiederholen. Das kostet viel Zeit, und man übersieht leicht, wo noch alte Snapshots liegen und Speicher belegen.

Ziel

Ein neuer Menüpunkt „Snapshots“ mit einer zentralen Liste aller Snapshots aller verbundenen Server, also aller Server mit Proxmox-Verknüpfung (proxmox_server_id, proxmox_node, proxmox_vmid):

  1. Gesamtliste: Pro Snapshot werden Server, Typ (VM/LXC), Snapshot-Name, Beschreibung und Erstellungszeitpunkt angezeigt.
  2. Auswahl über Server hinweg: Man kann Snapshots von verschiedenen Servern gleichzeitig anhaken.
  3. Massenlöschung: Ein Button „Ausgewählte löschen“ mit Bestätigungsdialog. Die Snapshots werden nacheinander gelöscht, mit Fortschritt und einem Ergebnis pro Snapshot (✓ / ✗ + Meldung).
  4. Man muss nicht mehr jeden Server einzeln öffnen.

Stand im Code

  • backend/routers/servers.py:
    • GET /api/servers/{id}/snapshots listet die Snapshots eines Servers (über proxmox_utils.list_snapshots()).
    • POST /api/servers/{id}/snapshots/delete startet einen Lösch-Batch im Hintergrund (_run_delete_batch) und liefert eine batch_id zurück.
    • GET /api/servers/{id}/snapshots/delete/{batch_id} liefert den Fortschritt.
    • Der Batch läuft schon nacheinander, weil Proxmox die Gast-Konfiguration während eines Snapshot-Vorgangs sperrt. Er ist aber auf einen Server beschränkt.
  • backend/proxmox_utils.py: list_snapshots() / delete_snapshot() / _proxmox_session() lassen sich wiederverwenden.
  • Frontend: Die Snapshot-Verwaltung steckt heute in components/SnapshotBadge.tsx und ist an einen Server gebunden.

Lösungsvorschlag

Backend:

  • GET /api/snapshots: sammelt die Snapshots aller Server mit Proxmox-Verknüpfung und gibt sie flach zurück (server_id, server_name, vm_type, name, description, snaptime).
    • Ist ein Server oder Proxmox-Host nicht erreichbar, darf nicht die ganze Anfrage scheitern. Die Antwort enthält dann pro Server einen Fehlereintrag, zum Beispiel errors: [{server_id, server_name, message}], der im Frontend als Hinweis erscheint.
    • Die Server werden am besten parallel abgefragt (kleiner ThreadPool), damit die Seite bei vielen Servern nicht ewig lädt. Die Proxmox-Anmeldung pro ProxmoxServer sollte nur einmal erfolgen und für alle Server dahinter wiederverwendet werden.
  • POST /api/snapshots/delete mit items: [{server_id, name}, …] startet einen serverübergreifenden Lösch-Batch im Hintergrund. Er arbeitet die Liste strikt nacheinander ab, wie _run_delete_batch, und liefert eine batch_id zurück.
  • GET /api/snapshots/delete/{batch_id}: Fortschritt und Ergebnisse, jeweils mit server_id + name.
  • Die bestehende Logik aus servers.py (_delete_batches, _run_delete_batch) sollte in eine gemeinsame Funktion wandern, damit Einzelserver-Dialog und neue Seite denselben Code nutzen.

Frontend:

  • Neue Seite Snapshots.tsx + Menüpunkt „Snapshots“.
  • Die Tabelle lässt sich nach Server gruppieren oder filtern und ist nach Datum sortierbar (älteste zuerst ist zum Aufräumen praktisch). Dazu eine Suche nach Snapshot-Namen.
  • Checkboxen pro Snapshot, „Alle auswählen“ pro Server-Gruppe und für die ganze Liste. Ein Zähler zeigt „X Snapshots auf Y Servern ausgewählt“.
  • Der Bestätigungsdialog listet die ausgewählten Snapshots mit Server auf.
  • Während des Löschens gibt es eine Fortschrittsanzeige (n / total) und ein Ergebnis pro Zeile. Danach wird die Liste neu geladen.
  • Optional ein Schnellfilter „älter als X Tage“, der die passenden Snapshots vorauswählt.

Offene Punkte

  • Nur PatchPilot-Snapshots? Soll es einen Filter geben, der nur die von PatchPilot erstellten Snapshots zeigt (am Namens- oder Beschreibungsmuster erkennbar), damit man nicht aus Versehen händisch angelegte Snapshots löscht? Vorschlag: alle anzeigen, dazu ein Filter und eine Markierung für PatchPilot-Snapshots.
  • Reihenfolge: Global strikt nacheinander ist am sichersten und entspricht dem Wunsch. Parallel pro Proxmox-Node wäre schneller, ist aber vorerst nicht nötig.
  • Abbrechen: Lässt sich ein laufender Batch abbrechen, sodass er nach dem aktuellen Snapshot stoppt?

Akzeptanzkriterien

  • Neuer Menüpunkt „Snapshots“ mit einer Liste aller Snapshots aller verbundenen Server
  • Ein nicht erreichbarer Server verhindert die Anzeige der übrigen nicht, sondern erscheint als Hinweis
  • Snapshots von verschiedenen Servern lassen sich gleichzeitig auswählen
  • „Ausgewählte löschen“ löscht nach Bestätigung nacheinander, mit Fortschritt und Ergebnis pro Snapshot
  • Einzelserver-Dialog und neue Seite nutzen dieselbe Lösch-Logik im Backend
  • Tests für den serverübergreifenden Lösch-Batch (Erfolg, Teilfehler, nicht erreichbarer Server)
## Problem Snapshots lassen sich im Moment nur **pro Server** verwalten, über `SnapshotBadge` bzw. den Snapshot-Dialog des jeweiligen Servers. Wer nach einer Update-Runde auf vielen VMs/LXCs aufräumen will, muss jeden Server einzeln öffnen, dort die Snapshots auswählen und löschen, und das dann beim nächsten Server wiederholen. Das kostet viel Zeit, und man übersieht leicht, wo noch alte Snapshots liegen und Speicher belegen. ## Ziel Ein neuer Menüpunkt **„Snapshots“** mit einer zentralen Liste **aller Snapshots aller verbundenen Server**, also aller Server mit Proxmox-Verknüpfung (`proxmox_server_id`, `proxmox_node`, `proxmox_vmid`): 1. **Gesamtliste:** Pro Snapshot werden Server, Typ (VM/LXC), Snapshot-Name, Beschreibung und Erstellungszeitpunkt angezeigt. 2. **Auswahl über Server hinweg:** Man kann Snapshots von **verschiedenen Servern gleichzeitig** anhaken. 3. **Massenlöschung:** Ein Button „Ausgewählte löschen“ mit Bestätigungsdialog. Die Snapshots werden **nacheinander** gelöscht, mit Fortschritt und einem Ergebnis pro Snapshot (✓ / ✗ + Meldung). 4. Man muss nicht mehr jeden Server einzeln öffnen. ## Stand im Code - `backend/routers/servers.py`: - `GET /api/servers/{id}/snapshots` listet die Snapshots **eines** Servers (über `proxmox_utils.list_snapshots()`). - `POST /api/servers/{id}/snapshots/delete` startet einen Lösch-Batch im Hintergrund (`_run_delete_batch`) und liefert eine `batch_id` zurück. - `GET /api/servers/{id}/snapshots/delete/{batch_id}` liefert den Fortschritt. - Der Batch läuft schon **nacheinander**, weil Proxmox die Gast-Konfiguration während eines Snapshot-Vorgangs sperrt. Er ist aber auf **einen** Server beschränkt. - `backend/proxmox_utils.py`: `list_snapshots()` / `delete_snapshot()` / `_proxmox_session()` lassen sich wiederverwenden. - Frontend: Die Snapshot-Verwaltung steckt heute in `components/SnapshotBadge.tsx` und ist an einen Server gebunden. ## Lösungsvorschlag **Backend:** - `GET /api/snapshots`: sammelt die Snapshots aller Server mit Proxmox-Verknüpfung und gibt sie flach zurück (`server_id`, `server_name`, `vm_type`, `name`, `description`, `snaptime`). - Ist ein Server oder Proxmox-Host nicht erreichbar, darf nicht die ganze Anfrage scheitern. Die Antwort enthält dann pro Server einen Fehlereintrag, zum Beispiel `errors: [{server_id, server_name, message}]`, der im Frontend als Hinweis erscheint. - Die Server werden am besten parallel abgefragt (kleiner ThreadPool), damit die Seite bei vielen Servern nicht ewig lädt. Die Proxmox-Anmeldung pro `ProxmoxServer` sollte nur einmal erfolgen und für alle Server dahinter wiederverwendet werden. - `POST /api/snapshots/delete` mit `items: [{server_id, name}, …]` startet einen **serverübergreifenden** Lösch-Batch im Hintergrund. Er arbeitet die Liste **strikt nacheinander** ab, wie `_run_delete_batch`, und liefert eine `batch_id` zurück. - `GET /api/snapshots/delete/{batch_id}`: Fortschritt und Ergebnisse, jeweils mit `server_id` + `name`. - Die bestehende Logik aus `servers.py` (`_delete_batches`, `_run_delete_batch`) sollte in eine gemeinsame Funktion wandern, damit Einzelserver-Dialog und neue Seite denselben Code nutzen. **Frontend:** - Neue Seite `Snapshots.tsx` + Menüpunkt „Snapshots“. - Die Tabelle lässt sich nach Server gruppieren oder filtern und ist nach Datum sortierbar (älteste zuerst ist zum Aufräumen praktisch). Dazu eine Suche nach Snapshot-Namen. - Checkboxen pro Snapshot, „Alle auswählen“ pro Server-Gruppe und für die ganze Liste. Ein Zähler zeigt „X Snapshots auf Y Servern ausgewählt“. - Der Bestätigungsdialog listet die ausgewählten Snapshots mit Server auf. - Während des Löschens gibt es eine Fortschrittsanzeige (`n / total`) und ein Ergebnis pro Zeile. Danach wird die Liste neu geladen. - Optional ein Schnellfilter „älter als X Tage“, der die passenden Snapshots vorauswählt. ## Offene Punkte - **Nur PatchPilot-Snapshots?** Soll es einen Filter geben, der nur die von PatchPilot erstellten Snapshots zeigt (am Namens- oder Beschreibungsmuster erkennbar), damit man nicht aus Versehen händisch angelegte Snapshots löscht? Vorschlag: alle anzeigen, dazu ein Filter und eine Markierung für PatchPilot-Snapshots. - **Reihenfolge:** Global strikt nacheinander ist am sichersten und entspricht dem Wunsch. Parallel pro Proxmox-Node wäre schneller, ist aber vorerst nicht nötig. - **Abbrechen:** Lässt sich ein laufender Batch abbrechen, sodass er nach dem aktuellen Snapshot stoppt? ## Akzeptanzkriterien - [x] Neuer Menüpunkt „Snapshots“ mit einer Liste aller Snapshots aller verbundenen Server - [x] Ein nicht erreichbarer Server verhindert die Anzeige der übrigen nicht, sondern erscheint als Hinweis - [x] Snapshots von verschiedenen Servern lassen sich gleichzeitig auswählen - [x] „Ausgewählte löschen“ löscht nach Bestätigung nacheinander, mit Fortschritt und Ergebnis pro Snapshot - [x] Einzelserver-Dialog und neue Seite nutzen dieselbe Lösch-Logik im Backend - [x] Tests für den serverübergreifenden Lösch-Batch (Erfolg, Teilfehler, nicht erreichbarer Server)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
AxonByteDev/PatchPilot#15
No description provided.