@@ -46,7 +46,7 @@ func (r *VirtualMCPServerReconciler) ensureVmcpConfigConfigMap(
4646 Labels : labelsForVmcpConfig (vmcp .Name ),
4747 },
4848 Data : map [string ]string {
49- "config.json " : string (vmcpConfigJSON ),
49+ "config.yaml " : string (vmcpConfigJSON ), // Using .yaml extension - yaml.v3 can parse JSON
5050 },
5151 }
5252
@@ -163,19 +163,39 @@ func (*VirtualMCPServerReconciler) convertIncomingAuth(
163163) * vmcpconfig.IncomingAuthConfig {
164164 incoming := & vmcpconfig.IncomingAuthConfig {}
165165
166- // TODO: Implement proper conversion from OIDCConfigRef to OIDCConfig
167- // The OIDCConfigRef structure is more complex and needs to resolve references
166+ // Convert OIDC configuration
168167 if vmcp .Spec .IncomingAuth .OIDCConfig != nil {
169168 incoming .Type = "oidc"
170- // Placeholder - will need to resolve actual OIDC config from references
171- incoming .OIDC = & vmcpconfig.OIDCConfig {}
169+
170+ // Handle inline OIDC configuration
171+ if vmcp .Spec .IncomingAuth .OIDCConfig .Type == "inline" && vmcp .Spec .IncomingAuth .OIDCConfig .Inline != nil {
172+ inline := vmcp .Spec .IncomingAuth .OIDCConfig .Inline
173+ incoming .OIDC = & vmcpconfig.OIDCConfig {
174+ Issuer : inline .Issuer ,
175+ ClientID : inline .ClientID , // Note: API uses clientId (camelCase) but config uses ClientID
176+ ClientSecret : inline .ClientSecret ,
177+ Audience : inline .Audience ,
178+ Resource : vmcp .Spec .IncomingAuth .OIDCConfig .ResourceURL ,
179+ Scopes : nil , // TODO: Add scopes if needed
180+ }
181+ } else {
182+ // TODO: Handle configMap and kubernetes types
183+ // For now, create empty config to avoid nil pointer
184+ incoming .OIDC = & vmcpconfig.OIDCConfig {}
185+ }
172186 }
173187
188+ // Convert authorization configuration
174189 if vmcp .Spec .IncomingAuth .AuthzConfig != nil {
175190 incoming .Authz = & vmcpconfig.AuthzConfig {
176191 Type : vmcp .Spec .IncomingAuth .AuthzConfig .Type ,
177- // TODO: Load policies from ConfigMap if referenced
178192 }
193+
194+ // Handle inline policies
195+ if vmcp .Spec .IncomingAuth .AuthzConfig .Type == "inline" && vmcp .Spec .IncomingAuth .AuthzConfig .Inline != nil {
196+ incoming .Authz .Policies = vmcp .Spec .IncomingAuth .AuthzConfig .Inline .Policies
197+ }
198+ // TODO: Load policies from ConfigMap if Type is "configMap"
179199 }
180200
181201 return incoming
@@ -259,6 +279,11 @@ func (*VirtualMCPServerReconciler) convertAggregation(
259279 PrefixFormat : vmcp .Spec .Aggregation .ConflictResolutionConfig .PrefixFormat ,
260280 PriorityOrder : vmcp .Spec .Aggregation .ConflictResolutionConfig .PriorityOrder ,
261281 }
282+ } else if agg .ConflictResolution == "prefix" {
283+ // Provide default prefix format if using prefix strategy without explicit config
284+ agg .ConflictResolutionConfig = & vmcpconfig.ConflictResolutionConfig {
285+ PrefixFormat : "{workload}_" ,
286+ }
262287 }
263288
264289 // Convert per-workload tool configs
@@ -306,7 +331,7 @@ func (*VirtualMCPServerReconciler) convertCompositeTools(
306331 // Parse timeout
307332 if crdTool .Timeout != "" {
308333 if duration , err := time .ParseDuration (crdTool .Timeout ); err == nil {
309- tool .Timeout = duration
334+ tool .Timeout = vmcpconfig . Duration ( duration )
310335 }
311336 }
312337
@@ -333,7 +358,7 @@ func (*VirtualMCPServerReconciler) convertCompositeTools(
333358 // Parse timeout
334359 if crdStep .Timeout != "" {
335360 if duration , err := time .ParseDuration (crdStep .Timeout ); err == nil {
336- step .Timeout = duration
361+ step .Timeout = vmcpconfig . Duration ( duration )
337362 }
338363 }
339364
@@ -378,7 +403,7 @@ func (*VirtualMCPServerReconciler) convertTokenCache(
378403 }
379404 if vmcp .Spec .TokenCache .Memory .TTLOffset != "" {
380405 if duration , err := time .ParseDuration (vmcp .Spec .TokenCache .Memory .TTLOffset ); err == nil {
381- cache .Memory .TTLOffset = duration
406+ cache .Memory .TTLOffset = vmcpconfig . Duration ( duration )
382407 }
383408 }
384409 }
@@ -408,20 +433,20 @@ func (*VirtualMCPServerReconciler) convertOperational(
408433
409434 if vmcp .Spec .Operational .Timeouts != nil {
410435 operational .Timeouts = & vmcpconfig.TimeoutConfig {
411- PerWorkload : make (map [string ]time .Duration ),
436+ PerWorkload : make (map [string ]vmcpconfig .Duration ),
412437 }
413438
414439 // Parse default timeout
415440 if vmcp .Spec .Operational .Timeouts .Default != "" {
416441 if duration , err := time .ParseDuration (vmcp .Spec .Operational .Timeouts .Default ); err == nil {
417- operational .Timeouts .Default = duration
442+ operational .Timeouts .Default = vmcpconfig . Duration ( duration )
418443 }
419444 }
420445
421446 // Parse per-workload timeouts
422447 for workload , timeoutStr := range vmcp .Spec .Operational .Timeouts .PerWorkload {
423448 if duration , err := time .ParseDuration (timeoutStr ); err == nil {
424- operational .Timeouts .PerWorkload [workload ] = duration
449+ operational .Timeouts .PerWorkload [workload ] = vmcpconfig . Duration ( duration )
425450 }
426451 }
427452 }
@@ -435,7 +460,7 @@ func (*VirtualMCPServerReconciler) convertOperational(
435460 // Parse health check interval
436461 if vmcp .Spec .Operational .FailureHandling .HealthCheckInterval != "" {
437462 if duration , err := time .ParseDuration (vmcp .Spec .Operational .FailureHandling .HealthCheckInterval ); err == nil {
438- operational .FailureHandling .HealthCheckInterval = duration
463+ operational .FailureHandling .HealthCheckInterval = vmcpconfig . Duration ( duration )
439464 }
440465 }
441466
@@ -449,7 +474,7 @@ func (*VirtualMCPServerReconciler) convertOperational(
449474 // Parse circuit breaker timeout
450475 if vmcp .Spec .Operational .FailureHandling .CircuitBreaker .Timeout != "" {
451476 if duration , err := time .ParseDuration (vmcp .Spec .Operational .FailureHandling .CircuitBreaker .Timeout ); err == nil {
452- operational .FailureHandling .CircuitBreaker .Timeout = duration
477+ operational .FailureHandling .CircuitBreaker .Timeout = vmcpconfig . Duration ( duration )
453478 }
454479 }
455480 }
0 commit comments