// getCmd is the command that implements 'helm get' func (g *getCmd) run() error { res, err := g.client.ReleaseContent(g.release) if err != nil { return prettyError(err) } cfg, err := chartutil.CoalesceValues(res.Release.Chart, res.Release.Config, nil) if err != nil { return err } cfgStr, err := cfg.YAML() if err != nil { return err } fmt.Fprintf(g.out, "CHART: %s-%s\n", res.Release.Chart.Metadata.Name, res.Release.Chart.Metadata.Version) fmt.Fprintf(g.out, "RELEASED: %s\n", timeconv.Format(res.Release.Info.LastDeployed, time.ANSIC)) fmt.Fprintln(g.out, "USER-SUPPLIED VALUES:") fmt.Fprintln(g.out, res.Release.Config.Raw) fmt.Fprintln(g.out, "COMPUTED VALUES:") fmt.Fprintln(g.out, cfgStr) fmt.Fprintln(g.out, "MANIFEST:") fmt.Fprintln(g.out, res.Release.Manifest) return nil }
// getCmd is the command that implements 'helm get' func getCmd(cmd *cobra.Command, args []string) error { if len(args) == 0 { return errReleaseRequired } res, err := helm.GetReleaseContent(args[0]) if err != nil { return prettyError(err) } cfg, err := chartutil.CoalesceValues(res.Release.Chart, res.Release.Config, nil) if err != nil { return err } cfgStr, err := cfg.YAML() if err != nil { return err } fmt.Printf("CHART: %s-%s\n", res.Release.Chart.Metadata.Name, res.Release.Chart.Metadata.Version) fmt.Printf("RELEASED: %s\n", timeconv.Format(res.Release.Info.LastDeployed, time.ANSIC)) fmt.Println("USER-SUPPLIED VALUES:") fmt.Println(res.Release.Config.Raw) fmt.Println("COMPUTED VALUES:") fmt.Println(cfgStr) fmt.Println("MANIFEST:") fmt.Println(res.Release.Manifest) return nil }
// getValues implements 'helm get values' func getValues(cmd *cobra.Command, args []string) error { if len(args) == 0 { return errReleaseRequired } res, err := helm.GetReleaseContent(args[0]) if err != nil { return prettyError(err) } // If the user wants all values, compute the values and return. if allValues { cfg, err := chartutil.CoalesceValues(res.Release.Chart, res.Release.Config, nil) if err != nil { return err } cfgStr, err := cfg.YAML() if err != nil { return err } fmt.Println(cfgStr) return nil } fmt.Println(res.Release.Config.Raw) return nil }
func TestRender(t *testing.T) { c := &chart.Chart{ Metadata: &chart.Metadata{ Name: "moby", Version: "1.2.3", }, Templates: []*chart.Template{ {Name: "test1", Data: []byte("{{.outer | title }} {{.inner | title}}")}, {Name: "test2", Data: []byte("{{.global.callme | lower }}")}, {Name: "test3", Data: []byte("{{.noValue}}")}, }, Values: &chart.Config{ Raw: "outer: DEFAULT\ninner: DEFAULT", }, } vals := &chart.Config{ Raw: "outer: BAD\ninner: inn", } overrides := map[string]interface{}{ "outer": "spouter", "global": map[string]interface{}{ "callme": "Ishmael", }, } e := New() v, err := chartutil.CoalesceValues(c, vals, overrides) if err != nil { t.Fatalf("Failed to coalesce values: %s", err) } out, err := e.Render(c, v) if err != nil { t.Errorf("Failed to render templates: %s", err) } expect := "Spouter Inn" if out["test1"] != expect { t.Errorf("Expected %q, got %q", expect, out["test1"]) } expect = "ishmael" if out["test2"] != expect { t.Errorf("Expected %q, got %q", expect, out["test2"]) } expect = "" if out["test3"] != expect { t.Errorf("Expected %q, got %q", expect, out["test3"]) } if _, err := e.Render(c, v); err != nil { t.Errorf("Unexpected error: %s", err) } }
// getCmd is the command that implements 'helm get' func (g *getCmd) run() error { res, err := g.client.ReleaseContent(g.release, helm.ContentReleaseVersion(g.version)) if err != nil { return prettyError(err) } cfg, err := chartutil.CoalesceValues(res.Release.Chart, res.Release.Config) if err != nil { return err } cfgStr, err := cfg.YAML() if err != nil { return err } data := map[string]interface{}{ "Release": res.Release, "ComputedValues": cfgStr, "ReleaseDate": timeconv.Format(res.Release.Info.LastDeployed, time.ANSIC), } return tpl(getTemplate, data, g.out) }
// getValues implements 'helm get values' func (g *getValuesCmd) run() error { res, err := g.client.ReleaseContent(g.release) if err != nil { return prettyError(err) } // If the user wants all values, compute the values and return. if g.allValues { cfg, err := chartutil.CoalesceValues(res.Release.Chart, res.Release.Config) if err != nil { return err } cfgStr, err := cfg.YAML() if err != nil { return err } fmt.Fprintln(g.out, cfgStr) return nil } fmt.Fprintln(g.out, res.Release.Config.Raw) return nil }
func TestRenderNestedValues(t *testing.T) { e := New() innerpath := "templates/inner.tpl" outerpath := "templates/outer.tpl" // Ensure namespacing rules are working. deepestpath := "templates/inner.tpl" checkrelease := "templates/release.tpl" deepest := &chart.Chart{ Metadata: &chart.Metadata{Name: "deepest"}, Templates: []*chart.Template{ {Name: deepestpath, Data: []byte(`And this same {{.Values.what}} that smiles {{.Values.global.when}}`)}, {Name: checkrelease, Data: []byte(`Tomorrow will be {{default "happy" .Release.Name }}`)}, }, Values: &chart.Config{Raw: `what: "milkshake"`}, } inner := &chart.Chart{ Metadata: &chart.Metadata{Name: "herrick"}, Templates: []*chart.Template{ {Name: innerpath, Data: []byte(`Old {{.Values.who}} is still a-flyin'`)}, }, Values: &chart.Config{Raw: `who: "Robert"`}, Dependencies: []*chart.Chart{deepest}, } outer := &chart.Chart{ Metadata: &chart.Metadata{Name: "top"}, Templates: []*chart.Template{ {Name: outerpath, Data: []byte(`Gather ye {{.Values.what}} while ye may`)}, }, Values: &chart.Config{ Raw: ` what: stinkweed who: me herrick: who: time`, }, Dependencies: []*chart.Chart{inner}, } injValues := chart.Config{ Raw: ` what: rosebuds herrick: deepest: what: flower global: when: to-day`, } tmp, err := chartutil.CoalesceValues(outer, &injValues) if err != nil { t.Fatalf("Failed to coalesce values: %s", err) } inject := chartutil.Values{ "Values": tmp, "Chart": outer.Metadata, "Release": chartutil.Values{ "Name": "dyin", }, } t.Logf("Calculated values: %v", inject) out, err := e.Render(outer, inject) if err != nil { t.Fatalf("failed to render templates: %s", err) } fullouterpath := "top/" + outerpath if out[fullouterpath] != "Gather ye rosebuds while ye may" { t.Errorf("Unexpected outer: %q", out[fullouterpath]) } fullinnerpath := "top/charts/herrick/" + innerpath if out[fullinnerpath] != "Old time is still a-flyin'" { t.Errorf("Unexpected inner: %q", out[fullinnerpath]) } fulldeepestpath := "top/charts/herrick/charts/deepest/" + deepestpath if out[fulldeepestpath] != "And this same flower that smiles to-day" { t.Errorf("Unexpected deepest: %q", out[fulldeepestpath]) } fullcheckrelease := "top/charts/herrick/charts/deepest/" + checkrelease if out[fullcheckrelease] != "Tomorrow will be dyin" { t.Errorf("Unexpected release: %q", out[fullcheckrelease]) } }