Merge pull request #223 from mumoshu/show-which-release-failed
feat: emit error message containing which release in which helmfile an upgrade failed
This commit is contained in:
		
						commit
						a5d42e741b
					
				
							
								
								
									
										11
									
								
								main.go
								
								
								
								
							
							
						
						
									
										11
									
								
								main.go
								
								
								
								
							| 
						 | 
					@ -519,19 +519,24 @@ func loadDesiredStateFromFile(c *cli.Context, file string) (*state.HelmState, he
 | 
				
			||||||
	return st, helmexec.New(logger, kubeContext), false, nil
 | 
						return st, helmexec.New(logger, kubeContext), false, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func clean(state *state.HelmState, errs []error) error {
 | 
					func clean(st *state.HelmState, errs []error) error {
 | 
				
			||||||
	if errs == nil {
 | 
						if errs == nil {
 | 
				
			||||||
		errs = []error{}
 | 
							errs = []error{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cleanErrs := state.Clean()
 | 
						cleanErrs := st.Clean()
 | 
				
			||||||
	if cleanErrs != nil {
 | 
						if cleanErrs != nil {
 | 
				
			||||||
		errs = append(errs, cleanErrs...)
 | 
							errs = append(errs, cleanErrs...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if errs != nil && len(errs) > 0 {
 | 
						if errs != nil && len(errs) > 0 {
 | 
				
			||||||
		for _, err := range errs {
 | 
							for _, err := range errs {
 | 
				
			||||||
			fmt.Printf("err: %s\n", err.Error())
 | 
								switch e := err.(type) {
 | 
				
			||||||
 | 
								case *state.ReleaseError:
 | 
				
			||||||
 | 
									fmt.Printf("err: release \"%s\" in \"%s\" failed: %v\n", e.Name, st.FilePath, e)
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									fmt.Printf("err: %v\n", e)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		switch e := errs[0].(type) {
 | 
							switch e := errs[0].(type) {
 | 
				
			||||||
		case *exec.ExitError:
 | 
							case *exec.ExitError:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ import (
 | 
				
			||||||
// HelmState structure for the helmfile
 | 
					// HelmState structure for the helmfile
 | 
				
			||||||
type HelmState struct {
 | 
					type HelmState struct {
 | 
				
			||||||
	BaseChartPath      string
 | 
						BaseChartPath      string
 | 
				
			||||||
	file               string
 | 
						FilePath           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"`
 | 
				
			||||||
| 
						 | 
					@ -100,7 +100,7 @@ func readFromYaml(content []byte, file string, logger *zap.SugaredLogger) (*Helm
 | 
				
			||||||
	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
 | 
						state.FilePath = file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(state.DeprecatedReleases) > 0 {
 | 
						if len(state.DeprecatedReleases) > 0 {
 | 
				
			||||||
		if len(state.Releases) > 0 {
 | 
							if len(state.Releases) > 0 {
 | 
				
			||||||
| 
						 | 
					@ -202,12 +202,21 @@ func (state *HelmState) SyncRepos(helm helmexec.Interface) []error {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ReleaseError struct {
 | 
				
			||||||
 | 
						*ReleaseSpec
 | 
				
			||||||
 | 
						underlying error
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *ReleaseError) Error() string {
 | 
				
			||||||
 | 
						return e.underlying.Error()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SyncReleases wrapper for executing helm upgrade on the releases
 | 
					// SyncReleases wrapper for executing helm upgrade on the releases
 | 
				
			||||||
func (state *HelmState) SyncReleases(helm helmexec.Interface, additionalValues []string, workerLimit int) []error {
 | 
					func (state *HelmState) SyncReleases(helm helmexec.Interface, additionalValues []string, workerLimit int) []error {
 | 
				
			||||||
	errs := []error{}
 | 
						errs := []error{}
 | 
				
			||||||
	jobQueue := make(chan *ReleaseSpec)
 | 
						jobQueue := make(chan *ReleaseSpec)
 | 
				
			||||||
	doneQueue := make(chan bool)
 | 
						doneQueue := make(chan bool)
 | 
				
			||||||
	errQueue := make(chan error)
 | 
						errQueue := make(chan *ReleaseError)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if workerLimit < 1 {
 | 
						if workerLimit < 1 {
 | 
				
			||||||
		workerLimit = len(state.Releases)
 | 
							workerLimit = len(state.Releases)
 | 
				
			||||||
| 
						 | 
					@ -218,7 +227,7 @@ func (state *HelmState) SyncReleases(helm helmexec.Interface, additionalValues [
 | 
				
			||||||
				state.applyDefaultsTo(release)
 | 
									state.applyDefaultsTo(release)
 | 
				
			||||||
				flags, flagsErr := state.flagsForUpgrade(helm, state.BaseChartPath, release)
 | 
									flags, flagsErr := state.flagsForUpgrade(helm, state.BaseChartPath, release)
 | 
				
			||||||
				if flagsErr != nil {
 | 
									if flagsErr != nil {
 | 
				
			||||||
					errQueue <- flagsErr
 | 
										errQueue <- &ReleaseError{release, flagsErr}
 | 
				
			||||||
					doneQueue <- true
 | 
										doneQueue <- true
 | 
				
			||||||
					continue
 | 
										continue
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -227,12 +236,12 @@ func (state *HelmState) SyncReleases(helm helmexec.Interface, additionalValues [
 | 
				
			||||||
				for _, value := range additionalValues {
 | 
									for _, value := range additionalValues {
 | 
				
			||||||
					valfile, err := filepath.Abs(value)
 | 
										valfile, err := filepath.Abs(value)
 | 
				
			||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						errQueue <- err
 | 
											errQueue <- &ReleaseError{release, err}
 | 
				
			||||||
						haveValueErr = true
 | 
											haveValueErr = true
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if _, err := os.Stat(valfile); os.IsNotExist(err) {
 | 
										if _, err := os.Stat(valfile); os.IsNotExist(err) {
 | 
				
			||||||
						errQueue <- err
 | 
											errQueue <- &ReleaseError{release, err}
 | 
				
			||||||
						haveValueErr = true
 | 
											haveValueErr = true
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					flags = append(flags, "--values", valfile)
 | 
										flags = append(flags, "--values", valfile)
 | 
				
			||||||
| 
						 | 
					@ -245,7 +254,7 @@ func (state *HelmState) SyncReleases(helm helmexec.Interface, additionalValues [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				chart := normalizeChart(state.BaseChartPath, release.Chart)
 | 
									chart := normalizeChart(state.BaseChartPath, release.Chart)
 | 
				
			||||||
				if err := helm.SyncRelease(release.Name, chart, flags...); err != nil {
 | 
									if err := helm.SyncRelease(release.Name, chart, flags...); err != nil {
 | 
				
			||||||
					errQueue <- err
 | 
										errQueue <- &ReleaseError{release, err}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				doneQueue <- true
 | 
									doneQueue <- true
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -605,7 +614,7 @@ func (state *HelmState) FilterReleases(labels []string) error {
 | 
				
			||||||
		filteredReleases = append(filteredReleases, r)
 | 
							filteredReleases = append(filteredReleases, r)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(filteredReleases) == 0 {
 | 
						if len(filteredReleases) == 0 {
 | 
				
			||||||
		state.logger.Debugf("specified selector did not match any releases in %s\n", state.file)
 | 
							state.logger.Debugf("specified selector did not match any releases in %s\n", state.FilePath)
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	state.Releases = filteredReleases
 | 
						state.Releases = filteredReleases
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue