provider/scaleway: delay between requests when waiting (#11184)
the CI sees many failing Scaleway tests due to request quotas being exceeded. this PR aims to address this issue by switching from `resource.Retry`, which waits 100ms between retries, to `resource.StateChangeConf` with a configured delay of 5s between retries. this should help us fixing the quota issue…
This commit is contained in:
parent
7b168604a1
commit
3954c1ecf0
|
@ -48,21 +48,7 @@ func deleteRunningServer(scaleway *api.ScalewayAPI, server *api.ScalewayServer)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return resource.Retry(20*time.Minute, func() *resource.RetryError {
|
return waitForServerState(scaleway, server.Identifier, "stopped")
|
||||||
_, err := scaleway.GetServer(server.Identifier)
|
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
return resource.RetryableError(fmt.Errorf("Waiting for server %q to be deleted", server.Identifier))
|
|
||||||
}
|
|
||||||
|
|
||||||
if serr, ok := err.(api.ScalewayAPIError); ok {
|
|
||||||
if serr.StatusCode == 404 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return resource.RetryableError(err)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteStoppedServer needs to cleanup attached root volumes. this is not done
|
// deleteStoppedServer needs to cleanup attached root volumes. this is not done
|
||||||
|
@ -83,20 +69,37 @@ func deleteStoppedServer(scaleway *api.ScalewayAPI, server *api.ScalewayServer)
|
||||||
// NOTE copied from github.com/scaleway/scaleway-cli/pkg/api/helpers.go
|
// NOTE copied from github.com/scaleway/scaleway-cli/pkg/api/helpers.go
|
||||||
// the helpers.go file pulls in quite a lot dependencies, and they're just convenience wrappers anyway
|
// the helpers.go file pulls in quite a lot dependencies, and they're just convenience wrappers anyway
|
||||||
|
|
||||||
|
var allStates = []string{"starting", "running", "stopping", "stopped"}
|
||||||
|
|
||||||
func waitForServerState(scaleway *api.ScalewayAPI, serverID, targetState string) error {
|
func waitForServerState(scaleway *api.ScalewayAPI, serverID, targetState string) error {
|
||||||
return resource.Retry(60*time.Minute, func() *resource.RetryError {
|
pending := []string{}
|
||||||
scaleway.ClearCache()
|
for _, state := range allStates {
|
||||||
|
if state != targetState {
|
||||||
s, err := scaleway.GetServer(serverID)
|
pending = append(pending, state)
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return resource.NonRetryableError(err)
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
stateConf := &resource.StateChangeConf{
|
||||||
|
Pending: pending,
|
||||||
|
Target: []string{targetState},
|
||||||
|
Refresh: func() (interface{}, string, error) {
|
||||||
|
s, err := scaleway.GetServer(serverID)
|
||||||
|
|
||||||
if s.State != targetState {
|
if err == nil {
|
||||||
return resource.RetryableError(fmt.Errorf("Waiting for server to enter %q state", targetState))
|
return 42, s.State, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
if serr, ok := err.(api.ScalewayAPIError); ok {
|
||||||
})
|
if serr.StatusCode == 404 {
|
||||||
|
return 42, "stopped", nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 42, s.State, err
|
||||||
|
},
|
||||||
|
Timeout: 60 * time.Minute,
|
||||||
|
MinTimeout: 5 * time.Second,
|
||||||
|
Delay: 5 * time.Second,
|
||||||
|
}
|
||||||
|
_, err := stateConf.WaitForState()
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue