Lazy-load Docker and Kubernetes deps

This commit is contained in:
shamoon 2026-02-27 19:26:05 -08:00
parent d529f81cb4
commit 4f3d60b94d
No known key found for this signature in database
2 changed files with 22 additions and 3 deletions

View File

@ -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) {

View File

@ -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"));