1
16
17 package controllers
18
19 import (
20 "context"
21 "fmt"
22 "time"
23
24 "k8s.io/apimachinery/pkg/runtime/schema"
25 "k8s.io/client-go/tools/record"
26 "k8s.io/utils/clock"
27 ctrl "sigs.k8s.io/controller-runtime"
28 "sigs.k8s.io/controller-runtime/pkg/builder"
29 "sigs.k8s.io/controller-runtime/pkg/controller"
30
31 v1alpha1 "github.com/cert-manager/issuer-lib/api/v1alpha1"
32 "github.com/cert-manager/issuer-lib/controllers/signer"
33 "github.com/cert-manager/issuer-lib/internal/kubeutil"
34 )
35
36 type CombinedController struct {
37 IssuerTypes []v1alpha1.Issuer
38 ClusterIssuerTypes []v1alpha1.Issuer
39
40 FieldOwner string
41
42 MaxRetryDuration time.Duration
43
44
45 signer.Check
46
47 signer.Sign
48
49
50
51 signer.IgnoreCertificateRequest
52
53
54 signer.IgnoreIssuer
55
56
57 EventRecorder record.EventRecorder
58
59
60 Clock clock.PassiveClock
61
62
63
64
65
66
67 SetCAOnCertificateRequest bool
68
69
70
71
72
73
74
75 DisableCertificateRequestController bool
76
77
78
79
80
81
82
83 DisableKubernetesCSRController bool
84
85
86
87
88 PreSetupWithManager func(context.Context, schema.GroupVersionKind, ctrl.Manager, *builder.Builder) error
89
90
91
92
93 PostSetupWithManager func(context.Context, schema.GroupVersionKind, ctrl.Manager, controller.Controller) error
94 }
95
96 func (r *CombinedController) SetupWithManager(ctx context.Context, mgr ctrl.Manager) error {
97 var err error
98 cl := mgr.GetClient()
99 eventSource := kubeutil.NewEventStore()
100
101 if r.Clock == nil {
102 r.Clock = clock.RealClock{}
103 }
104
105 for _, issuerType := range append(r.IssuerTypes, r.ClusterIssuerTypes...) {
106 if err = (&IssuerReconciler{
107 ForObject: issuerType,
108
109 FieldOwner: r.FieldOwner,
110 EventSource: eventSource,
111
112 Client: cl,
113 Check: r.Check,
114 IgnoreIssuer: r.IgnoreIssuer,
115 EventRecorder: r.EventRecorder,
116 Clock: r.Clock,
117
118 PreSetupWithManager: r.PreSetupWithManager,
119 PostSetupWithManager: r.PostSetupWithManager,
120 }).SetupWithManager(ctx, mgr); err != nil {
121 return fmt.Errorf("%T: %w", issuerType, err)
122 }
123 }
124
125 if r.DisableCertificateRequestController && r.DisableKubernetesCSRController {
126 return fmt.Errorf("both CertificateRequest and Kubernetes CSR controllers are disabled, must enable at least one")
127 }
128
129 if !r.DisableCertificateRequestController {
130 if err = (&CertificateRequestReconciler{
131 RequestController: RequestController{
132 IssuerTypes: r.IssuerTypes,
133 ClusterIssuerTypes: r.ClusterIssuerTypes,
134
135 FieldOwner: r.FieldOwner,
136 MaxRetryDuration: r.MaxRetryDuration,
137 EventSource: eventSource,
138
139 Client: cl,
140 Sign: r.Sign,
141 IgnoreCertificateRequest: r.IgnoreCertificateRequest,
142 EventRecorder: r.EventRecorder,
143 Clock: r.Clock,
144
145 PreSetupWithManager: r.PreSetupWithManager,
146 PostSetupWithManager: r.PostSetupWithManager,
147 },
148
149 SetCAOnCertificateRequest: r.SetCAOnCertificateRequest,
150 }).SetupWithManager(ctx, mgr); err != nil {
151 return fmt.Errorf("CertificateRequestReconciler: %w", err)
152 }
153 }
154
155 if !r.DisableKubernetesCSRController {
156 if err = (&CertificateSigningRequestReconciler{
157 RequestController: RequestController{
158 IssuerTypes: r.IssuerTypes,
159 ClusterIssuerTypes: r.ClusterIssuerTypes,
160
161 FieldOwner: r.FieldOwner,
162 MaxRetryDuration: r.MaxRetryDuration,
163 EventSource: eventSource,
164
165 Client: cl,
166 Sign: r.Sign,
167 IgnoreCertificateRequest: r.IgnoreCertificateRequest,
168 EventRecorder: r.EventRecorder,
169 Clock: r.Clock,
170
171 PreSetupWithManager: r.PreSetupWithManager,
172 PostSetupWithManager: r.PostSetupWithManager,
173 },
174 }).SetupWithManager(ctx, mgr); err != nil {
175 return fmt.Errorf("CertificateRequestReconciler: %w", err)
176 }
177 }
178
179 return nil
180 }
181
View as plain text