1
1
package mcp
2
2
3
3
import (
4
+ "context"
4
5
"encoding/base64"
5
6
"github.com/mark3labs/mcp-go/mcp"
6
7
corev1 "k8s.io/api/core/v1"
8
+ "k8s.io/apimachinery/pkg/api/errors"
7
9
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10
+ "k8s.io/client-go/kubernetes"
8
11
"path/filepath"
9
12
"runtime"
10
13
"sigs.k8s.io/yaml"
@@ -58,13 +61,7 @@ func TestHelmList(t *testing.T) {
58
61
testCase (t , func (c * mcpContext ) {
59
62
c .withEnvTest ()
60
63
kc := c .newKubernetesClient ()
61
- secrets , err := kc .CoreV1 ().Secrets ("default" ).List (c .ctx , metav1.ListOptions {})
62
- for _ , secret := range secrets .Items {
63
- if strings .HasPrefix (secret .Name , "sh.helm.release.v1." ) {
64
- _ = kc .CoreV1 ().Secrets ("default" ).Delete (c .ctx , secret .Name , metav1.DeleteOptions {})
65
- }
66
- }
67
- _ = kc .CoreV1 ().Secrets ("default" ).Delete (c .ctx , "release-to-list" , metav1.DeleteOptions {})
64
+ clearHelmReleases (c .ctx , kc )
68
65
toolResult , err := c .callTool ("helm_list" , map [string ]interface {}{})
69
66
t .Run ("helm_list with no releases, returns not found" , func (t * testing.T ) {
70
67
if err != nil {
@@ -79,8 +76,8 @@ func TestHelmList(t *testing.T) {
79
76
})
80
77
_ , _ = kc .CoreV1 ().Secrets ("default" ).Create (c .ctx , & corev1.Secret {
81
78
ObjectMeta : metav1.ObjectMeta {
82
- Name : "release-to-list" ,
83
- Labels : map [string ]string {"owner" : "helm" },
79
+ Name : "sh.helm.release.v1. release-to-list" ,
80
+ Labels : map [string ]string {"owner" : "helm" , "name" : "release-to-list" },
84
81
},
85
82
Data : map [string ][]byte {
86
83
"release" : []byte (base64 .StdEncoding .EncodeToString ([]byte ("{" +
@@ -149,3 +146,64 @@ func TestHelmList(t *testing.T) {
149
146
})
150
147
})
151
148
}
149
+
150
+ func TestHelmUninstall (t * testing.T ) {
151
+ testCase (t , func (c * mcpContext ) {
152
+ c .withEnvTest ()
153
+ kc := c .newKubernetesClient ()
154
+ clearHelmReleases (c .ctx , kc )
155
+ toolResult , err := c .callTool ("helm_uninstall" , map [string ]interface {}{
156
+ "name" : "release-to-uninstall" ,
157
+ })
158
+ t .Run ("helm_uninstall with no releases, returns not found" , func (t * testing.T ) {
159
+ if err != nil {
160
+ t .Fatalf ("call tool failed %v" , err )
161
+ }
162
+ if toolResult .IsError {
163
+ t .Fatalf ("call tool failed" )
164
+ }
165
+ if toolResult .Content [0 ].(mcp.TextContent ).Text != "Release release-to-uninstall not found" {
166
+ t .Fatalf ("unexpected result %v" , toolResult .Content [0 ].(mcp.TextContent ).Text )
167
+ }
168
+ })
169
+ _ , _ = kc .CoreV1 ().Secrets ("default" ).Create (c .ctx , & corev1.Secret {
170
+ ObjectMeta : metav1.ObjectMeta {
171
+ Name : "sh.helm.release.v1.existent-release-to-uninstall.v0" ,
172
+ Labels : map [string ]string {"owner" : "helm" , "name" : "existent-release-to-uninstall" },
173
+ },
174
+ Data : map [string ][]byte {
175
+ "release" : []byte (base64 .StdEncoding .EncodeToString ([]byte ("{" +
176
+ "\" name\" :\" existent-release-to-uninstall\" ," +
177
+ "\" info\" :{\" status\" :\" deployed\" }" +
178
+ "}" ))),
179
+ },
180
+ }, metav1.CreateOptions {})
181
+ toolResult , err = c .callTool ("helm_uninstall" , map [string ]interface {}{
182
+ "name" : "existent-release-to-uninstall" ,
183
+ })
184
+ t .Run ("helm_uninstall with deployed release, returns uninstalled" , func (t * testing.T ) {
185
+ if err != nil {
186
+ t .Fatalf ("call tool failed %v" , err )
187
+ }
188
+ if toolResult .IsError {
189
+ t .Fatalf ("call tool failed" )
190
+ }
191
+ if ! strings .HasPrefix (toolResult .Content [0 ].(mcp.TextContent ).Text , "Uninstalled release existent-release-to-uninstall" ) {
192
+ t .Fatalf ("unexpected result %v" , toolResult .Content [0 ].(mcp.TextContent ).Text )
193
+ }
194
+ _ , err = kc .CoreV1 ().Secrets ("default" ).Get (c .ctx , "sh.helm.release.v1.existent-release-to-uninstall.v0" , metav1.GetOptions {})
195
+ if ! errors .IsNotFound (err ) {
196
+ t .Fatalf ("expected release to be deleted, but it still exists" )
197
+ }
198
+ })
199
+ })
200
+ }
201
+
202
+ func clearHelmReleases (ctx context.Context , kc * kubernetes.Clientset ) {
203
+ secrets , _ := kc .CoreV1 ().Secrets ("default" ).List (ctx , metav1.ListOptions {})
204
+ for _ , secret := range secrets .Items {
205
+ if strings .HasPrefix (secret .Name , "sh.helm.release.v1." ) {
206
+ _ = kc .CoreV1 ().Secrets ("default" ).Delete (ctx , secret .Name , metav1.DeleteOptions {})
207
+ }
208
+ }
209
+ }
0 commit comments