diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index 52f8dcb05..70a24bdca 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -1,14 +1,11 @@ import { promises as fs } from "fs"; import path from "path"; -import Docker from "dockerode"; import yaml from "js-yaml"; import checkAndCopyConfig, { CONF_DIR, getSettings, substituteEnvironmentVars } from "utils/config/config"; import getDockerArguments from "utils/config/docker"; -import { getKubeConfig } from "utils/config/kubernetes"; import * as shvl from "utils/config/shvl"; -import kubernetes from "utils/kubernetes/export"; import createLogger from "utils/logger"; const logger = createLogger("service-helpers"); @@ -71,6 +68,8 @@ export async function servicesFromDocker() { return []; } + const { default: Docker } = await import("dockerode"); + const { instanceName } = getSettings(); const serviceServers = await Promise.all( @@ -173,6 +172,19 @@ export async function servicesFromKubernetes() { checkAndCopyConfig("kubernetes.yaml"); + const k8sConfigFile = path.join(CONF_DIR, "kubernetes.yaml"); + const k8sRawConfigData = await fs.readFile(k8sConfigFile, "utf8"); + const k8sConfigData = substituteEnvironmentVars(k8sRawConfigData); + const k8sConfig = yaml.load(k8sConfigData); + if (!k8sConfig?.mode || k8sConfig.mode === "disabled") { + return []; + } + + const [{ getKubeConfig }, { default: kubernetes }] = await Promise.all([ + import("utils/config/kubernetes"), + import("utils/kubernetes/export"), + ]); + try { const kc = getKubeConfig(); if (!kc) { diff --git a/src/utils/config/service-helpers.test.js b/src/utils/config/service-helpers.test.js index 0c6cf44ab..a84d51265 100644 --- a/src/utils/config/service-helpers.test.js +++ b/src/utils/config/service-helpers.test.js @@ -4,6 +4,7 @@ const { state, fs, yaml, config, Docker, dockerCfg, kubeCfg, kubeApi } = vi.hois const state = { servicesYaml: null, dockerYaml: null, + kubernetesYaml: null, dockerContainers: [], dockerContainersByServer: {}, dockerServicesByServer: {}, @@ -21,6 +22,7 @@ const { state, fs, yaml, config, Docker, dockerCfg, kubeCfg, kubeApi } = vi.hois readFile: vi.fn(async (filePath) => { if (String(filePath).endsWith("/services.yaml")) return "services"; if (String(filePath).endsWith("/docker.yaml")) return "docker"; + if (String(filePath).endsWith("/kubernetes.yaml")) return "kubernetes"; return ""; }), }; @@ -29,6 +31,7 @@ const { state, fs, yaml, config, Docker, dockerCfg, kubeCfg, kubeApi } = vi.hois load: vi.fn((contents) => { if (contents === "services") return state.servicesYaml; if (contents === "docker") return state.dockerYaml; + if (contents === "kubernetes") return state.kubernetesYaml; return null; }), }; @@ -89,6 +92,7 @@ describe("utils/config/service-helpers", () => { vi.clearAllMocks(); state.servicesYaml = null; state.dockerYaml = null; + state.kubernetesYaml = null; state.dockerContainers = []; state.dockerContainersByServer = {}; state.dockerServicesByServer = {}; @@ -423,6 +427,7 @@ describe("utils/config/service-helpers", () => { state.servicesYaml = [{ G: [{ Other: { icon: "nope" } }] }]; state.dockerYaml = { "docker-local": {} }; state.dockerContainers = []; + state.kubernetesYaml = { mode: "default" }; state.kubeConfig = {}; // truthy => proceed state.kubeServices = [{ name: "S", group: "G", type: "service" }]; kubeApi.listIngress.mockResolvedValueOnce([{}]); @@ -574,6 +579,7 @@ describe("utils/config/service-helpers", () => { it("servicesFromKubernetes maps discoverable resources into service groups", async () => { config.getSettings.mockReturnValue({ instanceName: "foo" }); + state.kubernetesYaml = { mode: "default" }; state.kubeConfig = {}; // truthy kubeApi.listIngress.mockResolvedValueOnce([{ kind: "Ingress" }]); kubeApi.isDiscoverable.mockReturnValueOnce(true); @@ -592,6 +598,7 @@ describe("utils/config/service-helpers", () => { }); it("servicesFromKubernetes logs and rethrows unexpected errors", async () => { + state.kubernetesYaml = { mode: "default" }; state.kubeConfig = {}; // truthy kubeApi.listIngress.mockRejectedValueOnce(new Error("boom"));