diff --git a/pkg/action/action.go b/pkg/action/action.go index 40194dfd7..5ac0ed73b 100644 --- a/pkg/action/action.go +++ b/pkg/action/action.go @@ -91,6 +91,19 @@ type Configuration struct { mutex sync.Mutex } +// postRenderReleaseHook render the manifests of release hooks with postrender.PostRenderer +func postRenderHookManifests(hs []*release.Hook, pr postrender.PostRenderer) error { + + for _, hook := range hs { + sb, err := pr.Run(bytes.NewBufferString(hook.Manifest)) + if err != nil { + return errors.Wrapf(err, "error while running postRender on hook: %s, which is path: %s and kind: %s", hook.Name, hook.Path, hook.Kind) + } + hook.Manifest = sb.String() + } + return nil +} + // renderResources renders the templates in a chart // // TODO: This function is badly in need of a refactor. @@ -225,6 +238,11 @@ func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Valu if err != nil { return hs, b, notes, fmt.Errorf("error while running post render on files: %w", err) } + + err = postRenderHookManifests(hs, pr) + if err != nil { + return hs, b, notes, err + } } return hs, b, notes, nil diff --git a/pkg/action/action_test.go b/pkg/action/action_test.go index 9436abef5..f9dd1acf5 100644 --- a/pkg/action/action_test.go +++ b/pkg/action/action_test.go @@ -16,6 +16,7 @@ limitations under the License. package action import ( + "bytes" "flag" "fmt" "io" @@ -368,3 +369,50 @@ func TestGetVersionSet(t *testing.T) { t.Error("Non-existent version is reported found.") } } + +type PostRendererMock struct { +} + +func (p *PostRendererMock) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { + var output = &bytes.Buffer{} + for { + line, err := renderedManifests.ReadBytes('\n') + + if len(line) > 0 { + output.Write(bytes.ReplaceAll(line, []byte("fake-image"), []byte("local-image"))) + } + // ReadBytes returns err != nil if and only if the returned data does not end in delim. + if err != nil { + break + } + } + + return output, nil +} + +func TestPostRenderHookManifests(t *testing.T) { + + hs := []*release.Hook{ + { + Name: "test-postrender-hook", + Kind: "Pod", + Path: "test-postrender-hook", + Manifest: manifestWithTestHook, + Events: []release.HookEvent{ + release.HookTest, + }, + }, + } + + pr := &PostRendererMock{} + + if err := postRenderHookManifests(hs, pr); err != nil { + t.Error(err) + } + + is := assert.New(t) + for _, hook := range hs { + is.Contains(hook.Manifest, "local-image") + } + +}