Skip to content

Commit 87cd4f4

Browse files
feat: implement MCP discovery registry and consolidated RESTful routes
1 parent b51ac0c commit 87cd4f4

19 files changed

Lines changed: 2864 additions & 15 deletions

.golangci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ linters:
2121
enable:
2222
- dupl
2323
- errcheck
24-
- exportloopref
24+
- copyloopvar
2525
- ginkgolinter
2626
- goconst
2727
- gocyclo

api/v1alpha1/error_rate_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ func TestParseErrorRate(t *testing.T) {
4949
{" 5%", 0, true},
5050
}
5151
for _, tc := range tests {
52-
tc := tc
5352
t.Run(tc.input, func(t *testing.T) {
5453
t.Parallel()
5554
got, err := agentraxv1alpha1.ParseErrorRate(tc.input)

cmd/main.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ limitations under the License.
1818
package main
1919

2020
import (
21+
"context"
2122
"crypto/tls"
23+
"errors"
2224
"flag"
25+
"net/http"
2326
"os"
2427
"time"
2528

@@ -35,6 +38,7 @@ import (
3538
ctrl "sigs.k8s.io/controller-runtime"
3639
"sigs.k8s.io/controller-runtime/pkg/healthz"
3740
"sigs.k8s.io/controller-runtime/pkg/log/zap"
41+
"sigs.k8s.io/controller-runtime/pkg/manager"
3842
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
3943
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
4044
"sigs.k8s.io/controller-runtime/pkg/webhook"
@@ -46,6 +50,7 @@ import (
4650
"github.com/gitcommitankit/agentrax/internal/controller"
4751
"github.com/gitcommitankit/agentrax/internal/metrics"
4852
"github.com/gitcommitankit/agentrax/internal/quota"
53+
"github.com/gitcommitankit/agentrax/internal/registry"
4954
"github.com/gitcommitankit/agentrax/internal/rollout"
5055
agentraxwebhook "github.com/gitcommitankit/agentrax/internal/webhook"
5156
// +kubebuilder:scaffold:imports
@@ -68,6 +73,8 @@ func init() {
6873
// +kubebuilder:scaffold:scheme
6974
}
7075

76+
// +kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;create;update;patch
77+
7178
// main is the entrypoint for the Agentrax controller manager binary.
7279
func main() {
7380
var metricsAddr string
@@ -79,6 +86,7 @@ func main() {
7986
var prometheusURL string
8087
var gatewayName string
8188
var gatewayNamespace string
89+
var registryAddr string
8290
var tlsOpts []func(*tls.Config)
8391
flag.StringVar(&metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+
8492
"Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service.")
@@ -99,6 +107,8 @@ func main() {
99107
"Name of the Gateway API Gateway object used for canary traffic splitting.")
100108
flag.StringVar(&gatewayNamespace, "gateway-namespace", "agentrax-system",
101109
"Namespace of the Gateway API Gateway object used for canary traffic splitting.")
110+
flag.StringVar(&registryAddr, "registry-bind-address", ":9090",
111+
"The address the MCP discovery registry HTTP endpoint binds to.")
102112
opts := zap.Options{
103113
Development: true,
104114
}
@@ -204,12 +214,47 @@ func main() {
204214
setupLog.Info("canary rollout disabled (no --prometheus-url)")
205215
}
206216

207-
if err = (&controller.AgentDeploymentReconciler{
217+
// Initialize MCP discovery registry and registrar.
218+
mcpRegistry := registry.NewRegistry(mgr.GetClient(), "agentrax-system", registry.DefaultTTL)
219+
mcpRegistrar := registry.NewRegistrar(mcpRegistry, registry.NewHTTPMCPClient())
220+
221+
if registryAddr != "" && registryAddr != "0" {
222+
if err := mgr.Add(manager.RunnableFunc(func(ctx context.Context) error {
223+
mcpRegistry.Start(ctx)
224+
srv := &http.Server{
225+
Addr: registryAddr,
226+
Handler: mcpRegistry.Handler(),
227+
}
228+
go func() {
229+
<-ctx.Done()
230+
_ = srv.Shutdown(context.Background())
231+
}()
232+
setupLog.Info("starting MCP discovery registry server", "addr", registryAddr)
233+
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
234+
return err
235+
}
236+
return nil
237+
})); err != nil {
238+
setupLog.Error(err, "unable to add registry server to manager")
239+
os.Exit(1)
240+
}
241+
}
242+
243+
agentDeploymentReconciler := &controller.AgentDeploymentReconciler{
208244
Client: mgr.GetClient(),
209245
Scheme: mgr.GetScheme(),
210246
GPUResourceName: gpuResourceName,
211247
CanaryController: canaryController,
212-
}).SetupWithManager(mgr); err != nil {
248+
Registrar: mcpRegistrar,
249+
}
250+
agentDeploymentReconciler.SetDeregister(func(ctx context.Context, ad *agentraxv1alpha1.AgentDeployment) error {
251+
return mcpRegistrar.Deregister(ctx, ad)
252+
})
253+
if canaryController != nil {
254+
canaryController.Registrar = mcpRegistrar
255+
}
256+
257+
if err = agentDeploymentReconciler.SetupWithManager(mgr); err != nil {
213258
setupLog.Error(err, "unable to create controller", "controller", "AgentDeployment")
214259
os.Exit(1)
215260
}

config/manager/kustomization.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
resources:
22
- manager.yaml
3+
- registry_service.yaml
4+
apiVersion: kustomize.config.k8s.io/v1beta1
5+
kind: Kustomization
6+
images:
7+
- name: controller
8+
newName: controller
9+
newTag: latest
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: agentrax-registry
5+
namespace: system
6+
labels:
7+
app.kubernetes.io/name: agentrax
8+
app.kubernetes.io/component: registry
9+
spec:
10+
selector:
11+
control-plane: controller-manager
12+
ports:
13+
- name: registry
14+
port: 9090
15+
targetPort: 9090
16+
protocol: TCP
17+
type: ClusterIP

config/rbac/role.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@ kind: ClusterRole
44
metadata:
55
name: manager-role
66
rules:
7+
- apiGroups:
8+
- ""
9+
resources:
10+
- configmaps
11+
verbs:
12+
- create
13+
- get
14+
- list
15+
- patch
16+
- update
17+
- watch
718
- apiGroups:
819
- agentrax.io
920
resources:

0 commit comments

Comments
 (0)