pull/11788/merge
Joe Julian 8 months ago committed by GitHub
commit 1d9f6b1a08
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -39,7 +39,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 {
@ -109,6 +109,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)
})
}
}

@ -465,7 +465,9 @@ func (i *Install) performInstall(rel *release.Release, toBeAdopted kube.Resource
return rel, err return rel, err
} }
if i.Wait { waitBeforePostHooks := !i.DisableHooks && i.cfg.hasPostInstallHooks(rel) || i.cfg.hasPostUpgradeHooks(rel)
if i.Wait || waitBeforePostHooks {
if i.WaitForJobs { if i.WaitForJobs {
err = i.cfg.KubeClient.WaitWithJobs(resources, i.Timeout) err = i.cfg.KubeClient.WaitWithJobs(resources, i.Timeout)
} else { } else {

@ -223,7 +223,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