Port the fix for `needs` to `helmfile delete` and `destroy`
This ports the fix for `helfmile apply` to `delete` and `destroy`, so that specifying `--selector` does not break those commands anymore. Ref #919
This commit is contained in:
parent
f41fe86452
commit
4751613f39
|
|
@ -158,15 +158,15 @@ func (a *App) Status(c StatusesConfigProvider) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) Delete(c DeleteConfigProvider) error {
|
func (a *App) Delete(c DeleteConfigProvider) error {
|
||||||
return a.reverse().ForEachStateFiltered(func(run *Run) []error {
|
return a.reverse().ForEachState(func(run *Run) (bool, []error) {
|
||||||
return run.Delete(c)
|
return a.delete(run, c.Purge(), c)
|
||||||
}, true)
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) Destroy(c DestroyConfigProvider) error {
|
func (a *App) Destroy(c DestroyConfigProvider) error {
|
||||||
return a.reverse().ForEachStateFiltered(func(run *Run) []error {
|
return a.reverse().ForEachState(func(run *Run) (bool, []error) {
|
||||||
return run.Destroy(c)
|
return a.delete(run, true, c)
|
||||||
}, true)
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) Test(c TestConfigProvider) error {
|
func (a *App) Test(c TestConfigProvider) error {
|
||||||
|
|
@ -460,7 +460,7 @@ func withDAG(templated *state.HelmState, helm helmexec.Interface, logger *zap.Su
|
||||||
|
|
||||||
logger.Debugf("processing %d groups of releases in this order:\n%s", numBatches, printBatches(batches))
|
logger.Debugf("processing %d groups of releases in this order:\n%s", numBatches, printBatches(batches))
|
||||||
|
|
||||||
all := true
|
any := false
|
||||||
|
|
||||||
for i, batch := range batches {
|
for i, batch := range batches {
|
||||||
var targets []state.ReleaseSpec
|
var targets []state.ReleaseSpec
|
||||||
|
|
@ -485,10 +485,10 @@ func withDAG(templated *state.HelmState, helm helmexec.Interface, logger *zap.Su
|
||||||
return false, errs
|
return false, errs
|
||||||
}
|
}
|
||||||
|
|
||||||
all = all && processed
|
any = any || processed
|
||||||
}
|
}
|
||||||
|
|
||||||
return all, nil
|
return any, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type Opts struct {
|
type Opts struct {
|
||||||
|
|
@ -835,6 +835,78 @@ Do you really want to apply?
|
||||||
return true, syncErrs
|
return true, syncErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *App) delete(r *Run, purge bool, c DestroyConfigProvider) (bool, []error) {
|
||||||
|
st := r.state
|
||||||
|
helm := r.helm
|
||||||
|
|
||||||
|
affectedReleases := state.AffectedReleases{}
|
||||||
|
|
||||||
|
var deletingReleases []state.ReleaseSpec
|
||||||
|
|
||||||
|
if len(st.Selectors) > 0 {
|
||||||
|
var err error
|
||||||
|
deletingReleases, err = st.GetFilteredReleases()
|
||||||
|
if err != nil {
|
||||||
|
return false, []error{err}
|
||||||
|
}
|
||||||
|
if len(deletingReleases) == 0 {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
deletingReleases = st.Releases
|
||||||
|
}
|
||||||
|
|
||||||
|
releasesToBeDeleted := map[string]state.ReleaseSpec{}
|
||||||
|
for _, r := range deletingReleases {
|
||||||
|
id := state.ReleaseToID(&r)
|
||||||
|
releasesToBeDeleted[id] = r
|
||||||
|
}
|
||||||
|
|
||||||
|
names := make([]string, len(deletingReleases))
|
||||||
|
for i, r := range deletingReleases {
|
||||||
|
names[i] = fmt.Sprintf(" %s (%s)", r.Name, r.Chart)
|
||||||
|
}
|
||||||
|
|
||||||
|
var errs []error
|
||||||
|
var any bool
|
||||||
|
|
||||||
|
msg := fmt.Sprintf(`Affected releases are:
|
||||||
|
%s
|
||||||
|
|
||||||
|
Do you really want to delete?
|
||||||
|
Helmfile will delete all your releases, as shown above.
|
||||||
|
|
||||||
|
`, strings.Join(names, "\n"))
|
||||||
|
interactive := c.Interactive()
|
||||||
|
if !interactive || interactive && r.askForConfirmation(msg) {
|
||||||
|
r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...)
|
||||||
|
|
||||||
|
if len(releasesToBeDeleted) > 0 {
|
||||||
|
deleted, deletionErrs := withDAG(st, helm, a.Logger, true, a.Wrap(func(subst *state.HelmState, helm helmexec.Interface) []error {
|
||||||
|
var rs []state.ReleaseSpec
|
||||||
|
|
||||||
|
for _, r := range subst.Releases {
|
||||||
|
if _, ok := releasesToBeDeleted[state.ReleaseToID(&r)]; ok {
|
||||||
|
rs = append(rs, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subst.Releases = rs
|
||||||
|
|
||||||
|
return subst.DeleteReleases(&affectedReleases, helm, c.Concurrency(), purge)
|
||||||
|
}))
|
||||||
|
|
||||||
|
any = any || deleted
|
||||||
|
|
||||||
|
if deletionErrs != nil && len(deletionErrs) > 0 {
|
||||||
|
errs = append(errs, deletionErrs...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
affectedReleases.DisplayAffectedReleases(c.Logger())
|
||||||
|
return any, errs
|
||||||
|
}
|
||||||
|
|
||||||
func fileExistsAt(path string) bool {
|
func fileExistsAt(path string) bool {
|
||||||
fileInfo, err := os.Stat(path)
|
fileInfo, err := os.Stat(path)
|
||||||
return err == nil && fileInfo.Mode().IsRegular()
|
return err == nil && fileInfo.Mode().IsRegular()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue