diff --git a/pkg/action/install.go b/pkg/action/install.go index 6ef754a45..4de0b64e6 100644 --- a/pkg/action/install.go +++ b/pkg/action/install.go @@ -157,7 +157,7 @@ func (i *Install) installCRDs(crds []chart.CRD) error { discoveryClient.Invalidate() // Give time for the CRD to be recognized. - if err := i.cfg.KubeClient.Wait(totalItems, 60*time.Second, false); err != nil { + if err := i.cfg.KubeClient.Wait(totalItems, 60*time.Second); err != nil { return err } @@ -346,8 +346,14 @@ func (i *Install) Run(chrt *chart.Chart, vals map[string]interface{}) (*release. } if i.Wait { - if err := i.cfg.KubeClient.Wait(resources, i.Timeout, i.WaitForJobs); err != nil { - return i.failRelease(rel, err) + if i.WaitForJobs { + if err := i.cfg.KubeClient.WaitWithJobs(resources, i.Timeout); err != nil { + return i.failRelease(rel, err) + } + } else { + if err := i.cfg.KubeClient.Wait(resources, i.Timeout); err != nil { + return i.failRelease(rel, err) + } } } diff --git a/pkg/action/rollback.go b/pkg/action/rollback.go index 5c3fabaee..f3f958f3d 100644 --- a/pkg/action/rollback.go +++ b/pkg/action/rollback.go @@ -200,11 +200,20 @@ func (r *Rollback) performRollback(currentRelease, targetRelease *release.Releas } if r.Wait { - if err := r.cfg.KubeClient.Wait(target, r.Timeout, r.WaitForJobs); err != nil { - targetRelease.SetStatus(release.StatusFailed, fmt.Sprintf("Release %q failed: %s", targetRelease.Name, err.Error())) - r.cfg.recordRelease(currentRelease) - r.cfg.recordRelease(targetRelease) - return targetRelease, errors.Wrapf(err, "release %s failed", targetRelease.Name) + if r.WaitForJobs { + 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())) + r.cfg.recordRelease(currentRelease) + r.cfg.recordRelease(targetRelease) + return targetRelease, errors.Wrapf(err, "release %s failed", targetRelease.Name) + } + } else { + if err := r.cfg.KubeClient.Wait(target, r.Timeout); err != nil { + targetRelease.SetStatus(release.StatusFailed, fmt.Sprintf("Release %q failed: %s", targetRelease.Name, err.Error())) + r.cfg.recordRelease(currentRelease) + r.cfg.recordRelease(targetRelease) + return targetRelease, errors.Wrapf(err, "release %s failed", targetRelease.Name) + } } } diff --git a/pkg/action/upgrade.go b/pkg/action/upgrade.go index db74e1ece..b0f294cae 100644 --- a/pkg/action/upgrade.go +++ b/pkg/action/upgrade.go @@ -331,9 +331,16 @@ func (u *Upgrade) performUpgrade(originalRelease, upgradedRelease *release.Relea } if u.Wait { - if err := u.cfg.KubeClient.Wait(target, u.Timeout, u.WaitForJobs); err != nil { - u.cfg.recordRelease(originalRelease) - return u.failRelease(upgradedRelease, results.Created, err) + if u.WaitForJobs { + if err := u.cfg.KubeClient.WaitWithJobs(target, u.Timeout); err != nil { + u.cfg.recordRelease(originalRelease) + return u.failRelease(upgradedRelease, results.Created, err) + } + } else { + if err := u.cfg.KubeClient.Wait(target, u.Timeout); err != nil { + u.cfg.recordRelease(originalRelease) + return u.failRelease(upgradedRelease, results.Created, err) + } } } diff --git a/pkg/kube/client.go b/pkg/kube/client.go index d1681a534..afa0cb5b3 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -127,7 +127,7 @@ func (c *Client) Create(resources ResourceList) (*Result, error) { } // Wait up to the given timeout for the specified resources to be ready -func (c *Client) Wait(resources ResourceList, timeout time.Duration, waitForJobsEnabled bool) error { +func (c *Client) Wait(resources ResourceList, timeout time.Duration) error { cs, err := c.getKubeClient() if err != nil { return err @@ -137,7 +137,21 @@ func (c *Client) Wait(resources ResourceList, timeout time.Duration, waitForJobs log: c.Log, timeout: timeout, } - return w.waitForResources(resources, waitForJobsEnabled) + return w.waitForResources(resources, false) +} + +// WaitWithJobs wait up to the given timeout for the specified resources to be ready, including jobs. +func (c *Client) WaitWithJobs(resources ResourceList, timeout time.Duration) error { + cs, err := c.getKubeClient() + if err != nil { + return err + } + w := waiter{ + c: cs, + log: c.Log, + timeout: timeout, + } + return w.waitForResources(resources, true) } func (c *Client) namespace() string { diff --git a/pkg/kube/fake/fake.go b/pkg/kube/fake/fake.go index 55b887ab3..ff800864c 100644 --- a/pkg/kube/fake/fake.go +++ b/pkg/kube/fake/fake.go @@ -51,11 +51,19 @@ func (f *FailingKubeClient) Create(resources kube.ResourceList) (*kube.Result, e } // Wait returns the configured error if set or prints -func (f *FailingKubeClient) Wait(resources kube.ResourceList, d time.Duration, waitForJobsEnabled bool) error { +func (f *FailingKubeClient) Wait(resources kube.ResourceList, d time.Duration) error { if f.WaitError != nil { return f.WaitError } - return f.PrintingKubeClient.Wait(resources, d, waitForJobsEnabled) + return f.PrintingKubeClient.Wait(resources, d) +} + +// WaitWithJobs returns the configured error if set or prints +func (f *FailingKubeClient) WaitWithJobs(resources kube.ResourceList, d time.Duration) error { + if f.WaitError != nil { + return f.WaitError + } + return f.PrintingKubeClient.Wait(resources, d) } // Delete returns the configured error if set or prints diff --git a/pkg/kube/fake/printer.go b/pkg/kube/fake/printer.go index b5f869c71..e8bd1845b 100644 --- a/pkg/kube/fake/printer.go +++ b/pkg/kube/fake/printer.go @@ -47,7 +47,12 @@ func (p *PrintingKubeClient) Create(resources kube.ResourceList) (*kube.Result, return &kube.Result{Created: resources}, nil } -func (p *PrintingKubeClient) Wait(resources kube.ResourceList, _ time.Duration, _ bool) error { +func (p *PrintingKubeClient) Wait(resources kube.ResourceList, _ time.Duration) error { + _, err := io.Copy(p.Out, bufferize(resources)) + return err +} + +func (p *PrintingKubeClient) WaitWithJobs(resources kube.ResourceList, _ time.Duration) error { _, err := io.Copy(p.Out, bufferize(resources)) return err } diff --git a/pkg/kube/interface.go b/pkg/kube/interface.go index d89abed34..545985996 100644 --- a/pkg/kube/interface.go +++ b/pkg/kube/interface.go @@ -30,7 +30,9 @@ type Interface interface { // Create creates one or more resources. Create(resources ResourceList) (*Result, error) - Wait(resources ResourceList, timeout time.Duration, waitForJobsEnabled bool) error + Wait(resources ResourceList, timeout time.Duration) error + + WaitWithJobs(resources ResourceList, timeout time.Duration) error // Delete destroys one or more resources. Delete(resources ResourceList) (*Result, []error)