Skip to content

Commit 8322076

Browse files
committed
fix(privat-nics): add documentation, timeout and retry support
1 parent c3f346b commit 8322076

7 files changed

+3267
-2642
lines changed

docs/resources/instance_server.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ attached to the server. Updates to this field will trigger a stop/start of the s
183183
Use the `cloud-init` key to use [cloud-init](https://cloudinit.readthedocs.io/en/latest/) on your instance.
184184
You can define values using:
185185
- string
186-
- UTF-8 encoded file content using [file](https://www.terraform.io/docs/configuration/functions/file.html)
187-
- Binary files using [filebase64](https://www.terraform.io/docs/configuration/functions/filebase64.html).
186+
- UTF-8 encoded file content using [file](https://www.terraform.io/language/functions/file)
187+
- Binary files using [filebase64](https://www.terraform.io/language/functions/filebase64).
188188

189189
- `private_network` - (Optional) The private network associated with the server.
190190
Use the `pn_id` key to attach a [private_network](https://developers.scaleway.com/en/products/instance/api/#private-nics-a42eea) on your instance.

go.sum

-2
Original file line numberDiff line numberDiff line change
@@ -855,8 +855,6 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb
855855
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
856856
github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
857857
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
858-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220308141350-165c40ac312e h1:clWNRWjqkdaqZ2zUCKnzS5fPypivPeuZyKpy0fNe9zU=
859-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220308141350-165c40ac312e/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
860858
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220413124200-87ec17340712 h1:MOkU+rQ1ZIIqYAjCUwd1qaOapaECgic6kZjuT+iK2/Y=
861859
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9.0.20220413124200-87ec17340712/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
862860
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=

scaleway/helpers_instance.go

+17-5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const (
2222
InstanceServerStateStandby = "standby"
2323

2424
defaultInstanceServerWaitTimeout = 10 * time.Minute
25+
defaultInstancePrivateNICWaitTimeout = 10 * time.Minute
2526
defaultInstanceVolumeDeleteTimeout = 10 * time.Minute
2627
defaultInstanceSecurityGroupTimeout = 1 * time.Minute
2728
defaultInstanceSecurityGroupRuleTimeout = 1 * time.Minute
@@ -328,7 +329,7 @@ func (ph *privateNICsHandler) flatPrivateNICs() error {
328329
return nil
329330
}
330331

331-
func (ph *privateNICsHandler) detach(o interface{}) error {
332+
func (ph *privateNICsHandler) detach(o interface{}, timeout time.Duration) error {
332333
oPtr := expandStringPtr(o)
333334
if oPtr != nil && len(*oPtr) > 0 {
334335
idPN := expandID(*oPtr)
@@ -338,8 +339,8 @@ func (ph *privateNICsHandler) detach(o interface{}) error {
338339
ServerID: ph.serverID,
339340
PrivateNicID: expandID(p.ID),
340341
Zone: ph.zone,
341-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutCreate)),
342-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
342+
Timeout: scw.TimeDurationPtr(timeout),
343+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
343344
}, scw.WithContext(ph.ctx))
344345
if err != nil {
345346
return err
@@ -359,19 +360,30 @@ func (ph *privateNICsHandler) detach(o interface{}) error {
359360
return nil
360361
}
361362

362-
func (ph *privateNICsHandler) attach(n interface{}) error {
363+
func (ph *privateNICsHandler) attach(n interface{}, timeout time.Duration) error {
363364
nPtr := expandStringPtr(n)
364365
if nPtr != nil {
365366
// check if new private network was already attached on instance server
366367
privateNetworkID := expandID(*nPtr)
367368
if _, ok := ph.privateNICsMap[privateNetworkID]; !ok {
368-
_, err := ph.instanceAPI.CreatePrivateNIC(&instance.CreatePrivateNICRequest{
369+
pn, err := ph.instanceAPI.CreatePrivateNIC(&instance.CreatePrivateNICRequest{
369370
Zone: ph.zone,
370371
ServerID: ph.serverID,
371372
PrivateNetworkID: privateNetworkID})
372373
if err != nil {
373374
return err
374375
}
376+
377+
_, err = ph.instanceAPI.WaitForPrivateNIC(&instance.WaitForPrivateNICRequest{
378+
ServerID: ph.serverID,
379+
PrivateNicID: pn.PrivateNic.ID,
380+
Zone: ph.zone,
381+
Timeout: scw.TimeDurationPtr(timeout),
382+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
383+
}, scw.WithContext(ph.ctx))
384+
if err != nil {
385+
return err
386+
}
375387
}
376388
}
377389

scaleway/resource_instance_private_nic.go

+68-10
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@ package scaleway
22

33
import (
44
"context"
5+
"time"
56

67
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
89
"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
910
"github.com/scaleway/scaleway-sdk-go/scw"
1011
)
1112

13+
const (
14+
retryInstancePrivateNICInterval = 30 * time.Second
15+
)
16+
1217
func resourceScalewayInstancePrivateNIC() *schema.Resource {
1318
return &schema.Resource{
1419
CreateContext: resourceScalewayInstancePrivateNICCreate,
@@ -18,7 +23,9 @@ func resourceScalewayInstancePrivateNIC() *schema.Resource {
1823
Importer: &schema.ResourceImporter{
1924
StateContext: schema.ImportStatePassthroughContext,
2025
},
21-
26+
Timeouts: &schema.ResourceTimeout{
27+
Default: schema.DefaultTimeout(defaultInstancePrivateNICWaitTimeout),
28+
},
2229
Schema: map[string]*schema.Schema{
2330
"server_id": {
2431
Type: schema.TypeString,
@@ -60,6 +67,17 @@ func resourceScalewayInstancePrivateNICCreate(ctx context.Context, d *schema.Res
6067
return diag.FromErr(err)
6168
}
6269

70+
_, err = instanceAPI.WaitForPrivateNIC(&instance.WaitForPrivateNICRequest{
71+
ServerID: res.PrivateNic.ServerID,
72+
PrivateNicID: res.PrivateNic.ID,
73+
Zone: zone,
74+
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutCreate)),
75+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
76+
}, scw.WithContext(ctx))
77+
if err != nil {
78+
return diag.FromErr(err)
79+
}
80+
6381
d.SetId(
6482
newZonedNestedIDString(
6583
zone,
@@ -82,9 +100,11 @@ func resourceScalewayInstancePrivateNICRead(ctx context.Context, d *schema.Resou
82100
}
83101

84102
res, err := instanceAPI.WaitForPrivateNIC(&instance.WaitForPrivateNICRequest{
85-
ServerID: outerID,
86-
PrivateNicID: innerID,
87-
Zone: zone,
103+
ServerID: outerID,
104+
PrivateNicID: innerID,
105+
Zone: zone,
106+
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutRead)),
107+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
88108
}, scw.WithContext(ctx))
89109
if err != nil {
90110
if is404Error(err) {
@@ -115,9 +135,11 @@ func resourceScalewayInstancePrivateNICUpdate(ctx context.Context, d *schema.Res
115135

116136
if d.HasChanges("private_network_id", "server_id") {
117137
_, err := instanceAPI.WaitForPrivateNIC(&instance.WaitForPrivateNICRequest{
118-
ServerID: outerID,
119-
PrivateNicID: innerID,
120-
Zone: zone,
138+
ServerID: outerID,
139+
PrivateNicID: innerID,
140+
Zone: zone,
141+
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutRead)),
142+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
121143
}, scw.WithContext(ctx))
122144
if err != nil {
123145
return diag.FromErr(err)
@@ -133,6 +155,18 @@ func resourceScalewayInstancePrivateNICUpdate(ctx context.Context, d *schema.Res
133155
if err != nil && !is404Error(err) {
134156
return diag.FromErr(err)
135157
}
158+
159+
_, err = instanceAPI.WaitForPrivateNIC(&instance.WaitForPrivateNICRequest{
160+
ServerID: outerID,
161+
PrivateNicID: innerID,
162+
Zone: zone,
163+
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutDelete)),
164+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
165+
}, scw.WithContext(ctx))
166+
if err != nil && !is404Error(err) {
167+
return diag.FromErr(err)
168+
}
169+
136170
// create the new one
137171
createPrivateNICRequest := &instance.CreatePrivateNICRequest{
138172
Zone: zone,
@@ -148,6 +182,17 @@ func resourceScalewayInstancePrivateNICUpdate(ctx context.Context, d *schema.Res
148182
return diag.FromErr(err)
149183
}
150184

185+
_, err = instanceAPI.WaitForPrivateNIC(&instance.WaitForPrivateNICRequest{
186+
ServerID: res.PrivateNic.ServerID,
187+
PrivateNicID: res.PrivateNic.ID,
188+
Zone: zone,
189+
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
190+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
191+
}, scw.WithContext(ctx))
192+
if err != nil {
193+
return diag.FromErr(err)
194+
}
195+
151196
d.SetId(
152197
newZonedNestedIDString(
153198
zone,
@@ -171,9 +216,11 @@ func resourceScalewayInstancePrivateNICDelete(ctx context.Context, d *schema.Res
171216
}
172217

173218
_, err = instanceAPI.WaitForPrivateNIC(&instance.WaitForPrivateNICRequest{
174-
ServerID: outerID,
175-
PrivateNicID: innerID,
176-
Zone: zone,
219+
ServerID: outerID,
220+
PrivateNicID: innerID,
221+
Zone: zone,
222+
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutRead)),
223+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
177224
}, scw.WithContext(ctx))
178225
if err != nil {
179226
return diag.FromErr(err)
@@ -189,5 +236,16 @@ func resourceScalewayInstancePrivateNICDelete(ctx context.Context, d *schema.Res
189236
return diag.FromErr(err)
190237
}
191238

239+
_, err = instanceAPI.WaitForPrivateNIC(&instance.WaitForPrivateNICRequest{
240+
ServerID: outerID,
241+
PrivateNicID: innerID,
242+
Zone: zone,
243+
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutDelete)),
244+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
245+
}, scw.WithContext(ctx))
246+
if err != nil && !is404Error(err) {
247+
return diag.FromErr(err)
248+
}
249+
192250
return nil
193251
}

scaleway/resource_instance_server.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,9 @@ func resourceScalewayInstanceServer() *schema.Resource {
232232
MaxItems: 8,
233233
Description: "List of private network to connect with your instance",
234234
Elem: &schema.Resource{
235+
Timeouts: &schema.ResourceTimeout{
236+
Default: schema.DefaultTimeout(defaultInstancePrivateNICWaitTimeout),
237+
},
235238
Schema: map[string]*schema.Schema{
236239
"pn_id": {
237240
Type: schema.TypeString,
@@ -482,7 +485,7 @@ func resourceScalewayInstanceServerCreate(ctx context.Context, d *schema.Resourc
482485
PrivateNicID: pn.PrivateNic.ID,
483486
Zone: zone,
484487
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutCreate)),
485-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
488+
RetryInterval: scw.TimeDurationPtr(retryInstancePrivateNICInterval),
486489
}, scw.WithContext(ctx))
487490
if err != nil {
488491
return diag.FromErr(err)
@@ -910,11 +913,11 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
910913
return diag.FromErr(err)
911914
}
912915

913-
err = ph.detach(o)
916+
err = ph.detach(o, d.Timeout(schema.TimeoutDelete))
914917
if err != nil {
915918
diag.FromErr(err)
916919
}
917-
err = ph.attach(n)
920+
err = ph.attach(n, d.Timeout(schema.TimeoutCreate))
918921
if err != nil {
919922
diag.FromErr(err)
920923
}
@@ -937,7 +940,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
937940
return diag.FromErr(err)
938941
}
939942

940-
err = ph.detach(pn["pn_id"])
943+
err = ph.detach(pn["pn_id"], d.Timeout(schema.TimeoutDelete))
941944
if err != nil {
942945
diag.FromErr(err)
943946
}

0 commit comments

Comments
 (0)