Skip to content

Commit 7f53a1a

Browse files
committed
fallback to deletion if termination fails + add context in reachState func
1 parent b5ec6a4 commit 7f53a1a

File tree

2 files changed

+65
-21
lines changed

2 files changed

+65
-21
lines changed

internal/services/instance/helpers_instance.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ func reachState(ctx context.Context, api *instancehelpers.BlockAndInstanceAPI, z
184184
VolumeID: volume.ID,
185185
Zone: zone,
186186
RetryInterval: transport.DefaultWaitRetryInterval,
187-
})
187+
}, scw.WithContext(ctx))
188188
if err != nil {
189189
return err
190190
}
@@ -193,7 +193,7 @@ func reachState(ctx context.Context, api *instancehelpers.BlockAndInstanceAPI, z
193193
Zone: zone,
194194
VolumeID: volume.ID,
195195
RetryInterval: transport.DefaultWaitRetryInterval,
196-
})
196+
}, scw.WithContext(ctx))
197197
if err != nil {
198198
return err
199199
}
@@ -207,7 +207,7 @@ func reachState(ctx context.Context, api *instancehelpers.BlockAndInstanceAPI, z
207207
Zone: zone,
208208
Timeout: scw.TimeDurationPtr(DefaultInstanceServerWaitTimeout),
209209
RetryInterval: transport.DefaultWaitRetryInterval,
210-
})
210+
}, scw.WithContext(ctx))
211211
if err != nil {
212212
return err
213213
}

internal/services/instance/server.go

Lines changed: 62 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,6 +1014,7 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m
10141014
}
10151015

10161016
if d.HasChange("admin_password_encryption_ssh_key_id") {
1017+
serverShouldUpdate = true
10171018
updateRequest.AdminPasswordEncryptionSSHKeyID = types.ExpandUpdatedStringPtr(d.Get("admin_password_encryption_ssh_key_id").(string))
10181019
}
10191020

@@ -1243,24 +1244,6 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m
12431244
}
12441245
}
12451246

1246-
// reach running state (mandatory for termination)
1247-
err = reachState(ctx, api, zone, id, instanceSDK.ServerStateRunning)
1248-
if err != nil && !httperrors.Is404(err) {
1249-
return diag.FromErr(err)
1250-
}
1251-
1252-
timeout := d.Timeout(schema.TimeoutDelete)
1253-
1254-
err = api.ServerActionAndWait(&instanceSDK.ServerActionAndWaitRequest{
1255-
Zone: zone,
1256-
ServerID: id,
1257-
Action: instanceSDK.ServerActionTerminate,
1258-
Timeout: &timeout,
1259-
}, scw.WithContext(ctx))
1260-
if err != nil && !httperrors.Is404(err) {
1261-
return diag.FromErr(err)
1262-
}
1263-
12641247
// Delete private-nic if managed by instance_server resource
12651248
if raw, ok := d.GetOk("private_network"); ok {
12661249
ph, err := newPrivateNICHandler(api.API, id, zone)
@@ -1279,6 +1262,19 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m
12791262
}
12801263
}
12811264

1265+
_, err = waitForServer(ctx, api.API, zone, id, d.Timeout(schema.TimeoutDelete))
1266+
if err != nil && !httperrors.Is404(err) {
1267+
return diag.FromErr(err)
1268+
}
1269+
1270+
err = terminateServer(ctx, api, zone, id, d.Timeout(schema.TimeoutDelete))
1271+
if err != nil {
1272+
err = deleteServer(ctx, api, zone, id, d.Timeout(schema.TimeoutDelete))
1273+
if err != nil {
1274+
return diag.FromErr(err)
1275+
}
1276+
}
1277+
12821278
// Related to https://github.com/hashicorp/terraform-plugin-sdk/issues/142
12831279
_, rootVolumeAttributeSet := d.GetOk("root_volume")
12841280
if d.Get("root_volume.0.delete_on_termination").(bool) || !rootVolumeAttributeSet {
@@ -1299,6 +1295,54 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m
12991295
return nil
13001296
}
13011297

1298+
func terminateServer(ctx context.Context, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, id string, timeout time.Duration) error {
1299+
// reach running state (mandatory for termination)
1300+
err := reachState(ctx, api, zone, id, instanceSDK.ServerStateRunning)
1301+
if err != nil && !httperrors.Is404(err) {
1302+
return err
1303+
}
1304+
1305+
err = api.ServerActionAndWait(&instanceSDK.ServerActionAndWaitRequest{
1306+
Zone: zone,
1307+
ServerID: id,
1308+
Action: instanceSDK.ServerActionTerminate,
1309+
Timeout: &timeout,
1310+
}, scw.WithContext(ctx))
1311+
if err != nil && !httperrors.Is404(err) {
1312+
return err
1313+
}
1314+
1315+
return nil
1316+
}
1317+
1318+
func deleteServer(ctx context.Context, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, id string, timeout time.Duration) error {
1319+
_, err := waitForServer(ctx, api.API, zone, id, timeout)
1320+
if err != nil && !httperrors.Is404(err) {
1321+
return err
1322+
}
1323+
1324+
// reach stopped state
1325+
err = reachState(ctx, api, zone, id, instanceSDK.ServerStateStopped)
1326+
if err != nil && !httperrors.Is404(err) {
1327+
return err
1328+
}
1329+
1330+
err = api.DeleteServer(&instanceSDK.DeleteServerRequest{
1331+
Zone: zone,
1332+
ServerID: id,
1333+
}, scw.WithContext(ctx))
1334+
if err != nil && !httperrors.Is404(err) {
1335+
return err
1336+
}
1337+
1338+
_, err = waitForServer(ctx, api.API, zone, id, timeout)
1339+
if err != nil && !httperrors.Is404(err) {
1340+
return err
1341+
}
1342+
1343+
return nil
1344+
}
1345+
13021346
func instanceServerCanMigrate(api *instanceSDK.API, server *instanceSDK.Server, requestedType string) error {
13031347
var localVolumeSize scw.Size
13041348

0 commit comments

Comments
 (0)