Retain hooks when a filtered helm test is interrupted

Signed-off-by: Lucas Heinlen <lheinlen@onecause.com>
pull/9400/head
Lucas Heinlen 5 years ago
parent 5f5549abaa
commit 129f04cf07
No known key found for this signature in database
GPG Key ID: 590AD23D7FBDFF2F

@ -27,10 +27,13 @@ import (
) )
// execHook executes all of the hooks for the given hook event. // 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{} executingHooks := []*release.Hook{}
if activeHooks == nil {
activeHooks = rl.Hooks
}
for _, h := range rl.Hooks { for _, h := range activeHooks {
for _, e := range h.Events { for _, e := range h.Events {
if e == hook { if e == hook {
executingHooks = append(executingHooks, h) executingHooks = append(executingHooks, h)

@ -327,7 +327,7 @@ func (i *Install) Run(chrt *chart.Chart, vals map[string]interface{}) (*release.
// pre-install hooks // pre-install hooks
if !i.DisableHooks { 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)) 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 !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)) return i.failRelease(rel, fmt.Errorf("failed post-install: %s", err))
} }
} }

@ -64,37 +64,21 @@ func (r *ReleaseTesting) Run(name string) (*release.Release, error) {
return rel, err return rel, err
} }
skippedHooks := []*release.Hook{} var activeHooks []*release.Hook
executingHooks := []*release.Hook{} if len(r.Filters["!name"]) != 0 || len(r.Filters["name"]) != 0 {
if len(r.Filters["!name"]) != 0 { activeHooks = []*release.Hook{}
for _, h := range rel.Hooks { for _, h := range rel.Hooks {
if contains(r.Filters["!name"], h.Name) { if r.passesFilters(h.Name) {
skippedHooks = append(skippedHooks, h) activeHooks = append(activeHooks, h)
} else {
executingHooks = append(executingHooks, 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 { if err := r.cfg.execHook(rel, release.HookTest, activeHooks, r.Timeout); err != nil {
rel.Hooks = append(skippedHooks, rel.Hooks...)
r.cfg.Releases.Update(rel) r.cfg.Releases.Update(rel)
return rel, err return rel, err
} }
rel.Hooks = append(skippedHooks, rel.Hooks...)
return rel, r.cfg.Releases.Update(rel) return rel, r.cfg.Releases.Update(rel)
} }
@ -128,6 +112,16 @@ func (r *ReleaseTesting) GetPodLogs(out io.Writer, rel *release.Release) error {
return nil 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 { func contains(arr []string, value string) bool {
for _, item := range arr { for _, item := range arr {
if item == value { if item == value {

@ -167,11 +167,11 @@ func TestReleaseTesting_ConflictingFilters(t *testing.T) {
for _, hook := range res.Hooks { for _, hook := range res.Hooks {
switch hook.Name { switch hook.Name {
case "test-cm": case "test-cm":
is.Empty(hook.LastRun.Phase) is.Empty(hook.LastRun.Phase, hook.Name)
case "finding-nemo": case "finding-nemo":
is.Empty(hook.LastRun.Phase) is.Empty(hook.LastRun.Phase, hook.Name)
case "finding-dory": case "finding-dory":
is.Empty(hook.LastRun.Phase) is.Empty(hook.LastRun.Phase, hook.Name)
default: default:
is.Fail("Unexpected hook: " + hook.Name) is.Fail("Unexpected hook: " + hook.Name)
} }

@ -157,7 +157,7 @@ func (r *Rollback) performRollback(currentRelease, targetRelease *release.Releas
// pre-rollback hooks // pre-rollback hooks
if !r.DisableHooks { 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 return targetRelease, err
} }
} else { } else {
@ -219,7 +219,7 @@ func (r *Rollback) performRollback(currentRelease, targetRelease *release.Releas
// post-rollback hooks // post-rollback hooks
if !r.DisableHooks { 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 return targetRelease, err
} }
} }

@ -97,7 +97,7 @@ func (u *Uninstall) Run(name string) (*release.UninstallReleaseResponse, error)
res := &release.UninstallReleaseResponse{Release: rel} res := &release.UninstallReleaseResponse{Release: rel}
if !u.DisableHooks { 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 return res, err
} }
} else { } else {
@ -114,7 +114,7 @@ func (u *Uninstall) Run(name string) (*release.UninstallReleaseResponse, error)
res.Info = kept res.Info = kept
if !u.DisableHooks { 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) errs = append(errs, err)
} }
} }

@ -307,7 +307,7 @@ func (u *Upgrade) performUpgrade(originalRelease, upgradedRelease *release.Relea
// pre-upgrade hooks // pre-upgrade hooks
if !u.DisableHooks { 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)) return u.failRelease(upgradedRelease, kube.ResourceList{}, fmt.Errorf("pre-upgrade hooks failed: %s", err))
} }
} else { } else {
@ -346,7 +346,7 @@ func (u *Upgrade) performUpgrade(originalRelease, upgradedRelease *release.Relea
// post-upgrade hooks // post-upgrade hooks
if !u.DisableHooks { 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)) return u.failRelease(upgradedRelease, results.Created, fmt.Errorf("post-upgrade hooks failed: %s", err))
} }
} }

Loading…
Cancel
Save