Skip to content

Commit ec20f80

Browse files
nicolai86stack72
authored andcommitted
provider/scaleway speedup server deletion (hashicorp#9491)
* provider/scaleway speedup server deletion using `terminate` instead of `poweroff` leads to a faster shutdown fixes hashicorp#9430 * provider/scaleway: extract server shutdown code
1 parent e2f96ed commit ec20f80

2 files changed

Lines changed: 44 additions & 25 deletions

File tree

builtin/providers/scaleway/helpers.go

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package scaleway
22

33
import (
4+
"fmt"
45
"log"
56
"time"
67

8+
"github.com/hashicorp/terraform/helper/resource"
79
"github.com/scaleway/scaleway-cli/pkg/api"
810
)
911

@@ -17,36 +19,55 @@ func String(val string) *string {
1719
return &val
1820
}
1921

20-
// NOTE copied from github.com/scaleway/scaleway-cli/pkg/api/helpers.go
21-
// the helpers.go file pulls in quite a lot dependencies, and they're just convenience wrappers anyway
22+
// deleteRunningServer terminates the server and waits until it is removed.
23+
func deleteRunningServer(scaleway *api.ScalewayAPI, server *api.ScalewayServer) error {
24+
err := scaleway.PostServerAction(server.Identifier, "terminate")
2225

23-
func deleteServerSafe(s *api.ScalewayAPI, serverID string) error {
24-
server, err := s.GetServer(serverID)
2526
if err != nil {
27+
if serr, ok := err.(api.ScalewayAPIError); ok {
28+
if serr.StatusCode == 404 {
29+
return nil
30+
}
31+
}
32+
2633
return err
2734
}
2835

29-
if server.State != "stopped" {
30-
if err := s.PostServerAction(serverID, "poweroff"); err != nil {
31-
return err
36+
return resource.Retry(5*time.Minute, func() *resource.RetryError {
37+
_, err := scaleway.GetServer(server.Identifier)
38+
39+
if err == nil {
40+
return resource.RetryableError(fmt.Errorf("Waiting for server %q to be deleted", server.Identifier))
3241
}
33-
if err := waitForServerState(s, serverID, "stopped"); err != nil {
34-
return err
42+
43+
if serr, ok := err.(api.ScalewayAPIError); ok {
44+
if serr.StatusCode == 404 {
45+
return nil
46+
}
3547
}
36-
}
3748

38-
if err := s.DeleteServer(serverID); err != nil {
49+
return resource.RetryableError(err)
50+
})
51+
}
52+
53+
// deleteStoppedServer needs to cleanup attached root volumes. this is not done
54+
// automatically by Scaleway
55+
func deleteStoppedServer(scaleway *api.ScalewayAPI, server *api.ScalewayServer) error {
56+
if err := scaleway.DeleteServer(server.Identifier); err != nil {
3957
return err
4058
}
59+
4160
if rootVolume, ok := server.Volumes["0"]; ok {
42-
if err := s.DeleteVolume(rootVolume.Identifier); err != nil {
61+
if err := scaleway.DeleteVolume(rootVolume.Identifier); err != nil {
4362
return err
4463
}
4564
}
46-
4765
return nil
4866
}
4967

68+
// NOTE copied from github.com/scaleway/scaleway-cli/pkg/api/helpers.go
69+
// the helpers.go file pulls in quite a lot dependencies, and they're just convenience wrappers anyway
70+
5071
func waitForServerState(s *api.ScalewayAPI, serverID string, targetState string) error {
5172
var server *api.ScalewayServer
5273
var err error

builtin/providers/scaleway/resource_scaleway_server.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -205,22 +205,20 @@ func resourceScalewayServerUpdate(d *schema.ResourceData, m interface{}) error {
205205
func resourceScalewayServerDelete(d *schema.ResourceData, m interface{}) error {
206206
scaleway := m.(*Client).scaleway
207207

208-
def, err := scaleway.GetServer(d.Id())
208+
s, err := scaleway.GetServer(d.Id())
209209
if err != nil {
210-
if serr, ok := err.(api.ScalewayAPIError); ok {
211-
if serr.StatusCode == 404 {
212-
d.SetId("")
213-
return nil
214-
}
215-
}
216210
return err
217211
}
218212

219-
err = deleteServerSafe(scaleway, def.Identifier)
220-
if err != nil {
221-
return err
213+
if s.State == "stopped" {
214+
return deleteStoppedServer(scaleway, s)
222215
}
223216

224-
d.SetId("")
225-
return nil
217+
err = deleteRunningServer(scaleway, s)
218+
219+
if err == nil {
220+
d.SetId("")
221+
}
222+
223+
return err
226224
}

0 commit comments

Comments
 (0)