11package mcp
22
33import (
4+ "bytes"
45 "context"
56 "encoding/base64"
7+ "flag"
68 "path/filepath"
79 "runtime"
10+ "strconv"
811 "strings"
912 "testing"
1013
@@ -15,16 +18,32 @@ import (
1518 "k8s.io/apimachinery/pkg/api/errors"
1619 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1720 "k8s.io/client-go/kubernetes"
21+ "k8s.io/klog/v2"
22+ "k8s.io/klog/v2/textlogger"
1823 "sigs.k8s.io/yaml"
1924)
2025
2126type HelmSuite struct {
2227 BaseMcpSuite
28+ klogState klog.State
29+ logBuffer bytes.Buffer
2330}
2431
2532func (s * HelmSuite ) SetupTest () {
2633 s .BaseMcpSuite .SetupTest ()
2734 clearHelmReleases (s .T ().Context (), kubernetes .NewForConfigOrDie (envTestRestConfig ))
35+
36+ // Capture log output to verify denied resource messages
37+ s .klogState = klog .CaptureState ()
38+ flags := flag .NewFlagSet ("test" , flag .ContinueOnError )
39+ klog .InitFlags (flags )
40+ _ = flags .Set ("v" , strconv .Itoa (5 ))
41+ klog .SetLogger (textlogger .NewLogger (textlogger .NewConfig (textlogger .Verbosity (5 ), textlogger .Output (& s .logBuffer ))))
42+ }
43+
44+ func (s * HelmSuite ) TearDownTest () {
45+ s .BaseMcpSuite .TearDownTest ()
46+ s .klogState .Restore ()
2847}
2948
3049func (s * HelmSuite ) TestHelmInstall () {
@@ -234,7 +253,7 @@ func (s *HelmSuite) TestHelmUninstall() {
234253
235254func (s * HelmSuite ) TestHelmUninstallDenied () {
236255 s .Require ().NoError (toml .Unmarshal ([]byte (`
237- denied_resources = [ { version = "v1", kind = "Secret " } ]
256+ denied_resources = [ { version = "v1", kind = "ConfigMap " } ]
238257 ` ), s .Cfg ), "Expected to parse denied resources config" )
239258 kc := kubernetes .NewForConfigOrDie (envTestRestConfig )
240259 _ , err := kc .CoreV1 ().Secrets ("default" ).Create (s .T ().Context (), & corev1.Secret {
@@ -246,7 +265,7 @@ func (s *HelmSuite) TestHelmUninstallDenied() {
246265 "release" : []byte (base64 .StdEncoding .EncodeToString ([]byte ("{" +
247266 "\" name\" :\" existent-release-to-uninstall\" ," +
248267 "\" info\" :{\" status\" :\" deployed\" }," +
249- "\" manifest\" :\" apiVersion: v1\\ nkind: Secret \\ nmetadata:\\ n name: secret -to-deny\\ n namespace: default\\ n\" " +
268+ "\" manifest\" :\" apiVersion: v1\\ nkind: ConfigMap \\ nmetadata:\\ n name: config-map -to-deny\\ n namespace: default\\ n\" " +
250269 "}" ))),
251270 },
252271 }, metav1.CreateOptions {})
@@ -260,10 +279,16 @@ func (s *HelmSuite) TestHelmUninstallDenied() {
260279 s .Truef (toolResult .IsError , "call tool should fail" )
261280 s .Nilf (err , "call tool should not return error object" )
262281 })
263- s .Run ("describes denial" , func () {
264- s .T ().Skipf ("Helm won't report what underlying resource caused the failure, so we can't assert on it" )
265- expectedMessage := "failed to uninstall release:(.+:)? resource not allowed: /v1, Kind=Secret"
266- s .Regexpf (expectedMessage , toolResult .Content [0 ].(mcp.TextContent ).Text , "expected descriptive error '%s', got %v" , expectedMessage , toolResult .Content [0 ].(mcp.TextContent ).Text )
282+ s .Run ("describes failure to uninstall" , func () {
283+ s .Contains (toolResult .Content [0 ].(mcp.TextContent ).Text ,
284+ "failed to uninstall helm chart 'existent-release-to-uninstall': failed to delete release: existent-release-to-uninstall" )
285+ })
286+ s .Run ("describes denial (in log)" , func () {
287+ msg := s .logBuffer .String ()
288+ s .Contains (msg , "resource not allowed:" )
289+ expectedMessage := "uninstall: Failed to delete release:(.+:)? resource not allowed: /v1, Kind=ConfigMap"
290+ s .Regexpf (expectedMessage , msg ,
291+ "expected descriptive error '%s', got %v" , expectedMessage , msg )
267292 })
268293 })
269294}
0 commit comments