On hook failure, the cleanup mechanism should also run on all previous hooks

Signed-off-by: prafull01 <prafull.ladha@trilio.io>
pull/10811/head
prafull01 4 years ago
parent ee3f270e1e
commit 8359e001a5

@ -41,7 +41,7 @@ func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent,
// hooke are pre-ordered by kind, so keep order stable // hooke are pre-ordered by kind, so keep order stable
sort.Stable(hookByWeight(executingHooks)) sort.Stable(hookByWeight(executingHooks))
for _, h := range executingHooks { for i, h := range executingHooks {
// Set default delete policy to before-hook-creation // Set default delete policy to before-hook-creation
if h.DeletePolicies == nil || len(h.DeletePolicies) == 0 { if h.DeletePolicies == nil || len(h.DeletePolicies) == 0 {
// TODO(jlegrone): Only apply before-hook-creation delete policy to run to completion // TODO(jlegrone): Only apply before-hook-creation delete policy to run to completion
@ -91,6 +91,12 @@ func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent,
if err := cfg.deleteHookByPolicy(h, release.HookFailed); err != nil { if err := cfg.deleteHookByPolicy(h, release.HookFailed); err != nil {
return err return err
} }
// If a hook is failed, check the annotation of the previous successful hooks to determine whether the hook
// should be deleted under succeeded condition.
if err := cfg.deleteHooksByPolicy(executingHooks[0:i], release.HookSucceeded); err != nil {
return err
}
return err return err
} }
h.LastRun.Phase = release.HookPhaseSucceeded h.LastRun.Phase = release.HookPhaseSucceeded
@ -98,10 +104,8 @@ func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent,
// If all hooks are successful, check the annotation of each hook to determine whether the hook should be deleted // If all hooks are successful, check the annotation of each hook to determine whether the hook should be deleted
// under succeeded condition. If so, then clear the corresponding resource object in each hook // under succeeded condition. If so, then clear the corresponding resource object in each hook
for _, h := range executingHooks { if err := cfg.deleteHooksByPolicy(executingHooks, release.HookSucceeded); err != nil {
if err := cfg.deleteHookByPolicy(h, release.HookSucceeded); err != nil { return err
return err
}
} }
return nil return nil
@ -119,6 +123,17 @@ func (x hookByWeight) Less(i, j int) bool {
return x[i].Weight < x[j].Weight return x[i].Weight < x[j].Weight
} }
// deleteHooksByPolicy deletes all hooks if the hook policy instructs it to
func (cfg *Configuration) deleteHooksByPolicy(hooks []*release.Hook, policy release.HookDeletePolicy) error {
for _, h := range hooks {
if err := cfg.deleteHookByPolicy(h, policy); err != nil {
return err
}
}
return nil
}
// deleteHookByPolicy deletes a hook if the hook policy instructs it to // deleteHookByPolicy deletes a hook if the hook policy instructs it to
func (cfg *Configuration) deleteHookByPolicy(h *release.Hook, policy release.HookDeletePolicy) error { func (cfg *Configuration) deleteHookByPolicy(h *release.Hook, policy release.HookDeletePolicy) error {
// Never delete CustomResourceDefinitions; this could cause lots of // Never delete CustomResourceDefinitions; this could cause lots of

Loading…
Cancel
Save