Use replica count for swarm status

Co-Authored-By: Raphaël Catarino <raphcatarino@gmail.com>
This commit is contained in:
shamoon 2023-02-14 10:12:19 -08:00
parent f74275293a
commit ae7a77d247
3 changed files with 47 additions and 24 deletions

View file

@ -44,42 +44,65 @@ export default async function handler(req, res) {
}
if (dockerArgs.swarm) {
const tasks = await docker.listTasks({
const serviceInfo = await docker.getService(containerName).inspect()
.catch(() => undefined);
if (!serviceInfo) {
return res.status(404).send({
status: "not found",
});
}
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(() => []);
// TODO: Show the result for all replicas/containers?
// We can only get stats for 'local' containers so try to find one
const localContainerIDs = containers.map(c => c.Id);
const task = tasks.find(t => localContainerIDs.includes(t.Status?.ContainerStatus?.ContainerID)) ?? tasks.at(0);
const taskContainerId = task?.Status?.ContainerStatus?.ContainerID;
if (taskContainerId) {
try {
const container = docker.getContainer(taskContainerId);
const info = await container.inspect();
if (serviceInfo.Spec.Mode?.Replicated) {
// Replicated service, check n replicas
const replicas = parseInt(serviceInfo.Spec.Mode?.Replicated?.Replicas, 10);
if (tasks.length === replicas) {
return res.status(200).json({
status: info.State.Status,
health: info.State.Health?.Status,
status: `running ${tasks.length}/${replicas}`,
});
} catch (e) {
if (task) {
}
if (tasks.length > 0) {
return res.status(200).json({
status: `partial ${tasks.length}/${replicas}`,
});
}
} else {
// Global service, prefer 'local' containers
const localContainerIDs = containers.map(c => c.Id);
const task = tasks.find(t => localContainerIDs.includes(t.Status?.ContainerStatus?.ContainerID)) ?? tasks.at(0);
const taskContainerId = task?.Status?.ContainerStatus?.ContainerID;
if (taskContainerId) {
try {
const container = docker.getContainer(taskContainerId);
const info = await container.inspect();
return res.status(200).json({
status: task.Status.State
})
status: info.State.Status,
health: info.State.Health?.Status,
});
} catch (e) {
if (task) {
return res.status(200).json({
status: task.Status.State
})
}
}
}
}
}
return res.status(200).send({
error: "not found",
return res.status(404).send({
status: "not found",
});
} catch (e) {
logger.error(e);