[FIX] Fixed naming display
This commit is contained in:
parent
a96ce0ddc3
commit
b45bfed63c
5 changed files with 96 additions and 84 deletions
|
@ -1,12 +1,12 @@
|
|||
import { getDeployments } from "../k8s/k8s-server-control.js";
|
||||
import { getInstances } from "../k8s/server-control.js";
|
||||
import { getInstances } from "../k8s/server-status.js";
|
||||
import { sendError } from "../util/ExpressClientError.js";
|
||||
|
||||
export function serverList(req, res) {
|
||||
getDeployments()
|
||||
.then((sd) => res.json(sd.map((s) => s.metadata.name.substring(4))))
|
||||
.catch((e) => {
|
||||
ERR("SERVER CONTROL", e);
|
||||
ERR("STATUS CONTROLLER", e);
|
||||
res.status(500).send("Couldn't get server list");
|
||||
});
|
||||
}
|
||||
|
|
|
@ -7,6 +7,8 @@ const asExpressClientError = (e) => {
|
|||
throw new ExpressClientError({ m: e.message, c: 409 });
|
||||
};
|
||||
|
||||
const getMclName = (host, id) => `${host.replaceAll(".", "-")}-${id}`;
|
||||
|
||||
export async function createServerEntry(serverSpec) {
|
||||
const { name, host, version, serverType: server_type, memory } = serverSpec;
|
||||
var q = insertQuery(table, { name, host, version, server_type, memory });
|
||||
|
@ -21,7 +23,8 @@ export async function createServerEntry(serverSpec) {
|
|||
server_type: serverType,
|
||||
memory,
|
||||
} = entries[0];
|
||||
return { name, id, host, version, serverType, memory };
|
||||
const mclName = getMclName(host, id);
|
||||
return { name, mclName, id, host, version, serverType, memory };
|
||||
} catch (e) {
|
||||
asExpressClientError(e);
|
||||
}
|
||||
|
@ -49,8 +52,14 @@ export async function getServerEntry(serverId) {
|
|||
server_type: serverType,
|
||||
memory,
|
||||
} = serverSpecs[0];
|
||||
return { name, id, host, version, serverType, memory };
|
||||
const mclName = getMclName(host, id);
|
||||
return { name, mclName, id, host, version, serverType, memory };
|
||||
} catch (e) {
|
||||
asExpressClientError(e);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getServerEntries() {
|
||||
const q = `SELECT * FROM ${table}`;
|
||||
return pg.query(q);
|
||||
}
|
||||
|
|
|
@ -1,77 +0,0 @@
|
|||
import k8s from "@kubernetes/client-node";
|
||||
import { getDeployments } from "./k8s-server-control.js";
|
||||
const kc = new k8s.KubeConfig();
|
||||
kc.loadFromDefault();
|
||||
|
||||
const k8sMetrics = new k8s.Metrics(kc);
|
||||
const namespace = process.env.MCL_SERVER_NAMESPACE;
|
||||
|
||||
function getServerMetrics(podMetricsRes, serverId, serverAvailable) {
|
||||
const pod = podMetricsRes.items.find(({ metadata: md }) => {
|
||||
return (
|
||||
md.annotations &&
|
||||
md.annotations["minecluster.dunemask.net/id"] === serverId
|
||||
);
|
||||
});
|
||||
|
||||
if (serverAvailable && pod) {
|
||||
const podCpus = pod.containers.map(
|
||||
({ usage }) => parseInt(usage.cpu) / 1_000_000,
|
||||
);
|
||||
const podMems = pod.containers.map(
|
||||
({ usage }) => parseInt(usage.memory) / 1024,
|
||||
);
|
||||
metrics = {
|
||||
cpu: Math.ceil(podCpus.reduce((a, b) => a + b)),
|
||||
memory: Math.ceil(podMems.reduce((a, b) => a + b)),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export async function getInstances() {
|
||||
const serverDeployments = await getDeployments();
|
||||
const podMetricsRes = await k8sMetrics.getPodMetrics(namespace);
|
||||
var name, serverId, metrics, services, serverAvailable, ftpAvailable;
|
||||
const serverInstances = serverDeployments.map((s) => {
|
||||
serverId = s.metadata.annotations["minecluster.dunemask.net/id"];
|
||||
name = s.metadata.name;
|
||||
metrics = null;
|
||||
|
||||
const { containers } = s.spec.template.spec;
|
||||
services = containers.map(({ name }) => name.split("-").pop());
|
||||
const serverStatusList = s.status.conditions.map(
|
||||
({ type: statusType, status: sts }) => ({ statusType, sts }),
|
||||
);
|
||||
const deploymentAvailable =
|
||||
serverStatusList.find(
|
||||
(ss) => ss.statusType === "Available" && ss.sts === "True",
|
||||
) !== undefined;
|
||||
serverAvailable = services.includes(`server`) && deploymentAvailable;
|
||||
ftpAvailable = services.includes("ftp") && deploymentAvailable;
|
||||
metrics = getServerMetrics(podMetricsRes, serverId, serverAvailable);
|
||||
return {
|
||||
name,
|
||||
id: serverId,
|
||||
metrics,
|
||||
services,
|
||||
serverAvailable,
|
||||
ftpAvailable,
|
||||
};
|
||||
});
|
||||
return serverInstances;
|
||||
}
|
||||
|
||||
export async function getNamespaceMetrics() {
|
||||
const serverInstances = await getInstances();
|
||||
var clusterMetrics = { cpu: 0, memory: 0 };
|
||||
if (servers.length > 1) {
|
||||
const clusterCpu = serverInstances
|
||||
.map(({ metrics }) => (metrics ? metrics.cpu : 0))
|
||||
.reduce((a, b) => a + b);
|
||||
const clusterMem = serverInstances
|
||||
.map(({ metrics }) => (metrics ? metrics.memory : 0))
|
||||
.reduce((a, b) => a + b);
|
||||
clusterMetrics = { cpu: clusterCpu, memory: clusterMem };
|
||||
}
|
||||
return clusterMetrics;
|
||||
}
|
|
@ -119,9 +119,6 @@ function createRconService(createSpec) {
|
|||
}
|
||||
|
||||
export default async function createServerResources(createSpec) {
|
||||
createSpec.mclName = `${createSpec.host.replaceAll(".", "-")}-${
|
||||
createSpec.id
|
||||
}`;
|
||||
const rconSecret = createRconSecret(createSpec);
|
||||
const serverVolume = createServerVolume(createSpec);
|
||||
const serverDeploy = createServerDeploy(createSpec);
|
||||
|
|
83
lib/k8s/server-status.js
Normal file
83
lib/k8s/server-status.js
Normal file
|
@ -0,0 +1,83 @@
|
|||
import k8s from "@kubernetes/client-node";
|
||||
import { getDeployments } from "./k8s-server-control.js";
|
||||
import { getServerEntries } from "../database/queries/server-queries.js";
|
||||
const kc = new k8s.KubeConfig();
|
||||
kc.loadFromDefault();
|
||||
|
||||
const k8sMetrics = new k8s.Metrics(kc);
|
||||
const namespace = process.env.MCL_SERVER_NAMESPACE;
|
||||
|
||||
function getServerMetrics(podMetricsRes, serverId, serverAvailable) {
|
||||
const pod = podMetricsRes.items.find(({ metadata: md }) => {
|
||||
return (
|
||||
md.annotations &&
|
||||
md.annotations["minecluster.dunemask.net/id"] === serverId
|
||||
);
|
||||
});
|
||||
if (!serverAvailable || !pod) return null;
|
||||
const podCpus = pod.containers.map(
|
||||
({ usage }) => parseInt(usage.cpu) / 1_000_000,
|
||||
);
|
||||
const podMems = pod.containers.map(
|
||||
({ usage }) => parseInt(usage.memory) / 1024,
|
||||
);
|
||||
return {
|
||||
cpu: Math.ceil(podCpus.reduce((a, b) => a + b)),
|
||||
memory: Math.ceil(podMems.reduce((a, b) => a + b)),
|
||||
};
|
||||
}
|
||||
|
||||
function getServerStatus(server) {
|
||||
const { containers } = server.spec.template.spec;
|
||||
const services = containers.map(({ name }) => name.split("-").pop());
|
||||
const serverStatusList = server.status.conditions.map(
|
||||
({ type: statusType, status: sts }) => ({ statusType, sts }),
|
||||
);
|
||||
const deploymentAvailable =
|
||||
serverStatusList.find(
|
||||
(ss) => ss.statusType === "Available" && ss.sts === "True",
|
||||
) !== undefined;
|
||||
const serverAvailable = services.includes(`server`) && deploymentAvailable;
|
||||
const ftpAvailable = services.includes("ftp"); // TODO this needs some handling for container creation
|
||||
return { serverAvailable, ftpAvailable, services };
|
||||
}
|
||||
|
||||
export async function getInstances() {
|
||||
const [serverDeployments, podMetricsRes, entries] = await Promise.all([
|
||||
getDeployments(),
|
||||
k8sMetrics.getPodMetrics(namespace),
|
||||
getServerEntries(),
|
||||
]);
|
||||
|
||||
var serverId, metrics;
|
||||
const serverInstances = serverDeployments.map((s) => {
|
||||
serverId = s.metadata.annotations["minecluster.dunemask.net/id"];
|
||||
const entry = entries.find((e) => e.id === serverId);
|
||||
const { ftpAvailable, serverAvailable, services } = getServerStatus(s);
|
||||
metrics = getServerMetrics(podMetricsRes, serverId, serverAvailable);
|
||||
return {
|
||||
name: entry.name,
|
||||
id: serverId,
|
||||
metrics,
|
||||
services,
|
||||
serverAvailable,
|
||||
ftpAvailable,
|
||||
};
|
||||
});
|
||||
return serverInstances;
|
||||
}
|
||||
|
||||
export async function getNamespaceMetrics() {
|
||||
const serverInstances = await getInstances();
|
||||
var clusterMetrics = { cpu: 0, memory: 0 };
|
||||
if (servers.length > 1) {
|
||||
const clusterCpu = serverInstances
|
||||
.map(({ metrics }) => (metrics ? metrics.cpu : 0))
|
||||
.reduce((a, b) => a + b);
|
||||
const clusterMem = serverInstances
|
||||
.map(({ metrics }) => (metrics ? metrics.memory : 0))
|
||||
.reduce((a, b) => a + b);
|
||||
clusterMetrics = { cpu: clusterCpu, memory: clusterMem };
|
||||
}
|
||||
return clusterMetrics;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue