diff --git a/app_test.go b/app_test.go index dc1bea42..03279218 100644 --- a/app_test.go +++ b/app_test.go @@ -106,3 +106,95 @@ releases: } } } + +// See https://github.com/roboll/helmfile/issues/320 +func TestFindAndIterateOverDesiredStates_UndefinedEnv(t *testing.T) { + absPaths := map[string]string{ + ".": "/path/to", + "/path/to/helmfile.d": "/path/to/helmfile.d", + } + dirs := map[string]bool{ + "helmfile.d": true, + } + files := map[string]string{ + "helmfile.yaml": ` +environments: + prod: + +helmfiles: +- helmfile.d/a*.yaml +`, + "/path/to/helmfile.d/a1.yaml": ` +environments: + prod: + +releases: +- name: zipkin + chart: stable/zipkin +`, + } + globMatches := map[string][]string{ + "/path/to/helmfile.d/a*.yaml": []string{"/path/to/helmfile.d/a1.yaml"}, + } + fileExistsAt := func(path string) bool { + _, ok := files[path] + return ok + } + directoryExistsAt := func(path string) bool { + _, ok := dirs[path] + return ok + } + readFile := func(filename string) ([]byte, error) { + str, ok := files[filename] + if !ok { + return []byte(nil), fmt.Errorf("no file found: %s", filename) + } + return []byte(str), nil + } + glob := func(pattern string) ([]string, error) { + matches, ok := globMatches[pattern] + if !ok { + return []string(nil), fmt.Errorf("no file matched: %s", pattern) + } + return matches, nil + } + abs := func(path string) (string, error) { + a, ok := absPaths[path] + if !ok { + return "", fmt.Errorf("abs: unexpected path: %s", path) + } + return a, nil + } + app := &app{ + readFile: readFile, + glob: glob, + abs: abs, + fileExistsAt: fileExistsAt, + directoryExistsAt: directoryExistsAt, + kubeContext: "default", + logger: helmexec.NewLogger(os.Stderr, "debug"), + } + noop := func(st *state.HelmState, helm helmexec.Interface) []error { + return []error{} + } + + testcases := []struct { + name string + expectErr bool + }{ + {name: "undefined_env", expectErr: true}, + {name: "default", expectErr: false}, + {name: "prod", expectErr: false}, + } + + for _, testcase := range testcases { + err := app.FindAndIterateOverDesiredStates( + "helmfile.yaml", noop, "", []string{}, testcase.name, + ) + if testcase.expectErr && err == nil { + t.Errorf("error expected but not happened for environment=%s", testcase.name) + } else if !testcase.expectErr && err != nil { + t.Errorf("unexpected error for environment=%s: %v", testcase.name, err) + } + } +} diff --git a/main.go b/main.go index c55a4087..b7150388 100644 --- a/main.go +++ b/main.go @@ -616,7 +616,7 @@ func (a *app) FindAndIterateOverDesiredStates(fileOrDir string, converge func(*s case *state.StateLoadError: switch stateLoadErr.Cause.(type) { case *state.UndefinedEnvError: - noMatchInThisHelmfile = true + continue default: return err }