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