11package mcp
22
33import (
4+ "context"
45 "encoding/base64"
56 "github.com/mark3labs/mcp-go/mcp"
67 corev1 "k8s.io/api/core/v1"
8+ "k8s.io/apimachinery/pkg/api/errors"
79 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+ "k8s.io/client-go/kubernetes"
811 "path/filepath"
912 "runtime"
1013 "sigs.k8s.io/yaml"
@@ -58,13 +61,7 @@ func TestHelmList(t *testing.T) {
5861 testCase (t , func (c * mcpContext ) {
5962 c .withEnvTest ()
6063 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 )
6865 toolResult , err := c .callTool ("helm_list" , map [string ]interface {}{})
6966 t .Run ("helm_list with no releases, returns not found" , func (t * testing.T ) {
7067 if err != nil {
@@ -79,8 +76,8 @@ func TestHelmList(t *testing.T) {
7976 })
8077 _ , _ = kc .CoreV1 ().Secrets ("default" ).Create (c .ctx , & corev1.Secret {
8178 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" },
8481 },
8582 Data : map [string ][]byte {
8683 "release" : []byte (base64 .StdEncoding .EncodeToString ([]byte ("{" +
@@ -149,3 +146,64 @@ func TestHelmList(t *testing.T) {
149146 })
150147 })
151148}
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