From 3ee314e4b18dab2c06ed37c3225ba2c2bb6a306f Mon Sep 17 00:00:00 2001 From: Todd Short Date: Tue, 4 Nov 2025 17:24:42 -0500 Subject: [PATCH] fix: Register cleanup-contentmanager-cache finalizer for BoxcutterRuntime When BoxcutterRuntime is enabled, ClusterExtensions created with the Helm runtime still have the cleanup-contentmanager-cache finalizer, but the finalizer handler is not registered in setupBoxcutter(). This causes ClusterExtension deletions to hang indefinitely. This commit registers a no-op finalizer handler in setupBoxcutter() to allow deletion of ClusterExtensions that were created before BoxcutterRuntime was enabled. Since Boxcutter doesn't use contentmanager (it has its own tracking mechanism), no actual cleanup is needed. Signed-off-by: Todd Short Assisted-by: Claude code --- cmd/operator-controller/main.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/cmd/operator-controller/main.go b/cmd/operator-controller/main.go index fba7c39af..b3eb066f5 100644 --- a/cmd/operator-controller/main.go +++ b/cmd/operator-controller/main.go @@ -460,7 +460,7 @@ func run() error { } if features.OperatorControllerFeatureGate.Enabled(features.BoxcutterRuntime) { - err = setupBoxcutter(mgr, ceReconciler, preflights, regv1ManifestProvider) + err = setupBoxcutter(mgr, ceReconciler, preflights, clusterExtensionFinalizers, regv1ManifestProvider) } else { err = setupHelm(mgr, ceReconciler, preflights, ceController, clusterExtensionFinalizers, regv1ManifestProvider) } @@ -527,6 +527,7 @@ func setupBoxcutter( mgr manager.Manager, ceReconciler *controllers.ClusterExtensionReconciler, preflights []applier.Preflight, + clusterExtensionFinalizers crfinalizer.Registerer, regv1ManifestProvider applier.ManifestProvider, ) error { coreClient, err := corev1client.NewForConfig(mgr.GetConfig()) @@ -551,6 +552,19 @@ func setupBoxcutter( return fmt.Errorf("unable to create helm action client getter: %w", err) } + // Register a no-op finalizer handler for cleanup-contentmanager-cache. + // This finalizer was added by the Helm applier for ClusterExtensions created + // before BoxcutterRuntime was enabled. Boxcutter doesn't use contentmanager, + // so we just need to acknowledge the finalizer to allow deletion to proceed. + err = clusterExtensionFinalizers.Register(controllers.ClusterExtensionCleanupContentManagerCacheFinalizer, finalizers.FinalizerFunc(func(ctx context.Context, obj client.Object) (crfinalizer.Result, error) { + // No-op: Boxcutter doesn't use contentmanager, so no cleanup is needed + return crfinalizer.Result{}, nil + })) + if err != nil { + setupLog.Error(err, "unable to register content manager cleanup finalizer for boxcutter") + return err + } + // TODO: add support for preflight checks // TODO: better scheme handling - which types do we want to support? _ = apiextensionsv1.AddToScheme(mgr.GetScheme())