Skip to content

Commit 89df998

Browse files
authored
feat(instance): support sbs volumes in server update (#4467)
1 parent 05bfd00 commit 89df998

File tree

3 files changed

+512
-249
lines changed

3 files changed

+512
-249
lines changed

internal/namespaces/instance/v1/custom_server.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/fatih/color"
1616
"github.com/scaleway/scaleway-cli/v2/core"
1717
"github.com/scaleway/scaleway-cli/v2/core/human"
18+
block "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1"
1819
"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
1920
"github.com/scaleway/scaleway-sdk-go/api/vpc/v2"
2021
"github.com/scaleway/scaleway-sdk-go/logger"
@@ -291,9 +292,17 @@ func serverUpdateBuilder(c *core.Command) *core.Command {
291292
volumes := make(map[string]*instance.VolumeServerTemplate)
292293
for i, volumeID := range *customRequest.VolumeIDs {
293294
index := strconv.Itoa(i)
294-
volumes[index] = &instance.VolumeServerTemplate{
295-
ID: scw.StringPtr(volumeID),
296-
Name: scw.StringPtr(getServerResponse.Server.Name + "-" + index),
295+
296+
if volumeIsFromSBS(block.NewAPI(client), customRequest.Zone, volumeID) {
297+
volumes[index] = &instance.VolumeServerTemplate{
298+
ID: scw.StringPtr(volumeID),
299+
VolumeType: instance.VolumeVolumeTypeSbsVolume,
300+
}
301+
} else {
302+
volumes[index] = &instance.VolumeServerTemplate{
303+
ID: scw.StringPtr(volumeID),
304+
Name: scw.StringPtr(getServerResponse.Server.Name + "-" + index),
305+
}
297306
}
298307
}
299308
customRequest.Volumes = &volumes
@@ -323,6 +332,15 @@ func serverUpdateBuilder(c *core.Command) *core.Command {
323332
return c
324333
}
325334

335+
func volumeIsFromSBS(api *block.API, zone scw.Zone, volumeID string) bool {
336+
_, err := api.GetVolume(&block.GetVolumeRequest{
337+
Zone: zone,
338+
VolumeID: volumeID,
339+
})
340+
341+
return err == nil
342+
}
343+
326344
func serverGetBuilder(c *core.Command) *core.Command {
327345
// This method is here as a proof of concept before we find the correct way to implement it at larger scale
328346
c.ArgSpecs.GetPositionalArg().AutoCompleteFunc = func(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions {

internal/namespaces/instance/v1/custom_server_test.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -232,20 +232,27 @@ func Test_ServerUpdateCustom(t *testing.T) {
232232
// Volumes cases.
233233
t.Run("Volumes", func(t *testing.T) {
234234
t.Run("valid simple block volume", core.Test(&core.TestConfig{
235-
Commands: instance.GetCommands(),
235+
Commands: core.NewCommandsMerge(
236+
block.GetCommands(),
237+
instance.GetCommands(),
238+
),
236239
BeforeFunc: core.BeforeFuncCombine(
237240
createServerBionic("Server"),
238241
createVolume("Volume", 10, instanceSDK.VolumeVolumeTypeBSSD),
242+
createSbsVolume("VolumeSBS", 10),
243+
),
244+
Cmd: `scw instance server update {{ .Server.ID }} volume-ids.0={{ (index .Server.Volumes "0").ID }} volume-ids.1={{ .Volume.ID }} volume-ids.2={{ .VolumeSBS.ID }}`,
245+
Check: core.TestCheckCombine(
246+
func(t *testing.T, ctx *core.CheckFuncCtx) {
247+
t.Helper()
248+
require.NoError(t, ctx.Err)
249+
size0 := ctx.Result.(*instanceSDK.UpdateServerResponse).Server.Volumes["0"].Size
250+
size1 := ctx.Result.(*instanceSDK.UpdateServerResponse).Server.Volumes["1"].Size
251+
assert.Equal(t, 20*scw.GB, instance.SizeValue(size0), "Size of volume should be 20 GB")
252+
assert.Equal(t, 10*scw.GB, instance.SizeValue(size1), "Size of volume should be 10 GB")
253+
assert.Equal(t, instanceSDK.VolumeServerVolumeTypeSbsVolume, ctx.Result.(*instanceSDK.UpdateServerResponse).Server.Volumes["2"].VolumeType)
254+
},
239255
),
240-
Cmd: `scw instance server update {{ .Server.ID }} volume-ids.0={{ (index .Server.Volumes "0").ID }} volume-ids.1={{ .Volume.ID }}`,
241-
Check: func(t *testing.T, ctx *core.CheckFuncCtx) {
242-
t.Helper()
243-
require.NoError(t, ctx.Err)
244-
size0 := ctx.Result.(*instanceSDK.UpdateServerResponse).Server.Volumes["0"].Size
245-
size1 := ctx.Result.(*instanceSDK.UpdateServerResponse).Server.Volumes["1"].Size
246-
assert.Equal(t, 20*scw.GB, instance.SizeValue(size0), "Size of volume should be 20 GB")
247-
assert.Equal(t, 10*scw.GB, instance.SizeValue(size1), "Size of volume should be 10 GB")
248-
},
249256
AfterFunc: deleteServer("Server"),
250257
}))
251258

0 commit comments

Comments
 (0)