[FEATURE] Adjust resource flow

This commit is contained in:
Dunemask 2023-12-15 21:00:02 -07:00
parent 360dd32860
commit 61bf66c5c1
11 changed files with 202 additions and 86 deletions

View file

@ -1,22 +1,26 @@
import k8s from "@kubernetes/client-node";
import {
getDeployment,
getDeployments,
getServerAssets,
scaleDeployment,
} from "./k8s-server-control.js";
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 k8sMetrics = new k8s.Metrics(kc);
const namespace = process.env.MCL_SERVER_NAMESPACE;
async function findDeployment(serverName) {
try {
const deploymentRes = await k8sDeps.listNamespacedDeployment(namespace);
return deploymentRes.body.items.find(
(i) => i.metadata.name === `mcl-${serverName}`,
);
} catch (e) {
ERR("SERVER CONTROL", `Error finding deployment: mcl-${serverName}`);
}
// Gets the all assets for the server
export async function getServer(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;
getServerAssets(name)
.then((server) => res.status(200).json(server))
.catch((e) => res.status(500).send(e));
}
export async function startServer(req, res) {
@ -24,19 +28,13 @@ export async function startServer(req, res) {
if (!serverSpec) return res.sendStatus(400);
if (!serverSpec.name) return res.status(400).send("Server name required!");
const { name } = serverSpec;
const dep = await findDeployment(name);
if (!dep || !dep.spec) return res.status(409).send("Server does not exist!");
if (dep.spec.replicas === 1)
return res.status(409).send("Server already started!");
dep.spec.replicas = 1;
k8sDeps
.replaceNamespacedDeployment(`mcl-${name}`, namespace, dep)
.then(() => res.sendStatus(200))
.catch((e) => {
ERR("SERVER CONTROL", e);
res.status(500).send("Error updating server!");
});
try {
await scaleDeployment(name, true);
res.sendStatus(200);
} catch (e) {
ERR("SERVER CONTROL", e);
res.status(500).send(`Error updating server '${name}'!`);
}
}
export async function stopServer(req, res) {
@ -44,34 +42,28 @@ export async function stopServer(req, res) {
if (!serverSpec) return res.sendStatus(400);
if (!serverSpec.name) return res.status(400).send("Server name required!");
const { name } = serverSpec;
const deploymentRes = await k8sDeps.listNamespacedDeployment(namespace);
const dep = deploymentRes.body.items.find(
(i) => i.metadata.name === `mcl-${name}`,
);
if (!dep) return res.status(409).send("Server does not exist!");
if (dep.spec.replicas === 0)
return res.status(409).send("Server already stopped!");
dep.spec.replicas = 0;
k8sDeps.replaceNamespacedDeployment(`mcl-${name}`, namespace, dep);
res.sendStatus(200);
try {
await scaleDeployment(name, false);
res.sendStatus(200);
} catch (e) {
ERR("SERVER CONTROL", e);
res.status(500).send(`Error updating server '${name}'!`);
}
}
export async function serverList(req, res) {
const deploymentRes = await k8sDeps.listNamespacedDeployment(namespace);
const deployments = deploymentRes.body.items.map((i) => i.metadata.name);
// TODO Add an annotation and manage using that
const serverDeployments = deployments.filter((d) => d.startsWith("mcl-"));
res.json(serverDeployments.map((sd) => sd.substring(4)));
export function serverList(req, res) {
getDeployments()
.then((sd) => res.json(sd.map((s) => s.metadata.name.substring(4))))
.catch((e) => {
ERR("SERVER CONTROL", e);
res.status(500).send("Couldn't get server list");
});
}
export async function getServers(req, res) {
const deploymentRes = await k8sDeps.listNamespacedDeployment(namespace);
const deployments = deploymentRes.body.items;
const serverDeployments = await getDeployments();
const podMetricsResponse = await k8sMetrics.getPodMetrics(namespace);
// TODO Add an annotation and manage using that
const serverDeployments = deployments.filter((d) =>
d.metadata.name.startsWith("mcl-"),
);
var name, metrics, started;
const servers = serverDeployments.map((s) => {
name = s.metadata.name.substring(4);