diff --git a/pkg/action/hooks.go b/pkg/action/hooks.go index 40c1ffdb6..a22712eee 100644 --- a/pkg/action/hooks.go +++ b/pkg/action/hooks.go @@ -27,10 +27,13 @@ import ( ) // execHook executes all of the hooks for the given hook event. -func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent, timeout time.Duration) error { +func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent, activeHooks []*release.Hook, timeout time.Duration) error { executingHooks := []*release.Hook{} + if activeHooks == nil { + activeHooks = rl.Hooks + } - for _, h := range rl.Hooks { + for _, h := range activeHooks { for _, e := range h.Events { if e == hook { executingHooks = append(executingHooks, h) diff --git a/pkg/action/install.go b/pkg/action/install.go index 4de0b64e6..ef1927701 100644 --- a/pkg/action/install.go +++ b/pkg/action/install.go @@ -327,7 +327,7 @@ func (i *Install) Run(chrt *chart.Chart, vals map[string]interface{}) (*release. // pre-install hooks if !i.DisableHooks { - if err := i.cfg.execHook(rel, release.HookPreInstall, i.Timeout); err != nil { + if err := i.cfg.execHook(rel, release.HookPreInstall, nil, i.Timeout); err != nil { return i.failRelease(rel, fmt.Errorf("failed pre-install: %s", err)) } } @@ -358,7 +358,7 @@ func (i *Install) Run(chrt *chart.Chart, vals map[string]interface{}) (*release. } if !i.DisableHooks { - if err := i.cfg.execHook(rel, release.HookPostInstall, i.Timeout); err != nil { + if err := i.cfg.execHook(rel, release.HookPostInstall, nil, i.Timeout); err != nil { return i.failRelease(rel, fmt.Errorf("failed post-install: %s", err)) } } diff --git a/pkg/action/release_testing.go b/pkg/action/release_testing.go index ecaeaf59f..62e4e7791 100644 --- a/pkg/action/release_testing.go +++ b/pkg/action/release_testing.go @@ -64,37 +64,21 @@ func (r *ReleaseTesting) Run(name string) (*release.Release, error) { return rel, err } - skippedHooks := []*release.Hook{} - executingHooks := []*release.Hook{} - if len(r.Filters["!name"]) != 0 { + var activeHooks []*release.Hook + if len(r.Filters["!name"]) != 0 || len(r.Filters["name"]) != 0 { + activeHooks = []*release.Hook{} for _, h := range rel.Hooks { - if contains(r.Filters["!name"], h.Name) { - skippedHooks = append(skippedHooks, h) - } else { - executingHooks = append(executingHooks, h) + if r.passesFilters(h.Name) { + activeHooks = append(activeHooks, h) } } - rel.Hooks = executingHooks - } - if len(r.Filters["name"]) != 0 { - executingHooks = nil - for _, h := range rel.Hooks { - if contains(r.Filters["name"], h.Name) { - executingHooks = append(executingHooks, h) - } else { - skippedHooks = append(skippedHooks, h) - } - } - rel.Hooks = executingHooks } - if err := r.cfg.execHook(rel, release.HookTest, r.Timeout); err != nil { - rel.Hooks = append(skippedHooks, rel.Hooks...) + if err := r.cfg.execHook(rel, release.HookTest, activeHooks, r.Timeout); err != nil { r.cfg.Releases.Update(rel) return rel, err } - rel.Hooks = append(skippedHooks, rel.Hooks...) return rel, r.cfg.Releases.Update(rel) } @@ -128,6 +112,16 @@ func (r *ReleaseTesting) GetPodLogs(out io.Writer, rel *release.Release) error { return nil } +func (r *ReleaseTesting) passesFilters(name string) bool { + if len(r.Filters["!name"]) != 0 && contains(r.Filters["!name"], name) { + return false + } else if len(r.Filters["name"]) != 0 { + return contains(r.Filters["name"], name) + } + + return true +} + func contains(arr []string, value string) bool { for _, item := range arr { if item == value { diff --git a/pkg/action/release_testing_test.go b/pkg/action/release_testing_test.go index fe50ea867..db96934e0 100644 --- a/pkg/action/release_testing_test.go +++ b/pkg/action/release_testing_test.go @@ -167,11 +167,11 @@ func TestReleaseTesting_ConflictingFilters(t *testing.T) { for _, hook := range res.Hooks { switch hook.Name { case "test-cm": - is.Empty(hook.LastRun.Phase) + is.Empty(hook.LastRun.Phase, hook.Name) case "finding-nemo": - is.Empty(hook.LastRun.Phase) + is.Empty(hook.LastRun.Phase, hook.Name) case "finding-dory": - is.Empty(hook.LastRun.Phase) + is.Empty(hook.LastRun.Phase, hook.Name) default: is.Fail("Unexpected hook: " + hook.Name) } diff --git a/pkg/action/rollback.go b/pkg/action/rollback.go index f3f958f3d..f66ef85f9 100644 --- a/pkg/action/rollback.go +++ b/pkg/action/rollback.go @@ -157,7 +157,7 @@ func (r *Rollback) performRollback(currentRelease, targetRelease *release.Releas // pre-rollback hooks if !r.DisableHooks { - if err := r.cfg.execHook(targetRelease, release.HookPreRollback, r.Timeout); err != nil { + if err := r.cfg.execHook(targetRelease, release.HookPreRollback, nil, r.Timeout); err != nil { return targetRelease, err } } else { @@ -219,7 +219,7 @@ func (r *Rollback) performRollback(currentRelease, targetRelease *release.Releas // post-rollback hooks if !r.DisableHooks { - if err := r.cfg.execHook(targetRelease, release.HookPostRollback, r.Timeout); err != nil { + if err := r.cfg.execHook(targetRelease, release.HookPostRollback, nil, r.Timeout); err != nil { return targetRelease, err } } diff --git a/pkg/action/uninstall.go b/pkg/action/uninstall.go index c466c6ee2..ba0e24e2f 100644 --- a/pkg/action/uninstall.go +++ b/pkg/action/uninstall.go @@ -97,7 +97,7 @@ func (u *Uninstall) Run(name string) (*release.UninstallReleaseResponse, error) res := &release.UninstallReleaseResponse{Release: rel} if !u.DisableHooks { - if err := u.cfg.execHook(rel, release.HookPreDelete, u.Timeout); err != nil { + if err := u.cfg.execHook(rel, release.HookPreDelete, nil, u.Timeout); err != nil { return res, err } } else { @@ -114,7 +114,7 @@ func (u *Uninstall) Run(name string) (*release.UninstallReleaseResponse, error) res.Info = kept if !u.DisableHooks { - if err := u.cfg.execHook(rel, release.HookPostDelete, u.Timeout); err != nil { + if err := u.cfg.execHook(rel, release.HookPostDelete, nil, u.Timeout); err != nil { errs = append(errs, err) } } diff --git a/pkg/action/upgrade.go b/pkg/action/upgrade.go index b0f294cae..56feb5e9b 100644 --- a/pkg/action/upgrade.go +++ b/pkg/action/upgrade.go @@ -307,7 +307,7 @@ func (u *Upgrade) performUpgrade(originalRelease, upgradedRelease *release.Relea // pre-upgrade hooks if !u.DisableHooks { - if err := u.cfg.execHook(upgradedRelease, release.HookPreUpgrade, u.Timeout); err != nil { + if err := u.cfg.execHook(upgradedRelease, release.HookPreUpgrade, nil, u.Timeout); err != nil { return u.failRelease(upgradedRelease, kube.ResourceList{}, fmt.Errorf("pre-upgrade hooks failed: %s", err)) } } else { @@ -346,7 +346,7 @@ func (u *Upgrade) performUpgrade(originalRelease, upgradedRelease *release.Relea // post-upgrade hooks if !u.DisableHooks { - if err := u.cfg.execHook(upgradedRelease, release.HookPostUpgrade, u.Timeout); err != nil { + if err := u.cfg.execHook(upgradedRelease, release.HookPostUpgrade, nil, u.Timeout); err != nil { return u.failRelease(upgradedRelease, results.Created, fmt.Errorf("post-upgrade hooks failed: %s", err)) } }