8cdc2f49d8
Co-authored-by: Nicholas Loomans <nicholas.loomans@portainer.io>
62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
import { Pod } from 'kubernetes-types/core/v1';
|
|
|
|
import { ContainerStatusInfo } from './types';
|
|
|
|
export function computePodStatus(pod: Pod): ContainerStatusInfo {
|
|
if (pod.metadata?.deletionTimestamp) {
|
|
return {
|
|
status: 'Terminating',
|
|
type: 'warn',
|
|
message: 'Pod is being deleted.',
|
|
};
|
|
}
|
|
|
|
const phase = pod.status?.phase;
|
|
const message = pod.status?.message;
|
|
const reason = pod.status?.reason;
|
|
const containerStatuses = pod.status?.containerStatuses ?? [];
|
|
|
|
switch (phase) {
|
|
case undefined:
|
|
return {
|
|
status: 'Unknown',
|
|
type: 'muted',
|
|
message: message || 'Pod status cannot be determined from the cluster.',
|
|
};
|
|
case 'Running': {
|
|
const total = containerStatuses.length;
|
|
const ready = containerStatuses.filter((c) => c.ready).length;
|
|
if (total > 0 && ready < total) {
|
|
return {
|
|
status: 'Running (not ready)',
|
|
type: 'warn',
|
|
message:
|
|
message ||
|
|
`${ready} of ${total} containers are ready. Check readiness probes.`,
|
|
};
|
|
}
|
|
return { status: 'Running', type: 'success' };
|
|
}
|
|
case 'Pending':
|
|
return {
|
|
status: 'Pending',
|
|
type: 'muted',
|
|
message: message || reason,
|
|
};
|
|
case 'Succeeded':
|
|
return { status: 'Succeeded', type: 'info', message };
|
|
case 'Failed':
|
|
return {
|
|
status: 'Failed',
|
|
type: 'danger',
|
|
message: message || reason || 'Pod failed.',
|
|
};
|
|
default:
|
|
return {
|
|
status: 'Unknown',
|
|
type: 'muted',
|
|
message: message || 'Pod status cannot be determined from the cluster.',
|
|
};
|
|
}
|
|
}
|