// waitForAgentInitialisation polls the bootstrapped state server with a read-only // command which will fail until the state server is fully initialised. // TODO(wallyworld) - add a bespoke command to maybe the admin facade for this purpose. func (c *BootstrapCommand) waitForAgentInitialisation(ctx *cmd.Context) (err error) { attempts := utils.AttemptStrategy{ Min: bootstrapReadyPollCount, Delay: bootstrapReadyPollDelay, } var client block.BlockListAPI for attempt := attempts.Start(); attempt.Next(); { client, err = blockAPI(&c.EnvCommandBase) if err != nil { return err } _, err = client.List() client.Close() if err == nil { ctx.Infof("Bootstrap complete") return nil } if strings.Contains(err.Error(), apiserver.UpgradeInProgressError.Error()) { ctx.Infof("Waiting for API to become available") continue } return err } return err }
// waitForAgentInitialisation polls the bootstrapped controller with a read-only // command which will fail until the controller is fully initialised. // TODO(wallyworld) - add a bespoke command to maybe the admin facade for this purpose. func (c *bootstrapCommand) waitForAgentInitialisation(ctx *cmd.Context) (err error) { attempts := utils.AttemptStrategy{ Min: bootstrapReadyPollCount, Delay: bootstrapReadyPollDelay, } var client block.BlockListAPI for attempt := attempts.Start(); attempt.Next(); { client, err = blockAPI(&c.ModelCommandBase) if err != nil { // Logins are prevented whilst space discovery is ongoing. errorMessage := err.Error() if strings.Contains(errorMessage, "space discovery still in progress") { continue } return err } _, err = client.List() client.Close() if err == nil { ctx.Infof("Bootstrap complete") return nil } // As the API server is coming up, it goes through a number of steps. // Initially the upgrade steps run, but the api server allows some // calls to be processed during the upgrade, but not the list blocks. // It is also possible that the underlying database causes connections // to be dropped as it is initialising, or reconfiguring. These can // lead to EOF or "connection is shut down" error messages. We skip // these too, hoping that things come back up before the end of the // retry poll count. errorMessage := err.Error() if strings.Contains(errorMessage, apiserver.UpgradeInProgressError.Error()) || strings.HasSuffix(errorMessage, "EOF") || strings.HasSuffix(errorMessage, "connection is shut down") { ctx.Infof("Waiting for API to become available") continue } return err } return err }