@@ -43,6 +43,7 @@ import (
4343 operatoropenshiftiov1alpha1 "github.com/openshift/zero-trust-workload-identity-manager/api/v1alpha1"
4444 customClient "github.com/openshift/zero-trust-workload-identity-manager/pkg/client"
4545 spiffeCsiDriverController "github.com/openshift/zero-trust-workload-identity-manager/pkg/controller/spiffe-csi-driver"
46+ spiffeHelperController "github.com/openshift/zero-trust-workload-identity-manager/pkg/controller/spiffe-helper"
4647 spireAgentController "github.com/openshift/zero-trust-workload-identity-manager/pkg/controller/spire-agent"
4748 spireOIDCDiscoveryProviderController "github.com/openshift/zero-trust-workload-identity-manager/pkg/controller/spire-oidc-discovery-provider"
4849 spireServerController "github.com/openshift/zero-trust-workload-identity-manager/pkg/controller/spire-server"
@@ -88,6 +89,8 @@ func main() {
8889 enableHTTP2 bool
8990 logLevel int
9091 metricsCerts string
92+ serveWebhook bool
93+ webhookCertDir string
9194 metricsTLSOpts []func (* tls.Config )
9295 webhookTLSOpts []func (* tls.Config )
9396 )
@@ -105,6 +108,10 @@ func main() {
105108 flag .StringVar (& metricsCerts , "metrics-cert-dir" , "" ,
106109 "Secret name containing the certificates for the metrics server which should be present in operator namespace. " +
107110 "If not provided self-signed certificates will be used" )
111+ flag .BoolVar (& serveWebhook , "serve-webhook" , false ,
112+ "Run in webhook server mode: only serve admission webhooks, skip controllers" )
113+ flag .StringVar (& webhookCertDir , "webhook-cert-dir" , "/tmp/k8s-webhook-server/serving-certs" ,
114+ "Directory containing TLS certificates for the webhook server" )
108115 opts := zap.Options {
109116 Development : true ,
110117 }
@@ -122,6 +129,12 @@ func main() {
122129 }
123130 setupLog .Info ("Operator namespace configured" , "namespace" , operatorNamespace )
124131
132+ // Webhook-only mode: serve admission webhooks without controllers
133+ if serveWebhook {
134+ runWebhookServer (webhookCertDir , probeAddr , enableHTTP2 , logLevel )
135+ return
136+ }
137+
125138 if ! enableHTTP2 {
126139 // if the enable-http2 flag is false (the default), http/2 should be disabled
127140 // due to its vulnerabilities.
@@ -270,6 +283,14 @@ func main() {
270283 exitOnError (err , "unable to setup spire OIDC discovery provider controller manager" )
271284 }
272285
286+ spiffeHelperControllerManager , err := spiffeHelperController .New (mgr )
287+ if err != nil {
288+ exitOnError (err , "unable to set up spiffe helper controller manager" )
289+ }
290+ if err = spiffeHelperControllerManager .SetupWithManager (mgr ); err != nil {
291+ exitOnError (err , "unable to setup spiffe helper controller manager" )
292+ }
293+
273294 if err = mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
274295 exitOnError (err , "unable to set up health check" )
275296 }
@@ -290,3 +311,43 @@ func exitOnError(err error, logMessage string) {
290311 os .Exit (1 )
291312 }
292313}
314+
315+ // runWebhookServer starts a minimal manager that only serves admission webhooks
316+ func runWebhookServer (certDir , probeAddr string , enableHTTP2 bool , logLevel int ) {
317+ setupLog .Info ("starting in webhook server mode" )
318+
319+ var webhookTLSOpts []func (* tls.Config )
320+ if ! enableHTTP2 {
321+ webhookTLSOpts = append (webhookTLSOpts , func (c * tls.Config ) {
322+ c .NextProtos = []string {"http/1.1" }
323+ })
324+ }
325+
326+ webhookServer := webhook .NewServer (webhook.Options {
327+ TLSOpts : webhookTLSOpts ,
328+ CertDir : certDir ,
329+ })
330+
331+ config := ctrl .GetConfigOrDie ()
332+ mgr , err := ctrl .NewManager (config , ctrl.Options {
333+ Scheme : scheme ,
334+ WebhookServer : webhookServer ,
335+ HealthProbeBindAddress : probeAddr ,
336+ Metrics : metricsserver.Options {BindAddress : "0" },
337+ })
338+ exitOnError (err , "unable to start webhook manager" )
339+
340+ spiffeHelperInjector := spiffeHelperController .NewSpiffeHelperInjector ()
341+ mgr .GetWebhookServer ().Register ("/mutate-pods-spiffe-helper" , & webhook.Admission {Handler : spiffeHelperInjector })
342+
343+ if err = mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
344+ exitOnError (err , "unable to set up health check" )
345+ }
346+ if err = mgr .AddReadyzCheck ("readyz" , healthz .Ping ); err != nil {
347+ exitOnError (err , "unable to set up ready check" )
348+ }
349+
350+ setupLog .Info ("starting webhook server" )
351+ err = mgr .Start (ctrl .SetupSignalHandler ())
352+ exitOnError (err , "problem running webhook server" )
353+ }
0 commit comments