Skip to content

Commit 6e29a2a

Browse files
committed
feat(pods): update metrics to comply with new API
Signed-off-by: Marc Nuri <[email protected]>
1 parent 22de31d commit 6e29a2a

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-20
lines changed

pkg/mcp/pods_top_test.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ func TestPodsTopMetricsAvailable(t *testing.T) {
7171
if req.URL.Path == "/apis/metrics.k8s.io/v1beta1/pods" {
7272
if req.URL.Query().Get("labelSelector") == "app=pod-ns-5-42" {
7373
_, _ = w.Write([]byte(`{"kind":"PodMetricsList","apiVersion":"metrics.k8s.io/v1beta1","items":[` +
74-
`{"metadata":{"name":"pod-ns-5-42","namespace":"ns-5"},"containers":[{"name":"container-1","usage":{"cpu":"42m","memory":"42Mi"}}]}` +
74+
`{"metadata":{"name":"pod-ns-5-42","namespace":"ns-5"},"containers":[{"name":"container-1","usage":{"cpu":"42m","memory":"42Mi","swap":"42Mi"}}]}` +
7575
`]}`))
7676
} else {
7777
_, _ = w.Write([]byte(`{"kind":"PodMetricsList","apiVersion":"metrics.k8s.io/v1beta1","items":[` +
78-
`{"metadata":{"name":"pod-1","namespace":"default"},"containers":[{"name":"container-1","usage":{"cpu":"100m","memory":"200Mi"}},{"name":"container-2","usage":{"cpu":"200m","memory":"300Mi"}}]},` +
79-
`{"metadata":{"name":"pod-2","namespace":"ns-1"},"containers":[{"name":"container-1-ns-1","usage":{"cpu":"300m","memory":"400Mi"}}]}` +
78+
`{"metadata":{"name":"pod-1","namespace":"default"},"containers":[{"name":"container-1","usage":{"cpu":"100m","memory":"200Mi","swap":"13Mi"}},{"name":"container-2","usage":{"cpu":"200m","memory":"300Mi","swap":"37Mi"}}]},` +
79+
`{"metadata":{"name":"pod-2","namespace":"ns-1"},"containers":[{"name":"container-1-ns-1","usage":{"cpu":"300m","memory":"400Mi","swap":"42Mi"}}]}` +
8080
`]}`))
8181

8282
}
@@ -85,22 +85,22 @@ func TestPodsTopMetricsAvailable(t *testing.T) {
8585
// Pod Metrics from configured namespace
8686
if req.URL.Path == "/apis/metrics.k8s.io/v1beta1/namespaces/default/pods" {
8787
_, _ = w.Write([]byte(`{"kind":"PodMetricsList","apiVersion":"metrics.k8s.io/v1beta1","items":[` +
88-
`{"metadata":{"name":"pod-1","namespace":"default"},"containers":[{"name":"container-1","usage":{"cpu":"10m","memory":"20Mi"}},{"name":"container-2","usage":{"cpu":"30m","memory":"40Mi"}}]}` +
88+
`{"metadata":{"name":"pod-1","namespace":"default"},"containers":[{"name":"container-1","usage":{"cpu":"10m","memory":"20Mi","swap":"13Mi"}},{"name":"container-2","usage":{"cpu":"30m","memory":"40Mi","swap":"37Mi"}}]}` +
8989
`]}`))
9090
return
9191
}
9292
// Pod Metrics from ns-5 namespace
9393
if req.URL.Path == "/apis/metrics.k8s.io/v1beta1/namespaces/ns-5/pods" {
9494
_, _ = w.Write([]byte(`{"kind":"PodMetricsList","apiVersion":"metrics.k8s.io/v1beta1","items":[` +
95-
`{"metadata":{"name":"pod-ns-5-1","namespace":"ns-5"},"containers":[{"name":"container-1","usage":{"cpu":"10m","memory":"20Mi"}}]}` +
95+
`{"metadata":{"name":"pod-ns-5-1","namespace":"ns-5"},"containers":[{"name":"container-1","usage":{"cpu":"10m","memory":"20Mi","swap":"42Mi"}}]}` +
9696
`]}`))
9797
return
9898
}
9999
// Pod Metrics from ns-5 namespace with pod-ns-5-5 pod name
100100
if req.URL.Path == "/apis/metrics.k8s.io/v1beta1/namespaces/ns-5/pods/pod-ns-5-5" {
101101
_, _ = w.Write([]byte(`{"kind":"PodMetrics","apiVersion":"metrics.k8s.io/v1beta1",` +
102102
`"metadata":{"name":"pod-ns-5-5","namespace":"ns-5"},` +
103-
`"containers":[{"name":"container-1","usage":{"cpu":"13m","memory":"37Mi"}}]` +
103+
`"containers":[{"name":"container-1","usage":{"cpu":"13m","memory":"37Mi","swap":"42Mi"}}]` +
104104
`}`))
105105
}
106106
}))
@@ -113,21 +113,21 @@ func TestPodsTopMetricsAvailable(t *testing.T) {
113113
if podsTopDefaults.IsError {
114114
t.Fatalf("call tool failed %s", textContent)
115115
}
116-
expectedHeaders := regexp.MustCompile(`(?m)^\s*NAMESPACE\s+POD\s+NAME\s+CPU\(cores\)\s+MEMORY\(bytes\)\s*$`)
116+
expectedHeaders := regexp.MustCompile(`(?m)^\s*NAMESPACE\s+POD\s+NAME\s+CPU\(cores\)\s+MEMORY\(bytes\)\s+SWAP\(bytes\)\s*$`)
117117
if !expectedHeaders.MatchString(textContent) {
118118
t.Errorf("Expected headers '%s' not found in output:\n%s", expectedHeaders.String(), textContent)
119119
}
120120
expectedRows := []string{
121-
"default\\s+pod-1\\s+container-1\\s+100m\\s+200Mi",
122-
"default\\s+pod-1\\s+container-2\\s+200m\\s+300Mi",
123-
"ns-1\\s+pod-2\\s+container-1-ns-1\\s+300m\\s+400Mi",
121+
"default\\s+pod-1\\s+container-1\\s+100m\\s+200Mi\\s+13Mi",
122+
"default\\s+pod-1\\s+container-2\\s+200m\\s+300Mi\\s+37Mi",
123+
"ns-1\\s+pod-2\\s+container-1-ns-1\\s+300m\\s+400Mi\\s+42Mi",
124124
}
125125
for _, row := range expectedRows {
126126
if !regexp.MustCompile(row).MatchString(textContent) {
127127
t.Errorf("Expected row '%s' not found in output:\n%s", row, textContent)
128128
}
129129
}
130-
expectedTotal := regexp.MustCompile(`(?m)^\s+600m\s+900Mi\s*$`)
130+
expectedTotal := regexp.MustCompile(`(?m)^\s+600m\s+900Mi\s+92Mi\s*$`)
131131
if !expectedTotal.MatchString(textContent) {
132132
t.Errorf("Expected total row '%s' not found in output:\n%s", expectedTotal.String(), textContent)
133133
}
@@ -141,15 +141,15 @@ func TestPodsTopMetricsAvailable(t *testing.T) {
141141
}
142142
textContent := podsTopConfiguredNamespace.Content[0].(mcp.TextContent).Text
143143
expectedRows := []string{
144-
"default\\s+pod-1\\s+container-1\\s+10m\\s+20Mi",
145-
"default\\s+pod-1\\s+container-2\\s+30m\\s+40Mi",
144+
"default\\s+pod-1\\s+container-1\\s+10m\\s+20Mi\\s+13Mi",
145+
"default\\s+pod-1\\s+container-2\\s+30m\\s+40Mi\\s+37Mi",
146146
}
147147
for _, row := range expectedRows {
148148
if !regexp.MustCompile(row).MatchString(textContent) {
149149
t.Errorf("Expected row '%s' not found in output:\n%s", row, textContent)
150150
}
151151
}
152-
expectedTotal := regexp.MustCompile(`(?m)^\s+40m\s+60Mi\s*$`)
152+
expectedTotal := regexp.MustCompile(`(?m)^\s+40m\s+60Mi\s+50Mi\s*$`)
153153
if !expectedTotal.MatchString(textContent) {
154154
t.Errorf("Expected total row '%s' not found in output:\n%s", expectedTotal.String(), textContent)
155155
}
@@ -162,11 +162,11 @@ func TestPodsTopMetricsAvailable(t *testing.T) {
162162
t.Fatalf("call tool failed %v", err)
163163
}
164164
textContent := podsTopNamespace.Content[0].(mcp.TextContent).Text
165-
expectedRow := regexp.MustCompile(`ns-5\s+pod-ns-5-1\s+container-1\s+10m\s+20Mi`)
165+
expectedRow := regexp.MustCompile(`ns-5\s+pod-ns-5-1\s+container-1\s+10m\s+20Mi\s+42Mi`)
166166
if !expectedRow.MatchString(textContent) {
167167
t.Errorf("Expected row '%s' not found in output:\n%s", expectedRow.String(), textContent)
168168
}
169-
expectedTotal := regexp.MustCompile(`(?m)^\s+10m\s+20Mi\s*$`)
169+
expectedTotal := regexp.MustCompile(`(?m)^\s+10m\s+20Mi\s+42Mi\s*$`)
170170
if !expectedTotal.MatchString(textContent) {
171171
t.Errorf("Expected total row '%s' not found in output:\n%s", expectedTotal.String(), textContent)
172172
}
@@ -180,11 +180,11 @@ func TestPodsTopMetricsAvailable(t *testing.T) {
180180
t.Fatalf("call tool failed %v", err)
181181
}
182182
textContent := podsTopNamespaceName.Content[0].(mcp.TextContent).Text
183-
expectedRow := regexp.MustCompile(`ns-5\s+pod-ns-5-5\s+container-1\s+13m\s+37Mi`)
183+
expectedRow := regexp.MustCompile(`ns-5\s+pod-ns-5-5\s+container-1\s+13m\s+37Mi\s+42Mi`)
184184
if !expectedRow.MatchString(textContent) {
185185
t.Errorf("Expected row '%s' not found in output:\n%s", expectedRow.String(), textContent)
186186
}
187-
expectedTotal := regexp.MustCompile(`(?m)^\s+13m\s+37Mi\s*$`)
187+
expectedTotal := regexp.MustCompile(`(?m)^\s+13m\s+37Mi\s+42Mi\s*$`)
188188
if !expectedTotal.MatchString(textContent) {
189189
t.Errorf("Expected total row '%s' not found in output:\n%s", expectedTotal.String(), textContent)
190190
}
@@ -201,7 +201,7 @@ func TestPodsTopMetricsAvailable(t *testing.T) {
201201
if !expectedRow.MatchString(textContent) {
202202
t.Errorf("Expected row '%s' not found in output:\n%s", expectedRow.String(), textContent)
203203
}
204-
expectedTotal := regexp.MustCompile(`(?m)^\s+42m\s+42Mi\s*$`)
204+
expectedTotal := regexp.MustCompile(`(?m)^\s+42m\s+42Mi\s+42Mi\s*$`)
205205
if !expectedTotal.MatchString(textContent) {
206206
t.Errorf("Expected total row '%s' not found in output:\n%s", expectedTotal.String(), textContent)
207207
}

pkg/toolsets/core/pods.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ func podsTop(params api.ToolHandlerParams) (*api.ToolCallResult, error) {
337337
return api.NewToolCallResult("", fmt.Errorf("failed to get pods top: %v", err)), nil
338338
}
339339
buf := new(bytes.Buffer)
340-
printer := metricsutil.NewTopCmdPrinter(buf)
340+
printer := metricsutil.NewTopCmdPrinter(buf, true)
341341
err = printer.PrintPodMetrics(ret.Items, true, true, false, "", true)
342342
if err != nil {
343343
return api.NewToolCallResult("", fmt.Errorf("failed to get pods top: %v", err)), nil

0 commit comments

Comments
 (0)