From 20c75f0c10023a652f310cce1f1582b5fa71c193 Mon Sep 17 00:00:00 2001 From: Austin Abro Date: Mon, 3 Mar 2025 17:26:21 +0000 Subject: [PATCH 1/2] 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 2/2] 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)