@@ -6,81 +6,38 @@ import (
66 "github.com/mark3labs/mcp-go/mcp"
77 "github.com/mark3labs/mcp-go/server"
88 "github.com/spf13/afero"
9+ "k8s.io/client-go/kubernetes"
910 "k8s.io/client-go/rest"
1011 "k8s.io/client-go/tools/clientcmd"
1112 "k8s.io/client-go/tools/clientcmd/api"
1213 "net/http/httptest"
1314 "os"
1415 "path/filepath"
1516 "runtime"
16- "testing"
17-
1817 "sigs.k8s.io/controller-runtime/pkg/envtest"
1918 "sigs.k8s.io/controller-runtime/tools/setup-envtest/env"
2019 "sigs.k8s.io/controller-runtime/tools/setup-envtest/remote"
2120 "sigs.k8s.io/controller-runtime/tools/setup-envtest/store"
2221 "sigs.k8s.io/controller-runtime/tools/setup-envtest/versions"
2322 "sigs.k8s.io/controller-runtime/tools/setup-envtest/workflows"
23+ "testing"
2424)
2525
26- func setupEnvTest () * envtest.Environment {
27- envTestDir , err := store .DefaultStoreDir ()
28- if err != nil {
29- panic (err )
30- }
31- envTest := & env.Env {
32- FS : afero.Afero {Fs : afero .NewOsFs ()},
33- Out : os .Stdout ,
34- Client : & remote.HTTPClient {
35- IndexURL : remote .DefaultIndexURL ,
36- },
37- Platform : versions.PlatformItem {
38- Platform : versions.Platform {
39- OS : runtime .GOOS ,
40- Arch : runtime .GOARCH ,
41- },
42- },
43- Version : versions .AnyVersion ,
44- Store : store .NewAt (envTestDir ),
45- }
46- envTest .CheckCoherence ()
47- workflows.Use {}.Do (envTest )
48- versionDir := envTest .Platform .Platform .BaseName (* envTest .Version .AsConcrete ())
49- return & envtest.Environment {
50- BinaryAssetsDirectory : filepath .Join (envTestDir , "k8s" , versionDir ),
51- }
52- }
53-
54- func withKubeConfig (t * testing.T , c * rest.Config ) * api.Config {
55- fakeConfig := api .NewConfig ()
56- fakeConfig .CurrentContext = "fake-context"
57- fakeConfig .Clusters ["fake" ] = api .NewCluster ()
58- fakeConfig .Clusters ["fake" ].Server = c .Host
59- fakeConfig .Clusters ["fake" ].CertificateAuthorityData = c .TLSClientConfig .CAData
60- fakeConfig .Contexts ["fake-context" ] = api .NewContext ()
61- fakeConfig .Contexts ["fake-context" ].Cluster = "fake"
62- fakeConfig .Contexts ["fake-context" ].AuthInfo = "fake"
63- fakeConfig .AuthInfos ["fake" ] = api .NewAuthInfo ()
64- fakeConfig .AuthInfos ["fake" ].ClientKeyData = c .TLSClientConfig .KeyData
65- fakeConfig .AuthInfos ["fake" ].ClientCertificateData = c .TLSClientConfig .CertData
66- dir := t .TempDir ()
67- kubeConfig := filepath .Join (dir , "config" )
68- clientcmd .WriteToFile (* fakeConfig , kubeConfig )
69- os .Setenv ("KUBECONFIG" , kubeConfig )
70- return fakeConfig
71- }
72-
7326type mcpContext struct {
7427 ctx context.Context
28+ tempDir string
7529 testServer * httptest.Server
7630 cancel context.CancelFunc
7731 mcpClient * client.SSEMCPClient
32+ envTest * envtest.Environment
7833}
7934
8035func (c * mcpContext ) beforeEach (t * testing.T ) {
8136 var err error
82- c .testServer = server .NewTestServer (NewSever ().server )
8337 c .ctx , c .cancel = context .WithCancel (context .Background ())
38+ c .tempDir = t .TempDir ()
39+ c .withKubeConfig (nil )
40+ c .testServer = server .NewTestServer (NewSever ().server )
8441 if c .mcpClient , err = client .NewSSEMCPClient (c .testServer .URL + "/sse" ); err != nil {
8542 t .Fatal (err )
8643 return
@@ -100,6 +57,9 @@ func (c *mcpContext) beforeEach(t *testing.T) {
10057}
10158
10259func (c * mcpContext ) afterEach () {
60+ if c .envTest != nil {
61+ _ = c .envTest .Stop ()
62+ }
10363 c .cancel ()
10464 _ = c .mcpClient .Close ()
10565 c .testServer .Close ()
@@ -113,3 +73,68 @@ func testCase(test func(t *testing.T, c *mcpContext)) func(*testing.T) {
11373 test (t , mcpCtx )
11474 }
11575}
76+
77+ func (c * mcpContext ) withKubeConfig (rc * rest.Config ) * api.Config {
78+ fakeConfig := api .NewConfig ()
79+ fakeConfig .CurrentContext = "fake-context"
80+ fakeConfig .Contexts ["fake-context" ] = api .NewContext ()
81+ fakeConfig .Contexts ["fake-context" ].Cluster = "fake"
82+ fakeConfig .Contexts ["fake-context" ].AuthInfo = "fake"
83+ fakeConfig .Clusters ["fake" ] = api .NewCluster ()
84+ fakeConfig .Clusters ["fake" ].Server = "https://example.com"
85+ fakeConfig .AuthInfos ["fake" ] = api .NewAuthInfo ()
86+ if rc != nil {
87+ fakeConfig .Clusters ["fake" ].Server = rc .Host
88+ fakeConfig .Clusters ["fake" ].CertificateAuthorityData = rc .TLSClientConfig .CAData
89+ fakeConfig .AuthInfos ["fake" ].ClientKeyData = rc .TLSClientConfig .KeyData
90+ fakeConfig .AuthInfos ["fake" ].ClientCertificateData = rc .TLSClientConfig .CertData
91+ }
92+ kubeConfig := filepath .Join (c .tempDir , "config" )
93+ _ = clientcmd .WriteToFile (* fakeConfig , kubeConfig )
94+ _ = os .Setenv ("KUBECONFIG" , kubeConfig )
95+ return fakeConfig
96+ }
97+
98+ func (c * mcpContext ) withEnvTest () {
99+ if c .envTest != nil {
100+ return
101+ }
102+ envTestDir , err := store .DefaultStoreDir ()
103+ if err != nil {
104+ panic (err )
105+ }
106+ envTest := & env.Env {
107+ FS : afero.Afero {Fs : afero .NewOsFs ()},
108+ Out : os .Stdout ,
109+ Client : & remote.HTTPClient {
110+ IndexURL : remote .DefaultIndexURL ,
111+ },
112+ Platform : versions.PlatformItem {
113+ Platform : versions.Platform {
114+ OS : runtime .GOOS ,
115+ Arch : runtime .GOARCH ,
116+ },
117+ },
118+ Version : versions .AnyVersion ,
119+ Store : store .NewAt (envTestDir ),
120+ }
121+ envTest .CheckCoherence ()
122+ workflows.Use {}.Do (envTest )
123+ versionDir := envTest .Platform .Platform .BaseName (* envTest .Version .AsConcrete ())
124+ c .envTest = & envtest.Environment {
125+ BinaryAssetsDirectory : filepath .Join (envTestDir , "k8s" , versionDir ),
126+ }
127+ restConfig , _ := c .envTest .Start ()
128+ c .withKubeConfig (restConfig )
129+ }
130+
131+ func (c * mcpContext ) newKubernetesClient () * kubernetes.Clientset {
132+ c .withEnvTest ()
133+ pathOptions := clientcmd .NewDefaultPathOptions ()
134+ cfg , _ := clientcmd .BuildConfigFromFlags ("" , pathOptions .GetDefaultFilename ())
135+ kubernetesClient , err := kubernetes .NewForConfig (cfg )
136+ if err != nil {
137+ panic (err )
138+ }
139+ return kubernetesClient
140+ }
0 commit comments