From 99b2ba8944f1927da0a371d6a4bda05d0da9b736 Mon Sep 17 00:00:00 2001 From: Ivan Bravo Bravo Date: Wed, 26 Oct 2022 00:12:46 -0500 Subject: [PATCH] added basic support for Docker Swarm services --- src/pages/api/docker/stats/[...service].js | 37 +++++++++++++++++---- src/pages/api/docker/status/[...service].js | 35 +++++++++++++++---- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/pages/api/docker/stats/[...service].js b/src/pages/api/docker/stats/[...service].js index ca8c8bd3a..c16eeb58e 100644 --- a/src/pages/api/docker/stats/[...service].js +++ b/src/pages/api/docker/stats/[...service].js @@ -31,18 +31,41 @@ export default async function handler(req, res) { const containerNames = containers.map((container) => container.Names[0].replace(/^\//, "")); const containerExists = containerNames.includes(containerName); - if (!containerExists) { - res.status(200).send({ - error: "not found", + if (containerExists) { + const container = docker.getContainer(containerName); + const stats = await container.stats({ stream: false }); + + res.status(200).json({ + stats, }); return; } - const container = docker.getContainer(containerName); - const stats = await container.stats({ stream: false }); + // Try with a service deployed in Docker Swarm + const tasks = await docker.listTasks({ + filters: { + service: [containerName], + // A service can have several offline containers, so we only look for an active one. + 'desired-state': ['running'] + } + }).catch(() => []); + + // For now we are only interested in the first one (in case replicas > 1). + // TODO: Show the result for all replicas/containers? + const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID + + if (taskContainerId) { + const container = docker.getContainer(taskContainerId); + const stats = await container.stats({ stream: false }); + + res.status(200).json({ + stats, + }); + return; + } - res.status(200).json({ - stats, + res.status(200).send({ + error: "not found", }); } catch { res.status(500).send({ diff --git a/src/pages/api/docker/status/[...service].js b/src/pages/api/docker/status/[...service].js index 8330ac3d3..cc0f56759 100644 --- a/src/pages/api/docker/status/[...service].js +++ b/src/pages/api/docker/status/[...service].js @@ -29,17 +29,38 @@ export default async function handler(req, res) { const containerNames = containers.map((container) => container.Names[0].replace(/^\//, "")); const containerExists = containerNames.includes(containerName); - if (!containerExists) { - return res.status(200).send({ - error: "not found", + if (containerExists) { + const container = docker.getContainer(containerName); + const info = await container.inspect(); + + return res.status(200).json({ + status: info.State.Status, }); } - const container = docker.getContainer(containerName); - const info = await container.inspect(); + const tasks = await docker.listTasks({ + filters: { + service: [containerName], + // A service can have several offline containers, we only look for an active one. + 'desired-state': ['running'] + } + }).catch(() => []); + + // For now we are only interested in the first one (in case replicas > 1). + // TODO: Show the result for all replicas/containers? + const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID + + if (taskContainerId) { + const container = docker.getContainer(taskContainerId); + const info = await container.inspect(); + + return res.status(200).json({ + status: info.State.Status, + }); + } - return res.status(200).json({ - status: info.State.Status, + return res.status(200).send({ + error: "not found", }); } catch { return res.status(500).send({