From 0519200748df1667c18c63a490e8f290fc35f6f0 Mon Sep 17 00:00:00 2001 From: Tan Guofu <267266206@qq.com> Date: Mon, 18 Apr 2022 18:02:58 +0800 Subject: [PATCH 1/3] fix: update action.go add postrenderer to Hooks Manifest Signed-off-by: Tan Guofu <267266206@qq.com> Signed-off-by: guofutan --- pkg/action/action.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/action/action.go b/pkg/action/action.go index 82760250f..57766c16d 100644 --- a/pkg/action/action.go +++ b/pkg/action/action.go @@ -220,6 +220,13 @@ func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Valu if err != nil { return hs, b, notes, errors.Wrap(err, "error while running post render on files") } + for _, hook := range hs { + sb, err := pr.Run(bytes.NewBufferString(hook.Manifest)) + if err != nil { + return hs, b, notes, errors.Wrap(err, "error while running post render on hooks manifest") + } + hook.Manifest = sb.String() + } } return hs, b, notes, nil From 6ed2086b74b79d9c50caa5ac2a050d1c587f6169 Mon Sep 17 00:00:00 2001 From: guofutan Date: Tue, 21 Jun 2022 15:27:11 +0800 Subject: [PATCH 2/3] fix: add unit test for TestPostRenderHookManifests and fix unit test error in internal/test/test.go and pkg/chartutil/values.go Signed-off-by: guofutan --- pkg/action/action.go | 23 +++++++++++++++++------ pkg/action/action_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/pkg/action/action.go b/pkg/action/action.go index 57766c16d..7e31de76a 100644 --- a/pkg/action/action.go +++ b/pkg/action/action.go @@ -97,6 +97,19 @@ type Configuration struct { Log func(string, ...interface{}) } +// 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 post render on hook: %s manifest", hook.Name) + } + hook.Manifest = sb.String() + } + return nil +} + // renderResources renders the templates in a chart // // TODO: This function is badly in need of a refactor. @@ -220,12 +233,10 @@ func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Valu if err != nil { return hs, b, notes, errors.Wrap(err, "error while running post render on files") } - for _, hook := range hs { - sb, err := pr.Run(bytes.NewBufferString(hook.Manifest)) - if err != nil { - return hs, b, notes, errors.Wrap(err, "error while running post render on hooks manifest") - } - hook.Manifest = sb.String() + + err = postRenderHookManifests(hs, pr) + if err != nil { + return hs, b, notes, err } } diff --git a/pkg/action/action_test.go b/pkg/action/action_test.go index c816c84af..cfdc039a9 100644 --- a/pkg/action/action_test.go +++ b/pkg/action/action_test.go @@ -18,13 +18,16 @@ package action import ( "flag" "io/ioutil" + "runtime" "testing" + "github.com/stretchr/testify/assert" fakeclientset "k8s.io/client-go/kubernetes/fake" "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/chartutil" kubefake "helm.sh/helm/v3/pkg/kube/fake" + "helm.sh/helm/v3/pkg/postrender" "helm.sh/helm/v3/pkg/registry" "helm.sh/helm/v3/pkg/release" "helm.sh/helm/v3/pkg/storage" @@ -281,3 +284,37 @@ func TestGetVersionSet(t *testing.T) { t.Error("Non-existent version is reported found.") } } + +func TestPostRenderHookManifests(t *testing.T) { + if runtime.GOOS == "windows" { + // the actual Run test uses a basic sed example, so skip this test on windows + t.Skip("skipping on windows") + } + + hs := []*release.Hook{ + { + Name: "finding-nemo", + Kind: "Pod", + Path: "finding-nemo", + Manifest: manifestWithTestHook, + Events: []release.HookEvent{ + release.HookTest, + }, + }, + } + + pr, err := postrender.NewExec("sed", "s/fake-image/local-image/") + if err != nil { + t.Error(err) + } + + if err := postRenderHookManifests(hs, pr); err != nil { + t.Error(err) + } + + is := assert.New(t) + for _, hook := range hs { + is.Contains(hook.Manifest, "local-image") + } + +} From 5f3ca5d78a500460564e17d6981567ae3d086d69 Mon Sep 17 00:00:00 2001 From: guofutan Date: Thu, 8 Sep 2022 11:48:31 +0800 Subject: [PATCH 3/3] fix: add more info in postRenderHookManifests and use mock instead of sed in TestPostRenderHookManifests Signed-off-by: guofutan --- pkg/action/action.go | 2 +- pkg/action/action_test.go | 36 ++++++++++++++++++++++++------------ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/pkg/action/action.go b/pkg/action/action.go index 7e31de76a..550137f14 100644 --- a/pkg/action/action.go +++ b/pkg/action/action.go @@ -103,7 +103,7 @@ func postRenderHookManifests(hs []*release.Hook, pr postrender.PostRenderer) err for _, hook := range hs { sb, err := pr.Run(bytes.NewBufferString(hook.Manifest)) if err != nil { - return errors.Wrapf(err, "error while running post render on hook: %s manifest", hook.Name) + 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() } diff --git a/pkg/action/action_test.go b/pkg/action/action_test.go index cfdc039a9..cc68aab70 100644 --- a/pkg/action/action_test.go +++ b/pkg/action/action_test.go @@ -16,9 +16,9 @@ limitations under the License. package action import ( + "bytes" "flag" "io/ioutil" - "runtime" "testing" "github.com/stretchr/testify/assert" @@ -27,7 +27,6 @@ import ( "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/chartutil" kubefake "helm.sh/helm/v3/pkg/kube/fake" - "helm.sh/helm/v3/pkg/postrender" "helm.sh/helm/v3/pkg/registry" "helm.sh/helm/v3/pkg/release" "helm.sh/helm/v3/pkg/storage" @@ -285,17 +284,33 @@ func TestGetVersionSet(t *testing.T) { } } -func TestPostRenderHookManifests(t *testing.T) { - if runtime.GOOS == "windows" { - // the actual Run test uses a basic sed example, so skip this test on windows - t.Skip("skipping on windows") +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: "finding-nemo", + Name: "test-postrender-hook", Kind: "Pod", - Path: "finding-nemo", + Path: "test-postrender-hook", Manifest: manifestWithTestHook, Events: []release.HookEvent{ release.HookTest, @@ -303,10 +318,7 @@ func TestPostRenderHookManifests(t *testing.T) { }, } - pr, err := postrender.NewExec("sed", "s/fake-image/local-image/") - if err != nil { - t.Error(err) - } + pr := &PostRendererMock{} if err := postRenderHookManifests(hs, pr); err != nil { t.Error(err)