fix: prevent confusing error messages when `installed: false` (#508)
This removes `release: "your_release_name" not found` errors seen for releases with `installed: false` when running `helmfile sync` and `helmfile apply`. The problem was that helmfile had been running `helm status` to detect releases to be deleted. helmfile now use `helm list ^YOUR_RELEASE_NAME$` to detect if the release is currently installed or not, which emits no error-like logs on against uninstalled releases. Fixes #507 Fixes #507
This commit is contained in:
parent
0639714136
commit
d3c5417177
|
|
@ -110,6 +110,13 @@ func (helm *execer) ReleaseStatus(name string) error {
|
|||
return err
|
||||
}
|
||||
|
||||
func (helm *execer) List(filter string) (string, error) {
|
||||
helm.logger.Infof("Listing releases matching %v", filter)
|
||||
out, err := helm.exec(append([]string{"list", filter})...)
|
||||
helm.write(out)
|
||||
return string(out), err
|
||||
}
|
||||
|
||||
func (helm *execer) DecryptSecret(name string) (string, error) {
|
||||
// Prevents https://github.com/roboll/helmfile/issues/258
|
||||
helm.decryptionMutex.Lock()
|
||||
|
|
|
|||
|
|
@ -17,6 +17,6 @@ type Interface interface {
|
|||
ReleaseStatus(name string) error
|
||||
DeleteRelease(name string, flags ...string) error
|
||||
TestRelease(name string, flags ...string) error
|
||||
|
||||
List(filter string) (string, error)
|
||||
DecryptSecret(name string) (string, error)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -252,24 +252,25 @@ func (st *HelmState) prepareSyncReleases(helm helmexec.Interface, additionalValu
|
|||
return res, errs
|
||||
}
|
||||
|
||||
func isReleaseInstalled(helm helmexec.Interface, release ReleaseSpec) (bool, error) {
|
||||
out, err := helm.List("^" + release.Name + "$")
|
||||
if err != nil {
|
||||
return false, err
|
||||
} else if out != "" {
|
||||
return true, nil
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func (st *HelmState) DetectReleasesToBeDeleted(helm helmexec.Interface) ([]*ReleaseSpec, error) {
|
||||
detected := []*ReleaseSpec{}
|
||||
for i, _ := range st.Releases {
|
||||
release := st.Releases[i]
|
||||
if release.Installed != nil && !*release.Installed {
|
||||
err := helm.ReleaseStatus(release.Name)
|
||||
installed, err := isReleaseInstalled(helm, release)
|
||||
if err != nil {
|
||||
switch e := err.(type) {
|
||||
case *exec.ExitError:
|
||||
// Propagate any non-zero exit status from the external command like `helm` that is failed under the hood
|
||||
status := e.Sys().(syscall.WaitStatus)
|
||||
if status.ExitStatus() != 1 {
|
||||
return nil, e
|
||||
}
|
||||
default:
|
||||
return nil, e
|
||||
}
|
||||
} else {
|
||||
return nil, err
|
||||
} else if installed {
|
||||
detected = append(detected, &release)
|
||||
}
|
||||
}
|
||||
|
|
@ -304,7 +305,10 @@ func (st *HelmState) SyncReleases(helm helmexec.Interface, additionalValues []st
|
|||
chart := normalizeChart(st.basePath, release.Chart)
|
||||
var relErr *ReleaseError
|
||||
if release.Installed != nil && !*release.Installed {
|
||||
if err := helm.ReleaseStatus(release.Name); err == nil {
|
||||
installed, err := isReleaseInstalled(helm, *release)
|
||||
if err != nil {
|
||||
relErr = &ReleaseError{release, err}
|
||||
} else if installed {
|
||||
if err := helm.DeleteRelease(release.Name, "--purge"); err != nil {
|
||||
relErr = &ReleaseError{release, err}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -614,6 +614,9 @@ func (helm *mockHelmExec) ReleaseStatus(release string) error {
|
|||
func (helm *mockHelmExec) DeleteRelease(name string, flags ...string) error {
|
||||
return nil
|
||||
}
|
||||
func (helm *mockHelmExec) List(filter string) (string, error) {
|
||||
return "", nil
|
||||
}
|
||||
func (helm *mockHelmExec) DecryptSecret(name string) (string, error) {
|
||||
return "", nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue