From 55261fa9c527a6f828cf5a03e8b25491f6ec8232 Mon Sep 17 00:00:00 2001 From: Sebastian Bauer Date: Mon, 18 Nov 2019 16:43:23 +0100 Subject: [PATCH 1/5] expose basePath it will have path to current yaml so we are able to do: ``` - {{ basePath }}/values/env-api.yaml.gotmpl ``` --- pkg/tmpl/context_funcs.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/tmpl/context_funcs.go b/pkg/tmpl/context_funcs.go index 9b5633488..a3a5c3627 100644 --- a/pkg/tmpl/context_funcs.go +++ b/pkg/tmpl/context_funcs.go @@ -25,6 +25,7 @@ func (c *Context) createFuncMap() template.FuncMap { "get": get, "getOrNil": getOrNil, "tpl": c.Tpl, + "basePath": func() string { return c.basePath }, } if c.preRender { // disable potential side-effect template calls From f71b9a6ec6857d700faa44ed4f893d9f9e12230b Mon Sep 17 00:00:00 2001 From: Sebastian Bauer Date: Mon, 18 Nov 2019 16:45:54 +0100 Subject: [PATCH 2/5] pass absolute paths between functions This will allow us to send that absolute path to "basePath" variable when rendering yamls --- pkg/app/app.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/pkg/app/app.go b/pkg/app/app.go index b07f92df4..6af8e44e7 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -240,8 +240,8 @@ func (a *App) within(dir string, do func() error) error { return appErr } -func (a *App) visitStateFiles(fileOrDir string, do func(string, string) error) error { - desiredStateFiles, err := a.findDesiredStateFiles(fileOrDir) +func (a *App) visitStateFiles(absFileOrDir string, do func(string, string) error) error { + desiredStateFiles, err := a.findDesiredStateFiles(absFileOrDir) if err != nil { return appError("", err) } @@ -299,17 +299,16 @@ func (a *App) loadDesiredStateFromYaml(file string, opts ...LoadOpts) (*state.He return ld.Load(file, op) } -func (a *App) visitStates(fileOrDir string, defOpts LoadOpts, converge func(*state.HelmState, helmexec.Interface) (bool, []error)) error { +func (a *App) visitStates(absFileOrDir string, defOpts LoadOpts, converge func(*state.HelmState, helmexec.Interface) (bool, []error)) error { noMatchInHelmfiles := true - - err := a.visitStateFiles(fileOrDir, func(f, d string) error { + err := a.visitStateFiles(absFileOrDir, func(f, d string) error { opts := defOpts.DeepCopy() if opts.CalleePath == "" { opts.CalleePath = f } - - st, err := a.loadDesiredStateFromYaml(f, opts) + absFile := filepath.Join(d, f) + st, err := a.loadDesiredStateFromYaml(absFile, opts) sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) @@ -414,7 +413,11 @@ func (a *App) ForEachStateFiltered(do func(*Run) []error) error { func (a *App) ForEachState(do func(*Run) (bool, []error)) error { ctx := NewContext() - err := a.visitStatesWithSelectorsAndRemoteSupport(a.FileOrDir, func(st *state.HelmState, helm helmexec.Interface) (bool, []error) { + absFileOrDir, err := a.abs(a.FileOrDir) + if err != nil && a.ErrorHandler != nil { + return err + } + err = a.visitStatesWithSelectorsAndRemoteSupport(absFileOrDir, func(st *state.HelmState, helm helmexec.Interface) (bool, []error) { run := NewRun(st, helm, ctx) return do(run) }) @@ -493,7 +496,7 @@ type Opts struct { DAGEnabled bool } -func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converge func(*state.HelmState, helmexec.Interface) (bool, []error)) error { +func (a *App) visitStatesWithSelectorsAndRemoteSupport(absFileOrDir string, converge func(*state.HelmState, helmexec.Interface) (bool, []error)) error { opts := LoadOpts{ Selectors: a.Selectors, } @@ -532,7 +535,7 @@ func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converg a.remote = remote - return a.visitStates(fileOrDir, opts, converge) + return a.visitStates(absFileOrDir, opts, converge) } func (a *App) Wrap(converge func(*state.HelmState, helmexec.Interface) []error) func(st *state.HelmState, helm helmexec.Interface) (bool, []error) { From 7ebb9ef6669056b3917b93b0d353e7c52c124b4a Mon Sep 17 00:00:00 2001 From: Sebastian Bauer Date: Thu, 28 Nov 2019 21:03:08 +0100 Subject: [PATCH 3/5] pass absolute paths between functions - tests fixes --- pkg/app/app_test.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index 2a84f5d1e..3d930baf3 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -89,7 +89,7 @@ releases: t.Errorf("unexpected error: %v", err) } - expectedOrder := []string{"a1.yaml", "a2.yaml", "b.yaml", "helmfile.yaml"} + expectedOrder := []string{"/path/to/helmfile.d/a1.yaml", "/path/to/helmfile.d/a2.yaml", "/path/to/helmfile.d/b.yaml", "/path/to/helmfile.yaml"} if !reflect.DeepEqual(actualOrder, expectedOrder) { t.Errorf("unexpected order of processed state files: expected=%v, actual=%v", expectedOrder, actualOrder) } @@ -133,7 +133,7 @@ BAZ: 4 t.Errorf("unexpected error: %v", err) } - expectedOrder := []string{"helmfile.yaml", "/path/to/env.1.yaml", "/path/to/env.2.yaml", "/path/to/env.1.yaml", "/path/to/env.2.yaml"} + expectedOrder := []string{"/path/to/helmfile.yaml", "/path/to/env.1.yaml", "/path/to/env.2.yaml", "/path/to/env.1.yaml", "/path/to/env.2.yaml"} actualOrder := fs.SuccessfulReads() if !reflect.DeepEqual(actualOrder, expectedOrder) { t.Errorf("unexpected order of processed state files: expected=%v, actual=%v", expectedOrder, actualOrder) @@ -171,7 +171,7 @@ releases: t.Fatal("expected error did not occur") } - expected := "in ./helmfile.yaml: failed to read helmfile.yaml: environment values file matching \"env.*.yaml\" does not exist in \".\"" + expected := "in ./helmfile.yaml: failed to read /path/to/helmfile.yaml: environment values file matching \"env.*.yaml\" does not exist in \"/path/to\"" if err.Error() != expected { t.Errorf("unexpected error: expected=%s, got=%v", expected, err) } @@ -2011,8 +2011,8 @@ releases: var helm = &mockHelmExec{} var wantReleases = []mockTemplates{ - {name: "myrelease1", chart: "mychart1", flags: []string{"--namespace", "testNamespace", "--set", "foo=a", "--set", "bar=b", "--output-dir", "output/subdir/helmfile-[a-z0-9]{8}-myrelease1"}}, - {name: "myrelease2", chart: "mychart2", flags: []string{"--namespace", "testNamespace", "--set", "foo=a", "--set", "bar=b", "--output-dir", "output/subdir/helmfile-[a-z0-9]{8}-myrelease2"}}, + {name: "myrelease1", chart: "mychart1", flags: []string{"--namespace", "testNamespace", "--set", "foo=a", "--set", "bar=b", "--output-dir", "output/subdir/path/to/helmfile-[a-z0-9]{8}-myrelease1"}}, + {name: "myrelease2", chart: "mychart2", flags: []string{"--namespace", "testNamespace", "--set", "foo=a", "--set", "bar=b", "--output-dir", "output/subdir/path/to/helmfile-[a-z0-9]{8}-myrelease2"}}, } var buffer bytes.Buffer @@ -2032,6 +2032,7 @@ releases: helmExecer: helm, Namespace: "testNamespace", valsRuntime: valsRuntime, + FileOrDir: "/path/to/", }, files) app.Template(configImpl{set: []string{"foo=a", "bar=b"}}) From 94e41ff5b8a927fb5a908aca3f060cbe1bce3637 Mon Sep 17 00:00:00 2001 From: Sebastian Bauer Date: Thu, 28 Nov 2019 21:30:49 +0100 Subject: [PATCH 4/5] pass absolute paths between functions - few more tests fixes --- pkg/app/app_test.go | 145 ++++++++++++++++++++++++-------------------- 1 file changed, 79 insertions(+), 66 deletions(-) diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index 3d930baf3..e79ce87c6 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -2171,10 +2171,11 @@ backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 deleted: []exectest.Release{ {Name: "frontend-v1", Flags: []string{}}, }, - log: `processing file "helmfile.yaml" in directory "." -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= + log: `processing file "helmfile.yaml" in directory "/path/to" +changing working directory to "/path/to" +first-pass rendering starting for "/path/to/helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": +first-pass rendering output of "/path/to/helmfile.yaml.part.0": 0: 1: releases: 2: - name: database @@ -2232,11 +2233,11 @@ first-pass rendering output of "helmfile.yaml.part.0": 54: first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} +first-pass rendering result of "/path/to/helmfile.yaml.part.0": {default map[] map[]} vals: map[] defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +second-pass rendering result of "/path/to/helmfile.yaml.part.0": 0: 1: releases: 2: - name: database @@ -2382,6 +2383,7 @@ DELETED RELEASES: NAME frontend-v1 backend-v1 +changing working directory back to "/path/to" `, }, // @@ -2403,7 +2405,7 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: nil, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: nil, }, lists: map[exectest.ListKey]string{ exectest.ListKey{Filter: "^foo$", Flags: "--kube-contextdefault"}: ``, @@ -2434,9 +2436,9 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "baz", Chart: "/path/to/mychart3", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{ @@ -2446,10 +2448,11 @@ releases: }, deleted: []exectest.Release{}, concurrency: 1, - log: `processing file "helmfile.yaml" in directory "." -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= + log: `processing file "helmfile.yaml" in directory "/path/to" +changing working directory to "/path/to" +first-pass rendering starting for "/path/to/helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": +first-pass rendering output of "/path/to/helmfile.yaml.part.0": 0: 1: releases: 2: - name: baz @@ -2463,11 +2466,11 @@ first-pass rendering output of "helmfile.yaml.part.0": 10: first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} +first-pass rendering result of "/path/to/helmfile.yaml.part.0": {default map[] map[]} vals: map[] defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +second-pass rendering result of "/path/to/helmfile.yaml.part.0": 0: 1: releases: 2: - name: baz @@ -2515,6 +2518,7 @@ bar mychart2 baz mychart3 foo mychart1 +changing working directory back to "/path/to" `, }, // @@ -2535,8 +2539,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{}}, @@ -2558,8 +2562,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{}}, @@ -2582,8 +2586,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{}}, @@ -2606,8 +2610,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--namespacetestNamespace--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{}}, @@ -2631,8 +2635,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}}, @@ -2656,8 +2660,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{"--kube-context", "default", "--namespace", "ns1"}}, @@ -2684,8 +2688,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{"--tiller-namespace", "tns2", "--kube-context", "default", "--namespace", "ns2"}}, @@ -2711,8 +2715,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{"--tiller-namespace", "tns1", "--kube-context", "default", "--namespace", "ns1"}}, @@ -2720,10 +2724,11 @@ releases: }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, - log: `processing file "helmfile.yaml" in directory "." -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= + log: `processing file "helmfile.yaml" in directory "/path/to" +changing working directory to "/path/to" +first-pass rendering starting for "/path/to/helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": +first-pass rendering output of "/path/to/helmfile.yaml.part.0": 0: 1: releases: 2: - name: bar @@ -2739,11 +2744,11 @@ first-pass rendering output of "helmfile.yaml.part.0": 12: first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} +first-pass rendering result of "/path/to/helmfile.yaml.part.0": {default map[] map[]} vals: map[] defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +second-pass rendering result of "/path/to/helmfile.yaml.part.0": 0: 1: releases: 2: - name: bar @@ -2790,6 +2795,7 @@ NAME CHART VERSION foo mychart1 bar mychart2 +changing working directory back to "/path/to" `, }, // @@ -2812,8 +2818,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ exectest.ListKey{Filter: "^foo$", Flags: "--kube-contextdefault"}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -2880,8 +2886,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ exectest.ListKey{Filter: "^foo$", Flags: "--kube-contextdefault"}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -2914,8 +2920,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ exectest.ListKey{Filter: "^foo$", Flags: "--kube-contextdefault"}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -2948,8 +2954,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ exectest.ListKey{Filter: "^foo$", Flags: "--kube-contextdefault"}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -2982,8 +2988,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "bar", Chart: "/path/to/mychart2", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ exectest.ListKey{Filter: "^foo$", Flags: "--kube-contextdefault"}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -3044,10 +3050,11 @@ releases: }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, - log: `processing file "helmfile.yaml" in directory "." -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= + log: `processing file "helmfile.yaml" in directory "/path/to" +changing working directory to "/path/to" +first-pass rendering starting for "/path/to/helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": +first-pass rendering output of "/path/to/helmfile.yaml.part.0": 0: 1: 2: @@ -3074,11 +3081,11 @@ first-pass rendering output of "helmfile.yaml.part.0": 23: first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} +first-pass rendering result of "/path/to/helmfile.yaml.part.0": {default map[] map[]} vals: map[] defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +second-pass rendering result of "/path/to/helmfile.yaml.part.0": 0: 1: 2: @@ -3120,10 +3127,10 @@ GROUP RELEASES 3 default/my-release processing releases in group 1/3: kube-system/kubernetes-external-secrets -0 release(s) matching app=test found in helmfile.yaml +0 release(s) matching app=test found in /path/to/helmfile.yaml processing releases in group 2/3: default/external-secrets -1 release(s) matching app=test found in helmfile.yaml +1 release(s) matching app=test found in /path/to/helmfile.yaml worker 1/1 started worker 1/1 finished @@ -3131,7 +3138,7 @@ worker 1/1 started getting deployed release version failed:unexpected list key: {^external-secrets$ --kube-contextdefault} worker 1/1 finished processing releases in group 3/3: default/my-release -1 release(s) matching app=test found in helmfile.yaml +1 release(s) matching app=test found in /path/to/helmfile.yaml worker 1/1 started worker 1/1 finished @@ -3144,6 +3151,7 @@ NAME CHART VERSION external-secrets incubator/raw my-release incubator/raw +changing working directory back to "/path/to" `, }, { @@ -3182,10 +3190,11 @@ releases: error: "err: no releases found that matches specified selector(app=test_non_existent) and environment(default), in any helmfile", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, - log: `processing file "helmfile.yaml" in directory "." -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= + log: `processing file "helmfile.yaml" in directory "/path/to" +changing working directory to "/path/to" +first-pass rendering starting for "/path/to/helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": +first-pass rendering output of "/path/to/helmfile.yaml.part.0": 0: 1: 2: @@ -3212,11 +3221,11 @@ first-pass rendering output of "helmfile.yaml.part.0": 23: first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} +first-pass rendering result of "/path/to/helmfile.yaml.part.0": {default map[] map[]} vals: map[] defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +second-pass rendering result of "/path/to/helmfile.yaml.part.0": 0: 1: 2: @@ -3243,6 +3252,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} +changing working directory back to "/path/to" `, }, // @@ -3264,18 +3274,19 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - exectest.DiffKey{Name: "baz", Chart: "mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, - exectest.DiffKey{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "baz", Chart: "/path/to/mychart3", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode"}: helmexec.ExitError{Code: 2}, + exectest.DiffKey{Name: "foo", Chart: "/path/to/mychart1", Flags: "--kube-contextdefault--detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, deleted: []exectest.Release{}, concurrency: 1, - error: `in ./helmfile.yaml: "foo" has dependency to inexistent release "bar"`, - log: `processing file "helmfile.yaml" in directory "." -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= + error: `in /path/to/helmfile.yaml: "foo" has dependency to inexistent release "bar"`, + log: `processing file "helmfile.yaml" in directory "/path/to" +changing working directory to "/path/to" +first-pass rendering starting for "/path/to/helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": +first-pass rendering output of "/path/to/helmfile.yaml.part.0": 0: 1: releases: 2: - name: baz @@ -3288,11 +3299,11 @@ first-pass rendering output of "helmfile.yaml.part.0": 9: first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} +first-pass rendering result of "/path/to/helmfile.yaml.part.0": {default map[] map[]} vals: map[] defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +second-pass rendering result of "/path/to/helmfile.yaml.part.0": 0: 1: releases: 2: - name: baz @@ -3314,6 +3325,7 @@ Affected releases are: foo (mychart1) UPDATED err: "foo" has dependency to inexistent release "bar" +changing working directory back to "/path/to" `, }, } @@ -3374,6 +3386,7 @@ err: "foo" has dependency to inexistent release "bar" Logger: logger, helmExecer: helm, valsRuntime: valsRuntime, + FileOrDir: "/path/to/", }, tc.files) if tc.ns != "" { From c3cefda15e556461e2a59e0cc6e618f3caffa98b Mon Sep 17 00:00:00 2001 From: Sebastian Bauer Date: Thu, 28 Nov 2019 21:53:59 +0100 Subject: [PATCH 5/5] pass absolute paths between functions - fix diff command --- pkg/app/app.go | 7 ++++--- pkg/app/app_test.go | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/app/app.go b/pkg/app/app.go index 6af8e44e7..ae949d44e 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -398,7 +398,8 @@ func (a *App) visitStates(absFileOrDir string, defOpts LoadOpts, converge func(* func (a *App) ForEachStateFiltered(do func(*Run) []error) error { ctx := NewContext() - err := a.VisitDesiredStatesWithReleasesFiltered(a.FileOrDir, func(st *state.HelmState, helm helmexec.Interface) []error { + absFileOrDir, err := a.abs(a.FileOrDir) + err = a.VisitDesiredStatesWithReleasesFiltered(absFileOrDir, func(st *state.HelmState, helm helmexec.Interface) []error { run := NewRun(st, helm, ctx) return do(run) @@ -573,10 +574,10 @@ func (a *App) Wrap(converge func(*state.HelmState, helmexec.Interface) []error) } } -func (a *App) VisitDesiredStatesWithReleasesFiltered(fileOrDir string, converge func(*state.HelmState, helmexec.Interface) []error) error { +func (a *App) VisitDesiredStatesWithReleasesFiltered(absFileOrDir string, converge func(*state.HelmState, helmexec.Interface) []error) error { f := a.Wrap(converge) - return a.visitStatesWithSelectorsAndRemoteSupport(fileOrDir, func(st *state.HelmState, helm helmexec.Interface) (bool, []error) { + return a.visitStatesWithSelectorsAndRemoteSupport(absFileOrDir, func(st *state.HelmState, helm helmexec.Interface) (bool, []error) { return f(st, helm) }) } diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index e79ce87c6..72a14f8df 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -3503,6 +3503,7 @@ releases: Env: "default", Logger: logger, Namespace: "testNamespace", + FileOrDir: "/path/to/", }, files) out := captureStdout(func() { err := app.PrintState(configImpl{}) @@ -3546,6 +3547,7 @@ releases: Env: "default", Logger: logger, Namespace: "testNamespace", + FileOrDir: "/path/to/helmfile.d/", }, files) out := captureStdout(func() { err := app.PrintState(configImpl{}) @@ -3595,6 +3597,7 @@ releases: Env: "default", Logger: logger, Namespace: "testNamespace", + FileOrDir: "/path/to/helmfile.d/", }, files) out := captureStdout(func() { err := app.ListReleases(configImpl{})