minecluster/lib/k8s/server-delete.js

55 lines
1.7 KiB
JavaScript

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));
}