@@ -7,23 +7,50 @@ import (
77 "testing"
88)
99
10- func TestPodsTop (t * testing.T ) {
10+ func TestPodsTopMetricsUnavailable (t * testing.T ) {
1111 testCase (t , func (c * mcpContext ) {
1212 mockServer := NewMockServer ()
1313 defer mockServer .Close ()
1414 c .withKubeConfig (mockServer .config )
15- metricsApiAvailable := false
1615 mockServer .Handle (http .HandlerFunc (func (w http.ResponseWriter , req * http.Request ) {
17- println ("Request received:" , req .Method , req .URL .Path ) // TODO: REMOVE LINE
1816 w .Header ().Set ("Content-Type" , "application/json" )
1917 // Request Performed by DiscoveryClient to Kube API (Get API Groups legacy -core-)
2018 if req .URL .Path == "/api" {
21- if ! metricsApiAvailable {
19+ _ , _ = w .Write ([]byte (`{"kind":"APIVersions","versions":[],"serverAddressByClientCIDRs":[{"clientCIDR":"0.0.0.0/0"}]}` ))
20+ return
21+ }
22+ // Request Performed by DiscoveryClient to Kube API (Get API Groups)
23+ if req .URL .Path == "/apis" {
24+ _ , _ = w .Write ([]byte (`{"kind":"APIGroupList","apiVersion":"v1","groups":[]}` ))
25+ return
26+ }
27+ }))
28+ podsTopMetricsApiUnavailable , err := c .callTool ("pods_top" , map [string ]interface {}{})
29+ t .Run ("pods_top with metrics API not available" , func (t * testing.T ) {
30+ if err != nil {
31+ t .Fatalf ("call tool failed %v" , err )
32+ }
33+ if ! podsTopMetricsApiUnavailable .IsError {
34+ t .Errorf ("call tool should have returned an error" )
35+ }
36+ if podsTopMetricsApiUnavailable .Content [0 ].(mcp.TextContent ).Text != "failed to get pods top: metrics API is not available" {
37+ t .Errorf ("call tool returned unexpected content: %s" , podsTopMetricsApiUnavailable .Content [0 ].(mcp.TextContent ).Text )
38+ }
39+ })
40+ })
41+ }
2242
23- _ , _ = w .Write ([]byte (`{"kind":"APIVersions","versions":[],"serverAddressByClientCIDRs":[{"clientCIDR":"0.0.0.0/0"}]}` ))
24- } else {
25- _ , _ = w .Write ([]byte (`{"kind":"APIVersions","versions":["metrics.k8s.io/v1beta1"],"serverAddressByClientCIDRs":[{"clientCIDR":"0.0.0.0/0"}]}` ))
26- }
43+ func TestPodsTopMetricsAvailable (t * testing.T ) {
44+ testCase (t , func (c * mcpContext ) {
45+ mockServer := NewMockServer ()
46+ defer mockServer .Close ()
47+ c .withKubeConfig (mockServer .config )
48+ mockServer .Handle (http .HandlerFunc (func (w http.ResponseWriter , req * http.Request ) {
49+ println ("Request received:" , req .Method , req .URL .Path ) // TODO: REMOVE LINE
50+ w .Header ().Set ("Content-Type" , "application/json" )
51+ // Request Performed by DiscoveryClient to Kube API (Get API Groups legacy -core-)
52+ if req .URL .Path == "/api" {
53+ _ , _ = w .Write ([]byte (`{"kind":"APIVersions","versions":["metrics.k8s.io/v1beta1"],"serverAddressByClientCIDRs":[{"clientCIDR":"0.0.0.0/0"}]}` ))
2754 return
2855 }
2956 // Request Performed by DiscoveryClient to Kube API (Get API Groups)
@@ -32,12 +59,12 @@ func TestPodsTop(t *testing.T) {
3259 return
3360 }
3461 // Request Performed by DiscoveryClient to Kube API (Get API Resources)
35- if metricsApiAvailable && req .URL .Path == "/apis/metrics.k8s.io/v1beta1" {
62+ if req .URL .Path == "/apis/metrics.k8s.io/v1beta1" {
3663 _ , _ = w .Write ([]byte (`{"kind":"APIResourceList","apiVersion":"v1","groupVersion":"metrics.k8s.io/v1beta1","resources":[{"name":"pods","singularName":"","namespaced":true,"kind":"PodMetrics","verbs":["get","list"]}]}` ))
3764 return
3865 }
3966 // Pod Metrics from all namespaces
40- if metricsApiAvailable && req .URL .Path == "/apis/metrics.k8s.io/v1beta1/pods" {
67+ if req .URL .Path == "/apis/metrics.k8s.io/v1beta1/pods" {
4168 if req .URL .Query ().Get ("labelSelector" ) == "app=pod-ns-5-42" {
4269 _ , _ = w .Write ([]byte (`{"kind":"PodMetricsList","apiVersion":"metrics.k8s.io/v1beta1","items":[` +
4370 `{"metadata":{"name":"pod-ns-5-42","namespace":"ns-5"},"containers":[{"name":"container-1","usage":{"cpu":"42m","memory":"42Mi"}}]}` +
@@ -52,42 +79,27 @@ func TestPodsTop(t *testing.T) {
5279 return
5380 }
5481 // Pod Metrics from configured namespace
55- if metricsApiAvailable && req .URL .Path == "/apis/metrics.k8s.io/v1beta1/namespaces/default/pods" {
82+ if req .URL .Path == "/apis/metrics.k8s.io/v1beta1/namespaces/default/pods" {
5683 _ , _ = w .Write ([]byte (`{"kind":"PodMetricsList","apiVersion":"metrics.k8s.io/v1beta1","items":[` +
5784 `{"metadata":{"name":"pod-1","namespace":"default"},"containers":[{"name":"container-1","usage":{"cpu":"10m","memory":"20Mi"}},{"name":"container-2","usage":{"cpu":"30m","memory":"40Mi"}}]}` +
5885 `]}` ))
5986 return
6087 }
6188 // Pod Metrics from ns-5 namespace
62- if metricsApiAvailable && req .URL .Path == "/apis/metrics.k8s.io/v1beta1/namespaces/ns-5/pods" {
89+ if req .URL .Path == "/apis/metrics.k8s.io/v1beta1/namespaces/ns-5/pods" {
6390 _ , _ = w .Write ([]byte (`{"kind":"PodMetricsList","apiVersion":"metrics.k8s.io/v1beta1","items":[` +
6491 `{"metadata":{"name":"pod-ns-5-1","namespace":"ns-5"},"containers":[{"name":"container-1","usage":{"cpu":"10m","memory":"20Mi"}}]}` +
6592 `]}` ))
6693 return
6794 }
6895 // Pod Metrics from ns-5 namespace with pod-ns-5-5 pod name
69- if metricsApiAvailable && req .URL .Path == "/apis/metrics.k8s.io/v1beta1/namespaces/ns-5/pods/pod-ns-5-5" {
96+ if req .URL .Path == "/apis/metrics.k8s.io/v1beta1/namespaces/ns-5/pods/pod-ns-5-5" {
7097 _ , _ = w .Write ([]byte (`{"kind":"PodMetrics","apiVersion":"metrics.k8s.io/v1beta1",` +
7198 `"metadata":{"name":"pod-ns-5-5","namespace":"ns-5"},` +
7299 `"containers":[{"name":"container-1","usage":{"cpu":"13m","memory":"37Mi"}}]` +
73100 `}` ))
74101 }
75102 }))
76- podsTopMetricsApiUnavailable , err := c .callTool ("pods_top" , map [string ]interface {}{})
77- t .Run ("pods_top with metrics API not available" , func (t * testing.T ) {
78- if err != nil {
79- t .Fatalf ("call tool failed %v" , err )
80- }
81- if ! podsTopMetricsApiUnavailable .IsError {
82- t .Errorf ("call tool should have returned an error" )
83- }
84- if podsTopMetricsApiUnavailable .Content [0 ].(mcp.TextContent ).Text != "failed to get pods top: metrics API is not available" {
85- t .Errorf ("call tool returned unexpected content: %s" , podsTopMetricsApiUnavailable .Content [0 ].(mcp.TextContent ).Text )
86- }
87- })
88- // Enable metrics API addon
89- metricsApiAvailable = true
90- c .mcpServer .k .Derived (t .Context ()).CacheInvalidate () // Force discovery client to refresh
91103 podsTopDefaults , err := c .callTool ("pods_top" , map [string ]interface {}{})
92104 t .Run ("pods_top defaults returns pod metrics from all namespaces" , func (t * testing.T ) {
93105 if err != nil {
0 commit comments