Files
proxdeploy/src/worker/ablaeufe/aufraeumen.ts
T
florian.wildeandClaude Opus 5.5 7f6cf00a0e feat(verlauf): Filter, Wiederholen und Aufräumen
Verlauf filterbar (URL, API, proxdeploy history); Wiederholen füllt den Assistenten aus einem alten Auftrag; Aufräumen löscht nach Fehlschlag oder Abbruch den halb angelegten Gast – nur, wenn dessen Beschreibung auf den Auftrag verweist. Deshalb setzt das Klonen die Beschreibung jetzt sofort. Auf pve-demo geprüft (CT 109).

Closes #014

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:39:58 +02:00

60 lines
2.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { phasenAusfuehren } from "@/engine/ablauf/ablauf";
import { aufraeumSchritte, type AufraeumStand } from "@/engine/ablaeufe/aufraeumen";
import { ProxmoxClient } from "@/engine/proxmox/client";
import { prisma } from "@/lib/db";
import { z } from "@/lib/validierung";
import { melden } from "@/server/ereignisse/senke";
import { verbindungAus } from "@/server/services/server";
import { ablaufRegistrieren } from "../ausfuehren";
import { aufrufLogger } from "../aufruf-log";
const Anfrage = z.object({
auftrag: z.string(),
typ: z.enum(["VM", "LXC"]),
vmid: z.number().int(),
knoten: z.string().nullable(),
});
ablaufRegistrieren("AUFRAEUMEN", async ({ auftrag, senke, abbruchGewuenscht }) => {
const anfrage = Anfrage.parse(auftrag.anfrage);
const server = await prisma.server.findUniqueOrThrow({ where: { id: auftrag.serverId } });
await prisma.auftrag.update({
where: { id: auftrag.id },
data: {
vmid: anfrage.vmid,
kopf: `Server ${server.name}${anfrage.knoten ? ` · Node ${anfrage.knoten}` : ""} · ${
anfrage.typ === "LXC" ? "CT" : "VM"
} ${anfrage.vmid} aus ${anfrage.auftrag}`,
},
});
await melden(auftrag.id);
const client = new ProxmoxClient(verbindungAus(server), { beobachter: aufrufLogger(senke) });
const stand: AufraeumStand = {};
try {
const ergebnis = await phasenAusfuehren(
aufraeumSchritte(
{
client,
typ: anfrage.typ,
vmid: anfrage.vmid,
knoten: anfrage.knoten,
auftragKurzId: anfrage.auftrag,
},
stand,
),
senke,
{ abbruchGewuenscht },
);
if (!ergebnis.ok) return ergebnis;
// Der ursprüngliche Auftrag ist damit erledigt – im Verlauf als „aufgeräumt“ sichtbar.
if (auftrag.bezugId) {
await prisma.auftrag.update({ where: { id: auftrag.bezugId }, data: { status: "AUFGERAEUMT" } });
await melden(auftrag.bezugId);
}
return { ok: true, ergebnis: { vmid: anfrage.vmid, ...(stand.knoten ? { knoten: stand.knoten } : {}) } };
} finally {
await client.schliessen();
}
});