Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero
2023-09-17 15:29:40 +08:00
parent cf24d348bf
commit 08f5d6ab08
7 changed files with 270 additions and 70 deletions
+10 -2
View File
@@ -112,7 +112,11 @@ func TestSelectReleasesWithOverrides(t *testing.T) {
state.Releases = state.GetReleasesWithOverrides()
rs, err := state.GetSelectedReleases(false)
rs, err := state.GetSelectedReleases(NeedsOptions{
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
SkipNeeds: true,
})
if err != nil {
t.Fatalf("%s %s: %v", tc.selector, tc.subject, err)
}
@@ -182,7 +186,11 @@ func TestSelectReleasesWithOverridesWithIncludedTransitives(t *testing.T) {
state.Selectors = tc.selector
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 {
t.Fatalf("%s %s: %v", tc.selector, tc.subject, err)
}
+21 -11
View File
@@ -1046,6 +1046,7 @@ type ChartPrepareOptions struct {
OutputDirTemplate string
IncludeTransitiveNeeds bool
IncludeNeeds bool
SkipNeeds bool
Concurrency int
KubeVersion 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
// 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 {
return nil, []error{err}
}
@@ -2155,16 +2160,16 @@ func (st *HelmState) GetReleasesWithOverrides() []ReleaseSpec {
return rs
}
func (st *HelmState) SelectReleases(includeTransitiveNeeds bool) ([]Release, error) {
func (st *HelmState) SelectReleases(needsOptions NeedsOptions) ([]Release, error) {
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 {
return nil, err
}
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
filters := []ReleaseFilter{}
for _, label := range selectors {
@@ -2209,7 +2214,12 @@ func markExcludedReleases(releases []ReleaseSpec, selectors []string, commonLabe
}
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
}
@@ -2279,8 +2289,8 @@ func collectNeeds(release ReleaseSpec, allReleases []ReleaseSpec, needs map[stri
}
}
func (st *HelmState) GetSelectedReleases(includeTransitiveNeeds bool) ([]ReleaseSpec, error) {
filteredReleases, err := st.SelectReleases(includeTransitiveNeeds)
func (st *HelmState) GetSelectedReleases(needsOptions NeedsOptions) ([]ReleaseSpec, error) {
filteredReleases, err := st.SelectReleases(needsOptions)
if err != nil {
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.
func (st *HelmState) FilterReleases(includeTransitiveNeeds bool) error {
releases, err := st.GetSelectedReleases(includeTransitiveNeeds)
func (st *HelmState) FilterReleases(needsOptions NeedsOptions) error {
releases, err := st.GetSelectedReleases(needsOptions)
if err != nil {
return err
}
@@ -2376,7 +2386,7 @@ func (st *HelmState) ResolveDeps() (*HelmState, error) {
}
// 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
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
// 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 {
return []error{err}
}
+11 -1
View File
@@ -89,6 +89,12 @@ func (st *HelmState) iterateOnReleases(helm helmexec.Interface, concurrency int,
return nil
}
type NeedsOptions struct {
IncludeNeeds bool
IncludeTransitiveNeeds bool
SkipNeeds bool
}
type PlanOptions struct {
Purpose string
Reverse bool
@@ -99,7 +105,11 @@ type PlanOptions struct {
}
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 {
return nil, err
}
+10 -2
View File
@@ -2143,7 +2143,11 @@ generated: 2019-05-16T15:42:45.50486+09:00
})
fs.Cwd = basePath
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}
if !reflect.DeepEqual(helm.Charts, want) {
@@ -2567,7 +2571,11 @@ func TestHelmState_NoReleaseMatched(t *testing.T) {
RenderedValues: map[string]any{},
}
state.Selectors = []string{tt.labels}
errs := state.FilterReleases(false)
errs := state.FilterReleases(NeedsOptions{
SkipNeeds: true,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
})
if (errs != nil) != tt.wantErr {
t.Errorf("ReleaseStatuses() for %s error = %v, wantErr %v", tt.name, errs, tt.wantErr)
return