diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index c8ce91f44..74ca76c4e 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -17,10 +17,8 @@ limitations under the License. package helm // import "k8s.io/helm/pkg/helm" import ( - "bytes" "errors" "math/rand" - "strings" "sync" "github.com/golang/protobuf/ptypes/timestamp" @@ -279,13 +277,15 @@ metadata: // MockReleaseOptions allows for user-configurable options on mock release objects. type MockReleaseOptions struct { - Name string - Version int32 - Chart *chart.Chart - Config *chart.Config - StatusCode release.Status_Code - Namespace string - Description string + Name string + Version int32 + Chart *chart.Chart + Config *chart.Config + StatusCode release.Status_Code + Namespace string + Description string + Hooks []*release.Hook + OmitDefaultHook bool } // ReleaseMock creates a mock release object based on options set by @@ -327,6 +327,20 @@ func ReleaseMock(opts *MockReleaseOptions) *release.Release { } } + hooks := opts.Hooks + if len(hooks) == 0 && !opts.OmitDefaultHook { + hooks = []*release.Hook{ + { + Name: "pre-install-hook", + Kind: "Job", + Path: "pre-install-hook.yaml", + Manifest: MockHookTemplate, + LastRun: &date, + Events: []release.Hook_Event{release.Hook_PRE_INSTALL}, + }, + } + } + config := opts.Config if config == nil { config = &chart.Config{Raw: `name: "value"`} @@ -349,22 +363,15 @@ func ReleaseMock(opts *MockReleaseOptions) *release.Release { Config: config, Version: version, Namespace: namespace, - Hooks: []*release.Hook{ - { - Name: "pre-install-hook", - Kind: "Job", - Path: "pre-install-hook.yaml", - Manifest: MockHookTemplate, - LastRun: &date, - Events: []release.Hook_Event{release.Hook_PRE_INSTALL}, - }, - }, - Manifest: MockManifest, + Hooks: hooks, + Manifest: MockManifest, } } // RenderReleaseMock will take a release (usually produced by helm.ReleaseMock) // and will render the Manifest inside using the local mechanism (no tiller). +// This will also overwrite any hooks in the release with the ones loaded from +// the chart. // (Compare to renderResources in pkg/tiller) func RenderReleaseMock(r *release.Release, asUpgrade bool) error { if r == nil || r.Chart == nil || r.Chart.Metadata == nil { @@ -386,15 +393,13 @@ func RenderReleaseMock(r *release.Release, asUpgrade bool) error { return err } - b := bytes.NewBuffer(nil) - for _, m := range manifest.SplitManifests(rendered) { - // Remove empty manifests - if len(strings.TrimSpace(m.Content)) == 0 { - continue - } - b.WriteString("\n---\n# Source: " + m.Name + "\n") - b.WriteString(m.Content) + hooks, manifests, _, err := manifest.Partition(rendered, chartutil.DefaultVersionSet, manifest.InstallOrder) + if err != nil { + return err } + + b := manifest.FlattenManifests(manifests) + r.Hooks = hooks r.Manifest = b.String() return nil } diff --git a/pkg/helm/fake_test.go b/pkg/helm/fake_test.go index 967905701..a84ab5faa 100644 --- a/pkg/helm/fake_test.go +++ b/pkg/helm/fake_test.go @@ -247,10 +247,10 @@ func TestFakeClient_InstallReleaseFromChart(t *testing.T) { opts: []InstallOption{ReleaseName("new-release")}, }, want: &rls.InstallReleaseResponse{ - Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release"}), false), + Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", OmitDefaultHook: true}), false), }, relsAfter: []*release.Release{ - withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release"}), false), + withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", OmitDefaultHook: true}), false), }, wantErr: false, }, @@ -418,10 +418,10 @@ func TestFakeClient_UpdateReleaseFromChart(t *testing.T) { opts: []UpdateOption{}, }, want: &rls.UpdateReleaseResponse{ - Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), true), + Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2, OmitDefaultHook: true}), true), }, relsAfter: []*release.Release{ - withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), true), + withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2, OmitDefaultHook: true}), true), }, wantErr: false, }, diff --git a/pkg/manifest/hooks.go b/pkg/manifest/hooks.go index 097f2bc7e..392847d8d 100644 --- a/pkg/manifest/hooks.go +++ b/pkg/manifest/hooks.go @@ -17,6 +17,7 @@ limitations under the License. package manifest import ( + "bytes" "fmt" "log" "path" @@ -105,6 +106,31 @@ func Partition(files map[string]string, apis chartutil.VersionSet, sort SortOrde return result.hooks, sortByKind(result.generic, sort), notes, nil } +// FlattenFiles will turn a manifest (in the form of a files map) back into a +// single buffer. +func FlattenFiles(files map[string]string) *bytes.Buffer { + var b bytes.Buffer + for name, content := range files { + if len(strings.TrimSpace(content)) == 0 { + continue + } + b.WriteString("\n---\n# Source: " + name + "\n") + b.WriteString(content) + } + return &b +} + +// FlattenManifests will turn a manifest (in the form of a partitioned slice) +// back into a single buffer. +func FlattenManifests(manifests []Manifest) *bytes.Buffer { + var b bytes.Buffer + for _, m := range manifests { + b.WriteString("\n---\n# Source: " + m.Name + "\n") + b.WriteString(m.Content) + } + return &b +} + // sort takes a manifestFile object which may contain multiple resource definition // entries and sorts each entry by hook types, and saves the resulting hooks and // generic manifests (or non-hooks) to the result struct. diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index f3c567b52..6540c1220 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -310,14 +310,7 @@ func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values // // 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) - } + b := manifest.FlattenFiles(files) return nil, b, "", err } @@ -336,13 +329,7 @@ func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values notes := notesBuffer.String() - // Aggregate all valid manifests into one big doc. - b := bytes.NewBuffer(nil) - for _, m := range manifests { - b.WriteString("\n---\n# Source: " + m.Name + "\n") - b.WriteString(m.Content) - } - + b := manifest.FlattenManifests(manifests) return hooks, b, notes, nil }