-
Notifications
You must be signed in to change notification settings - Fork 132
/
dedicated_server_task.go
81 lines (65 loc) · 2.07 KB
/
dedicated_server_task.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package ovh
import (
"fmt"
"log"
"net/url"
"time"
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/ovh/go-ovh/ovh"
)
func waitForDedicatedServerTask(serviceName string, task *DedicatedServerTask, c *ovh.Client) error {
taskId := task.Id
refreshFunc := func() (interface{}, string, error) {
var taskErr error
var task *DedicatedServerTask
// The Dedicated Server API often returns 500/404 errors
// in such case we retry to retrieve task status
// 404 may happen because of some inconsistency between the
// api endpoint call and the target region executing the task
retryErr := resource.Retry(5*time.Minute, func() *resource.RetryError {
var err error
task, err = getDedicatedServerTask(serviceName, taskId, c)
if err != nil {
if errOvh, ok := err.(*ovh.APIError); ok && (errOvh.Code == 404 || errOvh.Code == 500) {
return resource.RetryableError(err)
}
// other error dont retry and fail
taskErr = err
}
return nil
})
if retryErr != nil {
return taskId, "", retryErr
}
if taskErr != nil {
return taskId, "", taskErr
}
log.Printf("[INFO] Pending Task id %d on Dedicated %s status: %s", taskId, serviceName, task.Status)
return taskId, task.Status, nil
}
log.Printf("[INFO] Waiting for Dedicated Server Task id %s/%d", serviceName, taskId)
stateConf := &resource.StateChangeConf{
Pending: []string{"init", "todo", "doing"},
Target: []string{"done"},
Refresh: refreshFunc,
Timeout: 45 * time.Minute,
Delay: 10 * time.Second,
MinTimeout: 3 * time.Second,
}
if _, err := stateConf.WaitForState(); err != nil {
return fmt.Errorf("Error waiting for Dedicated Server task %s/%d to complete: %s", serviceName, taskId, err)
}
return nil
}
func getDedicatedServerTask(serviceName string, taskId int64, c *ovh.Client) (*DedicatedServerTask, error) {
task := &DedicatedServerTask{}
endpoint := fmt.Sprintf(
"/dedicated/server/%s/task/%d",
url.PathEscape(serviceName),
taskId,
)
if err := c.Get(endpoint, task); err != nil {
return nil, err
}
return task, nil
}