@@ -19,7 +19,10 @@ import (
19
19
"sigs.k8s.io/cluster-api/util"
20
20
)
21
21
22
- var ErrPrivateIPNotFound = errors .New ("private IP not found in IPAM" )
22
+ var (
23
+ ErrPrivateIPNotFound = errors .New ("private IP not found in IPAM" )
24
+ ErrInstanceNotStoppedYet = errors .New ("instance is being stopped" )
25
+ )
23
26
24
27
type Service struct {
25
28
* scope.Machine
@@ -387,13 +390,45 @@ func (s *Service) Delete(ctx context.Context) error {
387
390
}
388
391
}
389
392
390
- // TODO: do not use terminate? We could accidentally remove CSI volumes...
391
- if _ , err := s .ScalewayClient .Instance .ServerAction (& instance.ServerActionRequest {
393
+ switch server .State {
394
+ case instance .ServerStateRunning , instance .ServerStateStoppedInPlace :
395
+ if _ , err := s .ScalewayClient .Instance .ServerAction (& instance.ServerActionRequest {
396
+ Zone : server .Zone ,
397
+ ServerID : server .ID ,
398
+ Action : instance .ServerActionPoweroff ,
399
+ }); err != nil {
400
+ return fmt .Errorf ("failed to poweroff server: %w" , err )
401
+ }
402
+
403
+ return ErrInstanceNotStoppedYet
404
+ case instance .ServerStateStopping :
405
+ return ErrInstanceNotStoppedYet
406
+ case instance .ServerStateLocked :
407
+ return errors .New ("instance is locked" )
408
+ }
409
+
410
+ // Remove boot volume.
411
+ if v , ok := server .Volumes ["0" ]; ok && v .Boot {
412
+ if _ , err := s .ScalewayClient .Instance .DetachVolume (& instance.DetachVolumeRequest {
413
+ Zone : server .Zone ,
414
+ VolumeID : v .ID ,
415
+ }); err != nil {
416
+ return fmt .Errorf ("failed to detach boot volume: %w" , err )
417
+ }
418
+
419
+ if err := s .ScalewayClient .Instance .DeleteVolume (& instance.DeleteVolumeRequest {
420
+ Zone : server .Zone ,
421
+ VolumeID : v .ID ,
422
+ }); err != nil {
423
+ return fmt .Errorf ("failed to delete instance volume: %w" , err )
424
+ }
425
+ }
426
+
427
+ if err := s .ScalewayClient .Instance .DeleteServer (& instance.DeleteServerRequest {
392
428
Zone : server .Zone ,
393
429
ServerID : server .ID ,
394
- Action : instance .ServerActionTerminate ,
395
430
}); err != nil {
396
- return err
431
+ return fmt . Errorf ( "failed to delete instance: %w" , err )
397
432
}
398
433
399
434
return nil
0 commit comments