diff --git a/cmd/helm/env.go b/cmd/helm/env.go new file mode 100644 index 000000000..7c09d1632 --- /dev/null +++ b/cmd/helm/env.go @@ -0,0 +1,62 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "io" + + "helm.sh/helm/pkg/cli" + + "github.com/spf13/cobra" + + "helm.sh/helm/cmd/helm/require" +) + +var ( + envHelp = ` +Env prints out all the environment information in use by Helm. +` +) + +func newEnvCmd(out io.Writer) *cobra.Command { + o := &envOptions{} + o.settings = cli.New() + + cmd := &cobra.Command{ + Use: "env", + Short: "Helm client environment information", + Long: envHelp, + Args: require.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + return o.run(out) + }, + } + + return cmd +} + +type envOptions struct { + settings *cli.EnvSettings +} + +func (o *envOptions) run(out io.Writer) error { + for _, e := range o.settings.EnvironmentVariables { + fmt.Printf("%s=\"%s\" \n", e.Name, e.Value) + } + return nil +} diff --git a/cmd/helm/root.go b/cmd/helm/root.go index eb46e0f7a..cbda8273f 100644 --- a/cmd/helm/root.go +++ b/cmd/helm/root.go @@ -188,6 +188,7 @@ func newRootCmd(actionConfig *action.Configuration, out io.Writer, args []string newUpgradeCmd(actionConfig, out), newCompletionCmd(out), + newEnvCmd(out), newPluginCmd(out), newVersionCmd(out), diff --git a/pkg/cli/environment.go b/pkg/cli/environment.go index b277cb421..6b3c4d333 100644 --- a/pkg/cli/environment.go +++ b/pkg/cli/environment.go @@ -23,11 +23,13 @@ These dependencies are expressed as interfaces so that alternate implementations package cli import ( + "fmt" "os" "github.com/spf13/pflag" "helm.sh/helm/pkg/helmpath" + "helm.sh/helm/pkg/helmpath/xdg" ) // EnvSettings describes all of the environment settings. @@ -49,15 +51,26 @@ type EnvSettings struct { RepositoryCache string // PluginsDirectory is the path to the plugins directory. PluginsDirectory string + + // Environment Variables Store + EnvironmentVariables []EnvironmentVariable +} + +type EnvironmentVariable struct { + Name string + Value string } func New() *EnvSettings { - return &EnvSettings{ - PluginsDirectory: helmpath.DataPath("plugins"), - RegistryConfig: helmpath.ConfigPath("registry.json"), - RepositoryConfig: helmpath.ConfigPath("repositories.yaml"), - RepositoryCache: helmpath.CachePath("repository"), + envSettings := EnvSettings{ + PluginsDirectory: helmpath.DataPath("plugins"), + RegistryConfig: helmpath.ConfigPath("registry.json"), + RepositoryConfig: helmpath.ConfigPath("repositories.yaml"), + RepositoryCache: helmpath.CachePath("repository"), + EnvironmentVariables: []EnvironmentVariable{}, } + envSettings.setHelmEnvVars() + return &envSettings } // AddFlags binds flags to the given flagset. @@ -72,13 +85,6 @@ func (s *EnvSettings) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&s.RepositoryCache, "repository-cache", s.RepositoryCache, "path to the file containing cached repository indexes") } -// Init sets values from the environment. -func (s *EnvSettings) Init(fs *pflag.FlagSet) { - for name, envar := range envMap { - setFlagFromEnv(name, envar, fs) - } -} - // envMap maps flag names to envvars var envMap = map[string]string{ "debug": "HELM_DEBUG", @@ -95,3 +101,34 @@ func setFlagFromEnv(name, envar string, fs *pflag.FlagSet) { fs.Set(name, v) } } + +func (s *EnvSettings) setHelmEnvVars() { + for key, val := range map[string]string{ + "HELM_HOME": helmpath.DataPath(), + "HELM_PATH_STARTER": helmpath.DataPath("starters"), + "HELM_DEBUG": fmt.Sprint(s.Debug), + "HELM_REGISTRY_CONFIG": s.RegistryConfig, + "HELM_PATH_REPOSITORY_FILE": s.RepositoryConfig, + "HELM_PATH_REPOSITORY_CACHE": s.RepositoryCache, + "HELM_PLUGIN": s.PluginsDirectory, + xdg.CacheHomeEnvVar: helmpath.CachePath(), + xdg.ConfigHomeEnvVar: helmpath.ConfigPath(), + xdg.DataHomeEnvVar: helmpath.DataPath(), + } { + if eVal := os.Getenv(key); len(eVal) > 0 { + val = eVal + } + s.EnvironmentVariables = append(s.EnvironmentVariables, + EnvironmentVariable{ + Name: key, + Value: val, + }) + } +} + +// Init sets values from the environment. +func (s *EnvSettings) Init(fs *pflag.FlagSet) { + for name, envar := range envMap { + setFlagFromEnv(name, envar, fs) + } +}