@@ -531,10 +531,18 @@ type AlertGetter interface {
531531}
532532
533533func (u * availableUpdates ) evaluateAlertRisks (ctx context.Context ) error {
534+ if u == nil || u .AlertGetter == nil {
535+ u .AlertRisks = nil
536+ return nil
537+ }
534538 alerts , err := u .AlertGetter .Get (ctx )
535539 if err != nil {
536540 return fmt .Errorf ("failed to get alerts: %w" , err )
537541 }
542+ if alerts == nil {
543+ u .AlertRisks = nil
544+ return nil
545+ }
538546 u .AlertRisks = alertsToRisks (alerts .Data .Alerts )
539547 return nil
540548}
@@ -585,7 +593,7 @@ func alertsToRisks(alerts []alert.Alert) []configv1.ConditionalUpdateRisk {
585593 if alertName == "PodDisruptionBudgetLimit" {
586594 details = fmt .Sprintf ("Namespace=%s, PodDisruptionBudget=%s. %s" , alert .Labels .Namespace , alert .Labels .PodDisruptionBudget , details )
587595 }
588- addCondition (risks , alertName , summary , alertURL , alertPromQL , metav1.Condition {
596+ risks [ alertName ] = getRisk (risks , alertName , summary , alertURL , alertPromQL , metav1.Condition {
589597 Type : internal .ConditionalUpdateRiskConditionTypeApplies ,
590598 Status : metav1 .ConditionTrue ,
591599 Reason : fmt .Sprintf ("Alert:%s" , alert .State ),
@@ -597,7 +605,7 @@ func alertsToRisks(alerts []alert.Alert) []configv1.ConditionalUpdateRisk {
597605
598606 if alertName == "PodDisruptionBudgetAtLimit" {
599607 details = fmt .Sprintf ("Namespace=%s, PodDisruptionBudget=%s. %s" , alert .Labels .Namespace , alert .Labels .PodDisruptionBudget , details )
600- addCondition (risks , alertName , summary , alertURL , alertPromQL , metav1.Condition {
608+ risks [ alertName ] = getRisk (risks , alertName , summary , alertURL , alertPromQL , metav1.Condition {
601609 Type : internal .ConditionalUpdateRiskConditionTypeApplies ,
602610 Status : metav1 .ConditionTrue ,
603611 Reason : internal .AlertConditionReason (alert .State ),
@@ -608,7 +616,7 @@ func alertsToRisks(alerts []alert.Alert) []configv1.ConditionalUpdateRisk {
608616 }
609617
610618 if alertName == "KubeContainerWaiting" {
611- addCondition (risks , alertName , summary , alertURL , alertPromQL , metav1.Condition {
619+ risks [ alertName ] = getRisk (risks , alertName , summary , alertURL , alertPromQL , metav1.Condition {
612620 Type : internal .ConditionalUpdateRiskConditionTypeApplies ,
613621 Status : metav1 .ConditionTrue ,
614622 Reason : internal .AlertConditionReason (alert .State ),
@@ -619,7 +627,7 @@ func alertsToRisks(alerts []alert.Alert) []configv1.ConditionalUpdateRisk {
619627 }
620628
621629 if alertName == "KubeNodeNotReady" || alertName == "KubeNodeReadinessFlapping" || alertName == "KubeNodeUnreachable" {
622- addCondition (risks , alertName , summary , alertURL , alertPromQL , metav1.Condition {
630+ risks [ alertName ] = getRisk (risks , alertName , summary , alertURL , alertPromQL , metav1.Condition {
623631 Type : internal .ConditionalUpdateRiskConditionTypeApplies ,
624632 Status : metav1 .ConditionTrue ,
625633 Reason : internal .AlertConditionReason (alert .State ),
@@ -646,10 +654,10 @@ func alertsToRisks(alerts []alert.Alert) []configv1.ConditionalUpdateRisk {
646654 return ret
647655}
648656
649- func addCondition (risks map [string ]configv1.ConditionalUpdateRisk , riskName , message , url , promQL string , condition metav1.Condition ) {
657+ func getRisk (risks map [string ]configv1.ConditionalUpdateRisk , riskName , message , url , promQL string , condition metav1.Condition ) configv1. ConditionalUpdateRisk {
650658 risk , ok := risks [riskName ]
651659 if ! ok {
652- risks [ riskName ] = configv1.ConditionalUpdateRisk {
660+ return configv1.ConditionalUpdateRisk {
653661 Name : riskName ,
654662 Message : message ,
655663 URL : url ,
@@ -663,14 +671,17 @@ func addCondition(risks map[string]configv1.ConditionalUpdateRisk, riskName, mes
663671 },
664672 Conditions : []metav1.Condition {condition },
665673 }
666- return
667674 }
668675
669- risk .Conditions [0 ].Message = fmt .Sprintf ("%s; %s" , risk .Conditions [0 ].Message , condition .Message )
670- if risk .Conditions [0 ].LastTransitionTime .After (condition .LastTransitionTime .Time ) {
671- risk .Conditions [0 ].LastTransitionTime = condition .LastTransitionTime
676+ if c := meta .FindStatusCondition (risk .Conditions , condition .Type ); c != nil {
677+ c .Message = fmt .Sprintf ("%s; %s" , c .Message , condition .Message )
678+ if c .LastTransitionTime .After (condition .LastTransitionTime .Time ) {
679+ c .LastTransitionTime = condition .LastTransitionTime
680+ }
681+ meta .SetStatusCondition (& risk .Conditions , * c )
672682 }
673683
684+ return risk
674685}
675686
676687func (u * availableUpdates ) evaluateConditionalUpdates (ctx context.Context ) {
@@ -682,7 +693,7 @@ func (u *availableUpdates) evaluateConditionalUpdates(ctx context.Context) {
682693 risks := risksInOrder (riskVersions )
683694 u .RiskConditions = loadRiskConditions (ctx , risks , riskVersions , u .ConditionRegistry )
684695
685- if err := sanityCheck (u .ConditionalUpdates ); err != nil {
696+ if err := sanityCheck (u .ConditionalUpdates , u . AlertRisks ); err != nil {
686697 klog .Errorf ("Sanity check failed which might impact risk evaluation: %v" , err )
687698 }
688699 for i , conditionalUpdate := range u .ConditionalUpdates {
@@ -700,7 +711,7 @@ func (u *availableUpdates) evaluateConditionalUpdates(ctx context.Context) {
700711 }
701712}
702713
703- func sanityCheck (updates []configv1.ConditionalUpdate ) error {
714+ func sanityCheck (updates []configv1.ConditionalUpdate , alertRisks []configv1. ConditionalUpdateRisk ) error {
704715 risks := map [string ]configv1.ConditionalUpdateRisk {}
705716 var errs []error
706717 for _ , update := range updates {
@@ -716,6 +727,11 @@ func sanityCheck(updates []configv1.ConditionalUpdate) error {
716727 }
717728 }
718729 }
730+ for _ , alertRisk := range alertRisks {
731+ if _ , ok := risks [alertRisk .Name ]; ok {
732+ errs = append (errs , fmt .Errorf ("found alert risk and conditional update risk share the name: %s" , alertRisk .Name ))
733+ }
734+ }
719735 return utilerrors .NewAggregate (errs )
720736}
721737
0 commit comments