Merge pull request #3652 from rajatjindal/history-format

add support for output format in json or yaml
pull/3717/head
Matthew Fisher 7 years ago committed by GitHub
commit 87f66af061
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -23,12 +23,24 @@ import (
"github.com/gosuri/uitable" "github.com/gosuri/uitable"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"encoding/json"
"github.com/ghodss/yaml"
"k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/helm"
"k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/chart"
"k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/proto/hapi/release"
"k8s.io/helm/pkg/timeconv" "k8s.io/helm/pkg/timeconv"
) )
type releaseInfo struct {
Revision int32 `json:"revision" yaml:"revision"`
Updated string `json:"updated" yaml:"updated"`
Status string `json:"status" yaml:"status"`
Chart string `json:"chart" yaml:"chart"`
Description string `json:"description" yaml:"description"`
}
type releaseHistory []releaseInfo
var historyHelp = ` var historyHelp = `
History prints historical revisions for a given release. History prints historical revisions for a given release.
@ -51,6 +63,7 @@ type historyCmd struct {
out io.Writer out io.Writer
helmc helm.Interface helmc helm.Interface
colWidth uint colWidth uint
outputFormat string
} }
func newHistoryCmd(c helm.Interface, w io.Writer) *cobra.Command { func newHistoryCmd(c helm.Interface, w io.Writer) *cobra.Command {
@ -77,6 +90,7 @@ func newHistoryCmd(c helm.Interface, w io.Writer) *cobra.Command {
f := cmd.Flags() f := cmd.Flags()
f.Int32Var(&his.max, "max", 256, "maximum number of revision to include in history") f.Int32Var(&his.max, "max", 256, "maximum number of revision to include in history")
f.UintVar(&his.colWidth, "col-width", 60, "specifies the max column width of output") f.UintVar(&his.colWidth, "col-width", 60, "specifies the max column width of output")
f.StringVarP(&his.outputFormat, "output", "o", "table", "prints the output in the specified format (json|table|yaml)")
return cmd return cmd
} }
@ -90,15 +104,31 @@ func (cmd *historyCmd) run() error {
return nil return nil
} }
fmt.Fprintln(cmd.out, formatHistory(r.Releases, cmd.colWidth)) releaseHistory := getReleaseHistory(r.Releases)
return nil
var history []byte
var formattingError error
switch cmd.outputFormat {
case "yaml":
history, formattingError = yaml.Marshal(releaseHistory)
case "json":
history, formattingError = json.Marshal(releaseHistory)
case "table":
history = formatAsTable(releaseHistory, cmd.colWidth)
default:
return fmt.Errorf("unknown output format %q", cmd.outputFormat)
} }
func formatHistory(rls []*release.Release, colWidth uint) string { if formattingError != nil {
tbl := uitable.New() return prettyError(formattingError)
}
tbl.MaxColWidth = colWidth fmt.Fprintln(cmd.out, string(history))
tbl.AddRow("REVISION", "UPDATED", "STATUS", "CHART", "DESCRIPTION") return nil
}
func getReleaseHistory(rls []*release.Release) (history releaseHistory) {
for i := len(rls) - 1; i >= 0; i-- { for i := len(rls) - 1; i >= 0; i-- {
r := rls[i] r := rls[i]
c := formatChartname(r.Chart) c := formatChartname(r.Chart)
@ -106,9 +136,30 @@ func formatHistory(rls []*release.Release, colWidth uint) string {
s := r.Info.Status.Code.String() s := r.Info.Status.Code.String()
v := r.Version v := r.Version
d := r.Info.Description d := r.Info.Description
tbl.AddRow(v, t, s, c, d)
rInfo := releaseInfo{
Revision: v,
Updated: t,
Status: s,
Chart: c,
Description: d,
}
history = append(history, rInfo)
}
return history
}
func formatAsTable(releases releaseHistory, colWidth uint) []byte {
tbl := uitable.New()
tbl.MaxColWidth = colWidth
tbl.AddRow("REVISION", "UPDATED", "STATUS", "CHART", "DESCRIPTION")
for i := 0; i <= len(releases)-1; i++ {
r := releases[i]
tbl.AddRow(r.Revision, r.Updated, r.Status, r.Chart, r.Description)
} }
return tbl.String() return tbl.Bytes()
} }
func formatChartname(c *chart.Chart) string { func formatChartname(c *chart.Chart) string {

@ -57,6 +57,26 @@ func TestHistoryCmd(t *testing.T) {
}, },
expected: "REVISION\tUPDATED \tSTATUS \tCHART \tDESCRIPTION \n3 \t(.*)\tSUPERSEDED\tfoo-0.1.0-beta.1\tRelease mock\n4 \t(.*)\tDEPLOYED \tfoo-0.1.0-beta.1\tRelease mock\n", expected: "REVISION\tUPDATED \tSTATUS \tCHART \tDESCRIPTION \n3 \t(.*)\tSUPERSEDED\tfoo-0.1.0-beta.1\tRelease mock\n4 \t(.*)\tDEPLOYED \tfoo-0.1.0-beta.1\tRelease mock\n",
}, },
{
cmds: "helm history --max=MAX RELEASE_NAME -o yaml",
desc: "get history with yaml output format",
args: []string{"--max=2", "-o=yaml", "angry-bird"},
resp: []*rpb.Release{
mk("angry-bird", 4, rpb.Status_DEPLOYED),
mk("angry-bird", 3, rpb.Status_SUPERSEDED),
},
xout: "- chart: foo-0.1.0-beta.1\n description: Release mock\n revision: 3\n status: SUPERSEDED\n updated: (.*)\n- chart: foo-0.1.0-beta.1\n description: Release mock\n revision: 4\n status: DEPLOYED\n updated: (.*)\n\n",
},
{
cmds: "helm history --max=MAX RELEASE_NAME -o json",
desc: "get history with json output format",
args: []string{"--max=2", "-o=json", "angry-bird"},
resp: []*rpb.Release{
mk("angry-bird", 4, rpb.Status_DEPLOYED),
mk("angry-bird", 3, rpb.Status_SUPERSEDED),
},
xout: `[{"revision":3,"updated":".*","status":"SUPERSEDED","chart":"foo\-0.1.0-beta.1","description":"Release mock"},{"revision":4,"updated":".*","status":"DEPLOYED","chart":"foo\-0.1.0-beta.1","description":"Release mock"}]\n`,
},
} }
runReleaseCases(t, tests, func(c *helm.FakeClient, out io.Writer) *cobra.Command { runReleaseCases(t, tests, func(c *helm.FakeClient, out io.Writer) *cobra.Command {

@ -30,6 +30,7 @@ helm history [flags] RELEASE_NAME
``` ```
--col-width uint specifies the max column width of output (default 60) --col-width uint specifies the max column width of output (default 60)
--max int32 maximum number of revision to include in history (default 256) --max int32 maximum number of revision to include in history (default 256)
-o, --output string prints the output in the specified format (json|table|yaml) (default "table")
--tls enable TLS for request --tls enable TLS for request
--tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem")
--tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem")
@ -51,4 +52,4 @@ helm history [flags] RELEASE_NAME
### SEE ALSO ### SEE ALSO
* [helm](helm.md) - The Helm package manager for Kubernetes. * [helm](helm.md) - The Helm package manager for Kubernetes.
###### Auto generated by spf13/cobra on 8-Mar-2018 ###### Auto generated by spf13/cobra on 14-Mar-2018

Loading…
Cancel
Save