@@ -114,3 +114,70 @@ func EnsureOwnerRef(
114114
115115 return nil
116116}
117+
118+ // AddConsumerFinalizer adds consumerFinalizer to the given object.
119+ func AddConsumerFinalizer (
120+ ctx context.Context ,
121+ h * helper.Helper ,
122+ obj client.Object ,
123+ consumerFinalizer string ,
124+ ) error {
125+ before := obj .DeepCopyObject ().(client.Object )
126+ if controllerutil .AddFinalizer (obj , consumerFinalizer ) {
127+ patch := client .MergeFromWithOptions (before , client.MergeFromWithOptimisticLock {})
128+ if err := h .GetClient ().Patch (ctx , obj , patch ); err != nil {
129+ return fmt .Errorf ("failed to add consumer finalizer to %s: %w" , obj .GetName (), err )
130+ }
131+ h .GetLogger ().Info ("Added consumer finalizer" , "object" , obj .GetName (), "finalizer" , consumerFinalizer )
132+ }
133+ return nil
134+ }
135+
136+ // RemoveConsumerFinalizer removes consumerFinalizer from the given object.
137+ func RemoveConsumerFinalizer (
138+ ctx context.Context ,
139+ h * helper.Helper ,
140+ obj client.Object ,
141+ consumerFinalizer string ,
142+ ) error {
143+ before := obj .DeepCopyObject ().(client.Object )
144+ if controllerutil .RemoveFinalizer (obj , consumerFinalizer ) {
145+ patch := client .MergeFromWithOptions (before , client.MergeFromWithOptimisticLock {})
146+ if err := h .GetClient ().Patch (ctx , obj , patch ); err != nil {
147+ return fmt .Errorf ("failed to remove consumer finalizer from %s: %w" , obj .GetName (), err )
148+ }
149+ h .GetLogger ().Info ("Removed consumer finalizer" , "object" , obj .GetName (), "finalizer" , consumerFinalizer )
150+ }
151+ return nil
152+ }
153+
154+ // ManageConsumerFinalizer adds consumerFinalizer to newObj and removes it from oldObj.
155+ //
156+ // If both refer to the same object, returns early without mutating.
157+ func ManageConsumerFinalizer (
158+ ctx context.Context ,
159+ h * helper.Helper ,
160+ newObj client.Object ,
161+ oldObj client.Object ,
162+ consumerFinalizer string ,
163+ ) error {
164+ if newObj != nil && oldObj != nil &&
165+ newObj .GetNamespace () == oldObj .GetNamespace () &&
166+ newObj .GetName () == oldObj .GetName () {
167+ return nil
168+ }
169+
170+ if newObj != nil {
171+ if err := AddConsumerFinalizer (ctx , h , newObj , consumerFinalizer ); err != nil {
172+ return err
173+ }
174+ }
175+
176+ if oldObj != nil {
177+ if err := RemoveConsumerFinalizer (ctx , h , oldObj , consumerFinalizer ); err != nil {
178+ return err
179+ }
180+ }
181+
182+ return nil
183+ }
0 commit comments