@@ -5,6 +5,7 @@ package main
55import (
66 "context"
77 "flag"
8+ "fmt"
89 "os"
910 "strings"
1011
@@ -72,12 +73,44 @@ func main() {
7273 }
7374
7475 mgr , err := ctrl .NewManager (ctrl .GetConfigOrDie (), options )
75-
7676 if err != nil {
7777 setupLog .Error (err , "unable to start manager" )
7878 os .Exit (1 )
7979 }
8080
81+ if err := setupControllersAndWebhooks (mgr ); err != nil {
82+ setupLog .Error (err , "unable to setup controllers and webhooks" )
83+ os .Exit (1 )
84+ }
85+
86+ if err := mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
87+ setupLog .Error (err , "unable to set up health check" )
88+ os .Exit (1 )
89+ }
90+ if err := mgr .AddReadyzCheck ("readyz" , healthz .Ping ); err != nil {
91+ setupLog .Error (err , "unable to set up ready check" )
92+ os .Exit (1 )
93+ }
94+
95+ podNamespace , _ := os .LookupEnv ("POD_NAMESPACE" )
96+ // Set up telemetry service - only runs when elected as leader
97+ telemetryService := telemetry .NewService (mgr .GetClient (), podNamespace )
98+ if err := mgr .Add (& telemetry.LeaderTelemetryRunnable {
99+ TelemetryService : telemetryService ,
100+ }); err != nil {
101+ setupLog .Error (err , "unable to add telemetry runnable" )
102+ os .Exit (1 )
103+ }
104+
105+ setupLog .Info ("starting manager" )
106+ if err := mgr .Start (ctrl .SetupSignalHandler ()); err != nil {
107+ setupLog .Error (err , "problem running manager" )
108+ os .Exit (1 )
109+ }
110+ }
111+
112+ // setupControllersAndWebhooks sets up all controllers and webhooks with the manager
113+ func setupControllersAndWebhooks (mgr ctrl.Manager ) error {
81114 // Set up field indexing for MCPServer.Spec.GroupRef
82115 if err := mgr .GetFieldIndexer ().IndexField (
83116 context .Background (),
@@ -91,8 +124,7 @@ func main() {
91124 return []string {mcpServer .Spec .GroupRef }
92125 },
93126 ); err != nil {
94- setupLog .Error (err , "unable to create field index for spec.groupRef" )
95- os .Exit (1 )
127+ return fmt .Errorf ("unable to create field index for spec.groupRef: %w" , err )
96128 }
97129
98130 // Create a shared platform detector for all controllers
@@ -105,80 +137,61 @@ func main() {
105137 ImageValidation : validation .ImageValidationAlwaysAllow ,
106138 }
107139
108- if err = rec .SetupWithManager (mgr ); err != nil {
109- setupLog .Error (err , "unable to create controller" , "controller" , "MCPServer" )
110- os .Exit (1 )
140+ if err := rec .SetupWithManager (mgr ); err != nil {
141+ return fmt .Errorf ("unable to create controller MCPServer: %w" , err )
111142 }
112143
113144 // Register MCPToolConfig controller
114- if err = (& controllers.ToolConfigReconciler {
145+ if err : = (& controllers.ToolConfigReconciler {
115146 Client : mgr .GetClient (),
116147 Scheme : mgr .GetScheme (),
117148 }).SetupWithManager (mgr ); err != nil {
118- setupLog .Error (err , "unable to create controller" , "controller" , "MCPToolConfig" )
119- os .Exit (1 )
149+ return fmt .Errorf ("unable to create controller MCPToolConfig: %w" , err )
120150 }
121151
122152 // Register MCPExternalAuthConfig controller
123- if err = (& controllers.MCPExternalAuthConfigReconciler {
153+ if err : = (& controllers.MCPExternalAuthConfigReconciler {
124154 Client : mgr .GetClient (),
125155 Scheme : mgr .GetScheme (),
126156 }).SetupWithManager (mgr ); err != nil {
127- setupLog .Error (err , "unable to create controller" , "controller" , "MCPExternalAuthConfig" )
128- os .Exit (1 )
157+ return fmt .Errorf ("unable to create controller MCPExternalAuthConfig: %w" , err )
129158 }
130159
131160 // Register MCPRemoteProxy controller
132- if err = (& controllers.MCPRemoteProxyReconciler {
161+ if err : = (& controllers.MCPRemoteProxyReconciler {
133162 Client : mgr .GetClient (),
134163 Scheme : mgr .GetScheme (),
135164 PlatformDetector : ctrlutil .NewSharedPlatformDetector (),
136165 }).SetupWithManager (mgr ); err != nil {
137- setupLog .Error (err , "unable to create controller" , "controller" , "MCPRemoteProxy" )
138- os .Exit (1 )
166+ return fmt .Errorf ("unable to create controller MCPRemoteProxy: %w" , err )
139167 }
140168
141169 // Only register MCPRegistry controller if feature flag is enabled
142170 rec .ImageValidation = validation .ImageValidationRegistryEnforcing
143171
144- if err = (controllers .NewMCPRegistryReconciler (mgr .GetClient (), mgr .GetScheme ())).SetupWithManager (mgr ); err != nil {
145- setupLog .Error (err , "unable to create controller" , "controller" , "MCPRegistry" )
146- os .Exit (1 )
172+ if err := (controllers .NewMCPRegistryReconciler (mgr .GetClient (), mgr .GetScheme ())).SetupWithManager (mgr ); err != nil {
173+ return fmt .Errorf ("unable to create controller MCPRegistry: %w" , err )
147174 }
148175
149176 // Set up MCPGroup controller
150- if err = (& controllers.MCPGroupReconciler {
177+ if err : = (& controllers.MCPGroupReconciler {
151178 Client : mgr .GetClient (),
152179 }).SetupWithManager (mgr ); err != nil {
153- setupLog .Error (err , "unable to create controller" , "controller" , "MCPGroup" )
154- os .Exit (1 )
180+ return fmt .Errorf ("unable to create controller MCPGroup: %w" , err )
155181 }
156- //+kubebuilder:scaffold:builder
157182
158- if err := mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
159- setupLog .Error (err , "unable to set up health check" )
160- os .Exit (1 )
161- }
162- if err := mgr .AddReadyzCheck ("readyz" , healthz .Ping ); err != nil {
163- setupLog .Error (err , "unable to set up ready check" )
164- os .Exit (1 )
183+ // Set up VirtualMCPServer webhook
184+ if err := (& mcpv1alpha1.VirtualMCPServer {}).SetupWebhookWithManager (mgr ); err != nil {
185+ return fmt .Errorf ("unable to create webhook VirtualMCPServer: %w" , err )
165186 }
166187
167- podNamespace , _ := os .LookupEnv ("POD_NAMESPACE" )
168- // Set up telemetry service - only runs when elected as leader
169- telemetryService := telemetry .NewService (mgr .GetClient (), podNamespace )
170- if err := mgr .Add (& telemetry.LeaderTelemetryRunnable {
171- TelemetryService : telemetryService ,
172- }); err != nil {
173- setupLog .Error (err , "unable to add telemetry runnable" )
174- os .Exit (1 )
188+ // Set up VirtualMCPCompositeToolDefinition webhook
189+ if err := (& mcpv1alpha1.VirtualMCPCompositeToolDefinition {}).SetupWebhookWithManager (mgr ); err != nil {
190+ return fmt .Errorf ("unable to create webhook VirtualMCPCompositeToolDefinition: %w" , err )
175191 }
192+ //+kubebuilder:scaffold:builder
176193
177- setupLog .Info ("starting manager" )
178- if err := mgr .Start (ctrl .SetupSignalHandler ()); err != nil {
179- setupLog .Error (err , "problem running manager" )
180- os .Exit (1 )
181- }
194+ return nil
182195}
183196
184197// getDefaultNamespaces returns a map of namespaces to cache.Config for the operator to watch.
0 commit comments