Skip to content

Commit 3b90786

Browse files
authored
feat(instance): terminate server on delete (#3391)
* feat(instance): terminate server on delete * fallback to deletion if termination fails + add context in reachState func * delete pnic before terminating server * fix TestAccServer_AdminPasswordEncryptionSSHKeyID * fix TestAccDataSourceServers_PrivateIPs * fix TestAccServer_CustomDiffImage * cassettes * lint * vpc + vpcgw ok * ipam ok * instance ok * compress cassettes + re-record or drop those with errors
1 parent 6fc9bba commit 3b90786

File tree

82 files changed

+44513
-62408
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+44513
-62408
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: 73 additions & 20 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

@@ -1226,7 +1227,7 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m
12261227
Zone: zone,
12271228
IP: zonal.ExpandID(ipID).ID,
12281229
Server: &instanceSDK.NullableStringValue{Null: true},
1229-
})
1230+
}, scw.WithContext(ctx))
12301231
if err != nil {
12311232
log.Print("[WARN] Failed to detach eip of server")
12321233
}
@@ -1237,19 +1238,28 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m
12371238
Zone: zone,
12381239
PlacementGroup: &instanceSDK.NullableStringValue{Null: true},
12391240
ServerID: id,
1240-
})
1241+
}, scw.WithContext(ctx))
12411242
if err != nil {
12421243
log.Print("[WARN] Failed remove server from instanceSDK group")
12431244
}
12441245
}
1245-
// reach stopped state
1246-
err = reachState(ctx, api, zone, id, instanceSDK.ServerStateStopped)
1247-
if httperrors.Is404(err) {
1248-
return nil
1249-
}
12501246

1251-
if err != nil {
1252-
return diag.FromErr(err)
1247+
// Delete private-nic if managed by instance_server resource
1248+
if raw, ok := d.GetOk("private_network"); ok {
1249+
ph, err := newPrivateNICHandler(api.API, id, zone)
1250+
if err != nil {
1251+
return diag.FromErr(err)
1252+
}
1253+
1254+
for index := range raw.([]any) {
1255+
pnKey := fmt.Sprintf("private_network.%d.pn_id", index)
1256+
pn := d.Get(pnKey)
1257+
1258+
err := ph.detach(ctx, pn, d.Timeout(schema.TimeoutDelete))
1259+
if err != nil {
1260+
return diag.FromErr(err)
1261+
}
1262+
}
12531263
}
12541264

12551265
// Delete private-nic if managed by instance_server resource
@@ -1275,17 +1285,12 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m
12751285
return diag.FromErr(err)
12761286
}
12771287

1278-
err = api.DeleteServer(&instanceSDK.DeleteServerRequest{
1279-
Zone: zone,
1280-
ServerID: id,
1281-
}, scw.WithContext(ctx))
1282-
if err != nil && !httperrors.Is404(err) {
1283-
return diag.FromErr(err)
1284-
}
1285-
1286-
_, err = waitForServer(ctx, api.API, zone, id, d.Timeout(schema.TimeoutDelete))
1287-
if err != nil && !httperrors.Is404(err) {
1288-
return diag.FromErr(err)
1288+
err = terminateServer(ctx, api, zone, id, d.Timeout(schema.TimeoutDelete))
1289+
if err != nil {
1290+
err = deleteServer(ctx, api, zone, id, d.Timeout(schema.TimeoutDelete))
1291+
if err != nil {
1292+
return diag.FromErr(err)
1293+
}
12891294
}
12901295

12911296
// Related to https://github.com/hashicorp/terraform-plugin-sdk/issues/142
@@ -1308,6 +1313,54 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m
13081313
return nil
13091314
}
13101315

1316+
func terminateServer(ctx context.Context, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, id string, timeout time.Duration) error {
1317+
// reach running state (mandatory for termination)
1318+
err := reachState(ctx, api, zone, id, instanceSDK.ServerStateRunning)
1319+
if err != nil && !httperrors.Is404(err) {
1320+
return err
1321+
}
1322+
1323+
err = api.ServerActionAndWait(&instanceSDK.ServerActionAndWaitRequest{
1324+
Zone: zone,
1325+
ServerID: id,
1326+
Action: instanceSDK.ServerActionTerminate,
1327+
Timeout: &timeout,
1328+
}, scw.WithContext(ctx))
1329+
if err != nil && !httperrors.Is404(err) {
1330+
return err
1331+
}
1332+
1333+
return nil
1334+
}
1335+
1336+
func deleteServer(ctx context.Context, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, id string, timeout time.Duration) error {
1337+
_, err := waitForServer(ctx, api.API, zone, id, timeout)
1338+
if err != nil && !httperrors.Is404(err) {
1339+
return err
1340+
}
1341+
1342+
// reach stopped state
1343+
err = reachState(ctx, api, zone, id, instanceSDK.ServerStateStopped)
1344+
if err != nil && !httperrors.Is404(err) {
1345+
return err
1346+
}
1347+
1348+
err = api.DeleteServer(&instanceSDK.DeleteServerRequest{
1349+
Zone: zone,
1350+
ServerID: id,
1351+
}, scw.WithContext(ctx))
1352+
if err != nil && !httperrors.Is404(err) {
1353+
return err
1354+
}
1355+
1356+
_, err = waitForServer(ctx, api.API, zone, id, timeout)
1357+
if err != nil && !httperrors.Is404(err) {
1358+
return err
1359+
}
1360+
1361+
return nil
1362+
}
1363+
13111364
func instanceServerCanMigrate(api *instanceSDK.API, server *instanceSDK.Server, requestedType string) error {
13121365
var localVolumeSize scw.Size
13131366

0 commit comments

Comments
 (0)