From f7c5c3e79f300f47c2cc3619bc1d127423a560ff Mon Sep 17 00:00:00 2001 From: Jason Madigan Date: Tue, 22 Oct 2024 12:36:38 +0100 Subject: [PATCH] GW status: enforced if affected by any policies succesfully Signed-off-by: Jason Madigan --- src/components/ResourceList.tsx | 190 +++++++++++++++++--------------- 1 file changed, 99 insertions(+), 91 deletions(-) diff --git a/src/components/ResourceList.tsx b/src/components/ResourceList.tsx index 5a9c3f1..b483222 100644 --- a/src/components/ResourceList.tsx +++ b/src/components/ResourceList.tsx @@ -35,131 +35,139 @@ import { } from '@patternfly/react-icons'; import DropdownWithKebab from './DropdownWithKebab'; -const getStatusLabel = (obj: any) => { - // Check if status has parents and handle accordingly - const parentConditions = obj.status?.parents?.flatMap((parent: any) => parent.conditions) || []; +const getStatusLabel = (obj) => { + const { kind, status } = obj; - if (parentConditions.length > 0) { - const acceptedCondition = parentConditions.find( - (cond: any) => cond.type === 'Accepted' && cond.status === 'True', + const policiesMap = { + Gateway: [ + 'kuadrant.io/DNSPolicyAffected', + 'kuadrant.io/TLSPolicyAffected', + 'kuadrant.io/AuthPolicyAffected', + 'kuadrant.io/RateLimitPolicyAffected', + ], + HTTPRoute: ['kuadrant.io/AuthPolicyAffected', 'kuadrant.io/RateLimitPolicyAffected'], + }; + + const policiesAffected = policiesMap[kind] || []; + + const hasAllPoliciesEnforced = (conditions) => { + return policiesAffected.every((policy) => + conditions.some((cond) => cond.type === policy && cond.status === 'True'), + ); + }; + + const hasAnyPolicyError = (conditions) => { + return policiesAffected.some((policy) => + conditions.some((cond) => cond.type === policy && cond.status === 'False'), + ); + }; + + const generateLabel = (labelText, color, icon) => ( + + ); + + if (kind === 'Gateway') { + const conditions = status?.conditions || []; + + const acceptedCondition = conditions.find( + (cond) => cond.type === 'Accepted' && cond.status === 'True', + ); + const programmedCondition = conditions.find( + (cond) => cond.type === 'Programmed' && cond.status === 'True', ); - const programmedCondition = parentConditions.find( - (cond: any) => cond.type === 'Programmed' && cond.status === 'True', + + if (acceptedCondition && programmedCondition) { + if (hasAllPoliciesEnforced(conditions) && !hasAnyPolicyError(conditions)) { + return generateLabel('Enforced', 'green', ); + } else { + return generateLabel('Accepted (Not Enforced)', 'purple', ); + } + } else if (programmedCondition) { + return generateLabel('Programmed', 'blue', ); + } else if (conditions.some((cond) => cond.type === 'Conflicted' && cond.status === 'True')) { + return generateLabel('Conflicted', 'red', ); + } else if (conditions.some((cond) => cond.type === 'ResolvedRefs' && cond.status === 'True')) { + return generateLabel('Resolved Refs', 'blue', ); + } else { + return generateLabel('Unknown', 'orange', ); + } + } + + if (policiesAffected.length > 0) { + const parentConditions = status?.parents?.flatMap((parent) => parent.conditions) || []; + + const acceptedCondition = parentConditions.find( + (cond) => cond.type === 'Accepted' && cond.status === 'True', ); const conflictedCondition = parentConditions.find( - (cond: any) => cond.type === 'Conflicted' && cond.status === 'True', + (cond) => cond.type === 'Conflicted' && cond.status === 'True', ); const resolvedRefsCondition = parentConditions.find( - (cond: any) => cond.type === 'ResolvedRefs' && cond.status === 'True', + (cond) => cond.type === 'ResolvedRefs' && cond.status === 'True', ); - let labelText: string; - let color: 'green' | 'blue' | 'red' | 'orange'; - let icon: React.ReactNode; - if (acceptedCondition) { - labelText = 'Accepted'; - color = 'green'; - icon = ; - } else if (programmedCondition) { - labelText = 'Programmed'; - color = 'blue'; - icon = ; + if (hasAllPoliciesEnforced(parentConditions) && !hasAnyPolicyError(parentConditions)) { + return generateLabel('Enforced', 'green', ); + } else { + return generateLabel('Accepted (Not Enforced)', 'purple', ); + } } else if (conflictedCondition) { - labelText = 'Conflicted'; - color = 'red'; - icon = ; + return generateLabel('Conflicted', 'red', ); } else if (resolvedRefsCondition) { - labelText = 'Resolved Refs'; - color = 'blue'; - icon = ; + return generateLabel('Resolved Refs', 'blue', ); } else { - labelText = 'Unknown'; - color = 'orange'; - icon = ; + return generateLabel('Unknown', 'orange', ); } - - return ( - - ); } - // If no parent conditions, fallback to general condition checks - if (!obj.status || !obj.status.conditions || obj.status.conditions.length === 0) { - return ( - - ); + const generalConditions = status?.conditions || []; + + if (generalConditions.length === 0) { + return generateLabel('Creating', 'cyan', ); } - const enforcedCondition = obj.status.conditions.find( - (cond: any) => cond.type === 'Enforced' && cond.status === 'True', + const enforcedCondition = generalConditions.find( + (cond) => cond.type === 'Enforced' && cond.status === 'True', ); - const acceptedCondition = obj.status.conditions.find( - (cond: any) => cond.type === 'Accepted' && cond.status === 'True', + const acceptedCondition = generalConditions.find( + (cond) => cond.type === 'Accepted' && cond.status === 'True', ); - const acceptedConditionFalse = obj.status.conditions.find( - (cond: any) => cond.type === 'Accepted' && cond.status === 'False', + const acceptedConditionFalse = generalConditions.find( + (cond) => cond.type === 'Accepted' && cond.status === 'False', ); - const overriddenCondition = obj.status.conditions.find( - (cond: any) => cond.type === 'Overridden' && cond.status === 'False', + const overriddenCondition = generalConditions.find( + (cond) => cond.type === 'Overridden' && cond.status === 'False', ); - const conflictedCondition = obj.status.conditions.find( - (cond: any) => cond.reason === 'Conflicted' && cond.status === 'False', + const conflictedCondition = generalConditions.find( + (cond) => cond.reason === 'Conflicted' && cond.status === 'False', ); - const targetNotFoundCondition = obj.status.conditions.find( - (cond: any) => cond.reason === 'TargetNotFound' && cond.status === 'False', + const targetNotFoundCondition = generalConditions.find( + (cond) => cond.reason === 'TargetNotFound' && cond.status === 'False', ); - const unknownCondition = obj.status.conditions.find( - (cond: any) => cond.reason === 'Unknown' && cond.status === 'False', + const unknownCondition = generalConditions.find( + (cond) => cond.reason === 'Unknown' && cond.status === 'False', ); - let labelText: string; - let color: 'blue' | 'green' | 'red' | 'orange' | 'grey' | 'purple' | 'cyan'; - let icon: React.ReactNode; - if (enforcedCondition) { - labelText = 'Enforced'; - color = 'green'; - icon = ; + return generateLabel('Enforced', 'green', ); } else if (overriddenCondition) { - labelText = 'Overridden (Not Enforced)'; - color = 'grey'; - icon = ; + return generateLabel('Overridden (Not Enforced)', 'grey', ); } else if (acceptedCondition) { - labelText = 'Accepted (Not Enforced)'; - color = 'purple'; - icon = ; + return generateLabel('Accepted (Not Enforced)', 'purple', ); } else if (conflictedCondition) { - labelText = 'Conflicted (Not Accepted)'; - color = 'red'; - icon = ; + return generateLabel('Conflicted (Not Accepted)', 'red', ); } else if (targetNotFoundCondition) { - labelText = 'TargetNotFound (Not Accepted)'; - color = 'red'; - icon = ; + return generateLabel('TargetNotFound (Not Accepted)', 'red', ); } else if (unknownCondition) { - labelText = 'Unknown (Not Accepted)'; - color = 'orange'; - icon = ; + return generateLabel('Unknown (Not Accepted)', 'orange', ); } else if (acceptedConditionFalse) { - labelText = 'Invalid (Not Accepted)'; - color = 'red'; - icon = ; + return generateLabel('Invalid (Not Accepted)', 'red', ); } else { - labelText = 'Unknown'; - color = 'grey'; - icon = ; + return generateLabel('Unknown', 'grey', ); } - - return ( - - ); }; type ResourceListProps = {