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