11package transportadapter
22
33import (
4+ "context"
45 "crypto/sha256"
56 "encoding/hex"
67 "fmt"
78 "sort"
89
10+ "go.uber.org/multierr"
911 appsv1 "k8s.io/api/apps/v1"
1012 corev1 "k8s.io/api/core/v1"
1113 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -25,20 +27,32 @@ const (
2527
2628// Translator is the interface for translating MCPServer objects to TransportAdapter objects.
2729type Translator interface {
28- TranslateTransportAdapterOutputs (server * v1alpha1.MCPServer ) ([]client.Object , error )
30+ TranslateTransportAdapterOutputs (
31+ ctx context.Context ,
32+ server * v1alpha1.MCPServer ,
33+ ) ([]client.Object , error )
2934}
3035
36+ type TranslatorPlugin func (
37+ ctx context.Context ,
38+ server * v1alpha1.MCPServer ,
39+ objects []client.Object ,
40+ ) ([]client.Object , error )
41+
3142type transportAdapterTranslator struct {
32- scheme * runtime.Scheme
43+ scheme * runtime.Scheme
44+ plugins []TranslatorPlugin
3345}
3446
35- func NewTransportAdapterTranslator (scheme * runtime.Scheme ) Translator {
47+ func NewTransportAdapterTranslator (scheme * runtime.Scheme , plugins [] TranslatorPlugin ) Translator {
3648 return & transportAdapterTranslator {
37- scheme : scheme ,
49+ scheme : scheme ,
50+ plugins : plugins ,
3851 }
3952}
4053
4154func (t * transportAdapterTranslator ) TranslateTransportAdapterOutputs (
55+ ctx context.Context ,
4256 server * v1alpha1.MCPServer ,
4357) ([]client.Object , error ) {
4458 serviceAccount , err := t .translateTransportAdapterServiceAccount (server )
@@ -57,12 +71,12 @@ func (t *transportAdapterTranslator) TranslateTransportAdapterOutputs(
5771 if err != nil {
5872 return nil , fmt .Errorf ("failed to translate TransportAdapter config map: %w" , err )
5973 }
60- return []client.Object {
74+ return t . runPlugins ( ctx , server , []client.Object {
6175 serviceAccount ,
6276 deployment ,
6377 service ,
6478 configMap ,
65- }, nil
79+ })
6680}
6781
6882func (t * transportAdapterTranslator ) translateTransportAdapterDeployment (
@@ -359,7 +373,9 @@ func convertEnvVars(env map[string]string) []corev1.EnvVar {
359373 return envVars
360374}
361375
362- func (t * transportAdapterTranslator ) translateTransportAdapterService (server * v1alpha1.MCPServer ) (* corev1.Service , error ) {
376+ func (t * transportAdapterTranslator ) translateTransportAdapterService (
377+ server * v1alpha1.MCPServer ,
378+ ) (* corev1.Service , error ) {
363379 port := server .Spec .Deployment .Port
364380 if port == 0 {
365381 return nil , fmt .Errorf ("deployment port must be specified for MCPServer %s" , server .Name )
@@ -392,7 +408,9 @@ func (t *transportAdapterTranslator) translateTransportAdapterService(server *v1
392408 return service , controllerutil .SetOwnerReference (server , service , t .scheme )
393409}
394410
395- func (t * transportAdapterTranslator ) translateTransportAdapterConfigAsYAML (server * v1alpha1.MCPServer ) (string , error ) {
411+ func (t * transportAdapterTranslator ) translateTransportAdapterConfigAsYAML (
412+ server * v1alpha1.MCPServer ,
413+ ) (string , error ) {
396414 config , err := t .translateTransportAdapterConfig (server )
397415 if err != nil {
398416 return "" , fmt .Errorf ("failed to translate MCP server config: %w" , err )
@@ -406,7 +424,9 @@ func (t *transportAdapterTranslator) translateTransportAdapterConfigAsYAML(serve
406424 return string (configYaml ), nil
407425}
408426
409- func (t * transportAdapterTranslator ) translateTransportAdapterConfigMap (server * v1alpha1.MCPServer ) (* corev1.ConfigMap , error ) {
427+ func (t * transportAdapterTranslator ) translateTransportAdapterConfigMap (
428+ server * v1alpha1.MCPServer ,
429+ ) (* corev1.ConfigMap , error ) {
410430 configYaml , err := t .translateTransportAdapterConfigAsYAML (server )
411431 if err != nil {
412432 return nil , fmt .Errorf ("failed to marshal MCP server config to YAML: %w" , err )
@@ -498,3 +518,22 @@ func (t *transportAdapterTranslator) translateTransportAdapterConfig(server *v1a
498518
499519 return config , nil
500520}
521+
522+ func (t * transportAdapterTranslator ) runPlugins (
523+ ctx context.Context ,
524+ server * v1alpha1.MCPServer ,
525+ objects []client.Object ,
526+ ) ([]client.Object , error ) {
527+ var errs error
528+ if len (t .plugins ) > 0 {
529+ for _ , plugin := range t .plugins {
530+ out , err := plugin (ctx , server , objects )
531+ if err != nil {
532+ errs = multierr .Append (errs , fmt .Errorf ("plugin %T failed: %w" , plugin , err ))
533+ }
534+ objects = out
535+ }
536+ }
537+
538+ return objects , errs
539+ }
0 commit comments