// pollIndefinitelyAsNeeded is a terrible hack which is necessary because the Azure // Storage API (and perhaps others) can have response times way beyond the default // retry timeouts, with no apparent upper bound. This effectively causes the client // to continue polling when it reaches the configured timeout. My investigations // suggest that this is neccesary when deleting and recreating a storage account with // the same name in a short (though undetermined) time period. // // It is possible that this will give Terraform the appearance of being slow in // future: I have attempted to mitigate this by logging whenever this happens. We // may want to revisit this with configurable timeouts in the future as clearly // unbounded wait loops is not ideal. It does seem preferable to the current situation // where our polling loop will time out _with an operation in progress_, but no ID // for the resource - so the state will not know about it, and conflicts will occur // on the next run. func pollIndefinitelyAsNeeded(client autorest.Client, response *http.Response, acceptableCodes ...int) (*http.Response, error) { var resp *http.Response var err error for { resp, err = client.PollAsNeeded(response, acceptableCodes...) if err != nil { if resp.StatusCode != http.StatusAccepted { log.Printf("[DEBUG] Starting new polling loop for %q", response.Request.URL.Path) continue } return resp, err } return resp, nil } }