[test] teach the helm mock to update the hooks on render

Signed-off-by: Mike Lundy <mike@fluffypenguin.org>
pull/5040/head
Mike Lundy 6 years ago
parent d6480c0b73
commit eb558956fe
No known key found for this signature in database
GPG Key ID: 9CC064ECB96D9325

@ -17,10 +17,8 @@ limitations under the License.
package helm // import "k8s.io/helm/pkg/helm" package helm // import "k8s.io/helm/pkg/helm"
import ( import (
"bytes"
"errors" "errors"
"math/rand" "math/rand"
"strings"
"sync" "sync"
"github.com/golang/protobuf/ptypes/timestamp" "github.com/golang/protobuf/ptypes/timestamp"
@ -286,6 +284,8 @@ type MockReleaseOptions struct {
StatusCode release.Status_Code StatusCode release.Status_Code
Namespace string Namespace string
Description string Description string
Hooks []*release.Hook
OmitDefaultHook bool
} }
// ReleaseMock creates a mock release object based on options set by // 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 config := opts.Config
if config == nil { if config == nil {
config = &chart.Config{Raw: `name: "value"`} config = &chart.Config{Raw: `name: "value"`}
@ -349,22 +363,15 @@ func ReleaseMock(opts *MockReleaseOptions) *release.Release {
Config: config, Config: config,
Version: version, Version: version,
Namespace: namespace, Namespace: namespace,
Hooks: []*release.Hook{ Hooks: hooks,
{
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, Manifest: MockManifest,
} }
} }
// RenderReleaseMock will take a release (usually produced by helm.ReleaseMock) // RenderReleaseMock will take a release (usually produced by helm.ReleaseMock)
// and will render the Manifest inside using the local mechanism (no tiller). // 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) // (Compare to renderResources in pkg/tiller)
func RenderReleaseMock(r *release.Release, asUpgrade bool) error { func RenderReleaseMock(r *release.Release, asUpgrade bool) error {
if r == nil || r.Chart == nil || r.Chart.Metadata == nil { if r == nil || r.Chart == nil || r.Chart.Metadata == nil {
@ -386,15 +393,13 @@ func RenderReleaseMock(r *release.Release, asUpgrade bool) error {
return err return err
} }
b := bytes.NewBuffer(nil) hooks, manifests, _, err := manifest.Partition(rendered, chartutil.DefaultVersionSet, manifest.InstallOrder)
for _, m := range manifest.SplitManifests(rendered) { if err != nil {
// Remove empty manifests return err
if len(strings.TrimSpace(m.Content)) == 0 {
continue
}
b.WriteString("\n---\n# Source: " + m.Name + "\n")
b.WriteString(m.Content)
} }
b := manifest.FlattenManifests(manifests)
r.Hooks = hooks
r.Manifest = b.String() r.Manifest = b.String()
return nil return nil
} }

@ -247,10 +247,10 @@ func TestFakeClient_InstallReleaseFromChart(t *testing.T) {
opts: []InstallOption{ReleaseName("new-release")}, opts: []InstallOption{ReleaseName("new-release")},
}, },
want: &rls.InstallReleaseResponse{ want: &rls.InstallReleaseResponse{
Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release"}), false), Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", OmitDefaultHook: true}), false),
}, },
relsAfter: []*release.Release{ relsAfter: []*release.Release{
withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release"}), false), withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", OmitDefaultHook: true}), false),
}, },
wantErr: false, wantErr: false,
}, },
@ -418,10 +418,10 @@ func TestFakeClient_UpdateReleaseFromChart(t *testing.T) {
opts: []UpdateOption{}, opts: []UpdateOption{},
}, },
want: &rls.UpdateReleaseResponse{ 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{ 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, wantErr: false,
}, },

@ -17,6 +17,7 @@ limitations under the License.
package manifest package manifest
import ( import (
"bytes"
"fmt" "fmt"
"log" "log"
"path" "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 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 // 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 // entries and sorts each entry by hook types, and saves the resulting hooks and
// generic manifests (or non-hooks) to the result struct. // generic manifests (or non-hooks) to the result struct.

@ -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 // We return the files as a big blob of data to help the user debug parser
// errors. // errors.
b := bytes.NewBuffer(nil) b := manifest.FlattenFiles(files)
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 return nil, b, "", err
} }
@ -336,13 +329,7 @@ func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values
notes := notesBuffer.String() notes := notesBuffer.String()
// Aggregate all valid manifests into one big doc. b := manifest.FlattenManifests(manifests)
b := bytes.NewBuffer(nil)
for _, m := range manifests {
b.WriteString("\n---\n# Source: " + m.Name + "\n")
b.WriteString(m.Content)
}
return hooks, b, notes, nil return hooks, b, notes, nil
} }

Loading…
Cancel
Save