summaryrefslogtreecommitdiffstats
path: root/client/go/internal/cli/cmd/waiter.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/go/internal/cli/cmd/waiter.go')
-rw-r--r--client/go/internal/cli/cmd/waiter.go31
1 files changed, 27 insertions, 4 deletions
diff --git a/client/go/internal/cli/cmd/waiter.go b/client/go/internal/cli/cmd/waiter.go
index d818359e61c..8a25e18cd1e 100644
--- a/client/go/internal/cli/cmd/waiter.go
+++ b/client/go/internal/cli/cmd/waiter.go
@@ -2,10 +2,12 @@
package cmd
import (
+ "errors"
"fmt"
"time"
"github.com/fatih/color"
+ "github.com/spf13/cobra"
"github.com/vespa-engine/vespa/client/go/internal/vespa"
)
@@ -15,6 +17,7 @@ type Waiter struct {
Timeout time.Duration // TODO(mpolden): Consider making this a budget
cli *CLI
+ cmd *cobra.Command
}
// DeployService returns the service providing the deploy API on given target,
@@ -81,10 +84,30 @@ func (w *Waiter) services(target vespa.Target) ([]*vespa.Service, error) {
return target.ContainerServices(w.Timeout)
}
+// FastWaitOn returns whether we should use a short default timeout for given target.
+func (w *Waiter) FastWaitOn(target vespa.Target) bool {
+ return target.IsCloud() && w.Timeout == 0 && !w.cmd.PersistentFlags().Changed("wait")
+}
+
// Deployment waits for a deployment to become ready, returning the ID of the converged deployment.
-func (w *Waiter) Deployment(target vespa.Target, id int64) (int64, error) {
- if w.Timeout > 0 {
- w.cli.printInfo("Waiting up to ", color.CyanString(w.Timeout.String()), " for deployment to converge...")
+func (w *Waiter) Deployment(target vespa.Target, wantedID int64) (int64, error) {
+ timeout := w.Timeout
+ fastWait := w.FastWaitOn(target)
+ if timeout > 0 {
+ w.cli.printInfo("Waiting up to ", color.CyanString(timeout.String()), " for deployment to converge...")
+ } else if fastWait {
+ // If --wait is not explicitly given, we always wait a few seconds in Cloud to catch fast failures, e.g.
+ // invalid application package
+ timeout = 2 * time.Second
+ }
+ id, err := target.AwaitDeployment(wantedID, timeout)
+ if errors.Is(err, vespa.ErrWaitTimeout) {
+ if fastWait {
+ return id, nil // Do not report fast wait timeout as an error
+ }
+ if target.IsCloud() {
+ w.cli.printInfo("Timed out waiting for deployment to converge. See ", color.CyanString(target.Deployment().System.ConsoleRunURL(target.Deployment(), wantedID)), " for more details")
+ }
}
- return target.AwaitDeployment(id, w.Timeout)
+ return id, err
}