Skip to content

Commit bc0ab0e

Browse files
authored
Merge pull request #374 from matprig/feat/kube/resource_tiemeouts
Use user-provided timeouts for all resources
2 parents 486f78c + b38d56a commit bc0ab0e

8 files changed

+127
-37
lines changed

ovh/resource_cloud_project_kube.go

+17-9
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ func resourceCloudProjectKube() *schema.Resource {
3333
State: resourceCloudProjectKubeImportState,
3434
},
3535

36+
Timeouts: &schema.ResourceTimeout{
37+
Create: schema.DefaultTimeout(15 * time.Minute),
38+
Update: schema.DefaultTimeout(10 * time.Minute),
39+
Delete: schema.DefaultTimeout(10 * time.Minute),
40+
Read: schema.DefaultTimeout(5 * time.Minute),
41+
Default: schema.DefaultTimeout(10 * time.Minute),
42+
},
43+
3644
Schema: map[string]*schema.Schema{
3745
"service_name": {
3846
Type: schema.TypeString,
@@ -216,7 +224,7 @@ func resourceCloudProjectKubeCreate(d *schema.ResourceData, meta interface{}) er
216224
}
217225

218226
log.Printf("[DEBUG] Waiting for kube %s to be READY", res.Id)
219-
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, res.Id, []string{"INSTALLING"}, []string{"READY"})
227+
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, res.Id, []string{"INSTALLING"}, []string{"READY"}, d.Timeout(schema.TimeoutCreate))
220228
if err != nil {
221229
return fmt.Errorf("timeout while waiting kube %s to be READY: %w", res.Id, err)
222230
}
@@ -271,7 +279,7 @@ func resourceCloudProjectKubeDelete(d *schema.ResourceData, meta interface{}) er
271279
}
272280

273281
log.Printf("[DEBUG] Waiting for kube %s to be DELETED", d.Id())
274-
err = waitForCloudProjectKubeDeleted(config.OVHClient, serviceName, d.Id())
282+
err = waitForCloudProjectKubeDeleted(d, config.OVHClient, serviceName, d.Id())
275283
if err != nil {
276284
return fmt.Errorf("timeout while waiting kube %s to be DELETED: %w", d.Id(), err)
277285
}
@@ -299,7 +307,7 @@ func resourceCloudProjectKubeUpdate(d *schema.ResourceData, meta interface{}) er
299307
}
300308

301309
log.Printf("[DEBUG] Waiting for kube %s to be READY", d.Id())
302-
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, d.Id(), []string{"REDEPLOYING", "RESETTING"}, []string{"READY"})
310+
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, d.Id(), []string{"REDEPLOYING", "RESETTING"}, []string{"READY"}, d.Timeout(schema.TimeoutUpdate))
303311
if err != nil {
304312
return fmt.Errorf("timeout while waiting kube %s to be READY: %w", d.Id(), err)
305313
}
@@ -351,7 +359,7 @@ func resourceCloudProjectKubeUpdate(d *schema.ResourceData, meta interface{}) er
351359
}
352360

353361
log.Printf("[DEBUG] Waiting for kube %s to be READY", d.Id())
354-
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, d.Id(), []string{"UPDATING", "REDEPLOYING", "RESETTING"}, []string{"READY"})
362+
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, d.Id(), []string{"UPDATING", "REDEPLOYING", "RESETTING"}, []string{"READY"}, d.Timeout(schema.TimeoutUpdate))
355363
if err != nil {
356364
return fmt.Errorf("timeout while waiting kube %s to be READY: %w", d.Id(), err)
357365
}
@@ -405,7 +413,7 @@ func resourceCloudProjectKubeUpdate(d *schema.ResourceData, meta interface{}) er
405413
}
406414

407415
log.Printf("[DEBUG] Waiting for kube %s to be READY", d.Id())
408-
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, d.Id(), []string{"REDEPLOYING", "RESETTING"}, []string{"READY"})
416+
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, d.Id(), []string{"REDEPLOYING", "RESETTING"}, []string{"READY"}, d.Timeout(schema.TimeoutUpdate))
409417
if err != nil {
410418
return fmt.Errorf("timeout while waiting kube %s to be READY: %w", d.Id(), err)
411419
}
@@ -422,7 +430,7 @@ func cloudProjectKubeExists(serviceName, id string, client *ovh.Client) error {
422430
return client.Get(endpoint, res)
423431
}
424432

425-
func waitForCloudProjectKubeReady(client *ovh.Client, serviceName, kubeId string, pending []string, target []string) error {
433+
func waitForCloudProjectKubeReady(client *ovh.Client, serviceName, kubeId string, pending []string, target []string, timeout time.Duration) error {
426434
stateConf := &resource.StateChangeConf{
427435
Pending: pending,
428436
Target: target,
@@ -436,7 +444,7 @@ func waitForCloudProjectKubeReady(client *ovh.Client, serviceName, kubeId string
436444

437445
return res, res.Status, nil
438446
},
439-
Timeout: 20 * time.Minute,
447+
Timeout: timeout,
440448
Delay: 5 * time.Second,
441449
MinTimeout: 3 * time.Second,
442450
}
@@ -445,7 +453,7 @@ func waitForCloudProjectKubeReady(client *ovh.Client, serviceName, kubeId string
445453
return err
446454
}
447455

448-
func waitForCloudProjectKubeDeleted(client *ovh.Client, serviceName, kubeId string) error {
456+
func waitForCloudProjectKubeDeleted(d *schema.ResourceData, client *ovh.Client, serviceName, kubeId string) error {
449457
stateConf := &resource.StateChangeConf{
450458
Pending: []string{"DELETING"},
451459
Target: []string{"DELETED"},
@@ -463,7 +471,7 @@ func waitForCloudProjectKubeDeleted(client *ovh.Client, serviceName, kubeId stri
463471

464472
return res, res.Status, nil
465473
},
466-
Timeout: 20 * time.Minute,
474+
Timeout: d.Timeout(schema.TimeoutDelete),
467475
Delay: 5 * time.Second,
468476
MinTimeout: 3 * time.Second,
469477
}

ovh/resource_cloud_project_kube_iprestrictions.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"log"
66
"net/url"
77
"strings"
8+
"time"
89

910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1011

@@ -22,6 +23,14 @@ func resourceCloudProjectKubeIpRestrictions() *schema.Resource {
2223
State: resourceCloudProjectKubeIpRestrictionsImportState,
2324
},
2425

26+
Timeouts: &schema.ResourceTimeout{
27+
Create: schema.DefaultTimeout(10 * time.Minute),
28+
Update: schema.DefaultTimeout(5 * time.Minute),
29+
Delete: schema.DefaultTimeout(5 * time.Minute),
30+
Read: schema.DefaultTimeout(5 * time.Minute),
31+
Default: schema.DefaultTimeout(10 * time.Minute),
32+
},
33+
2534
Schema: map[string]*schema.Schema{
2635
"service_name": {
2736
Type: schema.TypeString,
@@ -91,7 +100,7 @@ func resourceCloudProjectKubeIpRestrictionsCreateOrUpdate(d *schema.ResourceData
91100

92101
params := (&CloudProjectKubeIpRestrictionsCreateOrUpdateOpts{}).FromResource(d)
93102

94-
err := resourceCloudProjectKubeIpRestrictionsUpdate(config, serviceName, kubeId, params)
103+
err := resourceCloudProjectKubeIpRestrictionsUpdate(d, config, serviceName, kubeId, params)
95104
if err != nil {
96105
return err
97106
}
@@ -107,12 +116,12 @@ func resourceCloudProjectKubeIpRestrictionsDelete(d *schema.ResourceData, meta i
107116
serviceName := d.Get("service_name").(string)
108117
kubeId := d.Get("kube_id").(string)
109118

110-
return resourceCloudProjectKubeIpRestrictionsUpdate(config, serviceName, kubeId, &CloudProjectKubeIpRestrictionsCreateOrUpdateOpts{
119+
return resourceCloudProjectKubeIpRestrictionsUpdate(d, config, serviceName, kubeId, &CloudProjectKubeIpRestrictionsCreateOrUpdateOpts{
111120
Ips: []string{},
112121
})
113122
}
114123

115-
func resourceCloudProjectKubeIpRestrictionsUpdate(config *Config, serviceName string, kubeId string, params *CloudProjectKubeIpRestrictionsCreateOrUpdateOpts) error {
124+
func resourceCloudProjectKubeIpRestrictionsUpdate(d *schema.ResourceData, config *Config, serviceName string, kubeId string, params *CloudProjectKubeIpRestrictionsCreateOrUpdateOpts) error {
116125
endpoint := fmt.Sprintf("/cloud/project/%s/kube/%s/ipRestrictions", url.PathEscape(serviceName), url.PathEscape(kubeId))
117126
res := make(CloudProjectKubeIpRestrictionsResponse, 0)
118127

@@ -123,7 +132,7 @@ func resourceCloudProjectKubeIpRestrictionsUpdate(config *Config, serviceName st
123132
}
124133

125134
log.Printf("[DEBUG] Waiting for kube %s to be READY", kubeId)
126-
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, kubeId, []string{"REDEPLOYING", "RESETTING"}, []string{"READY"})
135+
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, kubeId, []string{"REDEPLOYING", "RESETTING"}, []string{"READY"}, d.Timeout(schema.TimeoutUpdate))
127136
if err != nil {
128137
return fmt.Errorf("timeout while waiting kube %s to be READY: %v", kubeId, err)
129138
}

ovh/resource_cloud_project_kube_nodepool.go

+15-7
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ func resourceCloudProjectKubeNodePool() *schema.Resource {
2323
State: resourceCloudProjectKubeNodePoolImportState,
2424
},
2525

26+
Timeouts: &schema.ResourceTimeout{
27+
Create: schema.DefaultTimeout(20 * time.Minute),
28+
Update: schema.DefaultTimeout(10 * time.Minute),
29+
Delete: schema.DefaultTimeout(10 * time.Minute),
30+
Read: schema.DefaultTimeout(5 * time.Minute),
31+
Default: schema.DefaultTimeout(10 * time.Minute),
32+
},
33+
2634
Schema: map[string]*schema.Schema{
2735
"service_name": {
2836
Type: schema.TypeString,
@@ -264,7 +272,7 @@ func resourceCloudProjectKubeNodePoolCreate(d *schema.ResourceData, meta interfa
264272
}
265273

266274
log.Printf("[DEBUG] Waiting for nodepool %s to be READY", res.Id)
267-
err = waitForCloudProjectKubeNodePoolReady(config.OVHClient, serviceName, kubeId, res.Id)
275+
err = waitForCloudProjectKubeNodePoolReady(config.OVHClient, serviceName, kubeId, res.Id, d.Timeout(schema.TimeoutCreate))
268276
if err != nil {
269277
return fmt.Errorf("timeout while waiting nodepool %s to be READY: %w", res.Id, err)
270278
}
@@ -318,7 +326,7 @@ func resourceCloudProjectKubeNodePoolUpdate(d *schema.ResourceData, meta interfa
318326
}
319327

320328
log.Printf("[DEBUG] Waiting for nodepool %s to be READY", d.Id())
321-
err = waitForCloudProjectKubeNodePoolReady(config.OVHClient, serviceName, kubeId, d.Id())
329+
err = waitForCloudProjectKubeNodePoolReady(config.OVHClient, serviceName, kubeId, d.Id(), d.Timeout(schema.TimeoutUpdate))
322330
if err != nil {
323331
return fmt.Errorf("timeout while waiting nodepool %s to be READY: %w", d.Id(), err)
324332
}
@@ -341,7 +349,7 @@ func resourceCloudProjectKubeNodePoolDelete(d *schema.ResourceData, meta interfa
341349
}
342350

343351
log.Printf("[DEBUG] Waiting for nodepool %s to be DELETED", d.Id())
344-
err = waitForCloudProjectKubeNodePoolDeleted(config.OVHClient, serviceName, kubeId, d.Id())
352+
err = waitForCloudProjectKubeNodePoolDeleted(config.OVHClient, serviceName, kubeId, d.Id(), d.Timeout(schema.TimeoutDelete))
345353
if err != nil {
346354
return fmt.Errorf("timeout while waiting nodepool %s to be DELETED: %v", d.Id(), err)
347355
}
@@ -359,7 +367,7 @@ func cloudProjectKubeNodePoolExists(serviceName, kubeId, id string, client *ovh.
359367
return client.Get(endpoint, res)
360368
}
361369

362-
func waitForCloudProjectKubeNodePoolReady(client *ovh.Client, serviceName, kubeId, id string) error {
370+
func waitForCloudProjectKubeNodePoolReady(client *ovh.Client, serviceName, kubeId, id string, timeout time.Duration) error {
363371
stateConf := &resource.StateChangeConf{
364372
Pending: []string{"INSTALLING", "UPDATING", "REDEPLOYING", "RESIZING", "DOWNSCALING", "UPSCALING"},
365373
Target: []string{"READY"},
@@ -373,7 +381,7 @@ func waitForCloudProjectKubeNodePoolReady(client *ovh.Client, serviceName, kubeI
373381

374382
return res, res.Status, nil
375383
},
376-
Timeout: 20 * time.Minute,
384+
Timeout: timeout,
377385
Delay: 5 * time.Second,
378386
MinTimeout: 3 * time.Second,
379387
}
@@ -382,7 +390,7 @@ func waitForCloudProjectKubeNodePoolReady(client *ovh.Client, serviceName, kubeI
382390
return err
383391
}
384392

385-
func waitForCloudProjectKubeNodePoolDeleted(client *ovh.Client, serviceName, kubeId, id string) error {
393+
func waitForCloudProjectKubeNodePoolDeleted(client *ovh.Client, serviceName, kubeId, id string, timeout time.Duration) error {
386394
stateConf := &resource.StateChangeConf{
387395
Pending: []string{"DELETING"},
388396
Target: []string{"DELETED"},
@@ -400,7 +408,7 @@ func waitForCloudProjectKubeNodePoolDeleted(client *ovh.Client, serviceName, kub
400408

401409
return res, res.Status, nil
402410
},
403-
Timeout: 20 * time.Minute,
411+
Timeout: timeout,
404412
Delay: 5 * time.Second,
405413
MinTimeout: 3 * time.Second,
406414
}

ovh/resource_cloud_project_kube_oidc.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"log"
66
"strings"
7+
"time"
78

89
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
910
)
@@ -17,6 +18,13 @@ func resourceCloudProjectKubeOIDC() *schema.Resource {
1718
Importer: &schema.ResourceImporter{
1819
State: resourceCloudProjectKubeOIDCImportState,
1920
},
21+
Timeouts: &schema.ResourceTimeout{
22+
Create: schema.DefaultTimeout(10 * time.Minute),
23+
Update: schema.DefaultTimeout(10 * time.Minute),
24+
Delete: schema.DefaultTimeout(10 * time.Minute),
25+
Read: schema.DefaultTimeout(5 * time.Minute),
26+
Default: schema.DefaultTimeout(10 * time.Minute),
27+
},
2028

2129
Schema: map[string]*schema.Schema{
2230
"service_name": {
@@ -116,7 +124,7 @@ func resourceCloudProjectKubeOIDCCreate(d *schema.ResourceData, meta interface{}
116124
d.SetId(serviceName + "/" + kubeID)
117125

118126
log.Printf("[DEBUG] Waiting for kube %s to be READY", kubeID)
119-
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, kubeID, []string{"REDEPLOYING"}, []string{"READY"})
127+
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, kubeID, []string{"REDEPLOYING"}, []string{"READY"}, d.Timeout(schema.TimeoutCreate))
120128
if err != nil {
121129
return fmt.Errorf("timeout while waiting kube %s to be READY: %w", kubeID, err)
122130
}
@@ -168,7 +176,7 @@ func resourceCloudProjectKubeOIDCUpdate(d *schema.ResourceData, meta interface{}
168176
}
169177

170178
log.Printf("[DEBUG] Waiting for kube %s to be READY", kubeID)
171-
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, kubeID, []string{"REDEPLOYING"}, []string{"READY"})
179+
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, kubeID, []string{"REDEPLOYING"}, []string{"READY"}, d.Timeout(schema.TimeoutUpdate))
172180
if err != nil {
173181
return fmt.Errorf("timeout while waiting kube %s to be READY: %w", kubeID, err)
174182
}
@@ -192,7 +200,7 @@ func resourceCloudProjectKubeOIDCDelete(d *schema.ResourceData, meta interface{}
192200
}
193201

194202
log.Printf("[DEBUG] Waiting for kube %s to be READY", kubeID)
195-
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, kubeID, []string{"REDEPLOYING"}, []string{"READY"})
203+
err = waitForCloudProjectKubeReady(config.OVHClient, serviceName, kubeID, []string{"REDEPLOYING"}, []string{"READY"}, d.Timeout(schema.TimeoutDelete))
196204
if err != nil {
197205
return fmt.Errorf("timeout while waiting kube %s to be READY: %w", kubeID, err)
198206
}

website/docs/r/cloud_project_kube.html.markdown

+17
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,23 @@ The following attributes are exported:
162162
* `version` - See Argument Reference above.
163163
* `customization` - See Argument Reference above.
164164

165+
## Timeouts
166+
167+
```hcl
168+
resource "ovh_cloud_project_kube" "my_kube_cluster" {
169+
# ...
170+
171+
timeouts {
172+
create = "1h"
173+
update = "45m"
174+
delete = "50s"
175+
}
176+
}
177+
```
178+
* `create` - (Default 10m)
179+
* `update` - (Default 10m)
180+
* `delete` - (Default 10m)
181+
165182
## Import
166183

167184
OVHcloud Managed Kubernetes Service clusters can be imported using the `service_name` and the `id` of the cluster, separated by "/" E.g.,

website/docs/r/cloud_project_kube_iprestrictions.html.markdown

+17
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,23 @@ The following arguments are supported:
3535

3636
No additional attributes than the ones provided are exported.
3737

38+
## Timeouts
39+
40+
```hcl
41+
resource "ovh_cloud_project_kube_iprestrictions" "vrack_only" {
42+
# ...
43+
44+
timeouts {
45+
create = "1h"
46+
update = "45m"
47+
delete = "50s"
48+
}
49+
}
50+
```
51+
* `create` - (Default 10m)
52+
* `update` - (Default 5m)
53+
* `delete` - (Default 5m)
54+
3855
## Import
3956

4057
OVHcloud Managed Kubernetes Service cluster IP restrictions can be imported using the `service_name` and the `id` of the cluster, separated by "/" E.g.,

website/docs/r/cloud_project_kube_nodepool.html.markdown

+17
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,23 @@ In addition, the following attributes are exported:
118118
* `up_to_date_nodes` - Number of nodes with latest version installed in the pool
119119
* `updated_at` - Last update date
120120

121+
## Timeouts
122+
123+
```hcl
124+
resource "ovh_cloud_project_kube_nodepool" "pool" {
125+
# ...
126+
127+
timeouts {
128+
create = "1h"
129+
update = "45m"
130+
delete = "50s"
131+
}
132+
}
133+
```
134+
* `create` - (Default 20m)
135+
* `update` - (Default 10m)
136+
* `delete` - (Default 10m)
137+
121138
## Import
122139

123140
OVHcloud Managed Kubernetes Service cluster node pool can be imported using the `service_name`, the `id` of the cluster, and the `id` of the nodepool separated by "/" E.g.,

0 commit comments

Comments
 (0)