Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero 2023-09-10 12:24:08 +08:00
parent cf24d348bf
commit 08f5d6ab08
7 changed files with 270 additions and 70 deletions

View File

@ -133,7 +133,11 @@ func (a *App) Deps(c DepsConfigProvider) error {
} }
return return
}, c.IncludeTransitiveNeeds(), SetFilter(true)) }, state.NeedsOptions{
SkipNeeds: c.SkipRepos(),
IncludeNeeds: c.IncludeTransitiveNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
}, SetFilter(true))
} }
func (a *App) Repos(c ReposConfigProvider) error { func (a *App) Repos(c ReposConfigProvider) error {
@ -145,7 +149,11 @@ func (a *App) Repos(c ReposConfigProvider) error {
} }
return return
}, c.IncludeTransitiveNeeds(), SetFilter(true)) }, state.NeedsOptions{
SkipNeeds: !c.IncludeTransitiveNeeds(),
IncludeNeeds: false,
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
}, SetFilter(true))
} }
// TODO: Remove this function once Helmfile v0.x // TODO: Remove this function once Helmfile v0.x
@ -164,7 +172,11 @@ func (a *App) DeprecatedSyncCharts(c DeprecatedChartsConfigProvider) error {
} }
return return
}, c.IncludeTransitiveNeeds(), SetFilter(true)) }, state.NeedsOptions{
SkipNeeds: !c.IncludeTransitiveNeeds(),
IncludeNeeds: false,
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
}, SetFilter(true))
} }
func (a *App) Diff(c DiffConfigProvider) error { func (a *App) Diff(c DiffConfigProvider) error {
@ -221,7 +233,11 @@ func (a *App) Diff(c DiffConfigProvider) error {
} }
return matched, criticalErrs return matched, criticalErrs
}, c.IncludeTransitiveNeeds()) }, state.NeedsOptions{
SkipNeeds: c.SkipNeeds(),
IncludeNeeds: c.IncludeNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
})
if err != nil { if err != nil {
return err return err
@ -268,7 +284,11 @@ func (a *App) Template(c TemplateConfigProvider) error {
} }
return return
}, c.IncludeTransitiveNeeds()) }, state.NeedsOptions{
SkipNeeds: c.SkipNeeds(),
IncludeNeeds: c.IncludeNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
})
} }
func (a *App) WriteValues(c WriteValuesConfigProvider) error { func (a *App) WriteValues(c WriteValuesConfigProvider) error {
@ -287,7 +307,11 @@ func (a *App) WriteValues(c WriteValuesConfigProvider) error {
} }
return return
}, c.IncludeTransitiveNeeds(), SetFilter(true)) }, state.NeedsOptions{
SkipNeeds: !c.IncludeTransitiveNeeds(),
IncludeNeeds: false,
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
}, SetFilter(true))
} }
type MultiError struct { type MultiError struct {
@ -344,7 +368,11 @@ func (a *App) Lint(c LintConfigProvider) error {
} }
return return
}, c.IncludeTransitiveNeeds()) }, state.NeedsOptions{
SkipNeeds: c.SkipNeeds(),
IncludeNeeds: c.IncludeNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
})
if err != nil { if err != nil {
return err return err
@ -374,7 +402,11 @@ func (a *App) Fetch(c FetchConfigProvider) error {
} }
return return
}, false, SetFilter(true)) }, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
}, SetFilter(true))
} }
func (a *App) Sync(c SyncConfigProvider) error { func (a *App) Sync(c SyncConfigProvider) error {
@ -399,7 +431,11 @@ func (a *App) Sync(c SyncConfigProvider) error {
} }
return return
}, c.IncludeTransitiveNeeds()) }, state.NeedsOptions{
SkipNeeds: c.SkipNeeds(),
IncludeNeeds: c.IncludeNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
})
} }
func (a *App) Apply(c ApplyConfigProvider) error { func (a *App) Apply(c ApplyConfigProvider) error {
@ -440,7 +476,11 @@ func (a *App) Apply(c ApplyConfigProvider) error {
} }
return return
}, c.IncludeTransitiveNeeds(), opts...) }, state.NeedsOptions{
SkipNeeds: c.SkipNeeds(),
IncludeNeeds: c.IncludeNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
}, opts...)
if err != nil { if err != nil {
return err return err
@ -470,7 +510,11 @@ func (a *App) Status(c StatusesConfigProvider) error {
} }
return return
}, false, SetFilter(true)) }, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
}, SetFilter(true))
} }
// TODO: Remove this function once Helmfile v0.x // TODO: Remove this function once Helmfile v0.x
@ -492,7 +536,11 @@ func (a *App) Delete(c DeleteConfigProvider) error {
ok, errs = a.delete(run, c.Purge(), c) ok, errs = a.delete(run, c.Purge(), c)
} }
return return
}, false, SetReverse(true)) }, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
}, SetReverse(true))
} }
func (a *App) Destroy(c DestroyConfigProvider) error { func (a *App) Destroy(c DestroyConfigProvider) error {
@ -512,7 +560,11 @@ func (a *App) Destroy(c DestroyConfigProvider) error {
ok, errs = a.delete(run, true, c) ok, errs = a.delete(run, true, c)
} }
return return
}, false, SetReverse(true)) }, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
}, SetReverse(true))
} }
func (a *App) Test(c TestConfigProvider) error { func (a *App) Test(c TestConfigProvider) error {
@ -536,7 +588,11 @@ func (a *App) Test(c TestConfigProvider) error {
} }
return return
}, false, SetFilter(true)) }, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
}, SetFilter(true))
} }
func (a *App) PrintState(c StateConfigProvider) error { func (a *App) PrintState(c StateConfigProvider) error {
@ -589,7 +645,11 @@ func (a *App) PrintState(c StateConfigProvider) error {
} }
return return
}, false, SetFilter(true)) }, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
}, SetFilter(true))
} }
func (a *App) ListReleases(c ListConfigProvider) error { func (a *App) ListReleases(c ListConfigProvider) error {
@ -622,7 +682,11 @@ func (a *App) ListReleases(c ListConfigProvider) error {
releases = append(releases, stateReleases...) releases = append(releases, stateReleases...)
return return
}, false, SetFilter(true)) }, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
}, SetFilter(true))
if err != nil { if err != nil {
return err return err
@ -962,7 +1026,7 @@ var (
} }
) )
func (a *App) ForEachState(do func(*Run) (bool, []error), includeTransitiveNeeds bool, o ...LoadOption) error { func (a *App) ForEachState(do func(*Run) (bool, []error), needsOptions state.NeedsOptions, o ...LoadOption) error {
ctx := NewContext() ctx := NewContext()
err := a.visitStatesWithSelectorsAndRemoteSupport(a.FileOrDir, func(st *state.HelmState) (bool, []error) { err := a.visitStatesWithSelectorsAndRemoteSupport(a.FileOrDir, func(st *state.HelmState) (bool, []error) {
helm := a.getHelm(st) helm := a.getHelm(st)
@ -972,7 +1036,7 @@ func (a *App) ForEachState(do func(*Run) (bool, []error), includeTransitiveNeeds
return false, []error{err} return false, []error{err}
} }
return do(run) return do(run)
}, includeTransitiveNeeds, o...) }, needsOptions, o...)
return err return err
} }
@ -1051,7 +1115,7 @@ type Opts struct {
DAGEnabled bool DAGEnabled bool
} }
func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converge func(*state.HelmState) (bool, []error), includeTransitiveNeeds bool, opt ...LoadOption) error { func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converge func(*state.HelmState) (bool, []error), needsOptions state.NeedsOptions, opt ...LoadOption) error {
opts := LoadOpts{ opts := LoadOpts{
Selectors: a.Selectors, Selectors: a.Selectors,
} }
@ -1083,7 +1147,7 @@ func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converg
_, err := converge(st) _, err := converge(st)
return err return err
}, },
includeTransitiveNeeds) needsOptions)
} }
} }
@ -1096,9 +1160,9 @@ func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converg
return a.visitStates(fileOrDir, opts, fHelmStatsWithOverrides) return a.visitStates(fileOrDir, opts, fHelmStatsWithOverrides)
} }
func processFilteredReleases(st *state.HelmState, converge func(st *state.HelmState) []error, includeTransitiveNeeds bool) (bool, []error) { func processFilteredReleases(st *state.HelmState, converge func(st *state.HelmState) []error, needsOptions state.NeedsOptions) (bool, []error) {
if len(st.Selectors) > 0 { if len(st.Selectors) > 0 {
err := st.FilterReleases(includeTransitiveNeeds) err := st.FilterReleases(needsOptions)
if err != nil { if err != nil {
return false, []error{err} return false, []error{err}
} }
@ -1144,11 +1208,11 @@ func checkDuplicates(releases []state.ReleaseSpec) error {
return nil return nil
} }
func (a *App) Wrap(converge func(*state.HelmState, helmexec.Interface) []error) func(st *state.HelmState, helm helmexec.Interface, includeTransitiveNeeds bool) (bool, []error) { func (a *App) Wrap(converge func(*state.HelmState, helmexec.Interface) []error) func(st *state.HelmState, helm helmexec.Interface, needsOptions state.NeedsOptions) (bool, []error) {
return func(st *state.HelmState, helm helmexec.Interface, includeTransitiveNeeds bool) (bool, []error) { return func(st *state.HelmState, helm helmexec.Interface, needsOptions state.NeedsOptions) (bool, []error) {
return processFilteredReleases(st, func(st *state.HelmState) []error { return processFilteredReleases(st, func(st *state.HelmState) []error {
return converge(st, helm) return converge(st, helm)
}, includeTransitiveNeeds) }, needsOptions)
} }
} }
@ -1247,8 +1311,8 @@ func (a *App) findDesiredStateFiles(specifiedPath string, opts LoadOpts) ([]stri
return files, nil return files, nil
} }
func (a *App) getSelectedReleases(r *Run, includeTransitiveNeeds bool) ([]state.ReleaseSpec, []state.ReleaseSpec, error) { func (a *App) getSelectedReleases(r *Run, needsOptions state.NeedsOptions) ([]state.ReleaseSpec, []state.ReleaseSpec, error) {
selected, err := r.state.GetSelectedReleases(includeTransitiveNeeds) selected, err := r.state.GetSelectedReleases(needsOptions)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -1326,7 +1390,11 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) {
helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...)
selectedReleases, selectedAndNeededReleases, err := a.getSelectedReleases(r, c.IncludeTransitiveNeeds()) selectedReleases, selectedAndNeededReleases, err := a.getSelectedReleases(r, state.NeedsOptions{
SkipNeeds: c.SkipNeeds(),
IncludeNeeds: c.IncludeNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
})
if err != nil { if err != nil {
return false, false, []error{err} return false, false, []error{err}
} }
@ -1517,7 +1585,11 @@ func (a *App) delete(r *Run, purge bool, c DestroyConfigProvider) (bool, []error
affectedReleases := state.AffectedReleases{} affectedReleases := state.AffectedReleases{}
toSync, _, err := a.getSelectedReleases(r, false) toSync, _, err := a.getSelectedReleases(r, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
})
if err != nil { if err != nil {
return false, []error{err} return false, []error{err}
} }
@ -1670,7 +1742,11 @@ func (a *App) status(r *Run, c StatusesConfigProvider) (bool, []error) {
allReleases := st.Releases allReleases := st.Releases
selectedReleases, selectedAndNeededReleases, err := a.getSelectedReleases(r, false) selectedReleases, selectedAndNeededReleases, err := a.getSelectedReleases(r, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
})
if err != nil { if err != nil {
return false, []error{err} return false, []error{err}
} }
@ -1720,7 +1796,11 @@ func (a *App) sync(r *Run, c SyncConfigProvider) (bool, []error) {
st := r.state st := r.state
helm := r.helm helm := r.helm
selectedReleases, selectedAndNeededReleases, err := a.getSelectedReleases(r, c.IncludeTransitiveNeeds()) selectedReleases, selectedAndNeededReleases, err := a.getSelectedReleases(r, state.NeedsOptions{
SkipNeeds: c.SkipNeeds(),
IncludeNeeds: c.IncludeNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
})
if err != nil { if err != nil {
return false, []error{err} return false, []error{err}
} }
@ -1918,7 +1998,11 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) {
func (a *App) withNeeds(r *Run, c DAGConfig, includeDisabled bool, f func(*state.HelmState) []error) (bool, []error) { func (a *App) withNeeds(r *Run, c DAGConfig, includeDisabled bool, f func(*state.HelmState) []error) (bool, []error) {
st := r.state st := r.state
selectedReleases, deduplicated, err := a.getSelectedReleases(r, c.IncludeTransitiveNeeds()) selectedReleases, deduplicated, err := a.getSelectedReleases(r, state.NeedsOptions{
SkipNeeds: c.SkipNeeds(),
IncludeNeeds: c.IncludeNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
})
if err != nil { if err != nil {
return false, []error{err} return false, []error{err}
} }
@ -2001,7 +2085,7 @@ func (a *App) test(r *Run, c TestConfigProvider) []error {
st := r.state st := r.state
toTest, _, err := a.getSelectedReleases(r, false) toTest, _, err := a.getSelectedReleases(r, state.NeedsOptions{})
if err != nil { if err != nil {
return []error{err} return []error{err}
} }
@ -2023,7 +2107,7 @@ func (a *App) writeValues(r *Run, c WriteValuesConfigProvider) (bool, []error) {
st := r.state st := r.state
helm := r.helm helm := r.helm
toRender, _, err := a.getSelectedReleases(r, false) toRender, _, err := a.getSelectedReleases(r, state.NeedsOptions{})
if err != nil { if err != nil {
return false, []error{err} return false, []error{err}
} }

View File

@ -110,7 +110,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
noop, noop,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if err != nil { if err != nil {
@ -162,7 +166,11 @@ BAZ: 4
err := app.ForEachState( err := app.ForEachState(
Noop, Noop,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if err != nil { if err != nil {
@ -204,7 +212,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
Noop, Noop,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if err == nil { if err == nil {
@ -249,7 +261,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
Noop, Noop,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if err != nil { if err != nil {
@ -301,7 +317,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
Noop, Noop,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if testcase.expectErr && err == nil { if testcase.expectErr && err == nil {
@ -368,7 +388,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
Noop, Noop,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if testcase.expectErr && err == nil { if testcase.expectErr && err == nil {
@ -423,7 +447,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
Noop, Noop,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if testcase.expectErr && err == nil { if testcase.expectErr && err == nil {
@ -537,7 +565,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if testcase.expectErr { if testcase.expectErr {
@ -778,7 +810,11 @@ func runFilterSubHelmFilesTests(testcases []struct {
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if testcase.expectErr { if testcase.expectErr {
@ -864,7 +900,11 @@ ns: INLINE_NS
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
@ -961,7 +1001,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetReverse(testcase.reverse), SetReverse(testcase.reverse),
SetFilter(true), SetFilter(true),
) )
@ -1027,7 +1071,11 @@ bar: "bar1"
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if err != nil { if err != nil {
@ -1148,7 +1196,11 @@ x:
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if err != nil { if err != nil {
@ -1199,7 +1251,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if err != nil { if err != nil {
@ -1255,7 +1311,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
if err != nil { if err != nil {
@ -1304,7 +1364,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
@ -1346,7 +1410,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
@ -1392,7 +1460,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
},
SetFilter(true), SetFilter(true),
) )
@ -4234,7 +4306,11 @@ releases:
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
false, state.NeedsOptions{
IncludeTransitiveNeeds: false,
IncludeNeeds: false,
SkipNeeds: true,
},
SetFilter(true), SetFilter(true),
) )
if err != nil { if err != nil {

View File

@ -107,7 +107,11 @@ func (r *Run) withPreparedCharts(helmfileCommand string, opts state.ChartPrepare
func (r *Run) Deps(c DepsConfigProvider) []error { func (r *Run) Deps(c DepsConfigProvider) []error {
r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...) r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state, nil)...)
return r.state.UpdateDeps(r.helm, c.IncludeTransitiveNeeds()) return r.state.UpdateDeps(r.helm, state.NeedsOptions{
SkipNeeds: c.SkipRepos(),
IncludeNeeds: c.IncludeTransitiveNeeds(),
IncludeTransitiveNeeds: c.IncludeTransitiveNeeds(),
})
} }
func (r *Run) Repos(c ReposConfigProvider) error { func (r *Run) Repos(c ReposConfigProvider) error {

View File

@ -112,7 +112,11 @@ func TestSelectReleasesWithOverrides(t *testing.T) {
state.Releases = state.GetReleasesWithOverrides() state.Releases = state.GetReleasesWithOverrides()
rs, err := state.GetSelectedReleases(false) rs, err := state.GetSelectedReleases(NeedsOptions{
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
SkipNeeds: true,
})
if err != nil { if err != nil {
t.Fatalf("%s %s: %v", tc.selector, tc.subject, err) t.Fatalf("%s %s: %v", tc.selector, tc.subject, err)
} }
@ -182,7 +186,11 @@ func TestSelectReleasesWithOverridesWithIncludedTransitives(t *testing.T) {
state.Selectors = tc.selector state.Selectors = tc.selector
state.Releases = state.GetReleasesWithOverrides() state.Releases = state.GetReleasesWithOverrides()
rs, err := state.GetSelectedReleases(tc.includeTransitiveNeeds) rs, err := state.GetSelectedReleases(NeedsOptions{
IncludeNeeds: false,
IncludeTransitiveNeeds: tc.includeTransitiveNeeds,
SkipNeeds: !tc.includeTransitiveNeeds,
})
if err != nil { if err != nil {
t.Fatalf("%s %s: %v", tc.selector, tc.subject, err) t.Fatalf("%s %s: %v", tc.selector, tc.subject, err)
} }

View File

@ -1046,6 +1046,7 @@ type ChartPrepareOptions struct {
OutputDirTemplate string OutputDirTemplate string
IncludeTransitiveNeeds bool IncludeTransitiveNeeds bool
IncludeNeeds bool IncludeNeeds bool
SkipNeeds bool
Concurrency int Concurrency int
KubeVersion string KubeVersion string
Set []string Set []string
@ -1103,7 +1104,11 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre
// This and releasesNeedCharts ensures that we run operations like helm-dep-build and prepare-hook calls only on // This and releasesNeedCharts ensures that we run operations like helm-dep-build and prepare-hook calls only on
// releases that are (1) selected by the selectors and (2) to be installed. // releases that are (1) selected by the selectors and (2) to be installed.
selected, err = st.GetSelectedReleases(opts.IncludeTransitiveNeeds) selected, err = st.GetSelectedReleases(NeedsOptions{
IncludeTransitiveNeeds: opts.IncludeTransitiveNeeds,
IncludeNeeds: opts.IncludeNeeds,
SkipNeeds: true,
})
if err != nil { if err != nil {
return nil, []error{err} return nil, []error{err}
} }
@ -2155,16 +2160,16 @@ func (st *HelmState) GetReleasesWithOverrides() []ReleaseSpec {
return rs return rs
} }
func (st *HelmState) SelectReleases(includeTransitiveNeeds bool) ([]Release, error) { func (st *HelmState) SelectReleases(needsOptions NeedsOptions) ([]Release, error) {
values := st.Values() values := st.Values()
rs, err := markExcludedReleases(st.Releases, st.Selectors, st.CommonLabels, values, includeTransitiveNeeds) rs, err := markExcludedReleases(st.Releases, st.Selectors, st.CommonLabels, values, needsOptions)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return rs, nil return rs, nil
} }
func markExcludedReleases(releases []ReleaseSpec, selectors []string, commonLabels map[string]string, values map[string]any, includeTransitiveNeeds bool) ([]Release, error) { func markExcludedReleases(releases []ReleaseSpec, selectors []string, commonLabels map[string]string, values map[string]any, needsOptions NeedsOptions) ([]Release, error) {
var filteredReleases []Release var filteredReleases []Release
filters := []ReleaseFilter{} filters := []ReleaseFilter{}
for _, label := range selectors { for _, label := range selectors {
@ -2209,7 +2214,12 @@ func markExcludedReleases(releases []ReleaseSpec, selectors []string, commonLabe
} }
filteredReleases = append(filteredReleases, res) filteredReleases = append(filteredReleases, res)
} }
unmarkNeeds(filteredReleases, releases, includeTransitiveNeeds) if needsOptions.SkipNeeds {
return filteredReleases, nil
}
if needsOptions.IncludeTransitiveNeeds || needsOptions.IncludeNeeds {
unmarkNeeds(filteredReleases, releases, needsOptions.IncludeTransitiveNeeds)
}
return filteredReleases, nil return filteredReleases, nil
} }
@ -2279,8 +2289,8 @@ func collectNeeds(release ReleaseSpec, allReleases []ReleaseSpec, needs map[stri
} }
} }
func (st *HelmState) GetSelectedReleases(includeTransitiveNeeds bool) ([]ReleaseSpec, error) { func (st *HelmState) GetSelectedReleases(needsOptions NeedsOptions) ([]ReleaseSpec, error) {
filteredReleases, err := st.SelectReleases(includeTransitiveNeeds) filteredReleases, err := st.SelectReleases(needsOptions)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -2295,8 +2305,8 @@ func (st *HelmState) GetSelectedReleases(includeTransitiveNeeds bool) ([]Release
} }
// FilterReleases allows for the execution of helm commands against a subset of the releases in the helmfile. // FilterReleases allows for the execution of helm commands against a subset of the releases in the helmfile.
func (st *HelmState) FilterReleases(includeTransitiveNeeds bool) error { func (st *HelmState) FilterReleases(needsOptions NeedsOptions) error {
releases, err := st.GetSelectedReleases(includeTransitiveNeeds) releases, err := st.GetSelectedReleases(needsOptions)
if err != nil { if err != nil {
return err return err
} }
@ -2376,7 +2386,7 @@ func (st *HelmState) ResolveDeps() (*HelmState, error) {
} }
// UpdateDeps wrapper for updating dependencies on the releases // UpdateDeps wrapper for updating dependencies on the releases
func (st *HelmState) UpdateDeps(helm helmexec.Interface, includeTransitiveNeeds bool) []error { func (st *HelmState) UpdateDeps(helm helmexec.Interface, needsOptions NeedsOptions) []error {
var selected []ReleaseSpec var selected []ReleaseSpec
if len(st.Selectors) > 0 { if len(st.Selectors) > 0 {
@ -2384,7 +2394,7 @@ func (st *HelmState) UpdateDeps(helm helmexec.Interface, includeTransitiveNeeds
// This and releasesNeedCharts ensures that we run operations like helm-dep-build and prepare-hook calls only on // This and releasesNeedCharts ensures that we run operations like helm-dep-build and prepare-hook calls only on
// releases that are (1) selected by the selectors and (2) to be installed. // releases that are (1) selected by the selectors and (2) to be installed.
selected, err = st.GetSelectedReleases(includeTransitiveNeeds) selected, err = st.GetSelectedReleases(needsOptions)
if err != nil { if err != nil {
return []error{err} return []error{err}
} }

View File

@ -89,6 +89,12 @@ func (st *HelmState) iterateOnReleases(helm helmexec.Interface, concurrency int,
return nil return nil
} }
type NeedsOptions struct {
IncludeNeeds bool
IncludeTransitiveNeeds bool
SkipNeeds bool
}
type PlanOptions struct { type PlanOptions struct {
Purpose string Purpose string
Reverse bool Reverse bool
@ -99,7 +105,11 @@ type PlanOptions struct {
} }
func (st *HelmState) PlanReleases(opts PlanOptions) ([][]ReleaseSpec, error) { func (st *HelmState) PlanReleases(opts PlanOptions) ([][]ReleaseSpec, error) {
marked, err := st.GetSelectedReleases(opts.IncludeTransitiveNeeds) marked, err := st.GetSelectedReleases(NeedsOptions{
IncludeNeeds: opts.IncludeNeeds,
IncludeTransitiveNeeds: opts.IncludeTransitiveNeeds,
SkipNeeds: opts.SkipNeeds,
})
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -2143,7 +2143,11 @@ generated: 2019-05-16T15:42:45.50486+09:00
}) })
fs.Cwd = basePath fs.Cwd = basePath
state = injectFs(state, fs) state = injectFs(state, fs)
errs := state.UpdateDeps(helm, false) errs := state.UpdateDeps(helm, NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
})
want := []string{"/example", "./example", generatedDir} want := []string{"/example", "./example", generatedDir}
if !reflect.DeepEqual(helm.Charts, want) { if !reflect.DeepEqual(helm.Charts, want) {
@ -2567,7 +2571,11 @@ func TestHelmState_NoReleaseMatched(t *testing.T) {
RenderedValues: map[string]any{}, RenderedValues: map[string]any{},
} }
state.Selectors = []string{tt.labels} state.Selectors = []string{tt.labels}
errs := state.FilterReleases(false) errs := state.FilterReleases(NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
})
if (errs != nil) != tt.wantErr { if (errs != nil) != tt.wantErr {
t.Errorf("ReleaseStatuses() for %s error = %v, wantErr %v", tt.name, errs, tt.wantErr) t.Errorf("ReleaseStatuses() for %s error = %v, wantErr %v", tt.name, errs, tt.wantErr)
return return