mirror of
https://github.com/helm/helm.git
synced 2026-04-22 06:37:10 -04:00
Fix 'helm template' to also print invalid yaml
Signed-off-by: Reinhard Naegele <unguiculus@gmail.com>
This commit is contained in:
parent
593ea3fb12
commit
2a73967ca2
7 changed files with 96 additions and 44 deletions
|
|
@ -64,57 +64,58 @@ func newTemplateCmd(cfg *action.Configuration, out io.Writer) *cobra.Command {
|
|||
client.APIVersions = chartutil.VersionSet(extraAPIs)
|
||||
client.IncludeCRDs = includeCrds
|
||||
rel, err := runInstall(args, client, valueOpts, out)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var manifests bytes.Buffer
|
||||
fmt.Fprintln(&manifests, strings.TrimSpace(rel.Manifest))
|
||||
// We ignore a potential error here because we always want to print the YAML,
|
||||
// even if it is not valid. The error is still returned afterwards.
|
||||
if rel != nil {
|
||||
var manifests bytes.Buffer
|
||||
fmt.Fprintln(&manifests, strings.TrimSpace(rel.Manifest))
|
||||
|
||||
if !client.DisableHooks {
|
||||
for _, m := range rel.Hooks {
|
||||
fmt.Fprintf(&manifests, "---\n# Source: %s\n%s\n", m.Path, m.Manifest)
|
||||
}
|
||||
}
|
||||
|
||||
// if we have a list of files to render, then check that each of the
|
||||
// provided files exists in the chart.
|
||||
if len(showFiles) > 0 {
|
||||
splitManifests := releaseutil.SplitManifests(manifests.String())
|
||||
manifestNameRegex := regexp.MustCompile("# Source: [^/]+/(.+)")
|
||||
var manifestsToRender []string
|
||||
for _, f := range showFiles {
|
||||
missing := true
|
||||
for _, manifest := range splitManifests {
|
||||
submatch := manifestNameRegex.FindStringSubmatch(manifest)
|
||||
if len(submatch) == 0 {
|
||||
continue
|
||||
}
|
||||
manifestName := submatch[1]
|
||||
// manifest.Name is rendered using linux-style filepath separators on Windows as
|
||||
// well as macOS/linux.
|
||||
manifestPathSplit := strings.Split(manifestName, "/")
|
||||
manifestPath := filepath.Join(manifestPathSplit...)
|
||||
|
||||
// if the filepath provided matches a manifest path in the
|
||||
// chart, render that manifest
|
||||
if f == manifestPath {
|
||||
manifestsToRender = append(manifestsToRender, manifest)
|
||||
missing = false
|
||||
}
|
||||
}
|
||||
if missing {
|
||||
return fmt.Errorf("could not find template %s in chart", f)
|
||||
if !client.DisableHooks {
|
||||
for _, m := range rel.Hooks {
|
||||
fmt.Fprintf(&manifests, "---\n# Source: %s\n%s\n", m.Path, m.Manifest)
|
||||
}
|
||||
}
|
||||
for _, m := range manifestsToRender {
|
||||
fmt.Fprintf(out, "---\n%s\n", m)
|
||||
|
||||
// if we have a list of files to render, then check that each of the
|
||||
// provided files exists in the chart.
|
||||
if len(showFiles) > 0 {
|
||||
splitManifests := releaseutil.SplitManifests(manifests.String())
|
||||
manifestNameRegex := regexp.MustCompile("# Source: [^/]+/(.+)")
|
||||
var manifestsToRender []string
|
||||
for _, f := range showFiles {
|
||||
missing := true
|
||||
for _, manifest := range splitManifests {
|
||||
submatch := manifestNameRegex.FindStringSubmatch(manifest)
|
||||
if len(submatch) == 0 {
|
||||
continue
|
||||
}
|
||||
manifestName := submatch[1]
|
||||
// manifest.Name is rendered using linux-style filepath separators on Windows as
|
||||
// well as macOS/linux.
|
||||
manifestPathSplit := strings.Split(manifestName, "/")
|
||||
manifestPath := filepath.Join(manifestPathSplit...)
|
||||
|
||||
// if the filepath provided matches a manifest path in the
|
||||
// chart, render that manifest
|
||||
if f == manifestPath {
|
||||
manifestsToRender = append(manifestsToRender, manifest)
|
||||
missing = false
|
||||
}
|
||||
}
|
||||
if missing {
|
||||
return fmt.Errorf("could not find template %s in chart", f)
|
||||
}
|
||||
}
|
||||
for _, m := range manifestsToRender {
|
||||
fmt.Fprintf(out, "---\n%s\n", m)
|
||||
}
|
||||
} else {
|
||||
fmt.Fprintf(out, "%s", manifests.String())
|
||||
}
|
||||
} else {
|
||||
fmt.Fprintf(out, "%s", manifests.String())
|
||||
}
|
||||
|
||||
return nil
|
||||
return err
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -102,6 +102,12 @@ func TestTemplateCmd(t *testing.T) {
|
|||
// don't accidentally get the expected result.
|
||||
repeat: 10,
|
||||
},
|
||||
{
|
||||
name: "chart with template with invalid yaml",
|
||||
cmd: fmt.Sprintf("template '%s'", "testdata/testcharts/chart-with-template-with-invalid-yaml"),
|
||||
wantError: true,
|
||||
golden: "output/template-with-invalid-yaml.txt",
|
||||
},
|
||||
}
|
||||
runTestCmd(t, tests)
|
||||
}
|
||||
|
|
|
|||
13
cmd/helm/testdata/output/template-with-invalid-yaml.txt
vendored
Normal file
13
cmd/helm/testdata/output/template-with-invalid-yaml.txt
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
# Source: chart-with-template-with-invalid-yaml/templates/alpine-pod.yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: "RELEASE-NAME-my-alpine"
|
||||
spec:
|
||||
containers:
|
||||
- name: waiter
|
||||
image: "alpine:3.9"
|
||||
command: ["/bin/sleep","9000"]
|
||||
invalid
|
||||
Error: YAML parse error on chart-with-template-with-invalid-yaml/templates/alpine-pod.yaml: error converting YAML to JSON: yaml: line 11: could not find expected ':'
|
||||
8
cmd/helm/testdata/testcharts/chart-with-template-with-invalid-yaml/Chart.yaml
vendored
Normal file
8
cmd/helm/testdata/testcharts/chart-with-template-with-invalid-yaml/Chart.yaml
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
apiVersion: v1
|
||||
description: Deploy a basic Alpine Linux pod
|
||||
home: https://helm.sh/helm
|
||||
name: chart-with-template-with-invalid-yaml
|
||||
sources:
|
||||
- https://github.com/helm/helm
|
||||
version: 0.1.0
|
||||
type: application
|
||||
13
cmd/helm/testdata/testcharts/chart-with-template-with-invalid-yaml/README.md
vendored
Normal file
13
cmd/helm/testdata/testcharts/chart-with-template-with-invalid-yaml/README.md
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#Alpine: A simple Helm chart
|
||||
|
||||
Run a single pod of Alpine Linux.
|
||||
|
||||
This example was generated using the command `helm create alpine`.
|
||||
|
||||
The `templates/` directory contains a very simple pod resource with a
|
||||
couple of parameters.
|
||||
|
||||
The `values.yaml` file contains the default values for the
|
||||
`alpine-pod.yaml` template.
|
||||
|
||||
You can install this example using `helm install ./alpine`.
|
||||
10
cmd/helm/testdata/testcharts/chart-with-template-with-invalid-yaml/templates/alpine-pod.yaml
vendored
Normal file
10
cmd/helm/testdata/testcharts/chart-with-template-with-invalid-yaml/templates/alpine-pod.yaml
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: "{{.Release.Name}}-{{.Values.Name}}"
|
||||
spec:
|
||||
containers:
|
||||
- name: waiter
|
||||
image: "alpine:3.9"
|
||||
command: ["/bin/sleep","9000"]
|
||||
invalid
|
||||
1
cmd/helm/testdata/testcharts/chart-with-template-with-invalid-yaml/values.yaml
vendored
Normal file
1
cmd/helm/testdata/testcharts/chart-with-template-with-invalid-yaml/values.yaml
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
Name: my-alpine
|
||||
Loading…
Reference in a new issue