diff --git a/cmd/helm/get_all.go b/cmd/helm/get_all.go index bf367da7f..2dbef97cf 100644 --- a/cmd/helm/get_all.go +++ b/cmd/helm/get_all.go @@ -59,7 +59,7 @@ func newGetAllCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { return tpl(template, data, out) } - return output.Table.Write(out, &statusPrinter{res, true, false}) + return output.Table.Write(out, &statusPrinter{res, true, false, false}) }, } diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 794fef52c..044d1f2b5 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -141,7 +141,7 @@ func newInstallCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { return errors.Wrap(err, "INSTALLATION FAILED") } - return outfmt.Write(out, &statusPrinter{rel, settings.Debug, false}) + return outfmt.Write(out, &statusPrinter{rel, settings.Debug, false, false}) }, } diff --git a/cmd/helm/release_testing.go b/cmd/helm/release_testing.go index 2637cbb9f..d9b8fa8c9 100644 --- a/cmd/helm/release_testing.go +++ b/cmd/helm/release_testing.go @@ -72,7 +72,7 @@ func newReleaseTestCmd(cfg *action.Configuration, out io.Writer) *cobra.Command return runErr } - if err := outfmt.Write(out, &statusPrinter{rel, settings.Debug, false}); err != nil { + if err := outfmt.Write(out, &statusPrinter{rel, settings.Debug, false, false}); err != nil { return err } diff --git a/cmd/helm/status.go b/cmd/helm/status.go index 9ea7ea663..0eb6a9c2a 100644 --- a/cmd/helm/status.go +++ b/cmd/helm/status.go @@ -41,7 +41,7 @@ The status consists of: - state of the release (can be: unknown, deployed, uninstalled, superseded, failed, uninstalling, pending-install, pending-upgrade or pending-rollback) - revision of the release - description of the release (can be completion message or error message, need to enable --show-desc) -- list of resources that this release consists of, sorted by kind +- list of resources that this release consists of (need to enable --show-resources) - details on last test suite run, if applicable - additional notes provided by the chart ` @@ -70,7 +70,7 @@ func newStatusCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { // strip chart metadata from the output rel.Chart = nil - return outfmt.Write(out, &statusPrinter{rel, false, client.ShowDescription}) + return outfmt.Write(out, &statusPrinter{rel, false, client.ShowDescription, client.ShowResources}) }, } @@ -92,6 +92,8 @@ func newStatusCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { bindOutputFlag(cmd, &outfmt) f.BoolVar(&client.ShowDescription, "show-desc", false, "if set, display the description message of the named release") + f.BoolVar(&client.ShowResources, "show-resources", false, "if set, display the resources of the named release") + return cmd } @@ -99,6 +101,7 @@ type statusPrinter struct { release *release.Release debug bool showDescription bool + showResources bool } func (s statusPrinter) WriteJSON(out io.Writer) error { @@ -124,7 +127,7 @@ func (s statusPrinter) WriteTable(out io.Writer) error { fmt.Fprintf(out, "DESCRIPTION: %s\n", s.release.Info.Description) } - if len(s.release.Info.Resources) > 0 { + if s.showResources && len(s.release.Info.Resources) > 0 { fmt.Fprintf(out, "RESOURCES:\n%s\n", s.release.Info.Resources) } diff --git a/cmd/helm/status_test.go b/cmd/helm/status_test.go index 3cf694da9..8054b20f3 100644 --- a/cmd/helm/status_test.go +++ b/cmd/helm/status_test.go @@ -70,7 +70,7 @@ func TestStatusCmd(t *testing.T) { }), }, { name: "get status of a deployed release with resources", - cmd: "status flummoxed-chickadee", + cmd: "status --show-resources flummoxed-chickadee", golden: "output/status-with-resources.txt", rels: releasesMockWithStatus( &release.Info{ @@ -80,7 +80,7 @@ func TestStatusCmd(t *testing.T) { ), }, { name: "get status of a deployed release with resources in json", - cmd: "status flummoxed-chickadee -o json", + cmd: "status --show-resources flummoxed-chickadee -o json", golden: "output/status-with-resources.json", rels: releasesMockWithStatus( &release.Info{ diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 33db703c4..2ceb31a81 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -123,7 +123,7 @@ func newUpgradeCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { if err != nil { return err } - return outfmt.Write(out, &statusPrinter{rel, settings.Debug, false}) + return outfmt.Write(out, &statusPrinter{rel, settings.Debug, false, false}) } else if err != nil { return err } @@ -205,7 +205,7 @@ func newUpgradeCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { fmt.Fprintf(out, "Release %q has been upgraded. Happy Helming!\n", args[0]) } - return outfmt.Write(out, &statusPrinter{rel, settings.Debug, false}) + return outfmt.Write(out, &statusPrinter{rel, settings.Debug, false, false}) }, } diff --git a/pkg/action/status.go b/pkg/action/status.go index 86d2f0f57..178fb5204 100644 --- a/pkg/action/status.go +++ b/pkg/action/status.go @@ -19,6 +19,7 @@ package action import ( "bytes" + "helm.sh/helm/v3/pkg/kube" "helm.sh/helm/v3/pkg/release" ) @@ -34,6 +35,10 @@ type Status struct { // only affect print type table. // TODO Helm 4: Remove this flag and output the description by default. ShowDescription bool + + // If true, display resources of release to output format + // TODO Helm 4: Remove this flag and output the resources by default. + ShowResources bool } // NewStatus creates a new Status object with the given configuration. @@ -49,17 +54,26 @@ func (s *Status) Run(name string) (*release.Release, error) { return nil, err } + if !s.ShowResources { + return s.cfg.releaseContent(name, s.Version) + } + rel, err := s.cfg.releaseContent(name, s.Version) if err != nil { return nil, err } + resources, _ := s.cfg.KubeClient.Build(bytes.NewBufferString(rel.Manifest), false) - resp, err := s.cfg.KubeClient.Get(resources, bytes.NewBufferString(rel.Manifest)) - if err != nil { - return nil, err - } - if resp != "" { - rel.Info.Resources = resp + + if kubeClient, ok := s.cfg.KubeClient.(kube.InterfaceResources); ok { + resp, err := kubeClient.Get(resources, bytes.NewBufferString(rel.Manifest)) + if err != nil { + return nil, err + } + if resp != "" { + rel.Info.Resources = resp + } + return rel, nil } - return rel, nil + return nil, err } diff --git a/pkg/kube/interface.go b/pkg/kube/interface.go index 3c1afbd6c..9efc4cab9 100644 --- a/pkg/kube/interface.go +++ b/pkg/kube/interface.go @@ -68,8 +68,6 @@ type Interface interface { // IsReachable checks whether the client is able to connect to the cluster. IsReachable() error - - Get(resources ResourceList, reader io.Reader) (string, error) } // InterfaceExt is introduced to avoid breaking backwards compatibility for Interface implementers. @@ -80,5 +78,14 @@ type InterfaceExt interface { WaitForDelete(resources ResourceList, timeout time.Duration) error } +// InterfaceResources is introduced to avoid breaking backwards compatibility for Interface implementers. +// +// TODO Helm 4: Remove InterfaceResources and integrate its method(s) into the Interface. +type InterfaceResources interface { + // Get details of deployed resources in ResourceList to be printed. + Get(resources ResourceList, reader io.Reader) (string, error) +} + var _ Interface = (*Client)(nil) var _ InterfaceExt = (*Client)(nil) +var _ InterfaceResources = (*Client)(nil)