diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index d0aab5c18..afd9ab384 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -53,6 +53,12 @@ func debug(format string, v ...interface{}) { } } +func verbose(format string, v ...interface{}) { + if settings.Verbose { + format = fmt.Sprintf("%s\n", format) + fmt.Fprintf(os.Stdout, format, v...) + } +} func warning(format string, v ...interface{}) { format = fmt.Sprintf("WARNING: %s\n", format) fmt.Fprintf(os.Stderr, format, v...) @@ -69,7 +75,11 @@ func main() { // run when each command's execute method is called cobra.OnInitialize(func() { helmDriver := os.Getenv("HELM_DRIVER") - if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), helmDriver, debug); err != nil { + logger := debug + if settings.Verbose { + logger = verbose + } + if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), helmDriver, logger); err != nil { log.Fatal(err) } if helmDriver == "memory" { diff --git a/cmd/helm/testdata/output/env-comp.txt b/cmd/helm/testdata/output/env-comp.txt index b7befd69e..91984d8d1 100644 --- a/cmd/helm/testdata/output/env-comp.txt +++ b/cmd/helm/testdata/output/env-comp.txt @@ -15,5 +15,6 @@ HELM_PLUGINS HELM_REGISTRY_CONFIG HELM_REPOSITORY_CACHE HELM_REPOSITORY_CONFIG +HELM_VERBOSE :4 Completion ended with directive: ShellCompDirectiveNoFileComp diff --git a/pkg/action/history.go b/pkg/action/history.go index 0430aaf7a..4b2dc199a 100644 --- a/pkg/action/history.go +++ b/pkg/action/history.go @@ -53,6 +53,6 @@ func (h *History) Run(name string) ([]*release.Release, error) { return nil, errors.Errorf("release name is invalid: %s", name) } - h.cfg.Log("getting history for release %s", name) + h.cfg.Log("Getting history for release %s", name) return h.cfg.Releases.History(name) } diff --git a/pkg/action/rollback.go b/pkg/action/rollback.go index f3f958f3d..763b89de0 100644 --- a/pkg/action/rollback.go +++ b/pkg/action/rollback.go @@ -81,7 +81,7 @@ func (r *Rollback) Run(name string) error { } if !r.DryRun { - r.cfg.Log("updating status for rolled back release for %s", name) + r.cfg.Log("Updating status for rolled back release for %s", name) if err := r.cfg.Releases.Update(targetRelease); err != nil { return err } diff --git a/pkg/action/upgrade.go b/pkg/action/upgrade.go index b0f294cae..fc1283fe5 100644 --- a/pkg/action/upgrade.go +++ b/pkg/action/upgrade.go @@ -120,7 +120,7 @@ func (u *Upgrade) Run(name string, chart *chart.Chart, vals map[string]interface if err := chartutil.ValidateReleaseName(name); err != nil { return nil, errors.Errorf("release name is invalid: %s", name) } - u.cfg.Log("preparing upgrade for %s", name) + u.cfg.Log("Preparing upgrade for %s", name) currentRelease, upgradedRelease, err := u.prepareUpgrade(name, chart, vals) if err != nil { return nil, err @@ -128,14 +128,14 @@ func (u *Upgrade) Run(name string, chart *chart.Chart, vals map[string]interface u.cfg.Releases.MaxHistory = u.MaxHistory - u.cfg.Log("performing update for %s", name) + u.cfg.Log("Performing update for %s", name) res, err := u.performUpgrade(currentRelease, upgradedRelease) if err != nil { return res, err } if !u.DryRun { - u.cfg.Log("updating status for upgraded release for %s", name) + u.cfg.Log("Updating status for upgraded release for %s", name) if err := u.cfg.Releases.Update(upgradedRelease); err != nil { return res, err } @@ -300,7 +300,7 @@ func (u *Upgrade) performUpgrade(originalRelease, upgradedRelease *release.Relea return upgradedRelease, nil } - u.cfg.Log("creating upgraded release for %s", upgradedRelease.Name) + u.cfg.Log("Creating upgraded release for %s", upgradedRelease.Name) if err := u.cfg.Releases.Create(upgradedRelease); err != nil { return nil, err } diff --git a/pkg/cli/environment.go b/pkg/cli/environment.go index ee60d981f..83d905340 100644 --- a/pkg/cli/environment.go +++ b/pkg/cli/environment.go @@ -58,6 +58,8 @@ type EnvSettings struct { KubeCaFile string // Debug indicates whether or not Helm is running in Debug mode. Debug bool + // Verbose indicates whether or not Helm is running in Verbose mode. + Verbose bool // RegistryConfig is the path to the registry config file. RegistryConfig string // RepositoryConfig is the path to the repositories file. @@ -86,7 +88,7 @@ func New() *EnvSettings { RepositoryCache: envOr("HELM_REPOSITORY_CACHE", helmpath.CachePath("repository")), } env.Debug, _ = strconv.ParseBool(os.Getenv("HELM_DEBUG")) - + env.Verbose, _ = strconv.ParseBool(os.Getenv("HELM_VERBOSE")) // bind to kubernetes config flags env.config = &genericclioptions.ConfigFlags{ Namespace: &env.namespace, @@ -111,7 +113,8 @@ func (s *EnvSettings) AddFlags(fs *pflag.FlagSet) { fs.StringArrayVar(&s.KubeAsGroups, "kube-as-group", s.KubeAsGroups, "group to impersonate for the operation, this flag can be repeated to specify multiple groups.") fs.StringVar(&s.KubeAPIServer, "kube-apiserver", s.KubeAPIServer, "the address and the port for the Kubernetes API server") fs.StringVar(&s.KubeCaFile, "kube-ca-file", s.KubeCaFile, "the certificate authority file for the Kubernetes API server connection") - fs.BoolVar(&s.Debug, "debug", s.Debug, "enable verbose output") + fs.BoolVar(&s.Debug, "debug", s.Debug, "enable debug output") + fs.BoolVar(&s.Verbose, "verbose", s.Verbose, "enable verbose output") fs.StringVar(&s.RegistryConfig, "registry-config", s.RegistryConfig, "path to the registry config file") fs.StringVar(&s.RepositoryConfig, "repository-config", s.RepositoryConfig, "path to the file containing repository names and URLs") fs.StringVar(&s.RepositoryCache, "repository-cache", s.RepositoryCache, "path to the file containing cached repository indexes") @@ -151,6 +154,7 @@ func (s *EnvSettings) EnvVars() map[string]string { "HELM_CONFIG_HOME": helmpath.ConfigPath(""), "HELM_DATA_HOME": helmpath.DataPath(""), "HELM_DEBUG": fmt.Sprint(s.Debug), + "HELM_VERBOSE": fmt.Sprint(s.Verbose), "HELM_PLUGINS": s.PluginsDirectory, "HELM_REGISTRY_CONFIG": s.RegistryConfig, "HELM_REPOSITORY_CACHE": s.RepositoryCache, diff --git a/pkg/cli/environment_test.go b/pkg/cli/environment_test.go index 31ba7a237..fffff2fa3 100644 --- a/pkg/cli/environment_test.go +++ b/pkg/cli/environment_test.go @@ -36,6 +36,7 @@ func TestEnvSettings(t *testing.T) { // expected values ns, kcontext string debug bool + verbose bool maxhistory int kAsUser string kAsGroups []string @@ -48,9 +49,10 @@ func TestEnvSettings(t *testing.T) { }, { name: "with flags set", - args: "--debug --namespace=myns --kube-as-user=poro --kube-as-group=admins --kube-as-group=teatime --kube-as-group=snackeaters --kube-ca-file=/tmp/ca.crt", + args: "--debug --verbose --namespace=myns --kube-as-user=poro --kube-as-group=admins --kube-as-group=teatime --kube-as-group=snackeaters --kube-ca-file=/tmp/ca.crt", ns: "myns", debug: true, + verbose: true, maxhistory: defaultMaxHistory, kAsUser: "poro", kAsGroups: []string{"admins", "teatime", "snackeaters"}, @@ -96,6 +98,9 @@ func TestEnvSettings(t *testing.T) { if settings.Debug != tt.debug { t.Errorf("expected debug %t, got %t", tt.debug, settings.Debug) } + if settings.Verbose != tt.verbose { + t.Errorf("expected verbose %t, got %t", tt.verbose, settings.Verbose) + } if settings.Namespace() != tt.ns { t.Errorf("expected namespace %q, got %q", tt.ns, settings.Namespace()) } diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 34079e7a0..69d544be2 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -88,7 +88,7 @@ func New(getter genericclioptions.RESTClientGetter) *Client { } } -var nopLogger = func(_ string, _ ...interface{}) {} +var nopLogger = func(s string, i ...interface{}) {} // getKubeClient get or create a new KubernetesClientSet func (c *Client) getKubeClient() (*kubernetes.Clientset, error) { @@ -198,7 +198,7 @@ func (c *Client) Update(original, target ResourceList, force bool) (*Result, err updateErrors := []string{} res := &Result{} - c.Log("checking %d resources for changes", len(target)) + c.Log("Checking %d resources for changes", len(target)) err := target.Visit(func(info *resource.Info, err error) error { if err != nil { return err @@ -219,7 +219,12 @@ func (c *Client) Update(original, target ResourceList, force bool) (*Result, err } kind := info.Mapping.GroupVersionKind.Kind - c.Log("Created a new %s called %q in %s\n", kind, info.Name, info.Namespace) + if info.Namespace == "" { + // Cluster wide resource doesn't have a namespace defined + c.Log("Created a new %s called %q\n", kind, info.Name) + } else { + c.Log("Created a new %s called %q in %s\n", kind, info.Name, info.Namespace) + } return nil } diff --git a/pkg/kube/wait.go b/pkg/kube/wait.go index 40f7b7a6e..6fb66b181 100644 --- a/pkg/kube/wait.go +++ b/pkg/kube/wait.go @@ -50,7 +50,8 @@ type waiter struct { // waitForResources polls to get the current status of all pods, PVCs, Services and // Jobs(optional) until all are ready or a timeout is reached func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool) error { - w.log("beginning wait for %d resources with timeout of %v", len(created), w.timeout) + + w.log("Beginning wait for %d resources with timeout of %v", len(created), w.timeout) return wait.Poll(2*time.Second, w.timeout, func() (bool, error) { for _, v := range created {