diff --git a/cmd/helm/release_testing.go b/cmd/helm/release_testing.go index 37cac6186..79522bf42 100644 --- a/cmd/helm/release_testing.go +++ b/cmd/helm/release_testing.go @@ -39,6 +39,7 @@ func newReleaseTestCmd(cfg *action.Configuration, out io.Writer) *cobra.Command client := action.NewReleaseTesting(cfg) var outfmt = output.Table var outputLogs bool + var skip []string cmd := &cobra.Command{ Use: "test [RELEASE]", @@ -53,7 +54,8 @@ func newReleaseTestCmd(cfg *action.Configuration, out io.Writer) *cobra.Command }, RunE: func(cmd *cobra.Command, args []string) error { client.Namespace = settings.Namespace() - rel, runErr := client.Run(args[0]) + filters := map[string][]string{"skip": skip} + rel, runErr := client.Run(args[0], filters) // We only return an error if we weren't even able to get the // release, otherwise we keep going so we can print status and logs // if requested @@ -80,6 +82,7 @@ func newReleaseTestCmd(cfg *action.Configuration, out io.Writer) *cobra.Command f := cmd.Flags() f.DurationVar(&client.Timeout, "timeout", 300*time.Second, "time to wait for any individual Kubernetes operation (like Jobs for hooks)") f.BoolVar(&outputLogs, "logs", false, "dump the logs from test pods (this runs after all tests are complete, but before any cleanup)") + f.StringSliceVar(&skip, "skip", []string{}, "names of tests to skip (can specify multiple or separate values with commas: test1,test2)") return cmd } diff --git a/pkg/action/release_testing.go b/pkg/action/release_testing.go index 795c3c747..2903e7fc6 100644 --- a/pkg/action/release_testing.go +++ b/pkg/action/release_testing.go @@ -46,7 +46,7 @@ func NewReleaseTesting(cfg *Configuration) *ReleaseTesting { } // Run executes 'helm test' against the given release. -func (r *ReleaseTesting) Run(name string) (*release.Release, error) { +func (r *ReleaseTesting) Run(name string, filters map[string][]string) (*release.Release, error) { if err := r.cfg.KubeClient.IsReachable(); err != nil { return nil, err } @@ -61,11 +61,26 @@ func (r *ReleaseTesting) Run(name string) (*release.Release, error) { return rel, err } + skippedHooks := []*release.Hook{} + executingHooks := []*release.Hook{} + if len(filters["skip"]) != 0 { + for _, h := range rel.Hooks { + if contains(filters["skip"], h.Name) { + skippedHooks = append(skippedHooks, h) + } else { + executingHooks = append(executingHooks, h) + } + } + rel.Hooks = executingHooks + } + if err := r.cfg.execHook(rel, release.HookTest, r.Timeout); err != nil { + rel.Hooks = append(skippedHooks, rel.Hooks...) r.cfg.Releases.Update(rel) return rel, err } + rel.Hooks = append(skippedHooks, rel.Hooks...) return rel, r.cfg.Releases.Update(rel) } @@ -98,3 +113,12 @@ func (r *ReleaseTesting) GetPodLogs(out io.Writer, rel *release.Release) error { } return nil } + +func contains(arr []string, value string) bool { + for _, item := range arr { + if item == value { + return true + } + } + return false +}