Skip to content

Commit 55dbcc5

Browse files
authored
chore(instance): add support for fast retries with cassettes (#1194)
1 parent cbcee30 commit 55dbcc5

4 files changed

+80
-121
lines changed

scaleway/helpers_instance.go

+48
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const (
2727
defaultInstanceSecurityGroupRuleTimeout = 1 * time.Minute
2828
defaultInstancePlacementGroupTimeout = 1 * time.Minute
2929
defaultInstanceIPTimeout = 1 * time.Minute
30+
defaultInstanceRetryInterval = 5 * time.Second
3031

3132
defaultInstanceSnapshotWaitTimeout = 1 * time.Hour
3233
)
@@ -398,3 +399,50 @@ func (ph *privateNICsHandler) get(key string) (interface{}, error) {
398399
"zone": locality,
399400
}, nil
400401
}
402+
403+
func waitForInstanceSnapshot(ctx context.Context, api *instance.API, zone scw.Zone, id string, timeout time.Duration) (*instance.Snapshot, error) {
404+
retryInterval := defaultInstanceRetryInterval
405+
if DefaultWaitRetryInterval != nil {
406+
retryInterval = *DefaultWaitRetryInterval
407+
}
408+
409+
snapshot, err := api.WaitForSnapshot(&instance.WaitForSnapshotRequest{
410+
SnapshotID: id,
411+
Zone: zone,
412+
Timeout: scw.TimeDurationPtr(timeout),
413+
RetryInterval: &retryInterval,
414+
}, scw.WithContext(ctx))
415+
416+
return snapshot, err
417+
}
418+
419+
func waitForInstanceVolume(ctx context.Context, api *instance.API, zone scw.Zone, id string, timeout time.Duration) (*instance.Volume, error) {
420+
retryInterval := defaultInstanceRetryInterval
421+
if DefaultWaitRetryInterval != nil {
422+
retryInterval = *DefaultWaitRetryInterval
423+
}
424+
425+
volume, err := api.WaitForVolume(&instance.WaitForVolumeRequest{
426+
VolumeID: id,
427+
Zone: zone,
428+
Timeout: scw.TimeDurationPtr(timeout),
429+
RetryInterval: &retryInterval,
430+
}, scw.WithContext(ctx))
431+
return volume, err
432+
}
433+
434+
func waitForInstanceServer(ctx context.Context, api *instance.API, zone scw.Zone, id string, timeout time.Duration) (*instance.Server, error) {
435+
retryInterval := defaultInstanceRetryInterval
436+
if DefaultWaitRetryInterval != nil {
437+
retryInterval = *DefaultWaitRetryInterval
438+
}
439+
440+
server, err := api.WaitForServer(&instance.WaitForServerRequest{
441+
Zone: zone,
442+
ServerID: id,
443+
Timeout: scw.TimeDurationPtr(timeout),
444+
RetryInterval: &retryInterval,
445+
}, scw.WithContext(ctx))
446+
447+
return server, err
448+
}

scaleway/resource_instance_server.go

+28-103
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"io/ioutil"
99
"log"
1010
"strconv"
11-
"time"
1211

1312
"github.com/google/go-cmp/cmp"
1413
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -20,10 +19,6 @@ import (
2019
scwvalidation "github.com/scaleway/scaleway-sdk-go/validation"
2120
)
2221

23-
const (
24-
retryInstanceServerInterval = 30 * time.Second
25-
)
26-
2722
func resourceScalewayInstanceServer() *schema.Resource {
2823
return &schema.Resource{
2924
CreateContext: resourceScalewayInstanceServerCreate,
@@ -389,18 +384,13 @@ func resourceScalewayInstanceServerCreate(ctx context.Context, d *schema.Resourc
389384
return diag.FromErr(err)
390385
}
391386

392-
_, err = instanceAPI.WaitForServer(&instance.WaitForServerRequest{
393-
Zone: zone,
394-
ServerID: res.Server.ID,
395-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutCreate)),
396-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
397-
})
387+
d.SetId(newZonedID(zone, res.Server.ID).String())
388+
389+
_, err = waitForInstanceServer(ctx, instanceAPI, zone, res.Server.ID, d.Timeout(schema.TimeoutCreate))
398390
if err != nil {
399391
return diag.FromErr(err)
400392
}
401393

402-
d.SetId(newZonedID(zone, res.Server.ID).String())
403-
404394
////
405395
// Set user data
406396
////
@@ -422,12 +412,7 @@ func resourceScalewayInstanceServerCreate(ctx context.Context, d *schema.Resourc
422412
}
423413

424414
if len(userDataRequests.UserData) > 0 {
425-
_, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
426-
Zone: zone,
427-
ServerID: res.Server.ID,
428-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutCreate)),
429-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
430-
})
415+
_, err := waitForInstanceServer(ctx, instanceAPI, zone, res.Server.ID, d.Timeout(schema.TimeoutCreate))
431416
if err != nil {
432417
return diag.FromErr(err)
433418
}
@@ -461,12 +446,7 @@ func resourceScalewayInstanceServerCreate(ctx context.Context, d *schema.Resourc
461446
}
462447
// compute attachment
463448
for _, q := range pnRequest {
464-
_, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
465-
Zone: zone,
466-
ServerID: res.Server.ID,
467-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutCreate)),
468-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
469-
})
449+
_, err := waitForInstanceServer(ctx, instanceAPI, zone, res.Server.ID, d.Timeout(schema.TimeoutCreate))
470450
if err != nil {
471451
return diag.FromErr(err)
472452
}
@@ -483,17 +463,12 @@ func resourceScalewayInstanceServerCreate(ctx context.Context, d *schema.Resourc
483463

484464
//gocyclo:ignore
485465
func resourceScalewayInstanceServerRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
486-
instanceAPI, zone, ID, err := instanceAPIWithZoneAndID(meta, d.Id())
466+
instanceAPI, zone, id, err := instanceAPIWithZoneAndID(meta, d.Id())
487467
if err != nil {
488468
return diag.FromErr(err)
489469
}
490470

491-
server, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
492-
Zone: zone,
493-
ServerID: ID,
494-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutRead)),
495-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
496-
})
471+
server, err := waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutRead))
497472
if err != nil {
498473
if errorCheck(err, "is not found") {
499474
log.Printf("[WARN] instance %s not found droping from state", d.Id())
@@ -605,7 +580,7 @@ func resourceScalewayInstanceServerRead(ctx context.Context, d *schema.ResourceD
605580
////
606581
allUserData, _ := instanceAPI.GetAllServerUserData(&instance.GetAllServerUserDataRequest{
607582
Zone: zone,
608-
ServerID: ID,
583+
ServerID: id,
609584
}, scw.WithContext(ctx))
610585

611586
userData := make(map[string]interface{})
@@ -627,7 +602,7 @@ func resourceScalewayInstanceServerRead(ctx context.Context, d *schema.ResourceD
627602
////
628603
// Read server private networks
629604
////
630-
ph, err := newPrivateNICHandler(ctx, instanceAPI, ID, zone)
605+
ph, err := newPrivateNICHandler(ctx, instanceAPI, id, zone)
631606
if err != nil {
632607
return diag.FromErr(err)
633608
}
@@ -645,7 +620,7 @@ func resourceScalewayInstanceServerRead(ctx context.Context, d *schema.ResourceD
645620

646621
//gocyclo:ignore
647622
func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
648-
instanceAPI, zone, ID, err := instanceAPIWithZoneAndID(meta, d.Id())
623+
instanceAPI, zone, id, err := instanceAPIWithZoneAndID(meta, d.Id())
649624
if err != nil {
650625
return diag.FromErr(err)
651626
}
@@ -655,12 +630,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
655630

656631
var warnings diag.Diagnostics
657632

658-
server, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
659-
Zone: zone,
660-
ServerID: ID,
661-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
662-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
663-
})
633+
server, err := waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutUpdate))
664634
if err != nil {
665635
return diag.FromErr(err)
666636
}
@@ -747,12 +717,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
747717
// Update reserved IP
748718
////
749719
if d.HasChange("ip_id") {
750-
server, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
751-
Zone: zone,
752-
ServerID: ID,
753-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
754-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
755-
})
720+
server, err := waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutUpdate))
756721

757722
if err != nil {
758723
return diag.FromErr(err)
@@ -770,43 +735,28 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
770735
return diag.FromErr(err)
771736
}
772737
//we wait to ensure to not detach the new ip.
773-
_, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
774-
Zone: zone,
775-
ServerID: ID,
776-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
777-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
778-
})
738+
_, err := waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutUpdate))
779739
if err != nil {
780740
return diag.FromErr(err)
781741
}
782742
}
783743
// If a new IP is provided, we attach it to the server
784744
if ipID != "" {
785-
_, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
786-
Zone: zone,
787-
ServerID: ID,
788-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
789-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
790-
})
745+
_, err := waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutUpdate))
791746
if err != nil {
792747
return diag.FromErr(err)
793748
}
794749

795750
_, err = instanceAPI.UpdateIP(&instance.UpdateIPRequest{
796751
Zone: zone,
797752
IP: ipID,
798-
Server: &instance.NullableStringValue{Value: ID},
753+
Server: &instance.NullableStringValue{Value: id},
799754
}, scw.WithContext(ctx))
800755
if err != nil {
801756
return diag.FromErr(err)
802757
}
803758

804-
_, err = instanceAPI.WaitForServer(&instance.WaitForServerRequest{
805-
Zone: zone,
806-
ServerID: ID,
807-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
808-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
809-
})
759+
_, err = waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutUpdate))
810760
if err != nil {
811761
return diag.FromErr(err)
812762
}
@@ -840,7 +790,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
840790
if d.HasChanges("user_data") {
841791
userDataRequests := &instance.SetAllServerUserDataRequest{
842792
Zone: zone,
843-
ServerID: ID,
793+
ServerID: id,
844794
UserData: make(map[string]io.Reader),
845795
}
846796

@@ -857,12 +807,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
857807
}
858808
}
859809

860-
_, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
861-
Zone: zone,
862-
ServerID: ID,
863-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
864-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
865-
})
810+
_, err := waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutUpdate))
866811
if err != nil {
867812
return diag.FromErr(err)
868813
}
@@ -877,7 +822,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
877822
// Update server private network
878823
////
879824
if d.HasChanges("private_network") {
880-
ph, err := newPrivateNICHandler(ctx, instanceAPI, ID, zone)
825+
ph, err := newPrivateNICHandler(ctx, instanceAPI, id, zone)
881826
if err != nil {
882827
diag.FromErr(err)
883828
}
@@ -888,12 +833,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
888833
if d.HasChange(pnKey) {
889834
o, n := d.GetChange(pnKey)
890835
if !cmp.Equal(n, o) {
891-
_, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
892-
Zone: zone,
893-
ServerID: ID,
894-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
895-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
896-
})
836+
_, err := waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutUpdate))
897837
if err != nil {
898838
return diag.FromErr(err)
899839
}
@@ -915,12 +855,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
915855
for _, raw := range o.([]interface{}) {
916856
pn, pnExist := raw.(map[string]interface{})
917857
if pnExist {
918-
_, err := instanceAPI.WaitForServer(&instance.WaitForServerRequest{
919-
Zone: zone,
920-
ServerID: ID,
921-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
922-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
923-
})
858+
_, err := waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutUpdate))
924859
if err != nil {
925860
return diag.FromErr(err)
926861
}
@@ -943,7 +878,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
943878
return diag.FromErr(err)
944879
}
945880
// reach expected state
946-
err = reachState(ctx, instanceAPI, zone, ID, targetState)
881+
err = reachState(ctx, instanceAPI, zone, id, targetState)
947882
if err != nil {
948883
return diag.FromErr(err)
949884
}
@@ -954,12 +889,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
954889
return diag.FromErr(err)
955890
}
956891

957-
_, err = instanceAPI.WaitForServer(&instance.WaitForServerRequest{
958-
Zone: zone,
959-
ServerID: ID,
960-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutUpdate)),
961-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
962-
})
892+
_, err = waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutUpdate))
963893
if err != nil {
964894
return diag.FromErr(err)
965895
}
@@ -968,7 +898,7 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
968898
}
969899

970900
func resourceScalewayInstanceServerDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
971-
instanceAPI, zone, ID, err := instanceAPIWithZoneAndID(meta, d.Id())
901+
instanceAPI, zone, id, err := instanceAPIWithZoneAndID(meta, d.Id())
972902
if err != nil {
973903
return diag.FromErr(err)
974904
}
@@ -988,34 +918,29 @@ func resourceScalewayInstanceServerDelete(ctx context.Context, d *schema.Resourc
988918
_, err := instanceAPI.UpdateServer(&instance.UpdateServerRequest{
989919
Zone: zone,
990920
PlacementGroup: &instance.NullableStringValue{Null: true},
991-
ServerID: ID,
921+
ServerID: id,
992922
})
993923
if err != nil {
994924
log.Print("[WARN] Failed remove server from instance group")
995925
}
996926
}
997927
// reach stopped state
998-
err = reachState(ctx, instanceAPI, zone, ID, instance.ServerStateStopped)
928+
err = reachState(ctx, instanceAPI, zone, id, instance.ServerStateStopped)
999929
if is404Error(err) {
1000930
return nil
1001931
}
1002932
if err != nil {
1003933
return diag.FromErr(err)
1004934
}
1005935

1006-
_, err = instanceAPI.WaitForServer(&instance.WaitForServerRequest{
1007-
Zone: zone,
1008-
ServerID: ID,
1009-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutDelete)),
1010-
RetryInterval: scw.TimeDurationPtr(retryInstanceServerInterval),
1011-
})
936+
_, err = waitForInstanceServer(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutDelete))
1012937
if err != nil {
1013938
return diag.FromErr(err)
1014939
}
1015940

1016941
err = instanceAPI.DeleteServer(&instance.DeleteServerRequest{
1017942
Zone: zone,
1018-
ServerID: ID,
943+
ServerID: id,
1019944
}, scw.WithContext(ctx))
1020945

1021946
if err != nil && !is404Error(err) {

scaleway/resource_instance_snapshot.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,7 @@ func resourceScalewayInstanceSnapshotDelete(ctx context.Context, d *schema.Resou
155155
return diag.FromErr(err)
156156
}
157157

158-
_, err = instanceAPI.WaitForSnapshot(&instance.WaitForSnapshotRequest{
159-
SnapshotID: id,
160-
Zone: zone,
161-
RetryInterval: DefaultWaitRetryInterval,
162-
Timeout: scw.TimeDurationPtr(d.Timeout(schema.TimeoutDelete)),
163-
})
158+
_, err = waitForInstanceSnapshot(ctx, instanceAPI, zone, id, d.Timeout(schema.TimeoutDelete))
164159
if err != nil {
165160
return diag.FromErr(err)
166161
}

0 commit comments

Comments
 (0)