fix: `helmfile -f dir/ -l k=v sync` fails on first helmfile w/ no match (#188)

Fixes #187

Changelog:

* fix: `helmfile -f dir/ -l k=v sync` fails on first helmfile w/ no match

* fix(ux): present the filename if the selector did not match any releases

```console
$ helmfile -f helmfile.d/ -l foo=bar sync
2018/07/12 23:37:29 specified selector did not match any releases in helmfile.d/00-backend.yaml
2018/07/12 23:37:29 specified selector did not match any releases in helmfile.d/01-frontend.yaml
2018/07/12 23:37:29 err: specified selector did not match any releases in any helmfile
```
This commit is contained in:
KUOKA Yusuke 2018-07-19 12:01:14 +09:00 committed by GitHub
parent 01fe5b4213
commit 506de12fcd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 6 deletions

18
main.go
View File

@ -379,16 +379,24 @@ func eachDesiredStateDo(c *cli.Context, converge func(*state.HelmState, helmexec
if err != nil { if err != nil {
return err return err
} }
allSelectorNotMatched := true
for _, f := range desiredStateFiles { for _, f := range desiredStateFiles {
state, helm, err := loadDesiredStateFromFile(c, f) state, helm, empty, err := loadDesiredStateFromFile(c, f)
if err != nil { if err != nil {
return err return err
} }
allSelectorNotMatched = allSelectorNotMatched && empty
if empty {
continue
}
errs := converge(state, helm) errs := converge(state, helm)
if err := clean(state, errs); err != nil { if err := clean(state, errs); err != nil {
return err return err
} }
} }
if allSelectorNotMatched {
return fmt.Errorf("specified selector did not match any releases in any helmfile")
}
return nil return nil
} }
@ -449,14 +457,14 @@ func directoryExistsAt(path string) bool {
return err == nil && fileInfo.Mode().IsDir() return err == nil && fileInfo.Mode().IsDir()
} }
func loadDesiredStateFromFile(c *cli.Context, file string) (*state.HelmState, helmexec.Interface, error) { func loadDesiredStateFromFile(c *cli.Context, file string) (*state.HelmState, helmexec.Interface, bool, error) {
kubeContext := c.GlobalString("kube-context") kubeContext := c.GlobalString("kube-context")
namespace := c.GlobalString("namespace") namespace := c.GlobalString("namespace")
labels := c.GlobalStringSlice("selector") labels := c.GlobalStringSlice("selector")
st, err := state.ReadFromFile(file) st, err := state.ReadFromFile(file)
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("failed to read %s: %v", file, err) return nil, nil, false, fmt.Errorf("failed to read %s: %v", file, err)
} }
if st.Context != "" { if st.Context != "" {
@ -479,7 +487,7 @@ func loadDesiredStateFromFile(c *cli.Context, file string) (*state.HelmState, he
err = st.FilterReleases(labels) err = st.FilterReleases(labels)
if err != nil { if err != nil {
log.Print(err) log.Print(err)
os.Exit(1) return nil, nil, true, nil
} }
} }
@ -493,7 +501,7 @@ func loadDesiredStateFromFile(c *cli.Context, file string) (*state.HelmState, he
}() }()
logger := c.App.Metadata["logger"].(*zap.SugaredLogger) logger := c.App.Metadata["logger"].(*zap.SugaredLogger)
return st, helmexec.New(logger, kubeContext), nil return st, helmexec.New(logger, kubeContext), false, nil
} }
func clean(state *state.HelmState, errs []error) error { func clean(state *state.HelmState, errs []error) error {

View File

@ -25,6 +25,7 @@ import (
// HelmState structure for the helmfile // HelmState structure for the helmfile
type HelmState struct { type HelmState struct {
BaseChartPath string BaseChartPath string
file string
HelmDefaults HelmSpec `yaml:"helmDefaults"` HelmDefaults HelmSpec `yaml:"helmDefaults"`
Context string `yaml:"context"` Context string `yaml:"context"`
DeprecatedReleases []ReleaseSpec `yaml:"charts"` DeprecatedReleases []ReleaseSpec `yaml:"charts"`
@ -106,6 +107,7 @@ func readFromYaml(content []byte, file string) (*HelmState, error) {
if err := yaml.UnmarshalStrict(content, &state); err != nil { if err := yaml.UnmarshalStrict(content, &state); err != nil {
return nil, err return nil, err
} }
state.file = file
if len(state.DeprecatedReleases) > 0 { if len(state.DeprecatedReleases) > 0 {
if len(state.Releases) > 0 { if len(state.Releases) > 0 {
@ -588,7 +590,7 @@ func (state *HelmState) FilterReleases(labels []string) error {
filteredReleases = append(filteredReleases, r) filteredReleases = append(filteredReleases, r)
} }
if len(filteredReleases) == 0 { if len(filteredReleases) == 0 {
return errors.New("Specified selector did not match any releases.\n") return fmt.Errorf("specified selector did not match any releases in %s\n", state.file)
} }
state.Releases = filteredReleases state.Releases = filteredReleases
return nil return nil