From 8a7ae3ac99dd24923657ea23ca90747962a65c85 Mon Sep 17 00:00:00 2001 From: Dorothy Date: Sun, 10 May 2026 23:14:54 +0530 Subject: [PATCH 1/2] fix:return evaluation errors from processAllNodesForRule --- internal/controller/nodereadinessrule_controller.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/controller/nodereadinessrule_controller.go b/internal/controller/nodereadinessrule_controller.go index 6feb083..0ebaa1d 100644 --- a/internal/controller/nodereadinessrule_controller.go +++ b/internal/controller/nodereadinessrule_controller.go @@ -18,6 +18,7 @@ package controller import ( "context" + "errors" "fmt" "strings" "sync" @@ -265,6 +266,7 @@ func (r *RuleReadinessController) processAllNodesForRule(ctx context.Context, ru log.Info("Processing all nodes for rule", "rule", rule.Name, "totalNodes", len(nodeList.Items)) var appliedNodes []string + var errs []error for _, node := range nodeList.Items { if r.ruleAppliesTo(ctx, rule, &node) { appliedNodes = append(appliedNodes, node.Name) @@ -274,6 +276,7 @@ func (r *RuleReadinessController) processAllNodesForRule(ctx context.Context, ru log.Error(err, "Failed to evaluate node for rule", "rule", rule.Name, "node", node.Name) r.recordNodeFailure(rule, node.Name, "EvaluationError", err.Error()) metrics.Failures.WithLabelValues(rule.Name, "EvaluationError").Inc() + errs = append(errs, err) } } } @@ -287,7 +290,7 @@ func (r *RuleReadinessController) processAllNodesForRule(ctx context.Context, ru } log.Info("Completed processing nodes for rule", "rule", rule.Name, "processedCount", len(appliedNodes)) - return nil + return errors.Join(errs...) } // evaluateRuleForNode evaluates a single rule against a single node. From 7348a02c2d6fa3b0fb27d88a075575b3b762d487 Mon Sep 17 00:00:00 2001 From: Dorothy Date: Wed, 13 May 2026 22:39:02 +0530 Subject: [PATCH 2/2] fix: update status before evaluation error return --- internal/controller/nodereadinessrule_controller.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/controller/nodereadinessrule_controller.go b/internal/controller/nodereadinessrule_controller.go index 0ebaa1d..576b521 100644 --- a/internal/controller/nodereadinessrule_controller.go +++ b/internal/controller/nodereadinessrule_controller.go @@ -145,6 +145,7 @@ func (r *RuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. r.Controller.updateRuleCache(ctx, rule) // Handle dry run + var processErr error if rule.Spec.DryRun { if err := r.Controller.processDryRun(ctx, rule, nodeList); err != nil { log.Error(err, "Failed to process dry run", "rule", rule.Name) @@ -154,14 +155,15 @@ func (r *RuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. // Clear previous dry run results rule.Status.DryRunResults = readinessv1alpha1.DryRunResults{} - // Process all applicable nodes for this rule + // Process all applicable nodes for this rule; save error so status + // is still updated before retrying. if err := r.Controller.processAllNodesForRule(ctx, rule, nodeList); err != nil { log.Error(err, "Failed to process nodes for rule", "rule", rule.Name) - return ctrl.Result{RequeueAfter: time.Minute}, err + processErr = err } } - // Update rule status + // Update rule status regardless of evaluation errors above if err := r.Controller.updateRuleStatus(ctx, rule); err != nil { log.Error(err, "Failed to update rule status", "rule", rule.Name) return ctrl.Result{RequeueAfter: time.Minute}, err @@ -173,6 +175,9 @@ func (r *RuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. return ctrl.Result{RequeueAfter: time.Minute}, err } + if processErr != nil { + return ctrl.Result{RequeueAfter: time.Minute}, processErr + } return ctrl.Result{}, nil }