diff --git a/web/src/modules/swiss/components/ReleaseObjects.tsx b/web/src/modules/swiss/components/ReleaseObjects.tsx index 6bfa9e2..c3b2b5f 100644 --- a/web/src/modules/swiss/components/ReleaseObjects.tsx +++ b/web/src/modules/swiss/components/ReleaseObjects.tsx @@ -246,7 +246,7 @@ function ScalerPanel({ ); const current = status?.currentReplicas; const desired = status?.desiredReplicas; - const failing = status?.conditions?.find((c) => c.status === "False"); + const failing = scalerFailing(status?.conditions); const custom = spec?.metricProvider === "Custom"; let state: React.ReactNode = null; @@ -349,7 +349,7 @@ function ScalerPanel({ )} - + )} @@ -681,7 +681,18 @@ function Stale({ ); } -export function Conditions({ conditions }: { conditions?: Condition[] }) { +// Only AbleToScale=False or ScalingActive=False (DecisionAvailable on operator 0.5.0) is a scaler failure. +export function scalerFailing(conditions?: Condition[]): Condition | undefined { + const of = (type: string) => conditions?.find((c) => c.type === type); + return [of("AbleToScale"), of("ScalingActive") ?? of("DecisionAvailable")].find((c) => c?.status === "False"); +} + +// ScalingLimited is informational; DecisionAvailable only mirrors ScalingActive when that is present. +function scalerNeutral(conditions?: Condition[]): string[] { + return conditions?.some((c) => c.type === "ScalingActive") ? ["ScalingLimited", "DecisionAvailable"] : ["ScalingLimited"]; +} + +export function Conditions({ conditions, neutral = [] }: { conditions?: Condition[]; neutral?: string[] }) { if (!conditions?.length) return null; return (