@@ -119,6 +119,9 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
119119 return ctrl.Result {Requeue : true }, nil
120120 }
121121
122+ if err := r .validateMCPServerSpec (ctx , mcpServer , logger ); err != nil {
123+ return ctrl.Result {Requeue : false }, err
124+ }
122125 if err := r .validateIngressConfig (ctx , mcpServer , logger ); err != nil {
123126 return ctrl.Result {Requeue : false }, err
124127 }
@@ -172,22 +175,30 @@ func (r *MCPServerReconciler) applyDefaultsIfNeeded(ctx context.Context, mcpServ
172175 return true , nil
173176}
174177
175- func (r * MCPServerReconciler ) validateIngressConfig (ctx context.Context , mcpServer * mcpv1alpha1.MCPServer , logger logr.Logger ) error {
178+ func (r * MCPServerReconciler ) validateMCPServerSpec (ctx context.Context , mcpServer * mcpv1alpha1.MCPServer , logger logr.Logger ) error {
176179 if _ , err := mcpServer .ValidateCreate (); err != nil {
177180 r .updateStatus (ctx , mcpServer , "Error" , err .Error (), resourceReadiness {})
178- logOperatorError (logger , err , "Invalid ingress configuration " )
181+ logOperatorError (logger , err , "Invalid MCPServer specification " )
179182 return err
180183 }
181184 return nil
182185}
183186
184- func (r * MCPServerReconciler ) validateGatewayConfig (ctx context.Context , mcpServer * mcpv1alpha1.MCPServer , logger logr.Logger ) error {
185- if _ , err := mcpServer .ValidateCreate (); err != nil {
186- r .updateStatus (ctx , mcpServer , "Error" , err .Error (), resourceReadiness {})
187- logOperatorError (logger , err , "Invalid gateway configuration" )
188- return err
187+ func (r * MCPServerReconciler ) validateIngressConfig (ctx context.Context , mcpServer * mcpv1alpha1.MCPServer , logger logr.Logger ) error {
188+ if strings .TrimSpace (mcpServer .Spec .PublicPathPrefix ) == "" {
189+ if err := r .requireSpecField (ctx , mcpServer , logger , "ingress path" , effectiveIngressPath (mcpServer ),
190+ "ingressPath is required; set spec.ingressPath or ensure metadata.name is set" ); err != nil {
191+ return err
192+ }
193+ if err := r .requireSpecField (ctx , mcpServer , logger , "ingress host" , effectiveIngressHost (mcpServer ),
194+ "ingressHost is required; set spec.ingressHost, set MCP_DEFAULT_INGRESS_HOST on the operator, or use spec.publicPathPrefix for hostless routing" ); err != nil {
195+ return err
196+ }
189197 }
198+ return nil
199+ }
190200
201+ func (r * MCPServerReconciler ) validateGatewayConfig (ctx context.Context , mcpServer * mcpv1alpha1.MCPServer , logger logr.Logger ) error {
191202 if gatewayEnabled (mcpServer ) {
192203 if _ , err := r .resolveGatewayImage (mcpServer ); err != nil {
193204 r .updateStatus (ctx , mcpServer , "Error" , err .Error (), resourceReadiness {})
@@ -314,9 +325,12 @@ func determinePhase(readiness resourceReadiness) (string, bool) {
314325}
315326
316327func (r * MCPServerReconciler ) setDefaults (mcpServer * mcpv1alpha1.MCPServer ) {
328+ ingressHostUnset := strings .TrimSpace (mcpServer .Spec .IngressHost ) == ""
329+ publicPathPrefixUnset := strings .TrimSpace (mcpServer .Spec .PublicPathPrefix ) == ""
330+
317331 mcpServer .Default ()
318332
319- if strings . TrimSpace ( mcpServer . Spec . IngressHost ) == "" && strings . TrimSpace ( mcpServer . Spec . PublicPathPrefix ) == "" {
333+ if ingressHostUnset && publicPathPrefixUnset {
320334 mcpServer .Spec .IngressHost = strings .TrimSpace (r .DefaultIngressHost )
321335 }
322336
0 commit comments