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:
parent
01fe5b4213
commit
506de12fcd
18
main.go
18
main.go
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue