@@ -30,6 +30,7 @@ import (
3030 "k8s.io/apimachinery/pkg/runtime"
3131 "k8s.io/apimachinery/pkg/types"
3232 "k8s.io/apimachinery/pkg/util/sets"
33+ "k8s.io/utils/ptr"
3334 ctrl "sigs.k8s.io/controller-runtime"
3435 "sigs.k8s.io/controller-runtime/pkg/builder"
3536 "sigs.k8s.io/controller-runtime/pkg/client"
@@ -401,7 +402,17 @@ func (r *BundleReconciler) handleDelete(ctx context.Context, logger logr.Logger,
401402
402403 metrics .BundleCollector .Delete (req .Name , req .Namespace )
403404 controllerutil .RemoveFinalizer (bundle , finalize .BundleFinalizer )
404- return ctrl.Result {}, r .Update (ctx , bundle )
405+
406+ if err := r .Update (ctx , bundle ); err != nil {
407+ return ctrl.Result {}, err
408+ }
409+
410+ // pro-actively delete the bundle's secret. k8s owner garbage collection will handle remaining orphans.
411+ if err := r .Delete (ctx , & corev1.Secret {ObjectMeta : metav1.ObjectMeta {Name : bundle .Name , Namespace : bundle .Namespace }}); err != nil && ! apierrors .IsNotFound (err ) {
412+ logger .V (1 ).Info ("Cannot delete bundle's values secret, owner garbage collection will remove it" )
413+ }
414+
415+ return ctrl.Result {}, nil
405416}
406417
407418// ensureFinalizer adds a finalizer to a recently created bundle.
@@ -519,12 +530,19 @@ func (r *BundleReconciler) createOptionsSecret(ctx context.Context, bd *fleet.Bu
519530 Namespace : bd .Namespace ,
520531 },
521532 }
522-
523- if err := controllerutil .SetControllerReference (bd , secret , r .Scheme ); err != nil {
524- return err
533+ owners := []metav1.OwnerReference {
534+ {
535+ APIVersion : fleet .SchemeGroupVersion .String (),
536+ Kind : "BundleDeployment" ,
537+ Name : bd .GetName (),
538+ UID : bd .GetUID (),
539+ BlockOwnerDeletion : ptr .To (true ),
540+ Controller : ptr .To (true ),
541+ },
525542 }
526543
527544 if _ , err := controllerutil .CreateOrUpdate (ctx , r .Client , secret , func () error {
545+ secret .OwnerReferences = owners
528546 secret .Data = map [string ][]byte {
529547 helmvalues .ValuesKey : options ,
530548 helmvalues .StagedValuesKey : stagedOptions ,
@@ -665,6 +683,10 @@ func batchDeleteBundleDeployments(ctx context.Context, c client.Client, list []f
665683 if err := c .Delete (ctx , & bd ); client .IgnoreNotFound (err ) != nil {
666684 errs = append (errs , err )
667685 }
686+
687+ // k8s ownership garbage collection can take a long time, so we explicitly delete the secrets here.
688+ // GC will delete any remaining orphaned secrets, no need to add an error.
689+ _ = c .Delete (ctx , & corev1.Secret {ObjectMeta : metav1.ObjectMeta {Name : bd .Name , Namespace : bd .Namespace }})
668690 }
669691
670692 return errors .Join (errs ... )
0 commit comments