import k8s from "@kubernetes/client-node"; import { ERR } from "../util/logging.js"; import { getServerAssets } from "./k8s-server-control.js"; import ExpressClientError from "../util/ExpressClientError.js"; const kc = new k8s.KubeConfig(); kc.loadFromDefault(); const k8sDeps = kc.makeApiClient(k8s.AppsV1Api); const k8sCore = kc.makeApiClient(k8s.CoreV1Api); const namespace = process.env.MCL_SERVER_NAMESPACE; const deleteError = (err) => { ERR("K8S", "An error occurred while deleting a resource", err); throw new ExpressClientError({ c: 500, m: "Error deleting a resource!\n" + err, }); }; function deleteOnExist(o, fn) { if (o) return fn(o.metadata.name); } export default async function deleteServerResources(serverSpec) { const { id } = serverSpec; // Ensure deployment exists const server = await getServerAssets(id); if (!server) throw new ExpressClientError({ c: 404, m: "No Resources for that server were found!", }); // Delete in reverse order const deleteDeploy = deleteOnExist(server.deployment, (name) => k8sDeps.deleteNamespacedDeployment(name, namespace), ); const deleteService = deleteOnExist(server.service, (name) => k8sCore.deleteNamespacedService(name, namespace), ); const deleteRconService = deleteOnExist(server.rconService, (name) => k8sCore.deleteNamespacedService(name, namespace), ); if (deleteDeploy) await deleteDeploy.catch(deleteError); const deleteRconSecret = deleteOnExist(server.rconSecret, (name) => k8sCore.deleteNamespacedSecret(name, namespace), ); const deleteBackupSecret = deleteOnExist(server.backupSecret, (name) => k8sCore.deleteNamespacedSecret(name, namespace), ); const deleteExtraService = deleteOnExist(server.extraService, (name) => k8sCore.deleteNamespacedService(name, namespace), ); const deleteVolume = deleteOnExist(server.volume, (name) => k8sCore.deleteNamespacedPersistentVolumeClaim(name, namespace), ); return Promise.all([ deleteService, deleteRconService, deleteRconSecret, deleteExtraService, deleteBackupSecret, deleteVolume, ]).catch(deleteError); }