feat(helm): add support for a `pre-ready` hook

Adds a new `pre-ready` hook type that runs after resources have been
created or updated, but before they're necessarily in a ready state.

This allows for charts that provision a resources using a subchart,
use a hook to configure those resources (for example, migrating a
database), and require that subchart resources be configured before
the pods in their chart are in a ready state. Using the `--wait`
flag with Helm will currently fail with these charts, making them
incompatible with the chart-testing tool.

Fixes #7740, fixes helm/chart-testing#202

Signed-off-by: Noah Lackstein <noah@lackstein.com>
pull/8676/head
Noah Lackstein 5 years ago
parent 4f7b9fcb67
commit f0dc89c83b
No known key found for this signature in database
GPG Key ID: 9F4EB89DAB7F61D7

@ -344,6 +344,12 @@ func (i *Install) Run(chrt *chart.Chart, vals map[string]interface{}) (*release.
} }
} }
if !i.DisableHooks {
if err := i.cfg.execHook(rel, release.HookPreReady, i.Timeout); err != nil {
return i.failRelease(rel, fmt.Errorf("failed pre-ready: %s", err))
}
}
if i.Wait { if i.Wait {
if err := i.cfg.KubeClient.Wait(resources, i.Timeout); err != nil { if err := i.cfg.KubeClient.Wait(resources, i.Timeout); err != nil {
return i.failRelease(rel, err) return i.failRelease(rel, err)

@ -33,6 +33,7 @@ const (
HookPostUpgrade HookEvent = "post-upgrade" HookPostUpgrade HookEvent = "post-upgrade"
HookPreRollback HookEvent = "pre-rollback" HookPreRollback HookEvent = "pre-rollback"
HookPostRollback HookEvent = "post-rollback" HookPostRollback HookEvent = "post-rollback"
HookPreReady HookEvent = "pre-ready"
HookTest HookEvent = "test" HookTest HookEvent = "test"
) )

@ -61,6 +61,7 @@ var events = map[string]release.HookEvent{
release.HookPostUpgrade.String(): release.HookPostUpgrade, release.HookPostUpgrade.String(): release.HookPostUpgrade,
release.HookPreRollback.String(): release.HookPreRollback, release.HookPreRollback.String(): release.HookPreRollback,
release.HookPostRollback.String(): release.HookPostRollback, release.HookPostRollback.String(): release.HookPostRollback,
release.HookPreReady.String(): release.HookPreReady,
release.HookTest.String(): release.HookTest, release.HookTest.String(): release.HookTest,
// Support test-success for backward compatibility with Helm 2 tests // Support test-success for backward compatibility with Helm 2 tests
"test-success": release.HookTest, "test-success": release.HookTest,

@ -62,7 +62,8 @@ metadata:
annotations: annotations:
"helm.sh/hook": post-install "helm.sh/hook": post-install
`, `,
}, { },
{
name: []string{"third"}, name: []string{"third"},
path: "three", path: "three",
kind: []string{"ReplicaSet"}, kind: []string{"ReplicaSet"},
@ -74,7 +75,8 @@ metadata:
annotations: annotations:
"helm.sh/hook": no-such-hook "helm.sh/hook": no-such-hook
`, `,
}, { },
{
name: []string{"fourth"}, name: []string{"fourth"},
path: "four", path: "four",
kind: []string{"Pod"}, kind: []string{"Pod"},
@ -85,7 +87,8 @@ metadata:
name: fourth name: fourth
annotations: annotations:
nothing: here`, nothing: here`,
}, { },
{
name: []string{"fifth"}, name: []string{"fifth"},
path: "five", path: "five",
kind: []string{"ReplicaSet"}, kind: []string{"ReplicaSet"},
@ -97,14 +100,16 @@ metadata:
annotations: annotations:
"helm.sh/hook": post-delete, post-install "helm.sh/hook": post-delete, post-install
`, `,
}, { },
{
// Regression test: files with an underscore in the base name should be skipped. // Regression test: files with an underscore in the base name should be skipped.
name: []string{"sixth"}, name: []string{"sixth"},
path: "six/_six", path: "six/_six",
kind: []string{"ReplicaSet"}, kind: []string{"ReplicaSet"},
hooks: map[string][]release.HookEvent{"sixth": nil}, hooks: map[string][]release.HookEvent{"sixth": nil},
manifest: `invalid manifest`, // This will fail if partial is not skipped. manifest: `invalid manifest`, // This will fail if partial is not skipped.
}, { },
{
// Regression test: files with no content should be skipped. // Regression test: files with no content should be skipped.
name: []string{"seventh"}, name: []string{"seventh"},
path: "seven", path: "seven",
@ -130,6 +135,19 @@ metadata:
name: example-test name: example-test
annotations: annotations:
"helm.sh/hook": test "helm.sh/hook": test
`,
},
{
name: []string{"ninth"},
path: "nine",
kind: []string{"ReplicaSet"},
hooks: map[string][]release.HookEvent{"ninth": {release.HookPreReady}},
manifest: `kind: ReplicaSet
apiVersion: v1beta1
metadata:
name: ninth
annotations:
"helm.sh/hook": pre-ready
`, `,
}, },
} }
@ -149,8 +167,8 @@ metadata:
t.Errorf("Expected 2 generic manifests, got %d", len(generic)) t.Errorf("Expected 2 generic manifests, got %d", len(generic))
} }
if len(hs) != 4 { if len(hs) != 5 {
t.Errorf("Expected 4 hooks, got %d", len(hs)) t.Errorf("Expected 5 hooks, got %d", len(hs))
} }
for _, out := range hs { for _, out := range hs {

Loading…
Cancel
Save