diff --git a/internal/controller/object/object.go b/internal/controller/object/object.go index 52c3f0b..f027e1e 100644 --- a/internal/controller/object/object.go +++ b/internal/controller/object/object.go @@ -799,18 +799,17 @@ func (f *objFinalizer) AddFinalizer(ctx context.Context, res resource.Object) er return errors.New(errNotKubernetesObject) } - if meta.FinalizerExists(obj, objFinalizerName) { - return nil - } - meta.AddFinalizer(obj, objFinalizerName) + if !meta.FinalizerExists(obj, objFinalizerName) { + meta.AddFinalizer(obj, objFinalizerName) - err := f.client.Update(ctx, obj) - if err != nil { - return errors.Wrap(err, errAddFinalizer) + err := f.client.Update(ctx, obj) + if err != nil { + return errors.Wrap(err, errAddFinalizer) + } } // Add finalizer to referenced resources if not exists - err = f.handleRefFinalizer(ctx, obj, func( + err := f.handleRefFinalizer(ctx, obj, func( ctx context.Context, res *unstructured.Unstructured, finalizer string, ) error { if !meta.FinalizerExists(res, finalizer) { diff --git a/internal/controller/object/object_test.go b/internal/controller/object/object_test.go index 35ca273..7c38e51 100644 --- a/internal/controller/object/object_test.go +++ b/internal/controller/object/object_test.go @@ -1066,6 +1066,32 @@ func TestAddFinalizer(t *testing.T) { err: nil, }, }, + "SuccessfullyAddReferenceFinalizerOnRetry": { + args: args{ + mg: kubernetesObject(func(obj *v1alpha2.Object) { + obj.ObjectMeta.Finalizers = append(obj.ObjectMeta.Finalizers, objFinalizerName) + obj.Spec.References = objectReferences() + }), + client: resource.ClientApplicator{ + Client: &test.MockClient{ + MockGet: test.NewMockGetFn(nil, func(obj client.Object) error { + *obj.(*unstructured.Unstructured) = *referenceObject() + return nil + }), + MockUpdate: test.NewMockUpdateFn(nil, func(obj client.Object) error { + name := obj.GetName() + if name == testReferenceObjectName { + return nil + } + return errBoom + }), + }, + }, + }, + want: want{ + err: nil, + }, + }, } for name, tc := range cases { t.Run(name, func(t *testing.T) {