@@ -6,81 +6,38 @@ import (
6
6
"github.com/mark3labs/mcp-go/mcp"
7
7
"github.com/mark3labs/mcp-go/server"
8
8
"github.com/spf13/afero"
9
+ "k8s.io/client-go/kubernetes"
9
10
"k8s.io/client-go/rest"
10
11
"k8s.io/client-go/tools/clientcmd"
11
12
"k8s.io/client-go/tools/clientcmd/api"
12
13
"net/http/httptest"
13
14
"os"
14
15
"path/filepath"
15
16
"runtime"
16
- "testing"
17
-
18
17
"sigs.k8s.io/controller-runtime/pkg/envtest"
19
18
"sigs.k8s.io/controller-runtime/tools/setup-envtest/env"
20
19
"sigs.k8s.io/controller-runtime/tools/setup-envtest/remote"
21
20
"sigs.k8s.io/controller-runtime/tools/setup-envtest/store"
22
21
"sigs.k8s.io/controller-runtime/tools/setup-envtest/versions"
23
22
"sigs.k8s.io/controller-runtime/tools/setup-envtest/workflows"
23
+ "testing"
24
24
)
25
25
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
-
73
26
type mcpContext struct {
74
27
ctx context.Context
28
+ tempDir string
75
29
testServer * httptest.Server
76
30
cancel context.CancelFunc
77
31
mcpClient * client.SSEMCPClient
32
+ envTest * envtest.Environment
78
33
}
79
34
80
35
func (c * mcpContext ) beforeEach (t * testing.T ) {
81
36
var err error
82
- c .testServer = server .NewTestServer (NewSever ().server )
83
37
c .ctx , c .cancel = context .WithCancel (context .Background ())
38
+ c .tempDir = t .TempDir ()
39
+ c .withKubeConfig (nil )
40
+ c .testServer = server .NewTestServer (NewSever ().server )
84
41
if c .mcpClient , err = client .NewSSEMCPClient (c .testServer .URL + "/sse" ); err != nil {
85
42
t .Fatal (err )
86
43
return
@@ -100,6 +57,9 @@ func (c *mcpContext) beforeEach(t *testing.T) {
100
57
}
101
58
102
59
func (c * mcpContext ) afterEach () {
60
+ if c .envTest != nil {
61
+ _ = c .envTest .Stop ()
62
+ }
103
63
c .cancel ()
104
64
_ = c .mcpClient .Close ()
105
65
c .testServer .Close ()
@@ -113,3 +73,68 @@ func testCase(test func(t *testing.T, c *mcpContext)) func(*testing.T) {
113
73
test (t , mcpCtx )
114
74
}
115
75
}
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