Skip to content

Commit 6b36429

Browse files
committed
chore: Add finalizer to handle CRL Distribution Point cleanup
Signed-off-by: Teddy Andrieux <teddy.andrieux@scality.com>
1 parent fa4fc90 commit 6b36429

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

internal/controller/managedcrl_controller.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
760837
func (r *ManagedCRLReconciler) SetupWithManager(mgr ctrl.Manager) error {
761838
mapIssuerToCRL := func(ctx context.Context, obj client.Object) []ctrl.Request {

test/integration/managedcrl_controller_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,33 @@ var _ = Describe("ManagedCRL Controller", func() {
336336
k8sClient.Get(ctx, typeNamespacedName, &crloperatorv1alpha1.ManagedCRL{}),
337337
)
338338
}, 10*time.Second, time.Second).Should(BeTrue())
339+
340+
By("checking the CRL Distribution Points have been removed from the Issuer/ClusterIssuer")
341+
switch tc.spec.IssuerRef.Kind {
342+
case "Issuer":
343+
issuer := &cmv1.Issuer{}
344+
Expect(k8sClient.Get(
345+
ctx,
346+
types.NamespacedName{
347+
Name: tc.spec.IssuerRef.Name,
348+
Namespace: typeNamespacedName.Namespace,
349+
},
350+
issuer,
351+
)).To(Succeed())
352+
Expect(issuer.Spec.CA.CRLDistributionPoints).To(BeEmpty())
353+
case "ClusterIssuer":
354+
clusterIssuer := &cmv1.ClusterIssuer{}
355+
Expect(k8sClient.Get(
356+
ctx,
357+
types.NamespacedName{
358+
Name: tc.spec.IssuerRef.Name,
359+
},
360+
clusterIssuer,
361+
)).To(Succeed())
362+
Expect(clusterIssuer.Spec.CA.CRLDistributionPoints).To(BeEmpty())
363+
default:
364+
Fail("unexpected IssuerRef.Kind")
365+
}
339366
})
340367
}, toTableEntry(testCases))
341368
})
@@ -390,6 +417,8 @@ func checkSecret(mcrlRef types.NamespacedName) {
390417
}, 10*time.Second, time.Second).Should(BeTrue())
391418
retrieved.WithDefaults()
392419

420+
Expect(retrieved.ObjectMeta.Finalizers).To(ContainElement("crl-operator.scality.com/finalizer"))
421+
393422
expectedSecretNs := mcrlRef.Namespace
394423
if retrieved.Spec.IssuerRef.Kind == "ClusterIssuer" {
395424
expectedSecretNs = certManagerNamespace

0 commit comments

Comments
 (0)