Fix --selector results to correctly deduplicate releases (#1822)
Fixes #1818
This commit is contained in:
		
							parent
							
								
									f28ad5af23
								
							
						
					
					
						commit
						de8644a504
					
				| 
						 | 
					@ -1120,8 +1120,6 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) {
 | 
				
			||||||
	st := r.state
 | 
						st := r.state
 | 
				
			||||||
	helm := r.helm
 | 
						helm := r.helm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	allReleases := st.GetReleasesWithOverrides()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	toApply, err := a.getSelectedReleases(r)
 | 
						toApply, err := a.getSelectedReleases(r)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return false, false, []error{err}
 | 
							return false, false, []error{err}
 | 
				
			||||||
| 
						 | 
					@ -1214,9 +1212,6 @@ Do you really want to apply?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	affectedReleases := state.AffectedReleases{}
 | 
						affectedReleases := state.AffectedReleases{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | 
					 | 
				
			||||||
	st.Releases = allReleases
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if !interactive || interactive && r.askForConfirmation(confMsg) {
 | 
						if !interactive || interactive && r.askForConfirmation(confMsg) {
 | 
				
			||||||
		r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...)
 | 
							r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1360,8 +1355,6 @@ Do you really want to delete?
 | 
				
			||||||
func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) {
 | 
					func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) {
 | 
				
			||||||
	st := r.state
 | 
						st := r.state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	allReleases := st.GetReleasesWithOverrides()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	toDiff, err := a.getSelectedReleases(r)
 | 
						toDiff, err := a.getSelectedReleases(r)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, false, false, []error{err}
 | 
							return nil, false, false, []error{err}
 | 
				
			||||||
| 
						 | 
					@ -1371,10 +1364,6 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error)
 | 
				
			||||||
		return nil, false, false, nil
 | 
							return nil, false, false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Do build deps and prepare only on selected releases so that we won't waste time
 | 
					 | 
				
			||||||
	// on running various helm commands on unnecessary releases
 | 
					 | 
				
			||||||
	st.Releases = toDiff
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...)
 | 
						r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	opts := &state.DiffOpts{
 | 
						opts := &state.DiffOpts{
 | 
				
			||||||
| 
						 | 
					@ -1384,9 +1373,6 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error)
 | 
				
			||||||
		Set:     c.Set(),
 | 
							Set:     c.Set(),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Validate all releases for missing `needs` targets
 | 
					 | 
				
			||||||
	st.Releases = allReleases
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	plan, err := st.PlanReleases(state.PlanOptions{Reverse: false, SelectedReleases: toDiff, SkipNeeds: c.SkipNeeds(), IncludeNeeds: c.IncludeNeeds()})
 | 
						plan, err := st.PlanReleases(state.PlanOptions{Reverse: false, SelectedReleases: toDiff, SkipNeeds: c.SkipNeeds(), IncludeNeeds: c.IncludeNeeds()})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, false, false, []error{err}
 | 
							return nil, false, false, []error{err}
 | 
				
			||||||
| 
						 | 
					@ -1549,8 +1535,6 @@ func (a *App) sync(r *Run, c SyncConfigProvider) (bool, []error) {
 | 
				
			||||||
	st := r.state
 | 
						st := r.state
 | 
				
			||||||
	helm := r.helm
 | 
						helm := r.helm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	allReleases := st.GetReleasesWithOverrides()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	toSync, err := a.getSelectedReleases(r)
 | 
						toSync, err := a.getSelectedReleases(r)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return false, []error{err}
 | 
							return false, []error{err}
 | 
				
			||||||
| 
						 | 
					@ -1574,7 +1558,7 @@ func (a *App) sync(r *Run, c SyncConfigProvider) (bool, []error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Do build deps and prepare only on selected releases so that we won't waste time
 | 
						// Do build deps and prepare only on selected releases so that we won't waste time
 | 
				
			||||||
	// on running various helm commands on unnecessary releases
 | 
						// on running various helm commands on unnecessary releases
 | 
				
			||||||
	st.Releases = toSync
 | 
						st.Releases = toSyncWithNeeds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	toDelete, err := st.DetectReleasesToBeDeletedForSync(helm, toSyncWithNeeds)
 | 
						toDelete, err := st.DetectReleasesToBeDeletedForSync(helm, toSyncWithNeeds)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -1644,7 +1628,7 @@ func (a *App) sync(r *Run, c SyncConfigProvider) (bool, []error) {
 | 
				
			||||||
	r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...)
 | 
						r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | 
						// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | 
				
			||||||
	st.Releases = allReleases
 | 
						st.Releases = toSyncWithNeeds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	affectedReleases := state.AffectedReleases{}
 | 
						affectedReleases := state.AffectedReleases{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1701,8 +1685,6 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) {
 | 
				
			||||||
	st := r.state
 | 
						st := r.state
 | 
				
			||||||
	helm := r.helm
 | 
						helm := r.helm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	allReleases := st.GetReleasesWithOverrides()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	selectedReleases, err := a.getSelectedReleases(r)
 | 
						selectedReleases, err := a.getSelectedReleases(r)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return false, []error{err}
 | 
							return false, []error{err}
 | 
				
			||||||
| 
						 | 
					@ -1739,7 +1721,7 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) {
 | 
				
			||||||
	var errs []error
 | 
						var errs []error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | 
						// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | 
				
			||||||
	st.Releases = allReleases
 | 
						st.Releases = selectedReleasesWithNeeds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	args := argparser.GetArgs(c.Args(), st)
 | 
						args := argparser.GetArgs(c.Args(), st)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4201,7 +4201,7 @@ releases:
 | 
				
			||||||
			upgraded:    []exectest.Release{},
 | 
								upgraded:    []exectest.Release{},
 | 
				
			||||||
			deleted:     []exectest.Release{},
 | 
								deleted:     []exectest.Release{},
 | 
				
			||||||
			concurrency: 1,
 | 
								concurrency: 1,
 | 
				
			||||||
			error:       `in ./helmfile.yaml: "default/foo" depends on nonexistent release "default/bar"`,
 | 
								error:       `in ./helmfile.yaml: release "default/foo" depends on "default/bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`,
 | 
				
			||||||
			log: `processing file "helmfile.yaml" in directory "."
 | 
								log: `processing file "helmfile.yaml" in directory "."
 | 
				
			||||||
first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode=<nil>
 | 
					first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode=<nil>
 | 
				
			||||||
first-pass uses: &{default map[] map[]}
 | 
					first-pass uses: &{default map[] map[]}
 | 
				
			||||||
| 
						 | 
					@ -4237,7 +4237,7 @@ second-pass rendering result of "helmfile.yaml.part.0":
 | 
				
			||||||
merged environment: &{default map[] map[]}
 | 
					merged environment: &{default map[] map[]}
 | 
				
			||||||
2 release(s) found in helmfile.yaml
 | 
					2 release(s) found in helmfile.yaml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err: "default/foo" depends on nonexistent release "default/bar"
 | 
					err: release "default/foo" depends on "default/bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies
 | 
				
			||||||
`,
 | 
					`,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1159,7 +1159,7 @@ releases:
 | 
				
			||||||
			upgraded:    []exectest.Release{},
 | 
								upgraded:    []exectest.Release{},
 | 
				
			||||||
			deleted:     []exectest.Release{},
 | 
								deleted:     []exectest.Release{},
 | 
				
			||||||
			concurrency: 1,
 | 
								concurrency: 1,
 | 
				
			||||||
			error:       `in ./helmfile.yaml: "foo" depends on nonexistent release "bar"`,
 | 
								error:       `in ./helmfile.yaml: release "foo" depends on "bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`,
 | 
				
			||||||
			log: `processing file "helmfile.yaml" in directory "."
 | 
								log: `processing file "helmfile.yaml" in directory "."
 | 
				
			||||||
first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode=<nil>
 | 
					first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode=<nil>
 | 
				
			||||||
first-pass uses: &{default map[] map[]}
 | 
					first-pass uses: &{default map[] map[]}
 | 
				
			||||||
| 
						 | 
					@ -1195,7 +1195,7 @@ second-pass rendering result of "helmfile.yaml.part.0":
 | 
				
			||||||
merged environment: &{default map[] map[]}
 | 
					merged environment: &{default map[] map[]}
 | 
				
			||||||
2 release(s) found in helmfile.yaml
 | 
					2 release(s) found in helmfile.yaml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err: "foo" depends on nonexistent release "bar"
 | 
					err: release "foo" depends on "bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies
 | 
				
			||||||
`,
 | 
					`,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1263,7 +1263,7 @@ releases:
 | 
				
			||||||
			upgraded:    []exectest.Release{},
 | 
								upgraded:    []exectest.Release{},
 | 
				
			||||||
			deleted:     []exectest.Release{},
 | 
								deleted:     []exectest.Release{},
 | 
				
			||||||
			concurrency: 1,
 | 
								concurrency: 1,
 | 
				
			||||||
			error:       `in ./helmfile.yaml: "default/foo" depends on nonexistent release "default/bar"`,
 | 
								error:       `in ./helmfile.yaml: release "default/foo" depends on "default/bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`,
 | 
				
			||||||
			log: `processing file "helmfile.yaml" in directory "."
 | 
								log: `processing file "helmfile.yaml" in directory "."
 | 
				
			||||||
first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode=<nil>
 | 
					first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode=<nil>
 | 
				
			||||||
first-pass uses: &{default map[] map[]}
 | 
					first-pass uses: &{default map[] map[]}
 | 
				
			||||||
| 
						 | 
					@ -1299,7 +1299,7 @@ second-pass rendering result of "helmfile.yaml.part.0":
 | 
				
			||||||
merged environment: &{default map[] map[]}
 | 
					merged environment: &{default map[] map[]}
 | 
				
			||||||
2 release(s) found in helmfile.yaml
 | 
					2 release(s) found in helmfile.yaml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err: "default/foo" depends on nonexistent release "default/bar"
 | 
					err: release "default/foo" depends on "default/bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies
 | 
				
			||||||
`,
 | 
					`,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -165,21 +165,6 @@ func GroupReleasesByDependency(releases []Release, opts PlanOptions) ([][]Releas
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, r := range releases {
 | 
					 | 
				
			||||||
		if !r.Filtered {
 | 
					 | 
				
			||||||
			for _, n := range r.Needs {
 | 
					 | 
				
			||||||
				// To map n into idToReleases correctly, prepend KubeContext to n.
 | 
					 | 
				
			||||||
				if r.KubeContext != "" {
 | 
					 | 
				
			||||||
					n = r.KubeContext + "/" + n
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if _, ok := idToReleases[n]; !ok {
 | 
					 | 
				
			||||||
					id := ReleaseToID(&r.ReleaseSpec)
 | 
					 | 
				
			||||||
					return nil, fmt.Errorf("%q depends on nonexistent release %q", id, n)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var selectedReleaseIDs []string
 | 
						var selectedReleaseIDs []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, r := range opts.SelectedReleases {
 | 
						for _, r := range opts.SelectedReleases {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue