import k8s from "@kubernetes/client-node"; import { ERR } from "../util/logging.js"; import { getServerAssets } from "./k8s-server-control.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 = (res) => (err) => { res.status(500).send("Error deleting a resource!"); ERR("K8S", "An error occurred while deleting a resource", err); }; function deleteOnExist(o, fn) { if (o) return fn(o.metadata.name); } export default async function deleteServer(req, res) { const serverSpec = req.body; if (!serverSpec) return res.sendStatus(400); if (!serverSpec.name) return res.status(400).send("Server name required!"); const { name } = serverSpec; // Ensure deployment exists const server = await getServerAssets(name); if (!server) return res.status(404).send("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(res)); const deleteRconSecret = deleteOnExist(server.rconSecret, (name) => k8sCore.deleteNamespacedSecret(name, namespace), ); const deleteVolume = deleteOnExist(server.volume, (name) => k8sCore.deleteNamespacedPersistentVolumeClaim(name, namespace), ); Promise.all([ deleteService, deleteRconService, deleteRconSecret, deleteVolume, ]) .then(() => res.sendStatus(200)) .catch(deleteError(res)); }