From 48f03d316b81b2f9d2d10e2e411c93930d349ff5 Mon Sep 17 00:00:00 2001 From: Robert Sirchia Date: Wed, 26 Feb 2025 15:21:47 -0500 Subject: [PATCH 1/9] changing from log to slog Signed-off-by: Robert Sirchia --- pkg/repo/index.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/repo/index.go b/pkg/repo/index.go index c5f808229..3e063becf 100644 --- a/pkg/repo/index.go +++ b/pkg/repo/index.go @@ -19,7 +19,7 @@ package repo import ( "bytes" "encoding/json" - "log" + "log/slog" "os" "path" "path/filepath" @@ -154,7 +154,7 @@ func (i IndexFile) MustAdd(md *chart.Metadata, filename, baseURL, digest string) // Deprecated: Use index.MustAdd instead. func (i IndexFile) Add(md *chart.Metadata, filename, baseURL, digest string) { if err := i.MustAdd(md, filename, baseURL, digest); err != nil { - log.Printf("skipping loading invalid entry for chart %q %q from %s: %s", md.Name, md.Version, filename, err) + slog.Error("skipping loading invalid entry for chart %q %q from %s: %s", md.Name, md.Version, filename, err) } } @@ -356,7 +356,7 @@ func loadIndex(data []byte, source string) (*IndexFile, error) { for name, cvs := range i.Entries { for idx := len(cvs) - 1; idx >= 0; idx-- { if cvs[idx] == nil { - log.Printf("skipping loading invalid entry for chart %q from %s: empty entry", name, source) + slog.Info("skipping loading invalid entry for chart %q from %s: empty entry", name, source) continue } // When metadata section missing, initialize with no data @@ -367,7 +367,7 @@ func loadIndex(data []byte, source string) (*IndexFile, error) { cvs[idx].APIVersion = chart.APIVersionV1 } if err := cvs[idx].Validate(); ignoreSkippableChartValidationError(err) != nil { - log.Printf("skipping loading invalid entry for chart %q %q from %s: %s", name, cvs[idx].Version, source, err) + slog.Error("skipping loading invalid entry for chart %q %q from %s: %s", name, cvs[idx].Version, source, err) cvs = append(cvs[:idx], cvs[idx+1:]...) } } From a11f4c00265bdef681d2a84d3c7dfa4bb81d4812 Mon Sep 17 00:00:00 2001 From: Robert Sirchia Date: Thu, 27 Feb 2025 12:56:52 -0500 Subject: [PATCH 2/9] changing info to error Signed-off-by: Robert Sirchia --- pkg/repo/index.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/repo/index.go b/pkg/repo/index.go index 3e063becf..954d7486c 100644 --- a/pkg/repo/index.go +++ b/pkg/repo/index.go @@ -356,7 +356,7 @@ func loadIndex(data []byte, source string) (*IndexFile, error) { for name, cvs := range i.Entries { for idx := len(cvs) - 1; idx >= 0; idx-- { if cvs[idx] == nil { - slog.Info("skipping loading invalid entry for chart %q from %s: empty entry", name, source) + slog.Error("skipping loading invalid entry for chart %q from %s: empty entry", name, source) continue } // When metadata section missing, initialize with no data From f50547bf51aab27966b332fa10d80ac62873b85c Mon Sep 17 00:00:00 2001 From: Robert Sirchia Date: Fri, 28 Feb 2025 15:22:47 -0500 Subject: [PATCH 3/9] changing error to warn as requested by Matt Signed-off-by: Robert Sirchia --- pkg/repo/index.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/repo/index.go b/pkg/repo/index.go index 954d7486c..4f0266ca6 100644 --- a/pkg/repo/index.go +++ b/pkg/repo/index.go @@ -356,7 +356,7 @@ func loadIndex(data []byte, source string) (*IndexFile, error) { for name, cvs := range i.Entries { for idx := len(cvs) - 1; idx >= 0; idx-- { if cvs[idx] == nil { - slog.Error("skipping loading invalid entry for chart %q from %s: empty entry", name, source) + slog.Warn("skipping loading invalid entry for chart %q from %s: empty entry", name, source) continue } // When metadata section missing, initialize with no data @@ -367,7 +367,7 @@ func loadIndex(data []byte, source string) (*IndexFile, error) { cvs[idx].APIVersion = chart.APIVersionV1 } if err := cvs[idx].Validate(); ignoreSkippableChartValidationError(err) != nil { - slog.Error("skipping loading invalid entry for chart %q %q from %s: %s", name, cvs[idx].Version, source, err) + slog.Warn("skipping loading invalid entry for chart %q %q from %s: %s", name, cvs[idx].Version, source, err) cvs = append(cvs[:idx], cvs[idx+1:]...) } } From 12b8eb8b618a8faa309fce42d1bfa9006b9a0214 Mon Sep 17 00:00:00 2001 From: Rongrong Liu Date: Wed, 26 Feb 2025 09:16:39 -0800 Subject: [PATCH 4/9] fix:add proxy support when mTLS configured Signed-off-by: Rongrong Liu --- pkg/cmd/root.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/cmd/root.go b/pkg/cmd/root.go index ff4dcecbc..942060896 100644 --- a/pkg/cmd/root.go +++ b/pkg/cmd/root.go @@ -339,6 +339,7 @@ func newRegistryClientWithTLS( registry.ClientOptHTTPClient(&http.Client{ Transport: &http.Transport{ TLSClientConfig: tlsConf, + Proxy: http.ProxyFromEnvironment, }, }), registry.ClientOptBasicAuth(username, password), From b298910e079ee53bb818e7508b9a4ec57b8c418a Mon Sep 17 00:00:00 2001 From: George Jenkins Date: Sat, 1 Mar 2025 16:48:21 -0800 Subject: [PATCH 5/9] Remove 'coveralls' Signed-off-by: George Jenkins --- scripts/coverage.sh | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/scripts/coverage.sh b/scripts/coverage.sh index 2d8258866..2164d94da 100755 --- a/scripts/coverage.sh +++ b/scripts/coverage.sh @@ -20,10 +20,6 @@ covermode=${COVERMODE:-atomic} coverdir=$(mktemp -d /tmp/coverage.XXXXXXXXXX) profile="${coverdir}/cover.out" -pushd / -hash goveralls 2>/dev/null || go install github.com/mattn/goveralls@v0.0.11 -popd - generate_cover_data() { for d in $(go list ./...) ; do ( @@ -36,10 +32,6 @@ generate_cover_data() { grep -h -v "^mode:" "$coverdir"/*.cover >>"$profile" } -push_to_coveralls() { - goveralls -coverprofile="${profile}" -service=github -} - generate_cover_data go tool cover -func "${profile}" @@ -47,8 +39,5 @@ case "${1-}" in --html) go tool cover -html "${profile}" ;; - --coveralls) - push_to_coveralls - ;; esac From 763e61e47e9ebc0fd15a2534c9ce00c90d51e99e Mon Sep 17 00:00:00 2001 From: George Jenkins Date: Sat, 1 Mar 2025 17:50:15 -0800 Subject: [PATCH 6/9] fix: Fix go report card badge reference/link Signed-off-by: George Jenkins --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf177aa4b..5f4d71d4c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Helm [![Build Status](https://github.com/helm/helm/workflows/release/badge.svg)](https://github.com/helm/helm/actions?workflow=release) -[![Go Report Card](https://goreportcard.com/badge/github.com/helm/helm)](https://goreportcard.com/report/github.com/helm/helm) +[![Go Report Card](https://goreportcard.com/badge/helm.sh/helm/v4)](https://goreportcard.com/report/helm.sh/helm/v4) [![GoDoc](https://img.shields.io/static/v1?label=godoc&message=reference&color=blue)](https://pkg.go.dev/helm.sh/helm/v4) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/3131/badge)](https://bestpractices.coreinfrastructure.org/projects/3131) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/helm/helm/badge)](https://scorecard.dev/viewer/?uri=github.com/helm/helm) From 20c75f0c10023a652f310cce1f1582b5fa71c193 Mon Sep 17 00:00:00 2001 From: Austin Abro Date: Mon, 3 Mar 2025 17:26:21 +0000 Subject: [PATCH 7/9] fix namespace assignment not passing through Signed-off-by: Austin Abro --- cmd/helm/helm.go | 65 ------------------------------------------------ pkg/cmd/root.go | 58 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 65 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 4bdd9a388..538aa9ed8 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -17,37 +17,21 @@ limitations under the License. package main // import "helm.sh/helm/v4/cmd/helm" import ( - "io" "log" "os" - "strings" - - "github.com/spf13/cobra" - "sigs.k8s.io/yaml" // Import to initialize client auth plugins. _ "k8s.io/client-go/plugin/pkg/client/auth" "helm.sh/helm/v4/pkg/action" - "helm.sh/helm/v4/pkg/cli" helmcmd "helm.sh/helm/v4/pkg/cmd" "helm.sh/helm/v4/pkg/kube" - kubefake "helm.sh/helm/v4/pkg/kube/fake" - release "helm.sh/helm/v4/pkg/release/v1" - "helm.sh/helm/v4/pkg/storage/driver" ) -var settings = cli.New() - func init() { log.SetFlags(log.Lshortfile) } -// hookOutputWriter provides the writer for writing hook logs. -func hookOutputWriter(_, _, _ string) io.Writer { - return log.Writer() -} - func main() { // Setting the name of the app for managedFields in the Kubernetes client. // It is set here to the full name of "helm" so that renaming of helm to @@ -62,17 +46,6 @@ func main() { os.Exit(1) } - cobra.OnInitialize(func() { - helmDriver := os.Getenv("HELM_DRIVER") - if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), helmDriver, helmcmd.Debug); err != nil { - log.Fatal(err) - } - if helmDriver == "memory" { - loadReleasesInMemory(actionConfig) - } - actionConfig.SetHookOutputFunc(hookOutputWriter) - }) - if err := cmd.Execute(); err != nil { helmcmd.Debug("%+v", err) switch e := err.(type) { @@ -83,41 +56,3 @@ func main() { } } } - -// This function loads releases into the memory storage if the -// environment variable is properly set. -func loadReleasesInMemory(actionConfig *action.Configuration) { - filePaths := strings.Split(os.Getenv("HELM_MEMORY_DRIVER_DATA"), ":") - if len(filePaths) == 0 { - return - } - - store := actionConfig.Releases - mem, ok := store.Driver.(*driver.Memory) - if !ok { - // For an unexpected reason we are not dealing with the memory storage driver. - return - } - - actionConfig.KubeClient = &kubefake.PrintingKubeClient{Out: io.Discard} - - for _, path := range filePaths { - b, err := os.ReadFile(path) - if err != nil { - log.Fatal("Unable to read memory driver data", err) - } - - releases := []*release.Release{} - if err := yaml.Unmarshal(b, &releases); err != nil { - log.Fatal("Unable to unmarshal memory driver data: ", err) - } - - for _, rel := range releases { - if err := store.Create(rel); err != nil { - log.Fatal(err) - } - } - } - // Must reset namespace to the proper one - mem.SetNamespace(settings.Namespace()) -} diff --git a/pkg/cmd/root.go b/pkg/cmd/root.go index 942060896..c035181e3 100644 --- a/pkg/cmd/root.go +++ b/pkg/cmd/root.go @@ -26,6 +26,7 @@ import ( "strings" "github.com/spf13/cobra" + "sigs.k8s.io/yaml" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" @@ -33,8 +34,11 @@ import ( "helm.sh/helm/v4/internal/tlsutil" "helm.sh/helm/v4/pkg/action" "helm.sh/helm/v4/pkg/cli" + kubefake "helm.sh/helm/v4/pkg/kube/fake" "helm.sh/helm/v4/pkg/registry" + release "helm.sh/helm/v4/pkg/release/v1" "helm.sh/helm/v4/pkg/repo" + "helm.sh/helm/v4/pkg/storage/driver" ) var globalUsage = `The Kubernetes package manager @@ -119,6 +123,17 @@ func NewRootCmd(actionConfig *action.Configuration, out io.Writer, args []string } }, } + + cobra.OnInitialize(func() { + helmDriver := os.Getenv("HELM_DRIVER") + if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), helmDriver, Debug); err != nil { + log.Fatal(err) + } + if helmDriver == "memory" { + loadReleasesInMemory(actionConfig) + } + actionConfig.SetHookOutputFunc(hookOutputWriter) + }) flags := cmd.PersistentFlags() settings.AddFlags(flags) @@ -232,6 +247,49 @@ func NewRootCmd(actionConfig *action.Configuration, out io.Writer, args []string return cmd, nil } +// This function loads releases into the memory storage if the +// environment variable is properly set. +func loadReleasesInMemory(actionConfig *action.Configuration) { + filePaths := strings.Split(os.Getenv("HELM_MEMORY_DRIVER_DATA"), ":") + if len(filePaths) == 0 { + return + } + + store := actionConfig.Releases + mem, ok := store.Driver.(*driver.Memory) + if !ok { + // For an unexpected reason we are not dealing with the memory storage driver. + return + } + + actionConfig.KubeClient = &kubefake.PrintingKubeClient{Out: io.Discard} + + for _, path := range filePaths { + b, err := os.ReadFile(path) + if err != nil { + log.Fatal("Unable to read memory driver data", err) + } + + releases := []*release.Release{} + if err := yaml.Unmarshal(b, &releases); err != nil { + log.Fatal("Unable to unmarshal memory driver data: ", err) + } + + for _, rel := range releases { + if err := store.Create(rel); err != nil { + log.Fatal(err) + } + } + } + // Must reset namespace to the proper one + mem.SetNamespace(settings.Namespace()) +} + +// hookOutputWriter provides the writer for writing hook logs. +func hookOutputWriter(_, _, _ string) io.Writer { + return log.Writer() +} + func checkForExpiredRepos(repofile string) { expiredRepos := []struct { From 022d4db6af8d6d0307164be41a0c1cb68ea12ec0 Mon Sep 17 00:00:00 2001 From: Austin Abro Date: Mon, 3 Mar 2025 18:43:03 +0000 Subject: [PATCH 8/9] move logic from cmd/helm to pkg/cmd Signed-off-by: Austin Abro --- cmd/helm/helm.go | 4 +--- pkg/cmd/helpers_test.go | 2 +- pkg/cmd/root.go | 31 ++++++++++++++++++++----------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 538aa9ed8..da6a5c54e 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -23,7 +23,6 @@ import ( // Import to initialize client auth plugins. _ "k8s.io/client-go/plugin/pkg/client/auth" - "helm.sh/helm/v4/pkg/action" helmcmd "helm.sh/helm/v4/pkg/cmd" "helm.sh/helm/v4/pkg/kube" ) @@ -39,8 +38,7 @@ func main() { // manager as picked up by the automated name detection. kube.ManagedFieldsManager = "helm" - actionConfig := new(action.Configuration) - cmd, err := helmcmd.NewRootCmd(actionConfig, os.Stdout, os.Args[1:]) + cmd, err := helmcmd.NewRootCmd(os.Stdout, os.Args[1:]) if err != nil { helmcmd.Warning("%+v", err) os.Exit(1) diff --git a/pkg/cmd/helpers_test.go b/pkg/cmd/helpers_test.go index 5f9f4e769..effbc1673 100644 --- a/pkg/cmd/helpers_test.go +++ b/pkg/cmd/helpers_test.go @@ -95,7 +95,7 @@ func executeActionCommandStdinC(store *storage.Storage, in *os.File, cmd string) Log: func(_ string, _ ...interface{}) {}, } - root, err := NewRootCmd(actionConfig, buf, args) + root, err := newRootCmdWithConfig(actionConfig, buf, args) if err != nil { return nil, "", err } diff --git a/pkg/cmd/root.go b/pkg/cmd/root.go index c035181e3..ea686be7c 100644 --- a/pkg/cmd/root.go +++ b/pkg/cmd/root.go @@ -106,7 +106,26 @@ func Warning(format string, v ...interface{}) { fmt.Fprintf(os.Stderr, "WARNING: "+format+"\n", v...) } -func NewRootCmd(actionConfig *action.Configuration, out io.Writer, args []string) (*cobra.Command, error) { +func NewRootCmd(out io.Writer, args []string) (*cobra.Command, error) { + actionConfig := new(action.Configuration) + cmd, err := newRootCmdWithConfig(actionConfig, out, args) + if err != nil { + return nil, err + } + cobra.OnInitialize(func() { + helmDriver := os.Getenv("HELM_DRIVER") + if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), helmDriver, Debug); err != nil { + log.Fatal(err) + } + if helmDriver == "memory" { + loadReleasesInMemory(actionConfig) + } + actionConfig.SetHookOutputFunc(hookOutputWriter) + }) + return cmd, nil +} + +func newRootCmdWithConfig(actionConfig *action.Configuration, out io.Writer, args []string) (*cobra.Command, error) { cmd := &cobra.Command{ Use: "helm", Short: "The Helm package manager for Kubernetes.", @@ -124,16 +143,6 @@ func NewRootCmd(actionConfig *action.Configuration, out io.Writer, args []string }, } - cobra.OnInitialize(func() { - helmDriver := os.Getenv("HELM_DRIVER") - if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), helmDriver, Debug); err != nil { - log.Fatal(err) - } - if helmDriver == "memory" { - loadReleasesInMemory(actionConfig) - } - actionConfig.SetHookOutputFunc(hookOutputWriter) - }) flags := cmd.PersistentFlags() settings.AddFlags(flags) From 20f478ce09c6098afb2f7b5521ff9d5d399ad69b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 22:03:47 +0000 Subject: [PATCH 9/9] build(deps): bump github.com/opencontainers/image-spec Bumps [github.com/opencontainers/image-spec](https://github.com/opencontainers/image-spec) from 1.1.0 to 1.1.1. - [Release notes](https://github.com/opencontainers/image-spec/releases) - [Changelog](https://github.com/opencontainers/image-spec/blob/main/RELEASES.md) - [Commits](https://github.com/opencontainers/image-spec/compare/v1.1.0...v1.1.1) --- updated-dependencies: - dependency-name: github.com/opencontainers/image-spec dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7aaff78cc..84ab22d12 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/mattn/go-shellwords v1.0.12 github.com/mitchellh/copystructure v1.2.0 github.com/moby/term v0.5.2 - github.com/opencontainers/image-spec v1.1.0 + github.com/opencontainers/image-spec v1.1.1 github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 github.com/pkg/errors v0.9.1 github.com/rubenv/sql-migrate v1.7.1 diff --git a/go.sum b/go.sum index 874bde217..01e37e8e5 100644 --- a/go.sum +++ b/go.sum @@ -259,8 +259,8 @@ github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= -github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=