fix: prevent panicing when an undefined environment name was specified via --environment (#321)

Fixes #320
This commit is contained in:
KUOKA Yusuke 2018-09-09 08:35:15 +09:00 committed by GitHub
parent 7c65b2ed2c
commit 4f073167b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 93 additions and 1 deletions

View File

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

View File

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