Make purge optional when running "helmfile delete"

`helmfile delete` has been implying `--purge` but it is not the case since this change.

The new behavior is `helmfile delete --purge` to actually purge releases.
Run just `helmfile delete` to delete releases but not purge them.

Resolves #71
This commit is contained in:
Yusuke KUOKA 2018-05-11 16:37:09 +09:00
parent fb781be560
commit 3979c18ad3
7 changed files with 36 additions and 9 deletions

View File

@ -186,6 +186,12 @@ To supply the diff functionality Helmfile needs the `helm diff` plugin installed
you should be able to simply execute `helm plugin install https://github.com/databus23/helm-diff`. For more details you should be able to simply execute `helm plugin install https://github.com/databus23/helm-diff`. For more details
please look at their [documentation](https://github.com/databus23/helm-diff#helm-diff-plugin). please look at their [documentation](https://github.com/databus23/helm-diff#helm-diff-plugin).
### delete
The `helmfile delete` sub-command deletes all the releases defined in the manfiests
Note that `delete` doesn't purge releases. So `helmfile delete && helmfile sync` results in sync failed due to that releases names are not deleted but preserved for future references. If you really want to remove releases for reuse, add `--purge` flag to run it like `helmfile delete --purge`.
### secrets ### secrets
The `secrets` parameter in a `helmfile.yaml` causes the [helm-secrets](https://github.com/futuresimple/helm-secrets) plugin to be executed to decrypt the file. The `secrets` parameter in a `helmfile.yaml` causes the [helm-secrets](https://github.com/futuresimple/helm-secrets) plugin to be executed to decrypt the file.

View File

@ -79,8 +79,8 @@ func (helm *execer) DiffRelease(name, chart string, flags ...string) error {
return err return err
} }
func (helm *execer) DeleteRelease(name string) error { func (helm *execer) DeleteRelease(name string, flags ...string) error {
out, err := helm.exec("delete", "--purge", name) out, err := helm.exec(append([]string{"delete", name}, flags...)...)
helm.write(out) helm.write(out)
return err return err
} }

View File

@ -149,7 +149,16 @@ func Test_DeleteRelease(t *testing.T) {
var buffer bytes.Buffer var buffer bytes.Buffer
helm := MockExecer(&buffer, "dev") helm := MockExecer(&buffer, "dev")
helm.DeleteRelease("release") helm.DeleteRelease("release")
expected := "exec: helm delete --purge release --kube-context dev\n" expected := "exec: helm delete release --kube-context dev\n"
if buffer.String() != expected {
t.Errorf("helmexec.DeleteRelease()\nactual = %v\nexpect = %v", buffer.String(), expected)
}
}
func Test_DeleteRelease_Flags(t *testing.T) {
var buffer bytes.Buffer
helm := MockExecer(&buffer, "dev")
helm.DeleteRelease("release", "--purge")
expected := "exec: helm delete release --purge --kube-context dev\n"
if buffer.String() != expected { if buffer.String() != expected {
t.Errorf("helmexec.DeleteRelease()\nactual = %v\nexpect = %v", buffer.String(), expected) t.Errorf("helmexec.DeleteRelease()\nactual = %v\nexpect = %v", buffer.String(), expected)
} }

View File

@ -10,7 +10,7 @@ type Interface interface {
SyncRelease(name, chart string, flags ...string) error SyncRelease(name, chart string, flags ...string) error
DiffRelease(name, chart string, flags ...string) error DiffRelease(name, chart string, flags ...string) error
ReleaseStatus(name string) error ReleaseStatus(name string) error
DeleteRelease(name string) error DeleteRelease(name string, flags ...string) error
DecryptSecret(name string) (string, error) DecryptSecret(name string) (string, error)
} }

12
main.go
View File

@ -252,14 +252,22 @@ func main() {
}, },
{ {
Name: "delete", Name: "delete",
Usage: "delete charts from state file (helm delete)", Usage: "delete releases from state file (helm delete)",
Flags: []cli.Flag{
cli.BoolFlag{
Name: "purge",
Usage: "purge releases i.e. free release names and histories",
},
},
Action: func(c *cli.Context) error { Action: func(c *cli.Context) error {
state, helm, err := before(c) state, helm, err := before(c)
if err != nil { if err != nil {
return err return err
} }
errs := state.DeleteReleases(helm) purge := c.Bool("purge")
errs := state.DeleteReleases(helm, purge)
return clean(state, errs) return clean(state, errs)
}, },
}, },

View File

@ -356,14 +356,18 @@ func (state *HelmState) ReleaseStatuses(helm helmexec.Interface, workerLimit int
} }
// DeleteReleases wrapper for executing helm delete on the releases // DeleteReleases wrapper for executing helm delete on the releases
func (state *HelmState) DeleteReleases(helm helmexec.Interface) []error { func (state *HelmState) DeleteReleases(helm helmexec.Interface, purge bool) []error {
var wg sync.WaitGroup var wg sync.WaitGroup
errs := []error{} errs := []error{}
for _, release := range state.Releases { for _, release := range state.Releases {
wg.Add(1) wg.Add(1)
go func(wg *sync.WaitGroup, release ReleaseSpec) { go func(wg *sync.WaitGroup, release ReleaseSpec) {
if err := helm.DeleteRelease(release.Name); err != nil { flags := []string{}
if purge {
flags = append(flags, "--purge")
}
if err := helm.DeleteRelease(release.Name, flags...); err != nil {
errs = append(errs, err) errs = append(errs, err)
} }
wg.Done() wg.Done()

View File

@ -546,7 +546,7 @@ func (helm *mockHelmExec) ReleaseStatus(release string) error {
helm.releases = append(helm.releases, mockRelease{name: release, flags: []string{}}) helm.releases = append(helm.releases, mockRelease{name: release, flags: []string{}})
return nil return nil
} }
func (helm *mockHelmExec) DeleteRelease(name string) error { func (helm *mockHelmExec) DeleteRelease(name string, flags ...string) error {
return nil return nil
} }
func (helm *mockHelmExec) DecryptSecret(name string) (string, error) { func (helm *mockHelmExec) DecryptSecret(name string) (string, error) {