From 40e32cbfaa17429d25adcb6c729d0350a2777184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20S=C3=BC=C3=9F?= Date: Mon, 11 Mar 2024 11:29:43 +0100 Subject: [PATCH] feat: remove finalizer when no instances match this reduces load on the operator and eases deletion when no instance can be found --- .../grafanaalertrulegroup_controller.go | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/controllers/grafanaalertrulegroup_controller.go b/controllers/grafanaalertrulegroup_controller.go index 0f41c6f20..ad401b1d2 100644 --- a/controllers/grafanaalertrulegroup_controller.go +++ b/controllers/grafanaalertrulegroup_controller.go @@ -42,6 +42,10 @@ import ( client2 "github.com/grafana/grafana-operator/v5/controllers/client" ) +const ( + conditionAlertGroupSynchronized = "AlertGroupSynchronized" +) + // GrafanaAlertRuleGroupReconciler reconciles a GrafanaAlertRuleGroup object type GrafanaAlertRuleGroupReconciler struct { client.Client @@ -90,27 +94,31 @@ func (r *GrafanaAlertRuleGroupReconciler) Reconcile(ctx context.Context, req ctr } return ctrl.Result{}, nil } - if !controllerutil.ContainsFinalizer(group, grafanaFinalizer) { - controllerutil.AddFinalizer(group, grafanaFinalizer) - if err := r.Update(ctx, group); err != nil { - r.Log.Error(err, "failed to set finalizer") - return ctrl.Result{RequeueAfter: RequeueDelay}, err - } - } defer func() { if err := r.Client.Status().Update(ctx, group); err != nil { r.Log.Error(err, "updating status") } + if meta.IsStatusConditionTrue(group.Status.Conditions, conditionNoMatchingInstance) { + controllerutil.RemoveFinalizer(group, grafanaFinalizer) + } else { + controllerutil.AddFinalizer(group, grafanaFinalizer) + } + if err := r.Update(ctx, group); err != nil { + r.Log.Error(err, "failed to set finalizer") + } }() instances, err := r.GetMatchingInstances(ctx, group, r.Client) if err != nil { setNoMatchingInstance(&group.Status.Conditions, group.Generation, "ErrFetchingInstances", fmt.Sprintf("error occurred during fetching of instances: %s", err.Error())) + meta.RemoveStatusCondition(&group.Status.Conditions, conditionAlertGroupSynchronized) r.Log.Error(err, "could not find matching instances") return ctrl.Result{RequeueAfter: RequeueDelay}, err } + if len(instances) == 0 { + meta.RemoveStatusCondition(&group.Status.Conditions, conditionAlertGroupSynchronized) setNoMatchingInstance(&group.Status.Conditions, group.Generation, "EmptyAPIReply", "Instances could not be fetched, reconciliation will be retried") return ctrl.Result{}, nil } @@ -137,7 +145,7 @@ func (r *GrafanaAlertRuleGroupReconciler) Reconcile(ctx context.Context, req ctr } } condition := metav1.Condition{ - Type: "AlertGroupSynchronized", + Type: conditionAlertGroupSynchronized, ObservedGeneration: group.Generation, LastTransitionTime: metav1.Time{ Time: time.Now(),