mirror of
https://github.com/gethomepage/homepage.git
synced 2026-09-28 15:01:17 -07:00
Performance: fetch all docker container statuses in one request (#7092)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
This commit is contained in:
@@ -103,6 +103,119 @@ describe("utils/config/service-helpers", () => {
|
||||
expect(await mod.servicesFromConfig()).toEqual([]);
|
||||
});
|
||||
|
||||
it("containersFromConfig returns an empty set when services.yaml is empty", async () => {
|
||||
state.servicesYaml = null;
|
||||
|
||||
const mod = await import("./service-helpers");
|
||||
expect(await mod.containersFromConfig("local")).toEqual(new Set());
|
||||
});
|
||||
|
||||
it("containersFromConfig only returns containers for the requested server", async () => {
|
||||
state.servicesYaml = [
|
||||
{ Group: [{ App: { container: "app", server: "local" } }, { Other: { container: "other", server: "remote" } }] },
|
||||
];
|
||||
|
||||
const mod = await import("./service-helpers");
|
||||
expect(await mod.containersFromConfig("local")).toEqual(new Set(["app"]));
|
||||
expect(await mod.containersFromConfig("remote")).toEqual(new Set(["other"]));
|
||||
});
|
||||
|
||||
it("containersFromConfig maps a service without a server to the default connection", async () => {
|
||||
state.servicesYaml = [{ Group: [{ App: { container: "app" } }] }];
|
||||
|
||||
const mod = await import("./service-helpers");
|
||||
expect(await mod.containersFromConfig("")).toEqual(new Set(["app"]));
|
||||
expect(await mod.containersFromConfig(undefined)).toEqual(new Set(["app"]));
|
||||
expect(await mod.containersFromConfig("local")).toEqual(new Set());
|
||||
});
|
||||
|
||||
it("containersFromConfig recurses into nested groups", async () => {
|
||||
state.servicesYaml = [
|
||||
{
|
||||
Main: [
|
||||
{ Child: [{ Deep: { container: "deep", server: "local" } }] },
|
||||
{ Root: { container: "top", server: "local" } },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
const mod = await import("./service-helpers");
|
||||
expect(await mod.containersFromConfig("local")).toEqual(new Set(["top", "deep"]));
|
||||
});
|
||||
|
||||
it("containersFromConfig includes docker widget containers in both widget and widgets forms", async () => {
|
||||
state.servicesYaml = [
|
||||
{
|
||||
Group: [
|
||||
{ WidgetOnly: { widget: { type: "docker", container: "widgetapp", server: "local" } } },
|
||||
{
|
||||
WithArray: {
|
||||
container: "app",
|
||||
server: "local",
|
||||
widgets: [
|
||||
{ type: "docker", container: "sidecar", server: "local" },
|
||||
{ type: "docker", container: "elsewhere", server: "remote" },
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
const mod = await import("./service-helpers");
|
||||
expect(await mod.containersFromConfig("local")).toEqual(new Set(["widgetapp", "app", "sidecar"]));
|
||||
});
|
||||
|
||||
it("containersFromConfig ignores non docker widgets that carry a container field", async () => {
|
||||
state.servicesYaml = [
|
||||
{ Group: [{ App: { widget: { type: "portainer", container: "sneaky", server: "local" } } }] },
|
||||
];
|
||||
|
||||
const mod = await import("./service-helpers");
|
||||
expect(await mod.containersFromConfig("local")).toEqual(new Set());
|
||||
});
|
||||
|
||||
it("homepageLabelValue strips the prefix and honors instance scoping", async () => {
|
||||
const mod = await import("./service-helpers");
|
||||
|
||||
expect(mod.homepageLabelValue("com.docker.compose.project", "foo")).toBeNull();
|
||||
expect(mod.homepageLabelValue("homepage.name", undefined)).toBe("name");
|
||||
expect(mod.homepageLabelValue("homepage.instance.foo.name", "foo")).toBe("name");
|
||||
expect(mod.homepageLabelValue("homepage.instance.bar.name", "foo")).toBeNull();
|
||||
expect(mod.homepageLabelValue("homepage.instance.bar.name", undefined)).toBeNull();
|
||||
});
|
||||
|
||||
it("hasHomepageLabels reports whether a container opts in for this instance", async () => {
|
||||
const mod = await import("./service-helpers");
|
||||
|
||||
expect(mod.hasHomepageLabels(undefined, "foo")).toBe(false);
|
||||
expect(mod.hasHomepageLabels({}, "foo")).toBe(false);
|
||||
expect(mod.hasHomepageLabels({ "com.docker.compose.project": "x" }, "foo")).toBe(false);
|
||||
expect(mod.hasHomepageLabels({ "homepage.name": "X" }, undefined)).toBe(true);
|
||||
expect(mod.hasHomepageLabels({ "homepage.instance.foo.name": "X" }, "foo")).toBe(true);
|
||||
expect(mod.hasHomepageLabels({ "homepage.instance.bar.name": "X" }, "foo")).toBe(false);
|
||||
});
|
||||
|
||||
it("servicesFromDocker skips containers without labels instead of failing the whole server", async () => {
|
||||
state.dockerYaml = { "docker-local": {} };
|
||||
state.dockerContainersByServer["docker-local"] = [
|
||||
{ Names: ["/nolabels"] },
|
||||
{ Names: ["/labelled"], Labels: { "homepage.group": "G", "homepage.name": "Svc" } },
|
||||
];
|
||||
|
||||
const mod = await import("./service-helpers");
|
||||
const discovered = await mod.servicesFromDocker();
|
||||
|
||||
expect(discovered).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
name: "G",
|
||||
services: [expect.objectContaining({ name: "Svc", container: "labelled" })],
|
||||
}),
|
||||
]),
|
||||
);
|
||||
});
|
||||
|
||||
it("servicesFromDocker returns [] when docker.yaml is empty", async () => {
|
||||
state.dockerYaml = null;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user