wait for release before post hooks

If a release has post-install, post-delete, or post-rollback hooks,
always wait for the main resources before doing the post - otherwise
it's not really "post".

Signed-off-by: Joe Julian <me@joejulian.name>
pull/11788/head
Joe Julian 3 years ago
parent eb4edc96c5
commit 2378275ccc

@ -38,7 +38,7 @@ func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent,
} }
} }
// hooke are pre-ordered by kind, so keep order stable // hooks are pre-ordered by kind, so keep order stable
sort.Stable(hookByWeight(executingHooks)) sort.Stable(hookByWeight(executingHooks))
for _, h := range executingHooks { for _, h := range executingHooks {
@ -107,6 +107,39 @@ func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent,
return nil return nil
} }
func (cfg *Configuration) hasPostInstallHooks(rl *release.Release) bool {
for _, h := range rl.Hooks {
for _, e := range h.Events {
if e == release.HookPostInstall {
return true
}
}
}
return false
}
func (cfg *Configuration) hasPostUpgradeHooks(rl *release.Release) bool {
for _, h := range rl.Hooks {
for _, e := range h.Events {
if e == release.HookPostUpgrade {
return true
}
}
}
return false
}
func (cfg *Configuration) hasPostRollbackHooks(rl *release.Release) bool {
for _, h := range rl.Hooks {
for _, e := range h.Events {
if e == release.HookPostRollback {
return true
}
}
}
return false
}
// hookByWeight is a sorter for hooks // hookByWeight is a sorter for hooks
type hookByWeight []*release.Hook type hookByWeight []*release.Hook

@ -0,0 +1,133 @@
/*
Copyright The Helm Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package action
import (
"testing"
"github.com/stretchr/testify/assert"
"helm.sh/helm/v4/pkg/release"
)
func TestConfiguration_hasPostInstallHooks(t *testing.T) {
type args struct {
rl *release.Release
}
tests := []struct {
name string
args args
want bool
}{
{name: "return true when chart has post-install hooks",
args: args{rl: &release.Release{
Hooks: []*release.Hook{{Events: []release.HookEvent{release.HookPostInstall}}},
},
},
want: true,
},
{name: "return false when chart does not have post-install hooks",
args: args{rl: &release.Release{
Hooks: []*release.Hook{{Events: []release.HookEvent{release.HookPreDelete}}},
}},
want: false,
},
{name: "return false when chart does not have any hooks",
args: args{rl: &release.Release{
Hooks: []*release.Hook{{Events: []release.HookEvent{}}},
}},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cfg := &Configuration{}
assert.Equalf(t, tt.want, cfg.hasPostInstallHooks(tt.args.rl), "hasPostInstallHooks(%v)", tt.args.rl)
})
}
}
func TestConfiguration_hasPostUpgradeHooks(t *testing.T) {
type args struct {
rl *release.Release
}
tests := []struct {
name string
args args
want bool
}{
{name: "return true when chart has post-upgrade hooks",
args: args{rl: &release.Release{
Hooks: []*release.Hook{{Events: []release.HookEvent{release.HookPostUpgrade}}},
},
},
want: true,
},
{name: "return false when chart does not have post-upgrade hooks",
args: args{rl: &release.Release{
Hooks: []*release.Hook{{Events: []release.HookEvent{release.HookPreDelete}}},
}},
want: false,
},
{name: "return false when chart does not have any hooks",
args: args{rl: &release.Release{
Hooks: []*release.Hook{{Events: []release.HookEvent{}}},
}},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cfg := &Configuration{}
assert.Equalf(t, tt.want, cfg.hasPostUpgradeHooks(tt.args.rl), "hasPostUpgradeHooks(%v)", tt.args.rl)
})
}
}
func TestConfiguration_hasPostRollbackHooks(t *testing.T) {
type args struct {
rl *release.Release
}
tests := []struct {
name string
args args
want bool
}{
{name: "return true when chart has post-rollback hooks",
args: args{rl: &release.Release{
Hooks: []*release.Hook{{Events: []release.HookEvent{release.HookPostRollback}}},
},
},
want: true,
},
{name: "return false when chart does not have post-rollback hooks",
args: args{rl: &release.Release{
Hooks: []*release.Hook{{Events: []release.HookEvent{release.HookPreDelete}}},
}},
want: false,
},
{name: "return false when chart does not have any hooks",
args: args{rl: &release.Release{
Hooks: []*release.Hook{{Events: []release.HookEvent{}}},
}},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
cfg := &Configuration{}
assert.Equalf(t, tt.want, cfg.hasPostRollbackHooks(tt.args.rl), "hasPostRollbackHooks(%v)", tt.args.rl)
})
}
}

@ -432,7 +432,9 @@ func (i *Install) performInstall(c chan<- resultMessage, rel *release.Release, t
} }
} }
if i.Wait { waitBeforePostHooks := !i.DisableHooks && i.cfg.hasPostInstallHooks(rel) || i.cfg.hasPostUpgradeHooks(rel)
if i.Wait || waitBeforePostHooks {
if i.WaitForJobs { if i.WaitForJobs {
if err := i.cfg.KubeClient.WaitWithJobs(resources, i.Timeout); err != nil { if err := i.cfg.KubeClient.WaitWithJobs(resources, i.Timeout); err != nil {
i.reportToRun(c, rel, err) i.reportToRun(c, rel, err)

@ -222,7 +222,9 @@ func (r *Rollback) performRollback(currentRelease, targetRelease *release.Releas
} }
} }
if r.Wait { waitBeforePostHooks := !r.DisableHooks && r.cfg.hasPostRollbackHooks(targetRelease)
if r.Wait || waitBeforePostHooks {
if r.WaitForJobs { if r.WaitForJobs {
if err := r.cfg.KubeClient.WaitWithJobs(target, r.Timeout); err != nil { if err := r.cfg.KubeClient.WaitWithJobs(target, r.Timeout); err != nil {
targetRelease.SetStatus(release.StatusFailed, fmt.Sprintf("Release %q failed: %s", targetRelease.Name, err.Error())) targetRelease.SetStatus(release.StatusFailed, fmt.Sprintf("Release %q failed: %s", targetRelease.Name, err.Error()))

Loading…
Cancel
Save