@@ -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+
13111364func instanceServerCanMigrate (api * instanceSDK.API , server * instanceSDK.Server , requestedType string ) error {
13121365 var localVolumeSize scw.Size
13131366
0 commit comments