import k8s from "@kubernetes/client-node"; import { ERR } from "../util/logging.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); }; 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 deploymentRes = await k8sDeps.listNamespacedDeployment(namespace); const deployments = deploymentRes.body.items.map((i) => i.metadata.name); if (!deployments.includes(`mcl-${serverSpec.name}`)) return res.status(409).send("Server does not exist!"); // Delete in reverse order const deleteDeploy = k8sDeps.deleteNamespacedDeployment( `mcl-${serverSpec.name}`, namespace ); const deleteService = k8sCore.deleteNamespacedService( `mcl-${name}-server`, namespace ); const deleteRconService = k8sCore.deleteNamespacedService( `mcl-${name}-rcon`, namespace ); await deleteDeploy.catch(deleteError(res)); const deleteRconSecret = k8sCore.deleteNamespacedSecret( `mcl-${name}-rcon-secret`, namespace ); const deleteVolume = k8sCore.deleteNamespacedPersistentVolumeClaim( `mcl-${name}-volume`, namespace ); Promise.all([ deleteService, deleteRconService, deleteRconSecret, deleteVolume, ]) .then(() => res.sendStatus(200)) .catch(deleteError(res)); }