[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"
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
}

@ -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,
},

@ -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.

@ -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
}

Loading…
Cancel
Save