Skip to content

Commit 364df96

Browse files
committed
fix(instance): instance terminate deletes sbs volumes
1 parent 921e52d commit 364df96

9 files changed

+8520
-5653
lines changed

internal/namespaces/instance/v1/custom_server_action.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/scaleway/scaleway-cli/v2/core"
1111
"github.com/scaleway/scaleway-cli/v2/internal/interactive"
12+
block "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1"
1213
"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
1314
"github.com/scaleway/scaleway-sdk-go/scw"
1415
)
@@ -394,6 +395,41 @@ func serverTerminateCommand() *core.Command {
394395
}
395396
_, _ = interactive.Printf("successfully detached volume %s\n", volumeName)
396397
}
398+
} else {
399+
for _, volume := range server.Server.Volumes {
400+
if volume.VolumeType != instance.VolumeServerVolumeTypeSbsVolume {
401+
continue
402+
}
403+
404+
_, err = api.DetachVolume(&instance.DetachVolumeRequest{
405+
VolumeID: volume.ID,
406+
Zone: volume.Zone,
407+
}, scw.WithContext(ctx))
408+
if err != nil {
409+
return nil, fmt.Errorf("failed to detach block volume %s: %w", volume.ID, err)
410+
}
411+
412+
blockAPI := block.NewAPI(client)
413+
terminalStatus := block.VolumeStatusAvailable
414+
415+
blockVolume, err := blockAPI.WaitForVolume(&block.WaitForVolumeRequest{
416+
VolumeID: volume.ID,
417+
Zone: volume.Zone,
418+
TerminalStatus: &terminalStatus,
419+
})
420+
if err != nil {
421+
return nil, fmt.Errorf("failed to wait for block volume %s: %w", volume.ID, err)
422+
}
423+
424+
err = blockAPI.DeleteVolume(&block.DeleteVolumeRequest{
425+
VolumeID: blockVolume.ID,
426+
Zone: blockVolume.Zone,
427+
}, scw.WithContext(ctx))
428+
if err != nil {
429+
return nil, fmt.Errorf("failed to delete block volume %s: %w", blockVolume.Name, err)
430+
}
431+
_, _ = interactive.Printf("successfully deleted block volume %q\n", blockVolume.Name)
432+
}
397433
}
398434

399435
if _, err := api.ServerAction(&instance.ServerActionRequest{
@@ -439,7 +475,8 @@ func shouldDeleteBlockVolumes(
439475
case withBlockPrompt:
440476
// Only prompt user if at least one block volume is attached to the instance
441477
for _, volume := range server.Server.Volumes {
442-
if volume.VolumeType != instance.VolumeServerVolumeTypeBSSD {
478+
if volume.VolumeType != instance.VolumeServerVolumeTypeBSSD &&
479+
volume.VolumeType != instance.VolumeServerVolumeTypeSbsVolume {
443480
continue
444481
}
445482

internal/namespaces/instance/v1/custom_server_action_test.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
block "github.com/scaleway/scaleway-cli/v2/internal/namespaces/block/v1alpha1"
99
"github.com/scaleway/scaleway-cli/v2/internal/namespaces/instance/v1"
1010
"github.com/scaleway/scaleway-cli/v2/internal/testhelpers"
11+
blockSDK "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1"
1112
instanceSDK "github.com/scaleway/scaleway-sdk-go/api/instance/v1"
1213
"github.com/scaleway/scaleway-sdk-go/scw"
1314
"github.com/stretchr/testify/assert"
@@ -25,7 +26,7 @@ func Test_ServerTerminate(t *testing.T) {
2526
"Server",
2627
testServerCommand("image=ubuntu-jammy ip=new -w"),
2728
),
28-
Cmd: `scw instance server terminate {{ .Server.ID }}`,
29+
Cmd: `scw instance server terminate {{ .Server.ID }} with-block=true`,
2930
Check: core.TestCheckCombine(
3031
core.TestCheckGolden(),
3132
core.TestCheckExitCode(0),
@@ -56,7 +57,7 @@ func Test_ServerTerminate(t *testing.T) {
5657
"Server",
5758
testServerCommand("image=ubuntu-jammy ip=new -w"),
5859
),
59-
Cmd: `scw instance server terminate {{ .Server.ID }} with-ip=true`,
60+
Cmd: `scw instance server terminate {{ .Server.ID }} with-ip=true with-block=true`,
6061
Check: core.TestCheckCombine(
6162
core.TestCheckGolden(),
6263
core.TestCheckExitCode(0),
@@ -98,6 +99,10 @@ func Test_ServerTerminate(t *testing.T) {
9899
`scw block volume wait terminal-status=available {{ (index .Server.Volumes "1").ID }}`,
99100
),
100101
core.ExecAfterCmd(`scw block volume delete {{ (index .Server.Volumes "1").ID }}`),
102+
core.ExecAfterCmd(
103+
`scw block volume wait terminal-status=available {{ (index .Server.Volumes "0").ID }}`,
104+
),
105+
core.ExecAfterCmd(`scw block volume delete {{ (index .Server.Volumes "0").ID }}`),
101106
),
102107
DisableParallel: true,
103108
}))
@@ -114,16 +119,23 @@ func Test_ServerTerminate(t *testing.T) {
114119
core.TestCheckExitCode(0),
115120
func(t *testing.T, ctx *core.CheckFuncCtx) {
116121
t.Helper()
117-
api := instanceSDK.NewAPI(ctx.Client)
122+
api := blockSDK.NewAPI(ctx.Client)
118123
server := testhelpers.MapValue[*instance.ServerWithWarningsResponse](
119124
t,
120125
ctx.Meta,
121126
"Server",
122127
).Server
123-
volume := testhelpers.MapTValue(t, server.Volumes, "0")
128+
rootVolume := testhelpers.MapTValue(t, server.Volumes, "0")
129+
130+
_, err := api.GetVolume(&blockSDK.GetVolumeRequest{
131+
VolumeID: rootVolume.ID,
132+
Zone: server.Zone,
133+
})
134+
require.IsType(t, &scw.ResourceNotFoundError{}, err)
124135

125-
_, err := api.GetVolume(&instanceSDK.GetVolumeRequest{
126-
VolumeID: volume.ID,
136+
additionalVolume := testhelpers.MapTValue(t, server.Volumes, "1")
137+
_, err = api.GetVolume(&blockSDK.GetVolumeRequest{
138+
VolumeID: additionalVolume.ID,
127139
Zone: server.Zone,
128140
})
129141
require.IsType(t, &scw.ResourceNotFoundError{}, err)

0 commit comments

Comments
 (0)