Skip to content

Commit

Permalink
feat: remove finalizer when no instances match
Browse files Browse the repository at this point in the history
this reduces load on the operator and eases deletion when no instance can be found
  • Loading branch information
theSuess committed Mar 11, 2024
1 parent 221b2c9 commit 8226d13
Showing 1 changed file with 16 additions and 8 deletions.
24 changes: 16 additions & 8 deletions controllers/grafanaalertrulegroup_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}
Expand All @@ -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(),
Expand Down

0 comments on commit 8226d13

Please sign in to comment.