diff --git a/main.go b/main.go index 268d036c..1096cdb7 100644 --- a/main.go +++ b/main.go @@ -322,6 +322,11 @@ func main() { Name: "delete", Usage: "DEPRECATED: delete releases from state file (helm delete)", Flags: []cli.Flag{ + cli.IntFlag{ + Name: "concurrency", + Value: 0, + Usage: "maximum number of concurrent helm processes to run, 0 is unlimited", + }, cli.StringFlag{ Name: "args", Value: "", @@ -340,6 +345,11 @@ func main() { Name: "destroy", Usage: "deletes and then purges releases", Flags: []cli.Flag{ + cli.IntFlag{ + Name: "concurrency", + Value: 0, + Usage: "maximum number of concurrent helm processes to run, 0 is unlimited", + }, cli.StringFlag{ Name: "args", Value: "", diff --git a/pkg/app/config.go b/pkg/app/config.go index c0fa96db..654b6428 100644 --- a/pkg/app/config.go +++ b/pkg/app/config.go @@ -75,6 +75,7 @@ type DeleteConfigProvider interface { interactive loggingConfig + concurrencyConfig } type DestroyConfigProvider interface { @@ -82,6 +83,7 @@ type DestroyConfigProvider interface { interactive loggingConfig + concurrencyConfig } type TestConfigProvider interface { diff --git a/pkg/app/run.go b/pkg/app/run.go index 5e95bf07..dc2f8058 100644 --- a/pkg/app/run.go +++ b/pkg/app/run.go @@ -83,7 +83,7 @@ Do you really want to delete? if !interactive || interactive && r.askForConfirmation(msg) { r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) - errs = r.state.DeleteReleases(&affectedReleases, r.helm, purge) + errs = r.state.DeleteReleases(&affectedReleases, r.helm, c.Concurrency(), purge) } affectedReleases.DisplayAffectedReleases(c.Logger()) return errs @@ -109,7 +109,7 @@ Do you really want to delete? if !interactive || interactive && r.askForConfirmation(msg) { r.helm.SetExtraArgs(argparser.GetArgs(c.Args(), r.state)...) - errs = r.state.DeleteReleases(&affectedReleases, r.helm, true) + errs = r.state.DeleteReleases(&affectedReleases, r.helm, c.Concurrency(), true) } affectedReleases.DisplayAffectedReleases(c.Logger()) return errs diff --git a/pkg/state/state.go b/pkg/state/state.go index 913cc007..337f6e53 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -845,8 +845,8 @@ func (st *HelmState) ReleaseStatuses(helm helmexec.Interface, workerLimit int) [ } // DeleteReleases wrapper for executing helm delete on the releases -func (st *HelmState) DeleteReleases(affectedReleases *AffectedReleases, helm helmexec.Interface, purge bool) []error { - return st.scatterGatherReleases(helm, len(st.Releases), func(release ReleaseSpec, workerIndex int) error { +func (st *HelmState) DeleteReleases(affectedReleases *AffectedReleases, helm helmexec.Interface, concurrency int, purge bool) []error { + return st.scatterGatherReleases(helm, concurrency, func(release ReleaseSpec, workerIndex int) error { if !release.Desired() { return nil } diff --git a/pkg/state/state_test.go b/pkg/state/state_test.go index a8ced524..8c039c73 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -2073,7 +2073,7 @@ func TestHelmState_Delete(t *testing.T) { helm.lists[listKey{filter: "^" + name + "$", flags: tt.flags}] = name } affectedReleases := AffectedReleases{} - errs := state.DeleteReleases(&affectedReleases, helm, tt.purge) + errs := state.DeleteReleases(&affectedReleases, helm, 1, tt.purge) if errs != nil { if !tt.wantErr || len(affectedReleases.Failed) != 1 || affectedReleases.Failed[0].Name != release.Name { t.Errorf("DeleteReleases() for %s error = %v, wantErr %v", tt.name, errs, tt.wantErr)