Respect release filter in lint and status (#1672)
Ref #1190 Fixes #1651 Co-authored-by: Yusuke Kuoka <ykuoka@gmail.com>
This commit is contained in:
		
							parent
							
								
									f614e8b1bf
								
							
						
					
					
						commit
						c65bdff62c
					
				
							
								
								
									
										63
									
								
								main.go
								
								
								
								
							
							
						
						
									
										63
									
								
								main.go
								
								
								
								
							|  | @ -5,9 +5,8 @@ import ( | ||||||
| 	"os" | 	"os" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/roboll/helmfile/pkg/app/version" |  | ||||||
| 
 |  | ||||||
| 	"github.com/roboll/helmfile/pkg/app" | 	"github.com/roboll/helmfile/pkg/app" | ||||||
|  | 	"github.com/roboll/helmfile/pkg/app/version" | ||||||
| 	"github.com/roboll/helmfile/pkg/helmexec" | 	"github.com/roboll/helmfile/pkg/helmexec" | ||||||
| 	"github.com/roboll/helmfile/pkg/maputil" | 	"github.com/roboll/helmfile/pkg/maputil" | ||||||
| 	"github.com/roboll/helmfile/pkg/state" | 	"github.com/roboll/helmfile/pkg/state" | ||||||
|  | @ -126,8 +125,8 @@ func main() { | ||||||
| 					Usage: `skip running "helm repo update" before running "helm dependency build"`, | 					Usage: `skip running "helm repo update" before running "helm dependency build"`, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Deps(c) | 				return a.Deps(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -140,8 +139,8 @@ func main() { | ||||||
| 					Usage: "pass args to helm exec", | 					Usage: "pass args to helm exec", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Repos(c) | 				return a.Repos(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -167,8 +166,8 @@ func main() { | ||||||
| 					Usage: "maximum number of concurrent helm processes to run, 0 is unlimited", | 					Usage: "maximum number of concurrent helm processes to run, 0 is unlimited", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.DeprecatedSyncCharts(c) | 				return a.DeprecatedSyncCharts(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -219,8 +218,8 @@ func main() { | ||||||
| 					Usage: "output NUM lines of context around changes", | 					Usage: "output NUM lines of context around changes", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Diff(c) | 				return a.Diff(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -270,8 +269,8 @@ func main() { | ||||||
| 					Usage: "Stop cleaning up temporary values generated by helmfile and helm-secrets. Useful for debugging. Don't use in production for security", | 					Usage: "Stop cleaning up temporary values generated by helmfile and helm-secrets. Useful for debugging. Don't use in production for security", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Template(c) | 				return a.Template(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -300,8 +299,8 @@ func main() { | ||||||
| 					Usage: `skip running "helm repo update" and "helm dependency build"`, | 					Usage: `skip running "helm repo update" and "helm dependency build"`, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.WriteValues(c) | 				return a.WriteValues(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -331,8 +330,8 @@ func main() { | ||||||
| 					Usage: `skip running "helm repo update" and "helm dependency build"`, | 					Usage: `skip running "helm repo update" and "helm dependency build"`, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Lint(c) | 				return a.Lint(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -392,8 +391,8 @@ func main() { | ||||||
| 					Usage: `Override helmDefaults.waitForJobs setting "helm upgrade --install --wait-for-jobs"`, | 					Usage: `Override helmDefaults.waitForJobs setting "helm upgrade --install --wait-for-jobs"`, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Sync(c) | 				return a.Sync(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -468,8 +467,8 @@ func main() { | ||||||
| 					Usage: `Override helmDefaults.waitForJobs setting "helm upgrade --install --wait-for-jobs"`, | 					Usage: `Override helmDefaults.waitForJobs setting "helm upgrade --install --wait-for-jobs"`, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Apply(c) | 				return a.Apply(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -487,8 +486,8 @@ func main() { | ||||||
| 					Usage: "pass args to helm exec", | 					Usage: "pass args to helm exec", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Status(c) | 				return a.Status(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -510,8 +509,8 @@ func main() { | ||||||
| 					Usage: "purge releases i.e. free release names and histories", | 					Usage: "purge releases i.e. free release names and histories", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Delete(c) | 				return a.Delete(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -529,8 +528,8 @@ func main() { | ||||||
| 					Usage: "pass args to helm exec", | 					Usage: "pass args to helm exec", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Destroy(c) | 				return a.Destroy(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -561,8 +560,8 @@ func main() { | ||||||
| 					Usage: "maximum number of concurrent helm processes to run, 0 is unlimited", | 					Usage: "maximum number of concurrent helm processes to run, 0 is unlimited", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.Test(c) | 				return a.Test(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -574,8 +573,8 @@ func main() { | ||||||
| 					Usage: "Read all the values files for every release and embed into the output helmfile.yaml", | 					Usage: "Read all the values files for every release and embed into the output helmfile.yaml", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.PrintState(c) | 				return a.PrintState(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -592,8 +591,8 @@ func main() { | ||||||
| 					Usage: "Keep temporary directory", | 					Usage: "Keep temporary directory", | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			Action: action(func(run *app.App, c configImpl) error { | 			Action: action(func(a *app.App, c configImpl) error { | ||||||
| 				return run.ListReleases(c) | 				return a.ListReleases(c) | ||||||
| 			}), | 			}), | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  |  | ||||||
							
								
								
									
										211
									
								
								pkg/app/app.go
								
								
								
								
							
							
						
						
									
										211
									
								
								pkg/app/app.go
								
								
								
								
							|  | @ -275,14 +275,14 @@ func (a *App) WriteValues(c WriteValuesConfigProvider) error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (a *App) Lint(c LintConfigProvider) error { | func (a *App) Lint(c LintConfigProvider) error { | ||||||
| 	return a.ForEachState(func(run *Run) (_ bool, errs []error) { | 	return a.ForEachState(func(run *Run) (ok bool, errs []error) { | ||||||
| 		// `helm lint` on helm v2 and v3 does not support remote charts, that we need to set `forceDownload=true` here
 | 		// `helm lint` on helm v2 and v3 does not support remote charts, that we need to set `forceDownload=true` here
 | ||||||
| 		prepErr := run.withPreparedCharts("lint", state.ChartPrepareOptions{ | 		prepErr := run.withPreparedCharts("lint", state.ChartPrepareOptions{ | ||||||
| 			ForceDownload: true, | 			ForceDownload: true, | ||||||
| 			SkipRepos:     c.SkipDeps(), | 			SkipRepos:     c.SkipDeps(), | ||||||
| 			SkipDeps:      c.SkipDeps(), | 			SkipDeps:      c.SkipDeps(), | ||||||
| 		}, func() { | 		}, func() { | ||||||
| 			errs = run.Lint(c) | 			ok, errs = a.lint(run, c) | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
| 		if prepErr != nil { | 		if prepErr != nil { | ||||||
|  | @ -376,12 +376,12 @@ func (a *App) Apply(c ApplyConfigProvider) error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (a *App) Status(c StatusesConfigProvider) error { | func (a *App) Status(c StatusesConfigProvider) error { | ||||||
| 	return a.ForEachState(func(run *Run) (_ bool, errs []error) { | 	return a.ForEachState(func(run *Run) (ok bool, errs []error) { | ||||||
| 		err := run.withPreparedCharts("status", state.ChartPrepareOptions{ | 		err := run.withPreparedCharts("status", state.ChartPrepareOptions{ | ||||||
| 			SkipRepos: true, | 			SkipRepos: true, | ||||||
| 			SkipDeps:  true, | 			SkipDeps:  true, | ||||||
| 		}, func() { | 		}, func() { | ||||||
| 			errs = run.Status(c) | 			ok, errs = a.status(run, c) | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  | @ -1307,6 +1307,184 @@ Do you really want to delete? | ||||||
| 	return true, errs | 	return true, errs | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) { | ||||||
|  | 	st := r.state | ||||||
|  | 
 | ||||||
|  | 	allReleases := st.GetReleasesWithOverrides() | ||||||
|  | 
 | ||||||
|  | 	toDiff, err := a.getSelectedReleases(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, false, false, []error{err} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(toDiff) == 0 { | ||||||
|  | 		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)...) | ||||||
|  | 
 | ||||||
|  | 	opts := &state.DiffOpts{ | ||||||
|  | 		Context: c.Context(), | ||||||
|  | 		NoColor: c.NoColor(), | ||||||
|  | 		Set:     c.Set(), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Validate all releases for missing `needs` targets
 | ||||||
|  | 	st.Releases = allReleases | ||||||
|  | 
 | ||||||
|  | 	if _, err := st.PlanReleases(false); err != nil { | ||||||
|  | 		return nil, false, false, []error{err} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Diff only targeted releases
 | ||||||
|  | 
 | ||||||
|  | 	st.Releases = toDiff | ||||||
|  | 
 | ||||||
|  | 	filtered := &Run{ | ||||||
|  | 		state: st, | ||||||
|  | 		helm:  r.helm, | ||||||
|  | 		ctx:   r.ctx, | ||||||
|  | 		Ask:   r.Ask, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	infoMsg, updated, deleted, errs := filtered.diff(true, c.DetailedExitcode(), c, opts) | ||||||
|  | 
 | ||||||
|  | 	return infoMsg, true, len(deleted) > 0 || len(updated) > 0, errs | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (a *App) lint(r *Run, c LintConfigProvider) (bool, []error) { | ||||||
|  | 	st := r.state | ||||||
|  | 	helm := r.helm | ||||||
|  | 
 | ||||||
|  | 	allReleases := st.GetReleasesWithOverrides() | ||||||
|  | 
 | ||||||
|  | 	selectedReleases, err := a.getSelectedReleases(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, []error{err} | ||||||
|  | 	} | ||||||
|  | 	if len(selectedReleases) == 0 { | ||||||
|  | 		return 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 = selectedReleases | ||||||
|  | 
 | ||||||
|  | 	releasesToRender := map[string]state.ReleaseSpec{} | ||||||
|  | 	for _, r := range selectedReleases { | ||||||
|  | 		id := state.ReleaseToID(&r) | ||||||
|  | 		if r.Installed != nil && !*r.Installed { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		releasesToRender[id] = r | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var errs []error | ||||||
|  | 
 | ||||||
|  | 	// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | ||||||
|  | 	st.Releases = allReleases | ||||||
|  | 
 | ||||||
|  | 	args := argparser.GetArgs(c.Args(), st) | ||||||
|  | 
 | ||||||
|  | 	// Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint`
 | ||||||
|  | 	helm.SetExtraArgs() | ||||||
|  | 
 | ||||||
|  | 	if len(args) > 0 { | ||||||
|  | 		helm.SetExtraArgs(args...) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(releasesToRender) > 0 { | ||||||
|  | 		_, templateErrs := withDAG(st, helm, a.Logger, false, a.Wrap(func(subst *state.HelmState, helm helmexec.Interface) []error { | ||||||
|  | 			var rs []state.ReleaseSpec | ||||||
|  | 
 | ||||||
|  | 			for _, r := range subst.Releases { | ||||||
|  | 				if r2, ok := releasesToRender[state.ReleaseToID(&r)]; ok { | ||||||
|  | 					rs = append(rs, r2) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			subst.Releases = rs | ||||||
|  | 
 | ||||||
|  | 			opts := &state.LintOpts{ | ||||||
|  | 				Set: c.Set(), | ||||||
|  | 			} | ||||||
|  | 			return subst.LintReleases(helm, c.Values(), args, c.Concurrency(), opts) | ||||||
|  | 		})) | ||||||
|  | 
 | ||||||
|  | 		if templateErrs != nil && len(templateErrs) > 0 { | ||||||
|  | 			errs = append(errs, templateErrs...) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return true, errs | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (a *App) status(r *Run, c StatusesConfigProvider) (bool, []error) { | ||||||
|  | 	st := r.state | ||||||
|  | 	helm := r.helm | ||||||
|  | 
 | ||||||
|  | 	allReleases := st.GetReleasesWithOverrides() | ||||||
|  | 
 | ||||||
|  | 	selectedReleases, err := a.getSelectedReleases(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, []error{err} | ||||||
|  | 	} | ||||||
|  | 	if len(selectedReleases) == 0 { | ||||||
|  | 		return 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 = selectedReleases | ||||||
|  | 
 | ||||||
|  | 	releasesToRender := map[string]state.ReleaseSpec{} | ||||||
|  | 	for _, r := range selectedReleases { | ||||||
|  | 		id := state.ReleaseToID(&r) | ||||||
|  | 		if r.Installed != nil && !*r.Installed { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		releasesToRender[id] = r | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var errs []error | ||||||
|  | 
 | ||||||
|  | 	// Traverse DAG of all the releases so that we don't suffer from false-positive missing dependencies
 | ||||||
|  | 	st.Releases = allReleases | ||||||
|  | 
 | ||||||
|  | 	args := argparser.GetArgs(c.Args(), st) | ||||||
|  | 
 | ||||||
|  | 	// Reset the extra args if already set, not to break `helm fetch` by adding the args intended for `lint`
 | ||||||
|  | 	helm.SetExtraArgs() | ||||||
|  | 
 | ||||||
|  | 	if len(args) > 0 { | ||||||
|  | 		helm.SetExtraArgs(args...) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(releasesToRender) > 0 { | ||||||
|  | 		_, templateErrs := withDAG(st, helm, a.Logger, false, a.Wrap(func(subst *state.HelmState, helm helmexec.Interface) []error { | ||||||
|  | 			var rs []state.ReleaseSpec | ||||||
|  | 
 | ||||||
|  | 			for _, r := range subst.Releases { | ||||||
|  | 				if r2, ok := releasesToRender[state.ReleaseToID(&r)]; ok { | ||||||
|  | 					rs = append(rs, r2) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			subst.Releases = rs | ||||||
|  | 
 | ||||||
|  | 			return subst.ReleaseStatuses(helm, c.Concurrency()) | ||||||
|  | 		})) | ||||||
|  | 
 | ||||||
|  | 		if templateErrs != nil && len(templateErrs) > 0 { | ||||||
|  | 			errs = append(errs, templateErrs...) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return true, errs | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (a *App) sync(r *Run, c SyncConfigProvider) (bool, []error) { | func (a *App) sync(r *Run, c SyncConfigProvider) (bool, []error) { | ||||||
| 	st := r.state | 	st := r.state | ||||||
| 	helm := r.helm | 	helm := r.helm | ||||||
|  | @ -1508,6 +1686,31 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) { | ||||||
| 	return true, errs | 	return true, errs | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (a *App) test(r *Run, c TestConfigProvider) []error { | ||||||
|  | 	cleanup := c.Cleanup() | ||||||
|  | 	timeout := c.Timeout() | ||||||
|  | 	concurrency := c.Concurrency() | ||||||
|  | 
 | ||||||
|  | 	st := r.state | ||||||
|  | 
 | ||||||
|  | 	toTest, err := a.getSelectedReleases(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return []error{err} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(toTest) == 0 { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Do test only on selected releases, because that's what the user intended
 | ||||||
|  | 	// with conditions and selectors
 | ||||||
|  | 	st.Releases = toTest | ||||||
|  | 
 | ||||||
|  | 	r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) | ||||||
|  | 
 | ||||||
|  | 	return st.TestReleases(r.helm, cleanup, timeout, concurrency, state.Logs(c.Logs())) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (a *App) writeValues(r *Run, c WriteValuesConfigProvider) (bool, []error) { | func (a *App) writeValues(r *Run, c WriteValuesConfigProvider) (bool, []error) { | ||||||
| 	st := r.state | 	st := r.state | ||||||
| 	helm := r.helm | 	helm := r.helm | ||||||
|  |  | ||||||
|  | @ -117,105 +117,10 @@ func (r *Run) DeprecatedSyncCharts(c DeprecatedChartsConfigProvider) []error { | ||||||
| 	return errs | 	return errs | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *Run) Status(c StatusesConfigProvider) []error { | func (r *Run) diff(triggerCleanupEvent bool, detailedExitCode bool, c DiffConfigProvider, diffOpts *state.DiffOpts) (*string, map[string]state.ReleaseSpec, map[string]state.ReleaseSpec, []error) { | ||||||
| 	workers := c.Concurrency() |  | ||||||
| 
 |  | ||||||
| 	r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) |  | ||||||
| 
 |  | ||||||
| 	return r.state.ReleaseStatuses(r.helm, workers) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) { |  | ||||||
| 	st := r.state |  | ||||||
| 
 |  | ||||||
| 	allReleases := st.GetReleasesWithOverrides() |  | ||||||
| 
 |  | ||||||
| 	toDiff, err := a.getSelectedReleases(r) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, false, false, []error{err} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if len(toDiff) == 0 { |  | ||||||
| 		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)...) |  | ||||||
| 
 |  | ||||||
| 	opts := &state.DiffOpts{ |  | ||||||
| 		Context: c.Context(), |  | ||||||
| 		NoColor: c.NoColor(), |  | ||||||
| 		Set:     c.Set(), |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Validate all releases for missing `needs` targets
 |  | ||||||
| 	st.Releases = allReleases |  | ||||||
| 
 |  | ||||||
| 	if _, err := st.PlanReleases(false); err != nil { |  | ||||||
| 		return nil, false, false, []error{err} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Diff only targeted releases
 |  | ||||||
| 
 |  | ||||||
| 	st.Releases = toDiff |  | ||||||
| 
 |  | ||||||
| 	filtered := &Run{ |  | ||||||
| 		state: st, |  | ||||||
| 		helm:  r.helm, |  | ||||||
| 		ctx:   r.ctx, |  | ||||||
| 		Ask:   r.Ask, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	infoMsg, updated, deleted, errs := filtered.diff(true, c.DetailedExitcode(), c, opts) |  | ||||||
| 
 |  | ||||||
| 	return infoMsg, true, len(deleted) > 0 || len(updated) > 0, errs |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (a *App) test(r *Run, c TestConfigProvider) []error { |  | ||||||
| 	cleanup := c.Cleanup() |  | ||||||
| 	timeout := c.Timeout() |  | ||||||
| 	concurrency := c.Concurrency() |  | ||||||
| 
 |  | ||||||
| 	st := r.state |  | ||||||
| 
 |  | ||||||
| 	toTest, err := a.getSelectedReleases(r) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return []error{err} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if len(toTest) == 0 { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Do test only on selected releases, because that's what the user intended
 |  | ||||||
| 	// with conditions and selectors
 |  | ||||||
| 	st.Releases = toTest |  | ||||||
| 
 |  | ||||||
| 	r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) |  | ||||||
| 
 |  | ||||||
| 	return st.TestReleases(r.helm, cleanup, timeout, concurrency, state.Logs(c.Logs())) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (r *Run) Lint(c LintConfigProvider) []error { |  | ||||||
| 	st := r.state | 	st := r.state | ||||||
| 	helm := r.helm | 	helm := r.helm | ||||||
| 
 | 
 | ||||||
| 	values := c.Values() |  | ||||||
| 	args := argparser.GetArgs(c.Args(), st) |  | ||||||
| 	workers := c.Concurrency() |  | ||||||
| 	opts := &state.LintOpts{ |  | ||||||
| 		Set: c.Set(), |  | ||||||
| 	} |  | ||||||
| 	return st.LintReleases(helm, values, args, workers, opts) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (run *Run) diff(triggerCleanupEvent bool, detailedExitCode bool, c DiffConfigProvider, diffOpts *state.DiffOpts) (*string, map[string]state.ReleaseSpec, map[string]state.ReleaseSpec, []error) { |  | ||||||
| 	st := run.state |  | ||||||
| 	helm := run.helm |  | ||||||
| 
 |  | ||||||
| 	var changedReleases []state.ReleaseSpec | 	var changedReleases []state.ReleaseSpec | ||||||
| 	var deletingReleases []state.ReleaseSpec | 	var deletingReleases []state.ReleaseSpec | ||||||
| 	var planningErrs []error | 	var planningErrs []error | ||||||
|  |  | ||||||
|  | @ -1 +1,3 @@ | ||||||
| mysecret: MYSECRET | mysecret: MYSECRET | ||||||
|  | raw2: | ||||||
|  |   enabled: false | ||||||
|  |  | ||||||
|  | @ -46,3 +46,11 @@ releases: | ||||||
|             path: /metadata/annotations |             path: /metadata/annotations | ||||||
|             value: |             value: | ||||||
|               foo: bar |               foo: bar | ||||||
|  | 
 | ||||||
|  |   - name: raw2 | ||||||
|  |     chart: center/incubator/raw | ||||||
|  |     version: 0.2.3 | ||||||
|  |     condition: raw2.enabled | ||||||
|  |     values: | ||||||
|  |       - mysecret: {{ .Environment.Values.mysecret }} | ||||||
|  |       - values.yaml | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue