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 {