homepage-plus/src/pages/api/kubernetes/status/[...service].js
djeinstine 91d5fc8e42
Enhancement: support for Kubernetes gateway API (#4643)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
Co-authored-by: lyons <gittea.sand@gmail.com>
Co-authored-by: Brett Dudo <brett@dudo.io>
2025-02-11 18:57:22 -08:00

71 lines
2 KiB
JavaScript

import { CoreV1Api } from "@kubernetes/client-node";
import { getKubeConfig } from "../../../../utils/config/kubernetes";
import createLogger from "../../../../utils/logger";
const logger = createLogger("kubernetesStatusService");
export default async function handler(req, res) {
const APP_LABEL = "app.kubernetes.io/name";
const { service, podSelector } = req.query;
const [namespace, appName] = service;
if (!namespace && !appName) {
res.status(400).send({
error: "kubernetes query parameters are required",
});
return;
}
const labelSelector = podSelector !== undefined ? podSelector : `${APP_LABEL}=${appName}`;
try {
const kc = getKubeConfig();
if (!kc) {
res.status(500).send({
error: "No kubernetes configuration",
});
return;
}
const coreApi = kc.makeApiClient(CoreV1Api);
const podsResponse = await coreApi
.listNamespacedPod({
namespace,
labelSelector,
})
.then((response) => response)
.catch((err) => {
logger.error("Error getting pods: %d %s %s", err.statusCode, err.body, err.response);
return null;
});
if (!podsResponse) {
res.status(500).send({
error: "Error communicating with kubernetes",
});
return;
}
const pods = podsResponse.items;
if (pods.length === 0) {
res.status(404).send({
status: "not found",
});
logger.error(`no pods found with namespace=${namespace} and labelSelector=${labelSelector}`);
return;
}
const someReady = pods.find((pod) => ["Succeeded", "Running"].includes(pod.status.phase));
const allReady = pods.every((pod) => ["Succeeded", "Running"].includes(pod.status.phase));
let status = "down";
if (allReady) {
status = "running";
} else if (someReady) {
status = "partial";
}
res.status(200).json({
status,
});
} catch (e) {
if (e) logger.error(e);
res.status(500).send({
error: "unknown error",
});
}
}