From 1b68ddbd5922771134691a4be9dea986a56b03a0 Mon Sep 17 00:00:00 2001 From: Greg Haskins Date: Wed, 19 Nov 2025 10:45:56 -0500 Subject: [PATCH] [#2660] Fix issue with MCPServer.Spec.ResourceOverrides.ProxyDeployment.PodTemplateMetadataOverrides.Labels This assigns the CRD labels to the correct aree of the emitted Deployment object Fixes #2660 Signed-off-by: Greg Haskins --- .../controllers/mcpserver_controller.go | 3 ++- .../mcpserver_pod_template_test.go | 13 +++++++++++++ .../mcpserver_controller_integration_test.go | 19 +++++++++++++++---- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/cmd/thv-operator/controllers/mcpserver_controller.go b/cmd/thv-operator/controllers/mcpserver_controller.go index 50ce6fa07..6e41ef941 100644 --- a/cmd/thv-operator/controllers/mcpserver_controller.go +++ b/cmd/thv-operator/controllers/mcpserver_controller.go @@ -1097,7 +1097,8 @@ func (r *MCPServerReconciler) deploymentForMCPServer( if m.Spec.ResourceOverrides.ProxyDeployment.PodTemplateMetadataOverrides != nil { if m.Spec.ResourceOverrides.ProxyDeployment.PodTemplateMetadataOverrides.Labels != nil { - deploymentLabels = ctrlutil.MergeLabels(ls, m.Spec.ResourceOverrides.ProxyDeployment.PodTemplateMetadataOverrides.Labels) + deploymentTemplateLabels = ctrlutil.MergeLabels(ls, + m.Spec.ResourceOverrides.ProxyDeployment.PodTemplateMetadataOverrides.Labels) } if m.Spec.ResourceOverrides.ProxyDeployment.PodTemplateMetadataOverrides.Annotations != nil { deploymentTemplateAnnotations = ctrlutil.MergeAnnotations(deploymentAnnotations, diff --git a/cmd/thv-operator/controllers/mcpserver_pod_template_test.go b/cmd/thv-operator/controllers/mcpserver_pod_template_test.go index 35f2a0121..9c6fd977b 100644 --- a/cmd/thv-operator/controllers/mcpserver_pod_template_test.go +++ b/cmd/thv-operator/controllers/mcpserver_pod_template_test.go @@ -76,6 +76,15 @@ func TestDeploymentForMCPServerWithPodTemplateSpec(t *testing.T) { Transport: "stdio", ProxyPort: 8080, PodTemplateSpec: podTemplateSpecToRawExtension(t, podTemplateSpec), + ResourceOverrides: &mcpv1alpha1.ResourceOverrides{ + ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{ + PodTemplateMetadataOverrides: &mcpv1alpha1.ResourceMetadataOverrides{ + Labels: map[string]string{ + "podspec-testlabel": "true", + }, + }, + }, + }, }, } @@ -93,6 +102,10 @@ func TestDeploymentForMCPServerWithPodTemplateSpec(t *testing.T) { deployment := r.deploymentForMCPServer(ctx, mcpServer, "test-checksum") require.NotNil(t, deployment, "Deployment should not be nil") + // Check that the pod template metadata overrides labels are merged with Spec.Template.Labels + proxyLabels := deployment.Spec.Template.Labels + assert.Equal(t, "true", proxyLabels["podspec-testlabel"], "podTemplateMetadataOverrides labels should be merged with Spec.Template.Labels") + // Check if the pod template patch is included in the args podTemplatePatchFound := false for _, arg := range deployment.Spec.Template.Spec.Containers[0].Args { diff --git a/cmd/thv-operator/test-integration/mcp-server/mcpserver_controller_integration_test.go b/cmd/thv-operator/test-integration/mcp-server/mcpserver_controller_integration_test.go index 7d53aa7a8..68901f3a4 100644 --- a/cmd/thv-operator/test-integration/mcp-server/mcpserver_controller_integration_test.go +++ b/cmd/thv-operator/test-integration/mcp-server/mcpserver_controller_integration_test.go @@ -79,6 +79,15 @@ var _ = Describe("MCPServer Controller Integration Tests", func() { Memory: "128Mi", }, }, + ResourceOverrides: &mcpv1alpha1.ResourceOverrides{ + ProxyDeployment: &mcpv1alpha1.ProxyDeploymentOverrides{ + PodTemplateMetadataOverrides: &mcpv1alpha1.ResourceMetadataOverrides{ + Labels: map[string]string{ + "podspec-testlabel": "true", + }, + }, + }, + }, }, } @@ -116,14 +125,14 @@ var _ = Describe("MCPServer Controller Integration Tests", func() { verifyOwnerReference(deployment.OwnerReferences, createdMCPServer, "Deployment") // Verify Deployment labels - expectedLabels := map[string]string{ + baseExpectedLabels := map[string]string{ "app": "mcpserver", "app.kubernetes.io/name": "mcpserver", "app.kubernetes.io/instance": mcpServerName, "toolhive": "true", "toolhive-name": mcpServerName, } - for key, value := range expectedLabels { + for key, value := range baseExpectedLabels { Expect(deployment.Labels).To(HaveKeyWithValue(key, value)) } @@ -131,10 +140,12 @@ var _ = Describe("MCPServer Controller Integration Tests", func() { Expect(deployment.Spec.Replicas).To(Equal(ptr.To(int32(1)))) // Verify selector - Expect(deployment.Spec.Selector.MatchLabels).To(Equal(expectedLabels)) + Expect(deployment.Spec.Selector.MatchLabels).To(Equal(baseExpectedLabels)) // Verify pod template labels - for key, value := range expectedLabels { + podTemplateExepectedLabels := baseExpectedLabels + podTemplateExepectedLabels["podspec-testlabel"] = "true" + for key, value := range podTemplateExepectedLabels { Expect(deployment.Spec.Template.Labels).To(HaveKeyWithValue(key, value)) }