diff --git a/apps/dokploy/__test__/services/docker-stack-containers.test.ts b/apps/dokploy/__test__/services/docker-stack-containers.test.ts deleted file mode 100644 index c4de40613..000000000 --- a/apps/dokploy/__test__/services/docker-stack-containers.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - getContainersByAppNameMatch, - getStackContainersByAppName, -} from "@dokploy/server/services/docker"; -import { - execAsync, - execAsyncRemote, -} from "@dokploy/server/utils/process/execAsync"; -import { beforeEach, describe, expect, it, vi } from "vitest"; - -vi.mock("@dokploy/server/utils/process/execAsync", async (importOriginal) => ({ - ...(await importOriginal< - typeof import("@dokploy/server/utils/process/execAsync") - >()), - execAsync: vi.fn(), - execAsyncRemote: vi.fn(), -})); - -const execAsyncMock = vi.mocked(execAsync); -const execAsyncRemoteMock = vi.mocked(execAsyncRemote); - -describe("stack container lookup results", () => { - beforeEach(() => { - vi.resetAllMocks(); - }); - - it("returns undefined when the native stack lookup fails", async () => { - execAsyncMock.mockRejectedValueOnce(new Error("Docker is unavailable")); - - await expect( - getContainersByAppNameMatch("farmgate-odoo", "stack"), - ).resolves.toBeUndefined(); - - const command = execAsyncMock.mock.calls[0]?.[0]; - expect(command).toBeDefined(); - expect(command).not.toContain("|| true"); - }); - - it("returns an empty list for a successful native lookup with no tasks", async () => { - execAsyncMock.mockResolvedValueOnce({ stdout: "", stderr: "" }); - - await expect( - getContainersByAppNameMatch("farmgate-odoo", "stack"), - ).resolves.toEqual([]); - }); - - it("returns undefined when the remote native stack lookup fails", async () => { - execAsyncRemoteMock.mockRejectedValueOnce(new Error("SSH is unavailable")); - - await expect( - getContainersByAppNameMatch("farmgate-odoo", "stack", "server-1"), - ).resolves.toBeUndefined(); - }); - - it("returns undefined when the Swarm stack lookup reports an error", async () => { - execAsyncRemoteMock.mockResolvedValueOnce({ - stdout: "", - stderr: "node is unavailable", - }); - - await expect( - getStackContainersByAppName("farmgate-odoo", "server-1"), - ).resolves.toBeUndefined(); - }); - - it("returns an empty list for a successful Swarm lookup with no tasks", async () => { - execAsyncMock.mockResolvedValueOnce({ stdout: "", stderr: "" }); - - await expect(getStackContainersByAppName("farmgate-odoo")).resolves.toEqual( - [], - ); - }); -}); diff --git a/packages/server/src/services/docker.ts b/packages/server/src/services/docker.ts index cda350e63..65eb29041 100644 --- a/packages/server/src/services/docker.ts +++ b/packages/server/src/services/docker.ts @@ -167,7 +167,7 @@ export const getContainersByAppNameMatch = async ( return containers || []; } catch {} - return appType === "stack" ? undefined : []; + return []; }; const getStackTaskContainers = async (appName: string, serverId?: string) => { @@ -175,7 +175,7 @@ const getStackTaskContainers = async (appName: string, serverId?: string) => { const divider = "__DOKPLOY_DIVIDER__"; const tasksCommand = `docker stack ps ${appName} --no-trunc --filter "desired-state=running" --format 'TASK : {{.ID}} | Name: {{.Name}} | Node: {{.Node}} | CurrentState: {{.CurrentState}} | Error: {{.Error}}'`; const inspectCommand = `docker stack ps ${appName} -q --no-trunc --filter "desired-state=running" | xargs -r docker inspect --format '{{if .Status.ContainerStatus}}TASK : {{.ID}} | ContainerId: {{.Status.ContainerStatus.ContainerID}}{{end}}' 2>/dev/null`; - const command = `${tasksCommand} && echo "${divider}" && ${inspectCommand}`; + const command = `${tasksCommand} && echo "${divider}" && (${inspectCommand} || true)`; let stdout = ""; @@ -227,7 +227,7 @@ const getStackTaskContainers = async (appName: string, serverId?: string) => { return containers; } catch {} - return undefined; + return []; }; export const getStackContainersByAppName = async ( @@ -243,7 +243,7 @@ export const getStackContainersByAppName = async ( const { stdout, stderr } = await execAsyncRemote(serverId, command); if (stderr) { - return undefined; + return []; } if (!stdout) return []; @@ -252,7 +252,7 @@ export const getStackContainersByAppName = async ( const { stdout, stderr } = await execAsync(command); if (stderr) { - return undefined; + return []; } if (!stdout) return []; @@ -292,7 +292,7 @@ export const getStackContainersByAppName = async ( return containers || []; } catch {} - return undefined; + return []; }; export const getServiceContainersByAppName = async (