Skip to content

Commit cb8ba52

Browse files
jan--fJan FajerskiPeterYurkovich
authored
COO-1690: fix: add finalizers with Patch (#1029)
* fix: add finalizers with Patch This avoid the chances of trying to updates a resource that had been removed concurrently. E2E test runs have had log messages suggesting this was happening. Moving to Patch should avoid this as we no longer call Update with a UUID that is no longer present in etcd. Signed-off-by: Jan Fajerski <jan@fajerski.name> * fix: add patch permissions for monitoringstacks --------- Signed-off-by: Jan Fajerski <jan@fajerski.name> Co-authored-by: Jan Fajerski <jan@fajerski.name> Co-authored-by: PeterYurkovich <pyurkovi@redhat.com>
1 parent ce88b7d commit cb8ba52

5 files changed

Lines changed: 45 additions & 26 deletions

File tree

bundle/manifests/observability-operator.clusterserviceversion.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,7 @@ spec:
528528
- create
529529
- get
530530
- list
531+
- patch
531532
- update
532533
- watch
533534
- apiGroups:

deploy/operator/observability-operator-cluster-role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ rules:
211211
- create
212212
- get
213213
- list
214+
- patch
214215
- update
215216
- watch
216217
- apiGroups:

pkg/controllers/monitoring/monitoring-stack/controller.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package monitoringstack
1818

1919
import (
2020
"context"
21-
"slices"
2221
"time"
2322

2423
"github.com/go-logr/logr"
@@ -32,6 +31,7 @@ import (
3231
"sigs.k8s.io/controller-runtime/pkg/builder"
3332
"sigs.k8s.io/controller-runtime/pkg/client"
3433
"sigs.k8s.io/controller-runtime/pkg/controller"
34+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3535
"sigs.k8s.io/controller-runtime/pkg/predicate"
3636

3737
stack "github.com/rhobs/observability-operator/pkg/apis/monitoring/v1alpha1"
@@ -69,7 +69,7 @@ type Options struct {
6969
const finalizerName = "monitoring.observability.openshift.io/finalizer"
7070

7171
// RBAC for managing monitoring stacks
72-
//+kubebuilder:rbac:groups=monitoring.rhobs,resources=monitoringstacks,verbs=list;watch;create;update
72+
//+kubebuilder:rbac:groups=monitoring.rhobs,resources=monitoringstacks,verbs=list;watch;create;update;patch
7373
//+kubebuilder:rbac:groups=monitoring.rhobs,resources=monitoringstacks/status,verbs=get;update
7474

7575
// RBAC for managing Prometheus Operator CRs
@@ -149,11 +149,13 @@ func (rm resourceManager) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
149149
}
150150

151151
// Remove finalizer if present
152-
if slices.Contains(ms.ObjectMeta.Finalizers, finalizerName) {
153-
ms.ObjectMeta.Finalizers = slices.DeleteFunc(ms.ObjectMeta.Finalizers, func(currentFinalizerName string) bool {
154-
return currentFinalizerName == finalizerName
155-
})
156-
if err := rm.k8sClient.Update(ctx, ms); err != nil {
152+
if controllerutil.ContainsFinalizer(ms, finalizerName) {
153+
patch := client.MergeFrom(ms.DeepCopy())
154+
controllerutil.RemoveFinalizer(ms, finalizerName)
155+
if err := rm.k8sClient.Patch(ctx, ms, patch); err != nil {
156+
if errors.IsNotFound(err) {
157+
return ctrl.Result{}, nil
158+
}
157159
return ctrl.Result{}, err
158160
}
159161
}
@@ -163,9 +165,13 @@ func (rm resourceManager) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
163165
}
164166

165167
// Add finalizer if not present
166-
if !slices.Contains(ms.ObjectMeta.Finalizers, finalizerName) {
167-
ms.ObjectMeta.Finalizers = append(ms.ObjectMeta.Finalizers, finalizerName)
168-
if err := rm.k8sClient.Update(ctx, ms); err != nil {
168+
if !controllerutil.ContainsFinalizer(ms, finalizerName) {
169+
patch := client.MergeFrom(ms.DeepCopy())
170+
controllerutil.AddFinalizer(ms, finalizerName)
171+
if err := rm.k8sClient.Patch(ctx, ms, patch); err != nil {
172+
if errors.IsNotFound(err) {
173+
return ctrl.Result{}, nil
174+
}
169175
return ctrl.Result{}, err
170176
}
171177
}

pkg/controllers/observability/observability_controller.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,13 @@ func (o observabilityInstallerController) Reconcile(ctx context.Context, request
8888

8989
// Add finalizer for this CR
9090
if !controllerutil.ContainsFinalizer(instance, finalizerName) {
91-
if controllerutil.AddFinalizer(instance, finalizerName) {
92-
err := o.client.Update(ctx, instance)
93-
if err != nil {
94-
return ctrl.Result{}, err
91+
patch := client.MergeFrom(instance.DeepCopy())
92+
controllerutil.AddFinalizer(instance, finalizerName)
93+
if err := o.client.Patch(ctx, instance, patch); err != nil {
94+
if apierrors.IsNotFound(err) {
95+
return ctrl.Result{}, nil
9596
}
97+
return ctrl.Result{}, err
9698
}
9799
}
98100

@@ -153,11 +155,13 @@ func (o observabilityInstallerController) Reconcile(ctx context.Context, request
153155
if controllerutil.ContainsFinalizer(instance, finalizerName) {
154156
// Once all finalizers have been
155157
// removed, the object will be deleted.
156-
if controllerutil.RemoveFinalizer(instance, finalizerName) {
157-
err := o.client.Update(ctx, instance)
158-
if err != nil {
159-
return ctrl.Result{}, err
158+
patch := client.MergeFrom(instance.DeepCopy())
159+
controllerutil.RemoveFinalizer(instance, finalizerName)
160+
if err := o.client.Patch(ctx, instance, patch); err != nil {
161+
if apierrors.IsNotFound(err) {
162+
return ctrl.Result{}, nil
160163
}
164+
return ctrl.Result{}, err
161165
}
162166
}
163167
}

pkg/controllers/uiplugin/controller.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"sigs.k8s.io/controller-runtime/pkg/builder"
2626
"sigs.k8s.io/controller-runtime/pkg/client"
2727
"sigs.k8s.io/controller-runtime/pkg/controller"
28+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2829
"sigs.k8s.io/controller-runtime/pkg/predicate"
2930

3031
uiv1alpha1 "github.com/rhobs/observability-operator/pkg/apis/uiplugin/v1alpha1"
@@ -222,11 +223,13 @@ func (rm resourceManager) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
222223
}
223224

224225
// Remove finalizer if present
225-
if slices.Contains(plugin.ObjectMeta.Finalizers, finalizerName) {
226-
plugin.ObjectMeta.Finalizers = slices.DeleteFunc(plugin.ObjectMeta.Finalizers, func(currentFinalizerName string) bool {
227-
return currentFinalizerName == finalizerName
228-
})
229-
if err := rm.k8sClient.Update(ctx, plugin); err != nil {
226+
if controllerutil.ContainsFinalizer(plugin, finalizerName) {
227+
patch := client.MergeFrom(plugin.DeepCopy())
228+
controllerutil.RemoveFinalizer(plugin, finalizerName)
229+
if err := rm.k8sClient.Patch(ctx, plugin, patch); err != nil {
230+
if apierrors.IsNotFound(err) {
231+
return ctrl.Result{}, nil
232+
}
230233
return ctrl.Result{}, err
231234
}
232235
}
@@ -236,9 +239,13 @@ func (rm resourceManager) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
236239
}
237240

238241
// Add finalizer if not present
239-
if !slices.Contains(plugin.ObjectMeta.Finalizers, finalizerName) {
240-
plugin.ObjectMeta.Finalizers = append(plugin.ObjectMeta.Finalizers, finalizerName)
241-
if err := rm.k8sClient.Update(ctx, plugin); err != nil {
242+
if !controllerutil.ContainsFinalizer(plugin, finalizerName) {
243+
patch := client.MergeFrom(plugin.DeepCopy())
244+
controllerutil.AddFinalizer(plugin, finalizerName)
245+
if err := rm.k8sClient.Patch(ctx, plugin, patch); err != nil {
246+
if apierrors.IsNotFound(err) {
247+
return ctrl.Result{}, nil
248+
}
242249
return ctrl.Result{}, err
243250
}
244251
}

0 commit comments

Comments
 (0)