Use replica count for swarm status
Co-Authored-By: Raphaël Catarino <raphcatarino@gmail.com>
This commit is contained in:
parent
f74275293a
commit
ae7a77d247
3 changed files with 47 additions and 24 deletions
|
@ -12,7 +12,7 @@ export default function Status({ service }) {
|
|||
</div>
|
||||
}
|
||||
|
||||
if (data && data.status === "running") {
|
||||
if (data && data.status.includes("running")) {
|
||||
if (data.health === "starting") {
|
||||
return (
|
||||
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.health}>
|
||||
|
@ -36,7 +36,7 @@ export default function Status({ service }) {
|
|||
);
|
||||
}
|
||||
|
||||
if (data && (data.status === "not found" || data.status === "exited")) {
|
||||
if (data && (data.status === "not found" || data.status === "exited" || data.status?.startsWith("partial"))) {
|
||||
return (
|
||||
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.status}>
|
||||
<div className="text-[8px] font-bold text-orange-400/50 dark:text-orange-400/80 uppercase">{data.status}</div>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -22,7 +22,7 @@ export default function Component({ service }) {
|
|||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (statusData && statusData.status !== "running") {
|
||||
if (statusData && !(statusData.status.includes("running") || statusData.status.includes("partial"))) {
|
||||
return (
|
||||
<Container>
|
||||
<Block label={t("widget.status")} value={t("docker.offline")} />
|
||||
|
|
Loading…
Add table
Reference in a new issue