Skip to content

Commit

Permalink
add support for output format in json or yaml
Browse files Browse the repository at this point in the history
  • Loading branch information
rajatjindal committed Mar 10, 2018
1 parent c5f2174 commit 46ed802
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 14 deletions.
75 changes: 62 additions & 13 deletions cmd/helm/history.go
Expand Up @@ -23,12 +23,24 @@ import (
"github.com/gosuri/uitable"
"github.com/spf13/cobra"

"encoding/json"
"github.com/ghodss/yaml"
"k8s.io/helm/pkg/helm"
"k8s.io/helm/pkg/proto/hapi/chart"
"k8s.io/helm/pkg/proto/hapi/release"
"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 = `
History prints historical revisions for a given release.
Expand All @@ -46,11 +58,12 @@ The historical release set is printed as a formatted table, e.g:
`

type historyCmd struct {
max int32
rls string
out io.Writer
helmc helm.Interface
colWidth uint
max int32
rls string
out io.Writer
helmc helm.Interface
colWidth uint
outputFormat string
}

func newHistoryCmd(c helm.Interface, w io.Writer) *cobra.Command {
Expand All @@ -77,6 +90,7 @@ func newHistoryCmd(c helm.Interface, w io.Writer) *cobra.Command {
f := cmd.Flags()
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.StringVarP(&his.outputFormat, "output", "o", "", "prints the output in the specified format ('json' or 'yaml' or defaults to 'table')")

return cmd
}
Expand All @@ -90,25 +104,60 @@ func (cmd *historyCmd) run() error {
return nil
}

fmt.Fprintln(cmd.out, formatHistory(r.Releases, cmd.colWidth))
releaseHistory := getReleaseHistory(r.Releases)

var history []byte
var formattingError error

switch cmd.outputFormat {
case "yaml":
history, formattingError = yaml.Marshal(releaseHistory)
case "json":
history, formattingError = json.Marshal(releaseHistory)
default:
history = formatAsTable(releaseHistory, cmd.colWidth)
}

if formattingError != nil {
return prettyError(formattingError)
}

fmt.Fprintln(cmd.out, string(history))
return nil
}

func formatHistory(rls []*release.Release, colWidth uint) string {
tbl := uitable.New()

tbl.MaxColWidth = colWidth
tbl.AddRow("REVISION", "UPDATED", "STATUS", "CHART", "DESCRIPTION")
func getReleaseHistory(rls []*release.Release) (history releaseHistory) {
for i := len(rls) - 1; i >= 0; i-- {
r := rls[i]
c := formatChartname(r.Chart)
t := timeconv.String(r.Info.LastDeployed)
s := r.Info.Status.Code.String()
v := r.Version
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 {
Expand Down
20 changes: 20 additions & 0 deletions cmd/helm/history_test.go
Expand Up @@ -63,6 +63,26 @@ func TestHistoryCmd(t *testing.T) {
},
xout: "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`,
},
}

var buf bytes.Buffer
Expand Down
3 changes: 2 additions & 1 deletion docs/helm/helm_history.md
Expand Up @@ -30,6 +30,7 @@ helm history [flags] RELEASE_NAME
```
--col-width uint specifies the max column width of output (default 60)
--max int32 maximum number of revision to include in history (default 256)
-o, --output string prints the output in the specified format ('json' or 'yaml' or defaults to 'table')
--tls enable TLS for request
--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")
Expand All @@ -51,4 +52,4 @@ helm history [flags] RELEASE_NAME
### SEE ALSO
* [helm](helm.md) - The Helm package manager for Kubernetes.

###### Auto generated by spf13/cobra on 8-Mar-2018
###### Auto generated by spf13/cobra on 9-Mar-2018

0 comments on commit 46ed802

Please sign in to comment.