From 4885fa2122882e26fba8829b733824ca3594dd03 Mon Sep 17 00:00:00 2001 From: Dunemask Date: Tue, 19 Dec 2023 21:12:03 -0700 Subject: [PATCH] [FEATURE] Adjusted servercards --- lib/k8s/server-control.js | 20 ++++++++++++------ src/components/servers/ServerCard.jsx | 29 +++++++++++++++++++-------- src/css/header.css | 2 +- src/nav/MCLMenu.jsx | 7 +------ src/util/queries.js | 3 +-- src/util/theme.js | 2 +- 6 files changed, 39 insertions(+), 24 deletions(-) diff --git a/lib/k8s/server-control.js b/lib/k8s/server-control.js index 63097e6..bcb5a35 100644 --- a/lib/k8s/server-control.js +++ b/lib/k8s/server-control.js @@ -11,7 +11,6 @@ const kc = new k8s.KubeConfig(); kc.loadFromDefault(); const k8sMetrics = new k8s.Metrics(kc); -const k8sDeps = kc.makeApiClient(k8s.AppsV1Api); const namespace = process.env.MCL_SERVER_NAMESPACE; export async function startServerContainer(serverSpec) { @@ -43,17 +42,26 @@ export async function stopServerContainer(serverSpec) { export async function getInstances() { const serverDeployments = await getDeployments(); const podMetricsResponse = await k8sMetrics.getPodMetrics(namespace); - var name, metrics, started; + var name, metrics, services, serverAvailable, ftpAvailable; const serverInstances = serverDeployments.map((s) => { name = s.metadata.annotations["minecluster.dunemask.net/server-name"]; metrics = null; - started = !!s.spec.template.spec.containers.find((c) => - c.name.includes(`mcl-${name}-server`), + 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; + const pod = podMetricsResponse.items.find(({ metadata: md }) => { return md.labels && md.labels.app && md.labels.app === `mcl-${name}-app`; }); - if (started && pod) { + if (serverAvailable && pod) { const podCpus = pod.containers.map( ({ usage }) => parseInt(usage.cpu) / 1_000_000, ); @@ -65,7 +73,7 @@ export async function getInstances() { memory: Math.ceil(podMems.reduce((a, b) => a + b)), }; } - return { name, metrics, started }; + return { name, metrics, services, serverAvailable, ftpAvailable }; }); return serverInstances; } diff --git a/src/components/servers/ServerCard.jsx b/src/components/servers/ServerCard.jsx index 4eec631..d3a65e0 100644 --- a/src/components/servers/ServerCard.jsx +++ b/src/components/servers/ServerCard.jsx @@ -19,12 +19,12 @@ import { Link } from "react-router-dom"; export default function ServerCard(props) { const { server, openRcon } = props; - const { name, metrics, started } = server; + const { name, metrics, ftpAvailable, serverAvailable, services } = server; const startServer = useStartServer(name); const stopServer = useStopServer(name); const deleteServer = useDeleteServer(name); function toggleRcon() { - if (!started) return; + if (!services.includes("server")) return; openRcon(); } @@ -60,14 +60,26 @@ export default function ServerCard(props) { )}
- {started && ( + {services.includes("server") && ( )} - {!started && ( + {!services.includes("server") && ( @@ -106,11 +118,12 @@ export default function ServerCard(props) { diff --git a/src/css/header.css b/src/css/header.css index 15d51e4..efa6fa9 100644 --- a/src/css/header.css +++ b/src/css/header.css @@ -23,7 +23,7 @@ right: 0; color: rgba(0, 0, 0, 0.87); z-index: 1302; - background-color: black; + background-color: #29985c; } .view > header > div > div > a { height: 40px; diff --git a/src/nav/MCLMenu.jsx b/src/nav/MCLMenu.jsx index 3d6e7c2..706c971 100644 --- a/src/nav/MCLMenu.jsx +++ b/src/nav/MCLMenu.jsx @@ -36,12 +36,7 @@ export default function MCLMenu() { theme.zIndex.modal + 2 - (isDrawer ? 1 : 0); return ( - + fetchApiCore("/files/folder", { name: server, path, - }); /*postJsonApi("/files/folder", {name: server, path});*/ + }); export const deleteServerItem = async (server, path, isDir) => fetchApiCore("/files/item", { name: server, path, isDir }, "DELETE"); @@ -106,6 +106,5 @@ const postJsonApi = (subPath, body, invalidate, method = "POST") => { body: JSON.stringify(body), }); if (invalidate) qc.invalidateQueries([invalidate]); - return res.json(); }; }; diff --git a/src/util/theme.js b/src/util/theme.js index 26347a4..2e9bf46 100644 --- a/src/util/theme.js +++ b/src/util/theme.js @@ -5,7 +5,7 @@ const themeOptions = { palette: { mode: "light", primary: { - main: "rgba(109,216,144,255)", + main: "#29985c", }, secondary: { main: "#f50057",