Skip to content

Commit 112a457

Browse files
committed
Improve CM Cert reconcile and deletion if feature is turned off (knative#8519)
refactor CM Cert reconciler and take care of delete if feature is disabled Signed-off-by: Matthias Wessendorf <mwessend@redhat.com>
1 parent 70434b7 commit 112a457

File tree

2 files changed

+68
-20
lines changed

2 files changed

+68
-20
lines changed

pkg/reconciler/integration/sink/integrationsink.go

Lines changed: 54 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,31 +87,35 @@ func newReconciledNormal(namespace, name string) reconciler.Event {
8787

8888
func (r *Reconciler) ReconcileKind(ctx context.Context, sink *sinks.IntegrationSink) reconciler.Event {
8989
featureFlags := feature.FromContext(ctx)
90+
logger := logging.FromContext(ctx)
9091

91-
if featureFlags.IsPermissiveTransportEncryption() || featureFlags.IsStrictTransportEncryption() {
92-
_, err := r.reconcileCMCertificate(ctx, sink)
93-
if err != nil {
94-
logging.FromContext(ctx).Errorw("Error reconciling Certificate", zap.Error(err))
95-
return err
96-
}
92+
logger.Debugw("Reconciling IntegrationSink Certificate")
93+
_, err := r.reconcileIntegrationSinkCertificate(ctx, sink)
94+
if err != nil {
95+
logging.FromContext(ctx).Errorw("Error reconciling Certificate", zap.Error(err))
96+
return err
9797
}
9898

99-
_, err := r.reconcileDeployment(ctx, sink, featureFlags)
99+
logger.Debugw("Reconciling IntegrationSink Deployment")
100+
_, err = r.reconcileDeployment(ctx, sink, featureFlags)
100101
if err != nil {
101102
logging.FromContext(ctx).Errorw("Error reconciling Pod", zap.Error(err))
102103
return err
103104
}
104105

106+
logger.Debugw("Reconciling IntegrationSink Service")
105107
_, err = r.reconcileService(ctx, sink)
106108
if err != nil {
107109
logging.FromContext(ctx).Errorw("Error reconciling Service", zap.Error(err))
108110
return err
109111
}
110112

113+
logger.Debugw("Reconciling IntegrationSink address")
111114
if err := r.reconcileAddress(ctx, sink); err != nil {
112115
return fmt.Errorf("failed to reconcile address: %w", err)
113116
}
114117

118+
logger.Debugw("Updating IntegrationSink status with EventPolicies")
115119
err = auth.UpdateStatusWithEventPolicies(featureFlags, &sink.Status.AppliedEventPoliciesStatus, &sink.Status, r.eventPolicyLister, sinks.SchemeGroupVersion.WithKind("IntegrationSink"), sink.ObjectMeta)
116120
if err != nil {
117121
return fmt.Errorf("could not update IntegrationSink status with EventPolicies: %v", err)
@@ -171,19 +175,20 @@ func (r *Reconciler) reconcileService(ctx context.Context, sink *sinks.Integrati
171175
return svc, nil
172176
}
173177

174-
func (r *Reconciler) reconcileCMCertificate(ctx context.Context, sink *sinks.IntegrationSink) (*cmv1.Certificate, error) {
178+
func (r *Reconciler) reconcileIntegrationSinkCertificate(ctx context.Context, sink *sinks.IntegrationSink) (*cmv1.Certificate, error) {
175179

176-
expected := certificates.MakeCertificate(sink, certificates.WithDNSNames(
177-
network.GetServiceHostname(resources.DeploymentName(sink.GetName()), sink.GetNamespace()),
178-
fmt.Sprintf("%s.%s.svc", resources.DeploymentName(sink.GetName()), sink.GetNamespace()),
179-
))
180+
if f := feature.FromContext(ctx); !f.IsStrictTransportEncryption() && !f.IsPermissiveTransportEncryption() {
181+
return nil, r.deleteIntegrationSinkCertificate(ctx, sink)
182+
}
180183

181-
lister := r.cmCertificateLister.Load()
182-
if lister == nil || *lister == nil {
184+
expected := integrationSinkCertificate(sink)
185+
186+
cmCertificateLister := r.cmCertificateLister.Load()
187+
if cmCertificateLister == nil || *cmCertificateLister == nil {
183188
return nil, fmt.Errorf("no cert-manager certificate lister created yet, this should rarely happen and recover")
184189
}
185190

186-
cert, err := (*lister).Certificates(sink.Namespace).Get(expected.Name)
191+
cert, err := (*cmCertificateLister).Certificates(sink.Namespace).Get(expected.Name)
187192
if apierrors.IsNotFound(err) {
188193
cert, err := r.certManagerClient.CertmanagerV1().Certificates(sink.Namespace).Create(ctx, expected, metav1.CreateOptions{})
189194
if err != nil {
@@ -201,6 +206,31 @@ func (r *Reconciler) reconcileCMCertificate(ctx context.Context, sink *sinks.Int
201206
return cert, nil
202207
}
203208

209+
func (r *Reconciler) deleteIntegrationSinkCertificate(ctx context.Context, sink *sinks.IntegrationSink) error {
210+
certificate := integrationSinkCertificate(sink)
211+
212+
cmCertificateLister := r.cmCertificateLister.Load()
213+
if cmCertificateLister != nil && *cmCertificateLister != nil {
214+
_, err := (*cmCertificateLister).Certificates(certificate.GetNamespace()).Get(certificate.GetName())
215+
if apierrors.IsNotFound(err) {
216+
return nil
217+
}
218+
if err != nil {
219+
return fmt.Errorf("failed to get certificate %s/%s: %w", certificate.GetNamespace(), certificate.GetName(), err)
220+
}
221+
}
222+
223+
err := r.certManagerClient.CertmanagerV1().Certificates(certificate.GetNamespace()).Delete(ctx, certificate.GetName(), metav1.DeleteOptions{})
224+
if apierrors.IsNotFound(err) {
225+
return nil
226+
}
227+
if err != nil {
228+
return fmt.Errorf("failed to delete certificate %s/%s: %w", certificate.GetNamespace(), certificate.GetName(), err)
229+
}
230+
controller.GetEventRecorder(ctx).Event(sink, corev1.EventTypeNormal, "IntegrationSinkCertificateDeleted", certificate.GetName())
231+
return nil
232+
}
233+
204234
func (r *Reconciler) reconcileAddress(ctx context.Context, sink *sinks.IntegrationSink) error {
205235

206236
featureFlags := feature.FromContext(ctx)
@@ -303,3 +333,12 @@ func (r *Reconciler) podSpecChanged(oldPodSpec corev1.PodSpec, newPodSpec corev1
303333
}
304334
return false
305335
}
336+
337+
func integrationSinkCertificate(sink *sinks.IntegrationSink) *cmv1.Certificate {
338+
return certificates.MakeCertificate(sink,
339+
certificates.WithDNSNames(
340+
network.GetServiceHostname(resources.DeploymentName(sink.Name), sink.Namespace),
341+
fmt.Sprintf("%s.%s.svc", resources.DeploymentName(sink.Name), sink.Namespace),
342+
),
343+
)
344+
}

pkg/reconciler/integration/sink/integrationsink_test.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ package sink
1818

1919
import (
2020
"fmt"
21+
"sync/atomic"
22+
23+
cmlisters "knative.dev/eventing/pkg/client/certmanager/listers/certmanager/v1"
2124

2225
"knative.dev/eventing/pkg/certificates"
2326

@@ -151,12 +154,18 @@ func TestReconcile(t *testing.T) {
151154
logger := logtesting.TestLogger(t)
152155
table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
153156
ctx = addressable.WithDuck(ctx)
157+
158+
cmCertificatesListerAtomic := &atomic.Pointer[cmlisters.CertificateLister]{}
159+
cmCertificatesLister := listers.GetCertificateLister()
160+
cmCertificatesListerAtomic.Store(&cmCertificatesLister)
161+
154162
r := &Reconciler{
155-
kubeClientSet: fakekubeclient.Get(ctx),
156-
deploymentLister: listers.GetDeploymentLister(),
157-
serviceLister: listers.GetServiceLister(),
158-
secretLister: listers.GetSecretLister(),
159-
eventPolicyLister: listers.GetEventPolicyLister(),
163+
kubeClientSet: fakekubeclient.Get(ctx),
164+
deploymentLister: listers.GetDeploymentLister(),
165+
serviceLister: listers.GetServiceLister(),
166+
secretLister: listers.GetSecretLister(),
167+
cmCertificateLister: cmCertificatesListerAtomic,
168+
eventPolicyLister: listers.GetEventPolicyLister(),
160169
}
161170

162171
return integrationsink.NewReconciler(ctx, logging.FromContext(ctx), fakeeventingclient.Get(ctx), listers.GetIntegrationSinkLister(), controller.GetEventRecorder(ctx), r)

0 commit comments

Comments
 (0)