feat: Allow Helm test to skip one or more tests

Signed-off-by: Chris Wells <chriswells0@users.noreply.github.com>
pull/8485/head
Chris Wells 5 years ago
parent 241785c70f
commit 2d3ec27a95

@ -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
}

@ -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
}

Loading…
Cancel
Save