in integration_test/gce-testing-internal/gce/gce_testing.go [1864:1899]
func StartInstance(ctx context.Context, logger *log.Logger, vm *VM) error {
ctx, cancel := context.WithTimeout(ctx, 20*time.Minute)
defer cancel()
var output CommandOutput
tryStart := func() error {
var err error
output, err = RunGcloud(ctx, logger, "",
[]string{
"compute", "instances", "start",
"--project=" + vm.Project,
"--zone=" + vm.Zone,
vm.Name,
"--format=json",
})
// Sometimes we see errors about running out of CPU quota or IP addresses,
// Back off and retry in these cases, just like CreateInstance().
if err != nil && !strings.Contains(err.Error(), "Quota") {
err = backoff.Permanent(err)
}
// Returning a non-permanent error triggers retries.
return err
}
backoffPolicy := backoff.WithContext(backoff.NewConstantBackOff(time.Minute), ctx)
if err := backoff.Retry(tryStart, backoffPolicy); err != nil {
return err
}
ipAddress, err := extractIPAddress(output.Stdout)
if err != nil {
return err
}
vm.IPAddress = ipAddress
return waitForStart(ctx, logger, vm)
}