[FEATURE] Adjust resource flow
This commit is contained in:
parent
360dd32860
commit
61bf66c5c1
11 changed files with 202 additions and 86 deletions
105
lib/k8s/k8s-server-control.js
Normal file
105
lib/k8s/k8s-server-control.js
Normal file
|
@ -0,0 +1,105 @@
|
|||
import k8s from "@kubernetes/client-node";
|
||||
import { VERB } 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 mineclusterManaged = (o) =>
|
||||
o.metadata &&
|
||||
o.metadata.annotations &&
|
||||
o.metadata.annotations["minecluster.dunemask.net/server-name"] !== undefined;
|
||||
|
||||
const serverMatch = (serverName) => (o) =>
|
||||
o.metadata.annotations["minecluster.dunemask.net/server-name"] === serverName;
|
||||
|
||||
export async function getDeployments() {
|
||||
const deploymentRes = await k8sDeps.listNamespacedDeployment(namespace);
|
||||
const serverDeployments = deploymentRes.body.items.filter(mineclusterManaged);
|
||||
return serverDeployments;
|
||||
}
|
||||
|
||||
export async function getServices() {
|
||||
const serviceRes = await k8sCore.listNamespacedService(namespace);
|
||||
const serverServices = serviceRes.body.items.filter(mineclusterManaged);
|
||||
return serverServices;
|
||||
}
|
||||
|
||||
export async function getSecrets() {
|
||||
const secretRes = await k8sCore.listNamespacedSecret(namespace);
|
||||
const serverSecrets = secretRes.body.items.filter(mineclusterManaged);
|
||||
return serverSecrets;
|
||||
}
|
||||
|
||||
export async function getVolumes() {
|
||||
const volumeRes =
|
||||
await k8sCore.listNamespacedPersistentVolumeClaim(namespace);
|
||||
const serverVolumes = volumeRes.body.items.filter(mineclusterManaged);
|
||||
return serverVolumes;
|
||||
}
|
||||
|
||||
export function getServerAssets(serverName) {
|
||||
const serverFilter = serverMatch(serverName);
|
||||
return Promise.all([
|
||||
getDeployments(),
|
||||
getServices(),
|
||||
getSecrets(),
|
||||
getVolumes(),
|
||||
])
|
||||
.then(([deps, svcs, scrts, vols]) => {
|
||||
const deployments = deps.filter(serverFilter);
|
||||
const services = svcs.filter(serverFilter);
|
||||
const secrets = scrts.filter(serverFilter);
|
||||
const volumes = vols.filter(serverFilter);
|
||||
|
||||
if (deployments.length > 1) throw Error("Deployment filter broken!");
|
||||
if (volumes.length > 1) throw Error("Volume filter broken!");
|
||||
if (secrets.length > 1) throw Error("Secrets broken!");
|
||||
const serverAssets = {
|
||||
deployment: deployments[0],
|
||||
service: services.find(
|
||||
(s) => s.metadata.name === `mcl-${serverName}-rcon`,
|
||||
),
|
||||
volume: volumes[0],
|
||||
rconService: services.find(
|
||||
(s) => s.metadata.name === `mcl-${serverName}-server`,
|
||||
),
|
||||
rconSecret: secrets[0],
|
||||
};
|
||||
for (var k in serverAssets) if (serverAssets[k]) return serverAssets;
|
||||
// If no assets exist, return nothing
|
||||
})
|
||||
.catch((e) => console.log(e));
|
||||
}
|
||||
|
||||
export async function getDeployment(serverName) {
|
||||
const servers = await getDeployments();
|
||||
const serverDeployment = servers.find(
|
||||
(s) =>
|
||||
s.metadata.annotations["minecluster.dunemask.net/server-name"] ===
|
||||
serverName,
|
||||
);
|
||||
if (!serverDeployment) {
|
||||
console.log(servers.map((s) => s.metadata.annotations));
|
||||
throw Error(`MCL Deployment '${serverName}' could not be found!`);
|
||||
}
|
||||
return serverDeployment;
|
||||
}
|
||||
|
||||
export async function scaleDeployment(serverName, scaleUp = false) {
|
||||
const deployment = await getDeployment(serverName);
|
||||
if (deployment.spec.replicas === 1 && scaleUp)
|
||||
return VERB(
|
||||
"KSC",
|
||||
`MCL Deployment '${serverName}' is already scaled! Ignoring scale adjustment.`,
|
||||
);
|
||||
deployment.spec.replicas = scaleUp ? 1 : 0;
|
||||
return k8sDeps.replaceNamespacedDeployment(
|
||||
deployment.metadata.name,
|
||||
namespace,
|
||||
deployment,
|
||||
);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue