diff --git a/cmd/helm/history.go b/cmd/helm/history.go index 7edb4767c..02d8fac0a 100644 --- a/cmd/helm/history.go +++ b/cmd/helm/history.go @@ -159,6 +159,24 @@ func getReleaseHistory(rls []*release.Release) (history releaseHistory) { return history } +func getChartname(c *chart.Chart) string { + if c == nil || c.Metadata == nil { + // This is an edge case that has happened in prod, though we don't + // know how: https://github.com/helm/helm/issues/1347 + return "MISSING" + } + return c.Metadata.Name +} + +func getChartVerison(c *chart.Chart) string { + if c == nil || c.Metadata == nil { + // This is an edge case that has happened in prod, though we don't + // know how: https://github.com/helm/helm/issues/1347 + return "MISSING" + } + return c.Metadata.Version +} + func formatChartname(c *chart.Chart) string { if c == nil || c.Metadata == nil { // This is an edge case that has happened in prod, though we don't diff --git a/cmd/helm/history_test.go b/cmd/helm/history_test.go index 07f2d85df..cfc38942b 100644 --- a/cmd/helm/history_test.go +++ b/cmd/helm/history_test.go @@ -20,6 +20,8 @@ import ( "fmt" "testing" + "github.com/stretchr/testify/assert" + "helm.sh/helm/v3/pkg/release" ) @@ -122,3 +124,28 @@ func TestHistoryFileCompletion(t *testing.T) { checkFileCompletion(t, "history", false) checkFileCompletion(t, "history myrelease", false) } + +func TestGetChartDetails(t *testing.T) { + demoRelease := release.Mock(&release.MockReleaseOptions{ + Name: "demo", + Version: 1.0, + Status: release.StatusDeployed, + }) + + assert.Equal(t, formatAppVersion(demoRelease.Chart), "1.0", nil) + assert.Equal(t, getChartVerison(demoRelease.Chart), "0.1.0-beta.1", nil) + assert.Equal(t, getChartname(demoRelease.Chart), "foo", nil) +} + +func TestGetChartDetailsWithNullChart(t *testing.T) { + demoRelease := release.Mock(&release.MockReleaseOptions{ + Name: "demo", + Version: 1.0, + Status: release.StatusDeployed, + }) + demoRelease.Chart = nil + + assert.Equal(t, formatAppVersion(demoRelease.Chart), "MISSING", nil) + assert.Equal(t, getChartVerison(demoRelease.Chart), "MISSING", nil) + assert.Equal(t, getChartname(demoRelease.Chart), "MISSING", nil) +} diff --git a/cmd/helm/list.go b/cmd/helm/list.go index 7e828c2b2..3dca62372 100644 --- a/cmd/helm/list.go +++ b/cmd/helm/list.go @@ -133,13 +133,15 @@ func newListCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { } type releaseElement struct { - Name string `json:"name"` - Namespace string `json:"namespace"` - Revision string `json:"revision"` - Updated string `json:"updated"` - Status string `json:"status"` - Chart string `json:"chart"` - AppVersion string `json:"app_version"` + Name string `json:"name"` + Namespace string `json:"namespace"` + Revision string `json:"revision"` + Updated string `json:"updated"` + Status string `json:"status"` + Chart string `json:"chart"` + ChartName string `json:"chart_name"` + ChartVersion string `json:"chart_version"` + AppVersion string `json:"app_version"` } type releaseListWriter struct { @@ -152,12 +154,14 @@ func newReleaseListWriter(releases []*release.Release, timeFormat string, noHead elements := make([]releaseElement, 0, len(releases)) for _, r := range releases { element := releaseElement{ - Name: r.Name, - Namespace: r.Namespace, - Revision: strconv.Itoa(r.Version), - Status: r.Info.Status.String(), - Chart: formatChartname(r.Chart), - AppVersion: formatAppVersion(r.Chart), + Name: r.Name, + Namespace: r.Namespace, + Revision: strconv.Itoa(r.Version), + Status: r.Info.Status.String(), + Chart: formatChartname(r.Chart), + ChartName: getChartname(r.Chart), + ChartVersion: getChartVerison(r.Chart), + AppVersion: formatAppVersion(r.Chart), } t := "-" diff --git a/cmd/helm/list_test.go b/cmd/helm/list_test.go index 97a1e284f..ff48ec981 100644 --- a/cmd/helm/list_test.go +++ b/cmd/helm/list_test.go @@ -148,6 +148,16 @@ func TestListCmd(t *testing.T) { cmd: "list", golden: "output/list.txt", rels: releaseFixture, + }, { + name: "list releases in full yaml format", + cmd: "list --output yaml", + golden: "output/list-full-yaml.txt", + rels: releaseFixture, + }, { + name: "list releases in full json format", + cmd: "list --output json", + golden: "output/list-full-json.txt", + rels: releaseFixture, }, { name: "list without headers", cmd: "list --no-headers", diff --git a/cmd/helm/testdata/output/list-full-json.txt b/cmd/helm/testdata/output/list-full-json.txt new file mode 100644 index 000000000..e3faa4766 --- /dev/null +++ b/cmd/helm/testdata/output/list-full-json.txt @@ -0,0 +1 @@ +[{"name":"hummingbird","namespace":"default","revision":"1","updated":"2016-01-16 00:00:03 +0000 UTC","status":"deployed","chart":"chickadee-1.0.0","chart_name":"chickadee","chart_version":"1.0.0","app_version":"0.0.1"},{"name":"iguana","namespace":"default","revision":"2","updated":"2016-01-16 00:00:04 +0000 UTC","status":"deployed","chart":"chickadee-1.0.0","chart_name":"chickadee","chart_version":"1.0.0","app_version":"0.0.1"},{"name":"rocket","namespace":"default","revision":"1","updated":"2016-01-16 00:00:02 +0000 UTC","status":"failed","chart":"chickadee-1.0.0","chart_name":"chickadee","chart_version":"1.0.0","app_version":"0.0.1"},{"name":"starlord","namespace":"default","revision":"2","updated":"2016-01-16 00:00:01 +0000 UTC","status":"deployed","chart":"chickadee-1.0.0","chart_name":"chickadee","chart_version":"1.0.0","app_version":"0.0.1"}] diff --git a/cmd/helm/testdata/output/list-full-yaml.txt b/cmd/helm/testdata/output/list-full-yaml.txt new file mode 100644 index 000000000..5b496fcd0 --- /dev/null +++ b/cmd/helm/testdata/output/list-full-yaml.txt @@ -0,0 +1,36 @@ +- app_version: 0.0.1 + chart: chickadee-1.0.0 + chart_name: chickadee + chart_version: 1.0.0 + name: hummingbird + namespace: default + revision: "1" + status: deployed + updated: 2016-01-16 00:00:03 +0000 UTC +- app_version: 0.0.1 + chart: chickadee-1.0.0 + chart_name: chickadee + chart_version: 1.0.0 + name: iguana + namespace: default + revision: "2" + status: deployed + updated: 2016-01-16 00:00:04 +0000 UTC +- app_version: 0.0.1 + chart: chickadee-1.0.0 + chart_name: chickadee + chart_version: 1.0.0 + name: rocket + namespace: default + revision: "1" + status: failed + updated: 2016-01-16 00:00:02 +0000 UTC +- app_version: 0.0.1 + chart: chickadee-1.0.0 + chart_name: chickadee + chart_version: 1.0.0 + name: starlord + namespace: default + revision: "2" + status: deployed + updated: 2016-01-16 00:00:01 +0000 UTC