From 77082cef58e895aa7274798dad8dfd142f7e3831 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 7 Nov 2019 19:53:27 +0900 Subject: [PATCH] fix regression that `--namespace` breaks delete/destroy and possibly sync/apply as well The problem was that `--namespace NS` had been not taken into account while deleting releases, that resulted in releases that should be deleted are not deleted. --- pkg/app/app.go | 29 +++++++++++------------------ pkg/state/state.go | 32 ++++++++++++++++++++++++++++---- pkg/state/state_run.go | 4 ++-- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/pkg/app/app.go b/pkg/app/app.go index d21efc16..aa545480 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -451,7 +451,7 @@ func printBatches(batches [][]state.Release) string { } func withDAG(templated *state.HelmState, helm helmexec.Interface, logger *zap.SugaredLogger, reverse bool, converge func(*state.HelmState, helmexec.Interface) (bool, []error)) (bool, []error) { - batches, err := state.PlanReleases(templated.Releases, templated.Selectors, reverse) + batches, err := templated.PlanReleases(reverse) if err != nil { return false, []error{err} } @@ -679,7 +679,7 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, []error) { Set: c.Set(), } - allReleases := st.Releases + allReleases := st.GetReleasesWithOverrides() var changedReleases []state.ReleaseSpec var deletingReleases []state.ReleaseSpec @@ -688,7 +688,7 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, []error) { // TODO Better way to detect diff on only filtered releases { if len(st.Selectors) > 0 { - releases, err := st.GetFilteredReleases() + releases, err := st.GetSelectedReleasesWithOverrides() if err != nil { return false, []error{err} } @@ -835,19 +835,12 @@ func (a *App) delete(r *Run, purge bool, c DestroyConfigProvider) (bool, []error affectedReleases := state.AffectedReleases{} - var toSync []state.ReleaseSpec - - if len(st.Selectors) > 0 { - var err error - toSync, err = st.GetFilteredReleases() - if err != nil { - return false, []error{err} - } - if len(toSync) == 0 { - return false, nil - } - } else { - toSync = st.Releases + toSync, err := st.GetSelectedReleasesWithOverrides() + if err != nil { + return false, []error{err} + } + if len(toSync) == 0 { + return false, nil } toDelete, err := st.DetectReleasesToBeDeleted(helm, toSync) @@ -925,7 +918,7 @@ func (a *App) sync(r *Run, c SyncConfigProvider) (bool, []error) { if len(st.Selectors) > 0 { var err error - toSync, err = st.GetFilteredReleases() + toSync, err = st.GetSelectedReleasesWithOverrides() if err != nil { return false, []error{err} } @@ -1047,7 +1040,7 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) { if len(st.Selectors) > 0 { var err error - templatedReleases, err = st.GetFilteredReleases() + templatedReleases, err = st.GetSelectedReleasesWithOverrides() if err != nil { return false, []error{err} } diff --git a/pkg/state/state.go b/pkg/state/state.go index 5a41241a..3b93becb 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -1226,7 +1226,31 @@ func (st *HelmState) Clean() []error { return nil } -func MarkFilteredReleases(releases []ReleaseSpec, selectors []string) ([]Release, error) { +func (st *HelmState) GetReleasesWithOverrides() []ReleaseSpec { + var rs []ReleaseSpec + for _, r := range st.Releases { + var spec ReleaseSpec + spec = r + st.ApplyOverrides(&spec) + rs = append(rs, spec) + } + return rs +} + +func (st *HelmState) SelectReleasesWithOverrides() ([]Release, error) { + rs, err := markFilteredReleases(st.GetReleasesWithOverrides(), st.Selectors) + if err != nil { + return nil, err + } + for _, r := range rs { + spec := r.ReleaseSpec + st.ApplyOverrides(&spec) + r.ReleaseSpec = spec + } + return rs, nil +} + +func markFilteredReleases(releases []ReleaseSpec, selectors []string) ([]Release, error) { var filteredReleases []Release filters := []ReleaseFilter{} for _, label := range selectors { @@ -1266,8 +1290,8 @@ func MarkFilteredReleases(releases []ReleaseSpec, selectors []string) ([]Release return filteredReleases, nil } -func (st *HelmState) GetFilteredReleases() ([]ReleaseSpec, error) { - filteredReleases, err := MarkFilteredReleases(st.Releases, st.Selectors) +func (st *HelmState) GetSelectedReleasesWithOverrides() ([]ReleaseSpec, error) { + filteredReleases, err := st.SelectReleasesWithOverrides() if err != nil { return nil, err } @@ -1282,7 +1306,7 @@ func (st *HelmState) GetFilteredReleases() ([]ReleaseSpec, error) { // FilterReleases allows for the execution of helm commands against a subset of the releases in the helmfile. func (st *HelmState) FilterReleases() error { - releases, err := st.GetFilteredReleases() + releases, err := st.GetSelectedReleasesWithOverrides() if err != nil { return err } diff --git a/pkg/state/state_run.go b/pkg/state/state_run.go index 9c7a2f53..e074d64f 100644 --- a/pkg/state/state_run.go +++ b/pkg/state/state_run.go @@ -108,8 +108,8 @@ type PlanOpts struct { Reverse bool } -func PlanReleases(releases []ReleaseSpec, selectors []string, reverse bool) ([][]Release, error) { - marked, err := MarkFilteredReleases(releases, selectors) +func (st *HelmState) PlanReleases(reverse bool) ([][]Release, error) { + marked, err := st.SelectReleasesWithOverrides() if err != nil { return nil, err }