Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 10e2c0d

Browse files
committed
Improve machine deletion
1 parent f51b1e5 commit 10e2c0d

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed

controllers/scalewaymachine_controller.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,14 @@ func (r *ScalewayMachineReconciler) reconcileNormal(ctx context.Context, machine
154154
}
155155

156156
func (r *ScalewayMachineReconciler) reconcileDelete(ctx context.Context, machineScope *scope.Machine) (ctrl.Result, error) {
157+
log := k8slog.FromContext(ctx)
158+
157159
if err := instance.NewService(machineScope).Delete(ctx); err != nil {
160+
if errors.Is(err, instance.ErrInstanceNotStoppedYet) {
161+
log.Info("Waiting for instance to stop")
162+
return ctrl.Result{RequeueAfter: 2 * time.Second}, nil
163+
}
164+
158165
return ctrl.Result{}, err
159166
}
160167

pkg/service/scaleway/instance/instance.go

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ import (
1919
"sigs.k8s.io/cluster-api/util"
2020
)
2121

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+
)
2326

2427
type Service struct {
2528
*scope.Machine
@@ -387,13 +390,45 @@ func (s *Service) Delete(ctx context.Context) error {
387390
}
388391
}
389392

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{
392428
Zone: server.Zone,
393429
ServerID: server.ID,
394-
Action: instance.ServerActionTerminate,
395430
}); err != nil {
396-
return err
431+
return fmt.Errorf("failed to delete instance: %w", err)
397432
}
398433

399434
return nil

0 commit comments

Comments
 (0)