@@ -318,33 +318,54 @@ func ownerIndexValue(apiVersion string, kind string, name string) string {
318318
319319// handleTagBindingsDeletion handles the deletion of tag bindings when a resource is being deleted.
320320func (r * TaggableResourceReconciler [T , P , PT ]) handleTagBindingsDeletion (ctx context.Context , resource PT ) error {
321- log := log .FromContext (ctx )
321+ log := log .FromContext (ctx ).WithValues (
322+ "resource" , resource .GetName (),
323+ "namespace" , resource .GetNamespace (),
324+ )
322325
323326 gvk := resource .GetObjectKind ().GroupVersionKind ()
324327 ownerIndex := ownerIndexValue (gvk .GroupVersion ().String (), gvk .Kind , resource .GetName ())
325328
326329 var boundTags tagsv1alpha1.TagsLocationTagBindingList
327330 if err := r .List (ctx , & boundTags , client .InNamespace (resource .GetNamespace ()), client.MatchingFields {tagBindingOwnerKey : ownerIndex }); err != nil {
328- log .Error (err , "unable to list bound tags" )
329- return err
331+ log .Error (err , "failed to list bound tags" )
332+ return fmt . Errorf ( "failed to list bound tags: %w" , err )
330333 }
331334
335+ var err error
332336 for _ , tagBinding := range boundTags .Items {
333- // Delete the tag binding directly
334- log .Info ("deleting tag binding" , "name" , tagBinding .Name )
335- if err := r .Delete (ctx , & tagBinding ); err != nil {
336- if ! errors .IsNotFound (err ) {
337- return fmt .Errorf ("error deleting tag binding %s: %w" , tagBinding .Name , err )
337+ // Skip if tag binding is already being deleted
338+ if ! tagBinding .ObjectMeta .DeletionTimestamp .IsZero () {
339+ continue
340+ }
341+
342+ // Remove all finalizers in a single operation
343+ finalizers := []string {"cnrm.cloud.google.com/finalizer" , "cnrm.cloud.google.com/deletion-defender" }
344+ modified := false
345+ for _ , f := range finalizers {
346+ if controllerutil .ContainsFinalizer (& tagBinding , f ) {
347+ controllerutil .RemoveFinalizer (& tagBinding , f )
348+ modified = true
338349 }
339350 }
340- // Cleanup finalizer
341- controllerutil .RemoveFinalizer (& tagBinding , "cnrm.cloud.google.com/finalizer" )
342- if err := r .Update (ctx , & tagBinding ); err != nil {
343- return fmt .Errorf ("error removing finalizer from resource %s: %w" , tagBinding .Name , err )
351+
352+ if modified {
353+ if updateErr := r .Update (ctx , & tagBinding ); updateErr != nil && ! errors .IsNotFound (updateErr ) {
354+ log .Error (updateErr , "failed to remove finalizers" , "tagBinding" , tagBinding .Name )
355+ err = fmt .Errorf ("failed to remove finalizers from %s: %w" , tagBinding .Name , updateErr )
356+ continue
357+ }
358+ }
359+
360+ // Delete the tag binding
361+ log .Info ("deleting tag binding" , "name" , tagBinding .Name )
362+ if deleteErr := r .Delete (ctx , & tagBinding ); deleteErr != nil && ! errors .IsNotFound (deleteErr ) {
363+ log .Error (deleteErr , "failed to delete tag binding" , "tagBinding" , tagBinding .Name )
364+ err = fmt .Errorf ("failed to delete tag binding %s: %w" , tagBinding .Name , deleteErr )
344365 }
345366 }
346367
347- return nil
368+ return err
348369}
349370
350371func (r * TaggableResourceReconciler [T , P , PT ]) getValueAndKeyID (ctx context.Context , projectID , key , value string ) (string , string , error ) {
0 commit comments