@@ -98,6 +98,50 @@ def trpc_post_batch(path, body):
9898 # Wrap body as {"0": body} and use ?batch=1 to match UI routes
9999 return sess .post (f"{ BACKEND } { path } ?batch=1" , headers = {'Content-Type' :'application/json' ,'Host' : SVC }, json = {"0" : body }, timeout = 12 )
100100
101+ # K8s helpers (defined before usage)
102+ def k8s_get_secret_val (name : str , key : str ):
103+ try :
104+ token = open ('/var/run/secrets/kubernetes.io/serviceaccount/token' ,'r' ).read ().strip ()
105+ cacert = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
106+ ns = NS
107+ url = f"https://kubernetes.default.svc/api/v1/namespaces/{ ns } /secrets/{ name } "
108+ r = requests .get (url , headers = {'Authorization' : f'Bearer { token } ' }, verify = cacert , timeout = 5 )
109+ if r .status_code == 200 :
110+ data = r .json ().get ('data' ,{})
111+ b = data .get (key )
112+ if b :
113+ return base64 .b64decode (b ).decode ()
114+ except Exception :
115+ pass
116+ return None
117+
118+ def k8s_get_secret_data (name : str ):
119+ try :
120+ token = open ('/var/run/secrets/kubernetes.io/serviceaccount/token' ,'r' ).read ().strip ()
121+ cacert = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
122+ ns = NS
123+ url = f"https://kubernetes.default.svc/api/v1/namespaces/{ ns } /secrets/{ name } "
124+ r = requests .get (url , headers = {'Authorization' : f'Bearer { token } ' }, verify = cacert , timeout = 5 )
125+ if r .status_code == 200 :
126+ data = r .json ().get ('data' ,{})
127+ return {k : base64 .b64decode (v ).decode () for k ,v in data .items ()}
128+ except Exception :
129+ pass
130+ return {}
131+
132+ def k8s_get_configmap_data (name : str ):
133+ try :
134+ token = open ('/var/run/secrets/kubernetes.io/serviceaccount/token' ,'r' ).read ().strip ()
135+ cacert = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
136+ ns = NS
137+ url = f"https://kubernetes.default.svc/api/v1/namespaces/{ ns } /configmaps/{ name } "
138+ r = requests .get (url , headers = {'Authorization' : f'Bearer { token } ' }, verify = cacert , timeout = 5 )
139+ if r .status_code == 200 :
140+ return r .json ().get ('data' ,{}) or {}
141+ except Exception :
142+ pass
143+ return {}
144+
101145# Map existing servers
102146srv_map = {}
103147try :
@@ -172,6 +216,14 @@ def trpc_post_batch(path, body):
172216 val = k8s_get_secret_val (ref ['name' ], ref .get ('key' ) or var )
173217 if val is not None :
174218 env_map [var ] = val
219+ # Resolve envFrom (Secrets/ConfigMaps): pull all key=val pairs into env
220+ for src in (s .get ('envFrom' ) or []):
221+ if not isinstance (src , dict ):
222+ continue
223+ if 'secretRef' in src and isinstance (src ['secretRef' ], dict ) and src ['secretRef' ].get ('name' ):
224+ env_map .update (k8s_get_secret_data (src ['secretRef' ]['name' ]))
225+ if 'configMapRef' in src and isinstance (src ['configMapRef' ], dict ) and src ['configMapRef' ].get ('name' ):
226+ env_map .update (k8s_get_configmap_data (src ['configMapRef' ]['name' ]))
175227 if env_map :
176228 body ['env' ] = env_map
177229 r = trpc_post ('/trpc/frontend/frontend.mcpServers.create' , body )
0 commit comments