@@ -29,6 +29,7 @@ import (
2929
3030 cmv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
3131 cmmetav1 "github.com/cert-manager/cert-manager/pkg/apis/meta/v1"
32+ "github.com/go-logr/logr"
3233 appsv1 "k8s.io/api/apps/v1"
3334 corev1 "k8s.io/api/core/v1"
3435 networkingv1 "k8s.io/api/networking/v1"
@@ -54,6 +55,9 @@ const (
5455 // secretCRLKey is the key in the Secret data where the CRL is stored.
5556 secretCRLKey = "ca.crl"
5657
58+ // finalizerName is the name of the finalizer used to clean up resources.
59+ finalizerName = "crl-operator.scality.com/finalizer"
60+
5761 // Common labels
5862 labelManagedByName = "app.kubernetes.io/managed-by"
5963 labelManagedByValue = "crl-operator"
@@ -120,6 +124,32 @@ func (r *ManagedCRLReconciler) Reconcile(ctx context.Context, req ctrl.Request)
120124 return ctrl.Result {}, client .IgnoreNotFound (err )
121125 }
122126
127+ if instance .ObjectMeta .DeletionTimestamp .IsZero () {
128+ // Add finalizer if not present
129+ if ! controllerutil .ContainsFinalizer (instance , finalizerName ) {
130+ logger .WithValues ("finalizer" , finalizerName ).Info ("adding finalizer" )
131+ controllerutil .AddFinalizer (instance , finalizerName )
132+ if err := r .Update (ctx , instance ); err != nil {
133+ return ctrl.Result {}, err
134+ }
135+ }
136+ } else {
137+ // The object is being deleted
138+ if controllerutil .ContainsFinalizer (instance , finalizerName ) {
139+ finLogger := logger .WithValues ("finalizer" , finalizerName )
140+ if err := r .handleFinalization (finLogger , ctx , instance ); err != nil {
141+ return ctrl.Result {}, err
142+ }
143+
144+ // Remove finalizer
145+ finLogger .Info ("removing finalizer" )
146+ controllerutil .RemoveFinalizer (instance , finalizerName )
147+ if err := r .Update (ctx , instance ); err != nil {
148+ return ctrl.Result {}, err
149+ }
150+ }
151+ return ctrl.Result {}, nil
152+ }
123153 // Apply defaults
124154 instance .WithDefaults ()
125155 if err := instance .Validate (); err != nil {
@@ -756,6 +786,53 @@ func (r *ManagedCRLReconciler) stdMutate(obj metav1.Object, instance *crloperato
756786 return nil
757787}
758788
789+ // handleFinalization handles the deletion of a ManagedCRL resource by cleaning up
790+ // the CRL distribution points from the issuer and removing the finalizer.
791+ func (r * ManagedCRLReconciler ) handleFinalization (logger logr.Logger , ctx context.Context , instance * crloperatorv1alpha1.ManagedCRL ) error {
792+ logger .Info ("handling ManagedCRL deletion" )
793+
794+ issuer , err := r .getIssuer (ctx , instance .Namespace , instance .Spec .IssuerRef )
795+ if err != nil {
796+ if apierrors .IsNotFound (err ) {
797+ // Issuer no longer exists, nothing to clean up
798+ logger .Info ("issuer not found, skipping cleanup" )
799+ } else {
800+ return fmt .Errorf ("failed to get issuer: %w" , err )
801+ }
802+ }
803+
804+ var originalIssuer client.Object
805+ switch issuer := issuer .(type ) {
806+ case * cmv1.Issuer :
807+ if issuer .Spec .CA == nil || len (issuer .Spec .CA .CRLDistributionPoints ) == 0 {
808+ // Nothing to do
809+ break
810+ }
811+ originalIssuer = issuer .DeepCopy ()
812+ issuer .Spec .CA .CRLDistributionPoints = nil
813+ case * cmv1.ClusterIssuer :
814+ if issuer .Spec .CA == nil || len (issuer .Spec .CA .CRLDistributionPoints ) == 0 {
815+ // Nothing to do
816+ break
817+ }
818+ originalIssuer = issuer .DeepCopy ()
819+ issuer .Spec .CA .CRLDistributionPoints = nil
820+ default :
821+ logger .Error (errors .New ("unsupported issuer kind for cleaning up CRL distribution points" ), "unsupported issuer kind" )
822+ // Nothing to do
823+ }
824+
825+ if originalIssuer != nil {
826+ if err := r .Patch (ctx , issuer , client .MergeFrom (originalIssuer )); err != nil {
827+ return fmt .Errorf ("failed to patch issuer: %w" , err )
828+ }
829+ logger .Info ("removed CRL distribution points from issuer during deletion" )
830+ }
831+
832+ logger .Info ("ManagedCRL deletion handled successfully" )
833+ return nil
834+ }
835+
759836// SetupWithManager sets up the controller with the Manager.
760837func (r * ManagedCRLReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
761838 mapIssuerToCRL := func (ctx context.Context , obj client.Object ) []ctrl.Request {
0 commit comments