Skip to content

Commit 74fd934

Browse files
authored
fix(helm): helm logs to klog (#487)
This allows to verify the denied resource access for uninstall Signed-off-by: Marc Nuri <marc@marcnuri.com>
1 parent ee0a2dd commit 74fd934

File tree

2 files changed

+35
-9
lines changed

2 files changed

+35
-9
lines changed

pkg/helm/helm.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package helm
33
import (
44
"context"
55
"fmt"
6+
"time"
7+
68
"helm.sh/helm/v3/pkg/action"
79
"helm.sh/helm/v3/pkg/chart/loader"
810
"helm.sh/helm/v3/pkg/cli"
911
"helm.sh/helm/v3/pkg/registry"
1012
"helm.sh/helm/v3/pkg/release"
1113
"k8s.io/cli-runtime/pkg/genericclioptions"
12-
"log"
14+
"k8s.io/klog/v2"
1315
"sigs.k8s.io/yaml"
14-
"time"
1516
)
1617

1718
type Kubernetes interface {
@@ -115,7 +116,7 @@ func (h *Helm) newAction(namespace string, allNamespaces bool) (*action.Configur
115116
return nil, err
116117
}
117118
cfg.RegistryClient = registryClient
118-
return cfg, cfg.Init(h.kubernetes, applicableNamespace, "", log.Printf)
119+
return cfg, cfg.Init(h.kubernetes, applicableNamespace, "", klog.V(5).Infof)
119120
}
120121

121122
func simplify(release ...*release.Release) []map[string]interface{} {

pkg/mcp/helm_test.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package mcp
22

33
import (
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

2126
type HelmSuite struct {
2227
BaseMcpSuite
28+
klogState klog.State
29+
logBuffer bytes.Buffer
2330
}
2431

2532
func (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

3049
func (s *HelmSuite) TestHelmInstall() {
@@ -234,7 +253,7 @@ func (s *HelmSuite) TestHelmUninstall() {
234253

235254
func (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

Comments
 (0)