From 6eabe28334323686f764373551326a6a70a3510d Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Mon, 14 Nov 2016 13:15:41 -0700 Subject: [PATCH] fix(tiller): show failed YAML When an install fails and --dry-run is set, return the broken YAML for the user to debug. Closes #1499 --- pkg/tiller/release_server.go | 41 +++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index 24f3e318f..4750cf282 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -595,7 +595,14 @@ func (s *ReleaseServer) InstallRelease(c ctx.Context, req *services.InstallRelea rel, err := s.prepareRelease(req) if err != nil { log.Printf("Failed install prepare step: %s", err) - return nil, err + res := &services.InstallReleaseResponse{Release: rel} + + // On dry run, append the manifest contents to a failed release. This is + // a stop-gap until we can revisit an error backchannel post-2.0. + if req.DryRun && strings.HasPrefix(err.Error(), "YAML parse error") { + err = fmt.Errorf("%s\n%s", err, rel.Manifest) + } + return res, err } res, err := s.performRelease(rel, req) @@ -625,7 +632,24 @@ func (s *ReleaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re hooks, manifestDoc, notesTxt, err := s.renderResources(req.Chart, valuesToRender) if err != nil { - return nil, err + // Return a release with partial data so that client can show debugging + // information. + rel := &release.Release{ + Name: name, + Namespace: req.Namespace, + Chart: req.Chart, + Config: req.Values, + Info: &release.Info{ + FirstDeployed: ts, + LastDeployed: ts, + Status: &release.Status{Code: release.Status_UNKNOWN}, + }, + Version: 0, + } + if manifestDoc != nil { + rel.Manifest = manifestDoc.String() + } + return rel, err } // Store a release. @@ -708,7 +732,18 @@ func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values if err != nil { // By catching parse errors here, we can prevent bogus releases from going // to Kubernetes. - return nil, nil, "", err + // + // We return the files as a big blob of data to help the user debug parser + // errors. + b := bytes.NewBuffer(nil) + for name, content := range files { + if len(strings.TrimSpace(content)) == 0 { + continue + } + b.WriteString("\n---\n# Source: " + name + "\n") + b.WriteString(content) + } + return nil, b, "", err } // Aggregate all valid manifests into one big doc.