Skip to content

Commit 595b43c

Browse files
authored
fix: tag binding deletion (#30)
This pull request enhances the deletion process for tag bindings in the TaggableResourceReconciler: - Skipped already deleting tag bindings to avoid redundant operations. - Removed all finalizers in a single operation before deletion. - Handled errors during finalizer removal and tag binding deletion more gracefully.
1 parent 8c75a2e commit 595b43c

File tree

1 file changed

+34
-13
lines changed

1 file changed

+34
-13
lines changed

internal/controller/taggable_controller.go

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
320320
func (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

350371
func (r *TaggableResourceReconciler[T, P, PT]) getValueAndKeyID(ctx context.Context, projectID, key, value string) (string, string, error) {

0 commit comments

Comments
 (0)