diff --git a/pkg/action/hooks.go b/pkg/action/hooks.go index 9a5c6a69b..6a8e2d1d3 100644 --- a/pkg/action/hooks.go +++ b/pkg/action/hooks.go @@ -25,7 +25,6 @@ import ( "github.com/pkg/errors" v1 "k8s.io/api/core/v1" - "k8s.io/client-go/kubernetes" "helm.sh/helm/v3/pkg/release" helmtime "helm.sh/helm/v3/pkg/time" @@ -90,11 +89,7 @@ func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent, h.LastRun.CompletedAt = helmtime.Now() if isTestHook(h) { - client, err := cfg.KubernetesClientSet() // "Why create a new client for each hook?" Because `cfg.RESTClientGetter` can be `nil` before the `for` loop, as detected by the `TestInstall/basic_install` and `TestInstallRelease` tests. - if err != nil { - return errors.Wrapf(err, "unable to create Kubernetes client set to fetch pod logs") - } - hookLog, err := getHookLog(client, rl, h) + hookLog, err := getHookLog(cfg, rl, h) if err != nil { return err } @@ -126,10 +121,14 @@ func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent, } // getHookLog gets the log from the pod associated with the given hook, which is expected to be a test hook. -func getHookLog(client kubernetes.Interface, rel *release.Release, hook *release.Hook) (release.HookLog, error) { +func getHookLog(cfg *Configuration, rel *release.Release, hook *release.Hook) (release.HookLog, error) { + var nothing release.HookLog + client, err := cfg.KubernetesClientSet() + if err != nil { + return nothing, errors.Wrapf(err, "unable to create Kubernetes client set to fetch pod logs") + } req := client.CoreV1().Pods(rel.Namespace).GetLogs(hook.Name, &v1.PodLogOptions{}) responseBody, err := req.Stream(context.Background()) - var nothing release.HookLog if err != nil { return nothing, errors.Wrapf(err, "unable to get pod logs for %s", hook.Name) } diff --git a/pkg/action/release_testing.go b/pkg/action/release_testing.go index 5ae909bd3..849b69dab 100644 --- a/pkg/action/release_testing.go +++ b/pkg/action/release_testing.go @@ -100,14 +100,9 @@ func (r *ReleaseTesting) Run(name string) (*release.Release, error) { // the given writer. These can be immediately output to the user or captured for // other uses func (r *ReleaseTesting) GetPodLogs(out io.Writer, rel *release.Release) error { - client, err := r.cfg.KubernetesClientSet() - if err != nil { - return errors.Wrap(err, "unable to get kubernetes client to fetch pod logs") - } - for _, h := range rel.Hooks { if isTestHook(h) { - hookLog, err := getHookLog(client, rel, h) + hookLog, err := getHookLog(r.cfg, rel, h) if err != nil { return err }