From a7b206b67da25a0685790734e8a1d23f451990a5 Mon Sep 17 00:00:00 2001 From: Jose Szychowski Date: Thu, 26 Mar 2026 14:22:47 -0300 Subject: [PATCH] fix: clear metadata finalizers instead of spec finalizers in namespace purge Project deletion was stuck because Phase D of the purger was trying to clear nso.Spec.Finalizers instead of nso.ObjectMeta.Finalizers. In Kubernetes, the finalizers that prevent resource deletion are stored in metadata.finalizers, not spec. This fix allows namespaces to be properly force-finalized during project deletion, preventing Phase E from timing out. Co-Authored-By: Claude Haiku 4.5 --- internal/controllers/projectpurge/purge.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/controllers/projectpurge/purge.go b/internal/controllers/projectpurge/purge.go index 9ceee383..c5664e65 100644 --- a/internal/controllers/projectpurge/purge.go +++ b/internal/controllers/projectpurge/purge.go @@ -194,8 +194,8 @@ func (p *Purger) Purge(ctx context.Context, cfg *rest.Config, project string, o _ = core.CoreV1().Namespaces().Delete(ctx, ns, delOpts) } - // Clear finalizers to allow immediate removal without a namespace controller - nso.Spec.Finalizers = nil + // Clear metadata finalizers to allow immediate removal without a namespace controller + nso.ObjectMeta.Finalizers = nil if _, err := core.CoreV1().Namespaces().Finalize(ctx, nso, metav1.UpdateOptions{}); !ignorable(err) { if apierrors.IsForbidden(err) || apierrors.IsUnauthorized(err) { return fmt.Errorf("rbac forbids namespaces/finalize on %q: %w", ns, err)