@@ -38,11 +38,13 @@ import (
3838 "sigs.k8s.io/controller-runtime/pkg/log/zap"
3939 "sigs.k8s.io/controller-runtime/pkg/metrics/filters"
4040 metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
41+ "sigs.k8s.io/controller-runtime/pkg/webhook"
4142
4243 csiv1alpha1 "github.com/ceph/ceph-csi-operator/api/csi/v1alpha1"
4344 csiv1beta1 "github.com/ceph/ceph-csi-operator/api/csi/v1beta1"
4445 controller "github.com/ceph/ceph-csi-operator/internal/controller/csi"
4546 "github.com/ceph/ceph-csi-operator/internal/utils"
47+ webhookcsiv1beta1 "github.com/ceph/ceph-csi-operator/internal/webhook/csi/v1beta1"
4648 //+kubebuilder:scaffold:imports
4749)
4850
@@ -62,6 +64,7 @@ func init() {
6264func main () {
6365 var metricsAddr string
6466 var metricsCertPath , metricsCertName , metricsCertKey string
67+ var webhookCertPath , webhookCertName , webhookCertKey string
6568 var enableLeaderElection bool
6669 var enableHTTP2 bool
6770 var probeAddr string
@@ -79,6 +82,9 @@ func main() {
7982 "The directory that contains the metrics server certificate." )
8083 flag .StringVar (& metricsCertName , "metrics-cert-name" , "tls.crt" , "The name of the metrics server certificate file." )
8184 flag .StringVar (& metricsCertKey , "metrics-cert-key" , "tls.key" , "The name of the metrics server key file." )
85+ flag .StringVar (& webhookCertPath , "webhook-cert-path" , "" , "The directory that contains the webhook certificate." )
86+ flag .StringVar (& webhookCertName , "webhook-cert-name" , "tls.crt" , "The name of the webhook certificate file." )
87+ flag .StringVar (& webhookCertKey , "webhook-cert-key" , "tls.key" , "The name of the webhook key file." )
8288 flag .BoolVar (& enableHTTP2 , "enable-http2" , false ,
8389 "If set, HTTP/2 will be enabled for the metrics" )
8490
@@ -104,7 +110,34 @@ func main() {
104110 tlsOpts = append (tlsOpts , disableHTTP2 )
105111 }
106112 // Create watchers for metrics certificates
107- var metricsCertWatcher * certwatcher.CertWatcher
113+ var metricsCertWatcher , webhookCertWatcher * certwatcher.CertWatcher
114+
115+ // Initial webhook TLS options
116+ webhookTLSOpts := tlsOpts
117+
118+ if len (webhookCertPath ) > 0 {
119+ setupLog .Info ("Initializing webhook certificate watcher using provided certificates" ,
120+ "webhook-cert-path" , webhookCertPath , "webhook-cert-name" , webhookCertName , "webhook-cert-key" , webhookCertKey )
121+
122+ var err error
123+ webhookCertWatcher , err = certwatcher .New (
124+ filepath .Join (webhookCertPath , webhookCertName ),
125+ filepath .Join (webhookCertPath , webhookCertKey ),
126+ )
127+ if err != nil {
128+ setupLog .Error (err , "Failed to initialize webhook certificate watcher" )
129+ os .Exit (1 )
130+ }
131+
132+ webhookTLSOpts = append (webhookTLSOpts , func (config * tls.Config ) {
133+ config .GetCertificate = webhookCertWatcher .GetCertificate
134+ })
135+ }
136+
137+ webhookServer := webhook .NewServer (webhook.Options {
138+ TLSOpts : webhookTLSOpts ,
139+ })
140+
108141 // Metrics endpoint is enabled in 'config/default/kustomization.yaml'. The Metrics options configure the server.
109142 // More info:
110143 // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.20.0/pkg/metrics/server
@@ -169,6 +202,7 @@ func main() {
169202 }
170203 mgr , err := ctrl .NewManager (ctrl .GetConfigOrDie (), ctrl.Options {
171204 Scheme : scheme ,
205+ WebhookServer : webhookServer ,
172206 Metrics : metricsServerOptions ,
173207 HealthProbeBindAddress : probeAddr ,
174208 LeaderElection : enableLeaderElection ,
@@ -212,6 +246,13 @@ func main() {
212246 setupLog .Error (err , "unable to create controller" , "controller" , "ClientProfileMapping" )
213247 os .Exit (1 )
214248 }
249+ // nolint:goconst
250+ if os .Getenv ("ENABLE_WEBHOOKS" ) != "false" {
251+ if err = webhookcsiv1beta1 .SetupCephConnectionWebhookWithManager (mgr ); err != nil {
252+ setupLog .Error (err , "unable to create webhook" , "webhook" , "CephConnection" )
253+ os .Exit (1 )
254+ }
255+ }
215256 //+kubebuilder:scaffold:builder
216257
217258 if metricsCertWatcher != nil {
@@ -222,6 +263,14 @@ func main() {
222263 }
223264 }
224265
266+ if webhookCertWatcher != nil {
267+ setupLog .Info ("Adding webhook certificate watcher to manager" )
268+ if err := mgr .Add (webhookCertWatcher ); err != nil {
269+ setupLog .Error (err , "unable to add webhook certificate watcher to manager" )
270+ os .Exit (1 )
271+ }
272+ }
273+
225274 if err := mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
226275 setupLog .Error (err , "unable to set up health check" )
227276 os .Exit (1 )
0 commit comments