Skip to content

Commit 8ce0337

Browse files
yroblataskbot
andauthored
Watch VirtualMCPCompositeToolDefinition changes (#2601)
* Watch VirtualMCPCompositeToolDefinition changes * fix tests --------- Co-authored-by: taskbot <taskbot@users.noreply.github.com>
1 parent c1a872e commit 8ce0337

File tree

3 files changed

+484
-0
lines changed

3 files changed

+484
-0
lines changed

cmd/thv-operator/controllers/virtualmcpserver_controller.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,10 @@ func (r *VirtualMCPServerReconciler) SetupWithManager(mgr ctrl.Manager) error {
873873
Watches(&mcpv1alpha1.MCPServer{}, handler.EnqueueRequestsFromMapFunc(r.mapMCPServerToVirtualMCPServer)).
874874
Watches(&mcpv1alpha1.MCPExternalAuthConfig{}, handler.EnqueueRequestsFromMapFunc(r.mapExternalAuthConfigToVirtualMCPServer)).
875875
Watches(&mcpv1alpha1.MCPToolConfig{}, handler.EnqueueRequestsFromMapFunc(r.mapToolConfigToVirtualMCPServer)).
876+
Watches(
877+
&mcpv1alpha1.VirtualMCPCompositeToolDefinition{},
878+
handler.EnqueueRequestsFromMapFunc(r.mapCompositeToolDefinitionToVirtualMCPServer),
879+
).
876880
Complete(r)
877881
}
878882

@@ -1085,3 +1089,53 @@ func (*VirtualMCPServerReconciler) vmcpReferencesExternalAuthConfig(
10851089

10861090
return false
10871091
}
1092+
1093+
// mapCompositeToolDefinitionToVirtualMCPServer maps VirtualMCPCompositeToolDefinition changes to
1094+
// VirtualMCPServer reconciliation requests
1095+
func (r *VirtualMCPServerReconciler) mapCompositeToolDefinitionToVirtualMCPServer(
1096+
ctx context.Context,
1097+
obj client.Object,
1098+
) []reconcile.Request {
1099+
compositeToolDef, ok := obj.(*mcpv1alpha1.VirtualMCPCompositeToolDefinition)
1100+
if !ok {
1101+
return nil
1102+
}
1103+
1104+
vmcpList := &mcpv1alpha1.VirtualMCPServerList{}
1105+
if err := r.List(ctx, vmcpList, client.InNamespace(compositeToolDef.Namespace)); err != nil {
1106+
log.FromContext(ctx).Error(err, "Failed to list VirtualMCPServers for VirtualMCPCompositeToolDefinition watch")
1107+
return nil
1108+
}
1109+
1110+
var requests []reconcile.Request
1111+
for _, vmcp := range vmcpList.Items {
1112+
if r.vmcpReferencesCompositeToolDefinition(&vmcp, compositeToolDef.Name) {
1113+
requests = append(requests, reconcile.Request{
1114+
NamespacedName: types.NamespacedName{
1115+
Name: vmcp.Name,
1116+
Namespace: vmcp.Namespace,
1117+
},
1118+
})
1119+
}
1120+
}
1121+
1122+
return requests
1123+
}
1124+
1125+
// vmcpReferencesCompositeToolDefinition checks if a VirtualMCPServer references the given VirtualMCPCompositeToolDefinition
1126+
func (*VirtualMCPServerReconciler) vmcpReferencesCompositeToolDefinition(
1127+
vmcp *mcpv1alpha1.VirtualMCPServer,
1128+
compositeToolDefName string,
1129+
) bool {
1130+
if len(vmcp.Spec.CompositeToolRefs) == 0 {
1131+
return false
1132+
}
1133+
1134+
for _, ref := range vmcp.Spec.CompositeToolRefs {
1135+
if ref.Name == compositeToolDefName {
1136+
return true
1137+
}
1138+
}
1139+
1140+
return false
1141+
}

cmd/thv-operator/test-integration/mcp-server/suite_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ var _ = BeforeSuite(func() {
122122
}).SetupWithManager(k8sManager)
123123
Expect(err).ToNot(HaveOccurred())
124124

125+
// Register the VirtualMCPServer controller
126+
err = (&controllers.VirtualMCPServerReconciler{
127+
Client: k8sManager.GetClient(),
128+
Scheme: k8sManager.GetScheme(),
129+
PlatformDetector: ctrlutil.NewSharedPlatformDetector(),
130+
}).SetupWithManager(k8sManager)
131+
Expect(err).ToNot(HaveOccurred())
132+
125133
// Start the manager in a goroutine
126134
go func() {
127135
defer GinkgoRecover()

0 commit comments

Comments
 (0)