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