Skip to content

Commit 5fc9041

Browse files
mannothardeck
authored andcommitted
Explicitly delete bundle secrets on bundle deletion (#4146)
* Explicitly delete bundle secrets on bundle deletion * Update owner reference when updating values/options secret
1 parent f820a71 commit 5fc9041

1 file changed

Lines changed: 26 additions & 4 deletions

File tree

internal/cmd/controller/reconciler/bundle_controller.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)