Skip to content

Commit 7e44157

Browse files
authored
feat(instance): remove lockLocalized and use an retryable error (#688)
Signed-off-by: Patrik Cyvoct <[email protected]>
1 parent d47731b commit 7e44157

File tree

4 files changed

+32
-77
lines changed

4 files changed

+32
-77
lines changed

scaleway/helpers_instance.go

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const (
1818
InstanceServerStateStandby = "standby"
1919

2020
InstanceServerWaitForTimeout = 10 * time.Minute
21+
InstanceVolumeDeleteTimeout = 10 * time.Minute
2122
)
2223

2324
// instanceAPIWithZone returns a new instance API and the zone for a Create request
@@ -145,45 +146,3 @@ func reachState(ctx context.Context, instanceAPI *instance.API, zone scw.Zone, s
145146
}
146147
return nil
147148
}
148-
149-
// detachVolume will make sure a volume is not attached to any server. If volume is attached to a server, it will be stopped
150-
// to allow volume detachment.
151-
func detachVolume(ctx context.Context, instanceAPI *instance.API, zone scw.Zone, volumeID string) error {
152-
res, err := instanceAPI.GetVolume(&instance.GetVolumeRequest{
153-
Zone: zone,
154-
VolumeID: volumeID,
155-
}, scw.WithContext(ctx))
156-
if err != nil {
157-
return err
158-
}
159-
160-
if res.Volume.Server == nil {
161-
return nil
162-
}
163-
164-
defer lockLocalizedID(newZonedIDString(zone, res.Volume.Server.ID))()
165-
166-
// We need to stop server only for VolumeTypeLSSD volume type
167-
if res.Volume.VolumeType == instance.VolumeVolumeTypeLSSD {
168-
err = reachState(ctx, instanceAPI, zone, res.Volume.Server.ID, instance.ServerStateStopped)
169-
170-
// If 404 this mean server is deleted and volume is already detached
171-
if is404Error(err) {
172-
return nil
173-
}
174-
if err != nil {
175-
return err
176-
}
177-
}
178-
_, err = instanceAPI.DetachVolume(&instance.DetachVolumeRequest{
179-
Zone: zone,
180-
VolumeID: res.Volume.ID,
181-
}, scw.WithContext(ctx))
182-
183-
// TODO find a better way to test this error
184-
if err != nil && err.Error() != "scaleway-sdk-go: volume should be attached to a server" {
185-
return err
186-
}
187-
188-
return nil
189-
}

scaleway/resource_instance_server.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -532,11 +532,8 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
532532
volumes["0"] = &instance.VolumeTemplate{ID: expandZonedID(d.Get("root_volume.0.volume_id")).ID, Name: newRandomName("vol")} // name is ignored by the API, any name will work here
533533

534534
for i, volumeID := range raw.([]interface{}) {
535-
// We make sure volume is detached so we can attach it to the server.
536-
err = detachVolume(nil, instanceAPI, zone, expandZonedID(volumeID).ID)
537-
if err != nil {
538-
return diag.FromErr(err)
539-
}
535+
// TODO: this will be refactored soon, before next release
536+
// in the meantime it will throw an error if the volume is already attached somewhere
540537
volumes[strconv.Itoa(i+1)] = &instance.VolumeTemplate{
541538
ID: expandZonedID(volumeID).ID,
542539
Name: newRandomName("vol"), // name is ignored by the API, any name will work here
@@ -640,8 +637,6 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
640637
// Apply changes
641638
////
642639

643-
defer lockLocalizedID(d.Id())()
644-
645640
if forceReboot {
646641
err = reachState(ctx, instanceAPI, zone, ID, InstanceServerStateStopped)
647642
if err != nil {
@@ -672,7 +667,6 @@ func resourceScalewayInstanceServerDelete(ctx context.Context, d *schema.Resourc
672667
if err != nil {
673668
return diag.FromErr(err)
674669
}
675-
defer lockLocalizedID(d.Id())()
676670

677671
// reach stopped state
678672
err = reachState(ctx, instanceAPI, zone, ID, instance.ServerStateStopped)

scaleway/resource_instance_volume.go

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66

77
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1011
"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
@@ -20,6 +21,9 @@ func resourceScalewayInstanceVolume() *schema.Resource {
2021
Importer: &schema.ResourceImporter{
2122
State: schema.ImportStatePassthrough,
2223
},
24+
Timeouts: &schema.ResourceTimeout{
25+
Delete: scw.TimeDurationPtr(InstanceVolumeDeleteTimeout),
26+
},
2327

2428
Schema: map[string]*schema.Schema{
2529
"name": {
@@ -172,17 +176,33 @@ func resourceScalewayInstanceVolumeDelete(ctx context.Context, d *schema.Resourc
172176
return diag.FromErr(err)
173177
}
174178

175-
err = detachVolume(ctx, instanceAPI, zone, id)
176-
if err != nil {
177-
return diag.FromErr(err)
178-
}
179+
err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
180+
volumeResp, err := instanceAPI.GetVolume(&instance.GetVolumeRequest{
181+
Zone: zone,
182+
VolumeID: id,
183+
})
184+
if err != nil {
185+
if is404Error(err) {
186+
return nil
187+
}
188+
return resource.NonRetryableError(err)
189+
}
179190

180-
deleteRequest := &instance.DeleteVolumeRequest{
181-
Zone: zone,
182-
VolumeID: id,
183-
}
191+
if volumeResp.Volume.Server != nil {
192+
return resource.RetryableError(fmt.Errorf("volume is still attached to a server"))
193+
}
184194

185-
err = instanceAPI.DeleteVolume(deleteRequest, scw.WithContext(ctx))
195+
deleteRequest := &instance.DeleteVolumeRequest{
196+
Zone: zone,
197+
VolumeID: id,
198+
}
199+
200+
err = instanceAPI.DeleteVolume(deleteRequest, scw.WithContext(ctx))
201+
if err != nil {
202+
return resource.NonRetryableError(err)
203+
}
204+
return nil
205+
})
186206
if err != nil {
187207
return diag.FromErr(err)
188208
}

scaleway/sync.go

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)