Initial curated Unraid-AppOps-Gateway source from 3bd6f6fee310125bfbb4d4650389a817f498724d
This commit is contained in:
commit
1dfbca08a1
528 files changed
+131054
No files matched your search
@@ -0,0 +1,100 @@
|
||||
import type { Container } from "../types/appops.ts";
|
||||
|
||||
export type ContainerFocusFilter =
|
||||
| "all"
|
||||
| "attention"
|
||||
| "running"
|
||||
| "unhealthy"
|
||||
| "unmapped"
|
||||
| "unknown"
|
||||
| "protected"
|
||||
| "managed"
|
||||
| "connector_available"
|
||||
| "no_connector"
|
||||
| "missing_metrics";
|
||||
|
||||
export interface ContainerFocusSummary {
|
||||
total: number;
|
||||
attention: number;
|
||||
unhealthy: number;
|
||||
unmapped: number;
|
||||
unknown: number;
|
||||
protected: number;
|
||||
missingMetrics: number;
|
||||
measuredMetrics: number;
|
||||
noConnector: number;
|
||||
}
|
||||
|
||||
const statusValue = (value: unknown): string => String(value || "").toLowerCase();
|
||||
|
||||
export const hasMissingContainerMetrics = (container: Container): boolean => (
|
||||
container.state === "running"
|
||||
&& statusValue(container.metricsStatus) !== "measured"
|
||||
&& (!container.cpu
|
||||
|| !container.ram
|
||||
|| statusValue(container.cpu) === "n/a"
|
||||
|| statusValue(container.ram) === "n/a")
|
||||
);
|
||||
|
||||
export const hasMeasuredContainerMetrics = (container: Container): boolean => (
|
||||
statusValue(container.metricsStatus) === "measured"
|
||||
|| (
|
||||
Boolean(container.cpu)
|
||||
&& Boolean(container.ram)
|
||||
&& statusValue(container.cpu) !== "n/a"
|
||||
&& statusValue(container.ram) !== "n/a"
|
||||
)
|
||||
);
|
||||
|
||||
export const isUnmappedContainer = (container: Container): boolean => {
|
||||
const importStatus = statusValue(container.importStatus);
|
||||
return ["unmapped", "changed", "missing"].includes(importStatus);
|
||||
};
|
||||
|
||||
export const containerNeedsOperatorAttention = (container: Container): boolean => (
|
||||
container.health === "unhealthy"
|
||||
|| container.health === "critical"
|
||||
|| isUnmappedContainer(container)
|
||||
);
|
||||
|
||||
export const buildContainerFocusSummary = (containers: Container[]): ContainerFocusSummary => {
|
||||
const summary: ContainerFocusSummary = {
|
||||
total: containers.length,
|
||||
attention: 0,
|
||||
unhealthy: 0,
|
||||
unmapped: 0,
|
||||
unknown: 0,
|
||||
protected: 0,
|
||||
missingMetrics: 0,
|
||||
measuredMetrics: 0,
|
||||
noConnector: 0,
|
||||
};
|
||||
|
||||
for (const container of containers) {
|
||||
if (containerNeedsOperatorAttention(container)) summary.attention += 1;
|
||||
if (container.health === "unhealthy" || container.health === "critical") summary.unhealthy += 1;
|
||||
if (isUnmappedContainer(container)) summary.unmapped += 1;
|
||||
if (statusValue(container.appType) === "unknown") summary.unknown += 1;
|
||||
if (container.protected) summary.protected += 1;
|
||||
if (hasMissingContainerMetrics(container)) summary.missingMetrics += 1;
|
||||
if (hasMeasuredContainerMetrics(container)) summary.measuredMetrics += 1;
|
||||
if (!container.connectorType || statusValue(container.connectorType) === "none") summary.noConnector += 1;
|
||||
}
|
||||
|
||||
return summary;
|
||||
};
|
||||
|
||||
export const filterContainersByFocus = (containers: Container[], focus: ContainerFocusFilter): Container[] => {
|
||||
if (focus === "all") return containers;
|
||||
if (focus === "attention") return containers.filter(containerNeedsOperatorAttention);
|
||||
if (focus === "running") return containers.filter(container => container.state === "running");
|
||||
if (focus === "unhealthy") return containers.filter(container => container.health === "unhealthy" || container.health === "critical");
|
||||
if (focus === "unmapped") return containers.filter(isUnmappedContainer);
|
||||
if (focus === "unknown") return containers.filter(container => statusValue(container.appType) === "unknown");
|
||||
if (focus === "protected") return containers.filter(container => container.protected === true);
|
||||
if (focus === "managed") return containers.filter(container => container.isManaged === true || container.importStatus === "managed");
|
||||
if (focus === "connector_available") return containers.filter(container => Boolean(container.connectorType) && statusValue(container.connectorType) !== "none");
|
||||
if (focus === "no_connector") return containers.filter(container => !container.connectorType || statusValue(container.connectorType) === "none");
|
||||
if (focus === "missing_metrics") return containers.filter(hasMissingContainerMetrics);
|
||||
return containers;
|
||||
};
|
||||
Reference in new issue
Block a user