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
|
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) {
|
func (helm *execer) DecryptSecret(name string) (string, error) {
|
||||||
// Prevents https://github.com/roboll/helmfile/issues/258
|
// Prevents https://github.com/roboll/helmfile/issues/258
|
||||||
helm.decryptionMutex.Lock()
|
helm.decryptionMutex.Lock()
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,6 @@ type Interface interface {
|
||||||
ReleaseStatus(name string) error
|
ReleaseStatus(name string) error
|
||||||
DeleteRelease(name string, flags ...string) error
|
DeleteRelease(name string, flags ...string) error
|
||||||
TestRelease(name string, flags ...string) error
|
TestRelease(name string, flags ...string) error
|
||||||
|
List(filter string) (string, error)
|
||||||
DecryptSecret(name string) (string, error)
|
DecryptSecret(name string) (string, error)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -252,24 +252,25 @@ func (st *HelmState) prepareSyncReleases(helm helmexec.Interface, additionalValu
|
||||||
return res, errs
|
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) {
|
func (st *HelmState) DetectReleasesToBeDeleted(helm helmexec.Interface) ([]*ReleaseSpec, error) {
|
||||||
detected := []*ReleaseSpec{}
|
detected := []*ReleaseSpec{}
|
||||||
for i, _ := range st.Releases {
|
for i, _ := range st.Releases {
|
||||||
release := st.Releases[i]
|
release := st.Releases[i]
|
||||||
if release.Installed != nil && !*release.Installed {
|
if release.Installed != nil && !*release.Installed {
|
||||||
err := helm.ReleaseStatus(release.Name)
|
installed, err := isReleaseInstalled(helm, release)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
switch e := err.(type) {
|
return nil, err
|
||||||
case *exec.ExitError:
|
} else if installed {
|
||||||
// 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 {
|
|
||||||
detected = append(detected, &release)
|
detected = append(detected, &release)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -304,7 +305,10 @@ func (st *HelmState) SyncReleases(helm helmexec.Interface, additionalValues []st
|
||||||
chart := normalizeChart(st.basePath, release.Chart)
|
chart := normalizeChart(st.basePath, release.Chart)
|
||||||
var relErr *ReleaseError
|
var relErr *ReleaseError
|
||||||
if release.Installed != nil && !*release.Installed {
|
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 {
|
if err := helm.DeleteRelease(release.Name, "--purge"); err != nil {
|
||||||
relErr = &ReleaseError{release, err}
|
relErr = &ReleaseError{release, err}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -614,6 +614,9 @@ func (helm *mockHelmExec) ReleaseStatus(release string) error {
|
||||||
func (helm *mockHelmExec) DeleteRelease(name string, flags ...string) error {
|
func (helm *mockHelmExec) DeleteRelease(name string, flags ...string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
func (helm *mockHelmExec) List(filter string) (string, error) {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
func (helm *mockHelmExec) DecryptSecret(name string) (string, error) {
|
func (helm *mockHelmExec) DecryptSecret(name string) (string, error) {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue