From 7f13e13a716b192ecac104c0736227120f924dae Mon Sep 17 00:00:00 2001 From: Rajat Jindal Date: Tue, 21 Nov 2017 11:10:27 -0800 Subject: [PATCH] support output-dir when running 'helm template' (#3144) * support output-dir when running 'helm template' * add --output-dir to documentation * when writing to file, dont add additional document * trigger another ci build. make test-unit works for me * dont write blank files * return err instead of panic --- cmd/helm/template.go | 68 ++++++++++++++++++++++++++++++++++++++ docs/helm/helm_template.md | 3 +- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/cmd/helm/template.go b/cmd/helm/template.go index 92f6ed738..3ca364cfb 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -21,6 +21,7 @@ import ( "fmt" "io" "os" + "path" "path/filepath" "regexp" "strings" @@ -39,6 +40,10 @@ import ( tversion "k8s.io/helm/pkg/version" ) +const defaultDirectoryPermission = 0755 + +var whitespaceRegex = regexp.MustCompile(`^\s*$`) + const templateDesc = ` Render chart templates locally and display the output. @@ -64,6 +69,7 @@ type templateCmd struct { releaseName string renderFiles []string kubeVersion string + outputDir string } func newTemplateCmd(out io.Writer) *cobra.Command { @@ -88,6 +94,7 @@ func newTemplateCmd(out io.Writer) *cobra.Command { f.StringArrayVar(&t.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") f.StringVar(&t.nameTemplate, "name-template", "", "specify template used to name the release") f.StringVar(&t.kubeVersion, "kube-version", "", "override the Kubernetes version used as Capabilities.KubeVersion.Major/Minor (e.g. 1.7)") + f.StringVar(&t.outputDir, "output-dir", "", "writes the executed templates to files in output-dir instead of stdout") return cmd } @@ -126,6 +133,14 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { } } + // verify that output-dir exists if provided + if t.outputDir != "" { + _, err = os.Stat(t.outputDir) + if os.IsNotExist(err) { + return fmt.Errorf("output-dir '%s' does not exist", t.outputDir) + } + } + if t.namespace == "" { t.namespace = defaultNamespace() } @@ -248,8 +263,61 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { if strings.HasPrefix(b, "_") { continue } + + if t.outputDir != "" { + // blank template after execution + if whitespaceRegex.MatchString(data) { + continue + } + err = writeToFile(t.outputDir, m.Name, data) + if err != nil { + return err + } + continue + } fmt.Printf("---\n# Source: %s\n", m.Name) fmt.Println(data) } return nil } + +// write the to / +func writeToFile(outputDir string, name string, data string) error { + outfileName := strings.Join([]string{outputDir, name}, string(filepath.Separator)) + + err := ensureDirectoryForFile(outfileName) + if err != nil { + return err + } + + f, err := os.Create(outfileName) + if err != nil { + return err + } + + defer f.Close() + + _, err = f.WriteString(fmt.Sprintf("##---\n# Source: %s\n%s", name, data)) + + if err != nil { + return err + } + + fmt.Printf("wrote %s\n", outfileName) + return nil +} + +// check if the directory exists to create file. creates if don't exists +func ensureDirectoryForFile(file string) error { + baseDir := path.Dir(file) + _, err := os.Stat(baseDir) + if err != nil && !os.IsNotExist(err) { + return err + } + + err = os.MkdirAll(baseDir, defaultDirectoryPermission) + if err != nil { + return err + } + return nil +} diff --git a/docs/helm/helm_template.md b/docs/helm/helm_template.md index 46c4f9ca1..983652dba 100644 --- a/docs/helm/helm_template.md +++ b/docs/helm/helm_template.md @@ -31,6 +31,7 @@ helm template [flags] CHART --name-template string specify template used to name the release --namespace string namespace to install the release into --notes show the computed NOTES.txt file as well + --output-dir string writes the executed templates to files in output-dir instead of stdout --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) -f, --values valueFiles specify values in a YAML file (can specify multiple) (default []) ``` @@ -49,4 +50,4 @@ helm template [flags] CHART ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Nov-2017 +###### Auto generated by spf13/cobra on 15-Nov-2017