@@ -31,7 +31,6 @@ import (
3131
3232 mcpv1alpha1 "github.com/stacklok/toolhive/cmd/thv-operator/api/v1alpha1"
3333 "github.com/stacklok/toolhive/pkg/container/kubernetes"
34- "github.com/stacklok/toolhive/pkg/logger"
3534)
3635
3736// MCPServerReconciler reconciles a MCPServer object
@@ -290,7 +289,7 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
290289 err = r .Get (ctx , types.NamespacedName {Name : serviceName , Namespace : mcpServer .Namespace }, service )
291290 if err != nil && errors .IsNotFound (err ) {
292291 // Define a new service
293- svc := r .serviceForMCPServer (mcpServer )
292+ svc := r .serviceForMCPServer (ctx , mcpServer )
294293 if svc == nil {
295294 ctxLogger .Error (nil , "Failed to create Service object" )
296295 return ctrl.Result {}, fmt .Errorf ("failed to create Service object" )
@@ -319,7 +318,7 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
319318 }
320319
321320 // Check if the deployment spec changed
322- if r .deploymentNeedsUpdate (deployment , mcpServer ) {
321+ if r .deploymentNeedsUpdate (ctx , deployment , mcpServer ) {
323322 // Update the deployment
324323 newDeployment := r .deploymentForMCPServer (ctx , mcpServer )
325324 deployment .Spec = newDeployment .Spec
@@ -337,7 +336,7 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
337336 // Check if the service spec changed
338337 if serviceNeedsUpdate (service , mcpServer ) {
339338 // Update the service
340- newService := r .serviceForMCPServer (mcpServer )
339+ newService := r .serviceForMCPServer (ctx , mcpServer )
341340 service .Spec .Ports = newService .Spec .Ports
342341 err = r .Update (ctx , service )
343342 if err != nil {
@@ -523,7 +522,7 @@ func (r *MCPServerReconciler) createRBACResource(
523522 ctxLogger := log .FromContext (ctx )
524523 desired := createResource ()
525524 if err := controllerutil .SetControllerReference (mcpServer , desired , r .Scheme ); err != nil {
526- logger . Errorf ( "Failed to set controller reference for %s: %v " , resourceType , err )
525+ ctxLogger . Error ( err , "Failed to set controller reference" , " resourceType" , resourceType )
527526 return nil
528527 }
529528
@@ -550,7 +549,7 @@ func (r *MCPServerReconciler) updateRBACResourceIfNeeded(
550549 ctxLogger := log .FromContext (ctx )
551550 desired := createResource ()
552551 if err := controllerutil .SetControllerReference (mcpServer , desired , r .Scheme ); err != nil {
553- logger . Errorf ( "Failed to set controller reference for %s: %v " , resourceType , err )
552+ ctxLogger . Error ( err , "Failed to set controller reference" , " resourceType" , resourceType )
554553 return nil
555554 }
556555
@@ -708,7 +707,8 @@ func (r *MCPServerReconciler) deploymentForMCPServer(ctx context.Context, m *mcp
708707 if finalPodTemplateSpec != nil {
709708 podTemplatePatch , err := json .Marshal (finalPodTemplateSpec )
710709 if err != nil {
711- logger .Errorf ("Failed to marshal pod template spec: %v" , err )
710+ ctxLogger := log .FromContext (ctx )
711+ ctxLogger .Error (err , "Failed to marshal pod template spec" )
712712 } else {
713713 args = append (args , fmt .Sprintf ("--k8s-pod-patch=%s" , string (podTemplatePatch )))
714714 }
@@ -746,7 +746,8 @@ func (r *MCPServerReconciler) deploymentForMCPServer(ctx context.Context, m *mcp
746746 if finalPodTemplateSpec != nil {
747747 podTemplatePatch , err := json .Marshal (finalPodTemplateSpec )
748748 if err != nil {
749- logger .Errorf ("Failed to marshal pod template spec: %v" , err )
749+ ctxLogger := log .FromContext (ctx )
750+ ctxLogger .Error (err , "Failed to marshal pod template spec" )
750751 } else {
751752 args = append (args , fmt .Sprintf ("--k8s-pod-patch=%s" , string (podTemplatePatch )))
752753 }
@@ -966,7 +967,7 @@ func (r *MCPServerReconciler) deploymentForMCPServer(ctx context.Context, m *mcp
966967 proxyRunnerPodSecurityContext := securityBuilder .BuildPodSecurityContext ()
967968 proxyRunnerContainerSecurityContext := securityBuilder .BuildContainerSecurityContext ()
968969
969- env = ensureRequiredEnvVars (env )
970+ env = ensureRequiredEnvVars (ctx , env )
970971
971972 dep := & appsv1.Deployment {
972973 ObjectMeta : metav1.ObjectMeta {
@@ -1034,15 +1035,17 @@ func (r *MCPServerReconciler) deploymentForMCPServer(ctx context.Context, m *mcp
10341035
10351036 // Set MCPServer instance as the owner and controller
10361037 if err := controllerutil .SetControllerReference (m , dep , r .Scheme ); err != nil {
1037- logger .Errorf ("Failed to set controller reference for Deployment: %v" , err )
1038+ ctxLogger := log .FromContext (ctx )
1039+ ctxLogger .Error (err , "Failed to set controller reference for Deployment" )
10381040 return nil
10391041 }
10401042 return dep
10411043}
10421044
1043- func ensureRequiredEnvVars (env []corev1.EnvVar ) []corev1.EnvVar {
1045+ func ensureRequiredEnvVars (ctx context. Context , env []corev1.EnvVar ) []corev1.EnvVar {
10441046 // Check for the existence of the XDG_CONFIG_HOME, HOME, TOOLHIVE_RUNTIME, and UNSTRUCTURED_LOGS environment variables
10451047 // and set them to defaults if they don't exist
1048+ ctxLogger := log .FromContext (ctx )
10461049 xdgConfigHomeFound := false
10471050 homeFound := false
10481051 toolhiveRuntimeFound := false
@@ -1062,29 +1065,29 @@ func ensureRequiredEnvVars(env []corev1.EnvVar) []corev1.EnvVar {
10621065 }
10631066 }
10641067 if ! xdgConfigHomeFound {
1065- logger . Debugf ("XDG_CONFIG_HOME not found, setting to /tmp" )
1068+ ctxLogger . V ( 1 ). Info ("XDG_CONFIG_HOME not found, setting to /tmp" )
10661069 env = append (env , corev1.EnvVar {
10671070 Name : "XDG_CONFIG_HOME" ,
10681071 Value : "/tmp" ,
10691072 })
10701073 }
10711074 if ! homeFound {
1072- logger . Debugf ("HOME not found, setting to /tmp" )
1075+ ctxLogger . V ( 1 ). Info ("HOME not found, setting to /tmp" )
10731076 env = append (env , corev1.EnvVar {
10741077 Name : "HOME" ,
10751078 Value : "/tmp" ,
10761079 })
10771080 }
10781081 if ! toolhiveRuntimeFound {
1079- logger . Debugf ("TOOLHIVE_RUNTIME not found, setting to kubernetes" )
1082+ ctxLogger . V ( 1 ). Info ("TOOLHIVE_RUNTIME not found, setting to kubernetes" )
10801083 env = append (env , corev1.EnvVar {
10811084 Name : "TOOLHIVE_RUNTIME" ,
10821085 Value : "kubernetes" ,
10831086 })
10841087 }
10851088 // Always use structured JSON logs in Kubernetes (not configurable)
10861089 if ! unstructuredLogsFound {
1087- logger . Debugf ("UNSTRUCTURED_LOGS not found, setting to false for structured JSON logging" )
1090+ ctxLogger . V ( 1 ). Info ("UNSTRUCTURED_LOGS not found, setting to false for structured JSON logging" )
10881091 env = append (env , corev1.EnvVar {
10891092 Name : "UNSTRUCTURED_LOGS" ,
10901093 Value : "false" ,
@@ -1104,7 +1107,7 @@ func createServiceURL(mcpServerName, namespace string, port int32) string {
11041107}
11051108
11061109// serviceForMCPServer returns a MCPServer Service object
1107- func (r * MCPServerReconciler ) serviceForMCPServer (m * mcpv1alpha1.MCPServer ) * corev1.Service {
1110+ func (r * MCPServerReconciler ) serviceForMCPServer (ctx context. Context , m * mcpv1alpha1.MCPServer ) * corev1.Service {
11081111 ls := labelsForMCPServer (m .Name )
11091112
11101113 // we want to generate a service name that is unique for the proxy service
@@ -1144,7 +1147,8 @@ func (r *MCPServerReconciler) serviceForMCPServer(m *mcpv1alpha1.MCPServer) *cor
11441147
11451148 // Set MCPServer instance as the owner and controller
11461149 if err := controllerutil .SetControllerReference (m , svc , r .Scheme ); err != nil {
1147- logger .Errorf ("Failed to set controller reference for Service: %v" , err )
1150+ ctxLogger := log .FromContext (ctx )
1151+ ctxLogger .Error (err , "Failed to set controller reference for Service" )
11481152 return nil
11491153 }
11501154 return svc
@@ -1256,7 +1260,11 @@ func (r *MCPServerReconciler) finalizeMCPServer(ctx context.Context, m *mcpv1alp
12561260// deploymentNeedsUpdate checks if the deployment needs to be updated
12571261//
12581262//nolint:gocyclo
1259- func (r * MCPServerReconciler ) deploymentNeedsUpdate (deployment * appsv1.Deployment , mcpServer * mcpv1alpha1.MCPServer ) bool {
1263+ func (r * MCPServerReconciler ) deploymentNeedsUpdate (
1264+ ctx context.Context ,
1265+ deployment * appsv1.Deployment ,
1266+ mcpServer * mcpv1alpha1.MCPServer ,
1267+ ) bool {
12601268 // Check if the container args have changed
12611269 if len (deployment .Spec .Template .Spec .Containers ) > 0 {
12621270 container := deployment .Spec .Template .Spec .Containers [0 ]
@@ -1371,7 +1379,7 @@ func (r *MCPServerReconciler) deploymentNeedsUpdate(deployment *appsv1.Deploymen
13711379 }
13721380 }
13731381 // Add default environment variables that are always injected
1374- expectedProxyEnv = ensureRequiredEnvVars (expectedProxyEnv )
1382+ expectedProxyEnv = ensureRequiredEnvVars (ctx , expectedProxyEnv )
13751383 if ! reflect .DeepEqual (container .Env , expectedProxyEnv ) {
13761384 return true
13771385 }
@@ -1401,7 +1409,8 @@ func (r *MCPServerReconciler) deploymentNeedsUpdate(deployment *appsv1.Deploymen
14011409 if expectedPodTemplateSpec != nil {
14021410 expectedPatch , err := json .Marshal (expectedPodTemplateSpec )
14031411 if err != nil {
1404- logger .Errorf ("Failed to marshal expected pod template spec: %v" , err )
1412+ ctxLogger := log .FromContext (ctx )
1413+ ctxLogger .Error (err , "Failed to marshal expected pod template spec" )
14051414 return true // Assume change if we can't marshal
14061415 }
14071416 expectedPatchString := string (expectedPatch )
@@ -1705,7 +1714,7 @@ func (r *MCPServerReconciler) generateOIDCArgs(ctx context.Context, m *mcpv1alph
17051714
17061715 switch m .Spec .OIDCConfig .Type {
17071716 case mcpv1alpha1 .OIDCConfigTypeKubernetes :
1708- args = append (args , r .generateKubernetesOIDCArgs (m )... )
1717+ args = append (args , r .generateKubernetesOIDCArgs (ctx , m )... )
17091718 case mcpv1alpha1 .OIDCConfigTypeConfigMap :
17101719 args = append (args , r .generateConfigMapOIDCArgs (ctx , m )... )
17111720 case mcpv1alpha1 .OIDCConfigTypeInline :
@@ -1716,13 +1725,14 @@ func (r *MCPServerReconciler) generateOIDCArgs(ctx context.Context, m *mcpv1alph
17161725}
17171726
17181727// generateKubernetesOIDCArgs generates OIDC args for Kubernetes service account token validation
1719- func (* MCPServerReconciler ) generateKubernetesOIDCArgs (m * mcpv1alpha1.MCPServer ) []string {
1728+ func (* MCPServerReconciler ) generateKubernetesOIDCArgs (ctx context. Context , m * mcpv1alpha1.MCPServer ) []string {
17201729 var args []string
17211730 config := m .Spec .OIDCConfig .Kubernetes
17221731
17231732 // Set defaults if config is nil
17241733 if config == nil {
1725- logger .Infof ("Kubernetes OIDCConfig is nil for MCPServer %s, using default configuration" , m .Name )
1734+ ctxLogger := log .FromContext (ctx )
1735+ ctxLogger .Info ("Kubernetes OIDCConfig is nil, using default configuration" , "mcpServer" , m .Name )
17261736 defaultUseClusterAuth := true
17271737 config = & mcpv1alpha1.KubernetesOIDCConfig {
17281738 UseClusterAuth : & defaultUseClusterAuth , // Default to true
@@ -1804,7 +1814,8 @@ func (r *MCPServerReconciler) generateConfigMapOIDCArgs( // nolint:gocyclo
18041814 Namespace : m .Namespace ,
18051815 }, configMap )
18061816 if err != nil {
1807- logger .Errorf ("Failed to get ConfigMap %s: %v" , config .Name , err )
1817+ ctxLogger := log .FromContext (ctx )
1818+ ctxLogger .Error (err , "Failed to get ConfigMap" , "configMapName" , config .Name )
18081819 return args
18091820 }
18101821
0 commit comments