Skip to content

Commit 3bf6282

Browse files
authored
fix(image): update overwrites nullable values (#834)
* feat: add architecture flag #833 * fix: update overwrites nullable values #830
1 parent fcd2067 commit 3bf6282

File tree

8 files changed

+138
-35
lines changed

8 files changed

+138
-35
lines changed

docs/stackit_image_create.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ stackit image create [flags]
2323
### Options
2424

2525
```
26+
--architecture string Sets the CPU architecture. By default x86 is used.
2627
--boot-menu Enables the BIOS bootmenu.
2728
--cdrom-bus string Sets CDROM bus controller type.
2829
--disk-bus string Sets Disk bus controller type.

docs/stackit_image_update.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ stackit image update IMAGE_ID [flags]
2323
### Options
2424

2525
```
26+
--architecture string Sets the CPU architecture.
2627
--boot-menu Enables the BIOS bootmenu.
2728
--cdrom-bus string Sets CDROM bus controller type.
2829
--disk-bus string Sets Disk bus controller type.

internal/cmd/image/create/create.go

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const (
3131
localFilePathFlag = "local-file-path"
3232
noProgressIndicatorFlag = "no-progress"
3333

34+
architectureFlag = "architecture"
3435
bootMenuFlag = "boot-menu"
3536
cdromBusFlag = "cdrom-bus"
3637
diskBusFlag = "disk-bus"
@@ -53,6 +54,7 @@ const (
5354
)
5455

5556
type imageConfig struct {
57+
Architecture *string
5658
BootMenu *bool
5759
CdromBus *string
5860
DiskBus *string
@@ -261,6 +263,7 @@ func configureFlags(cmd *cobra.Command) {
261263
cmd.Flags().String(localFilePathFlag, "", "The path to the local disk image file.")
262264
cmd.Flags().Bool(noProgressIndicatorFlag, false, "Show no progress indicator for upload.")
263265

266+
cmd.Flags().String(architectureFlag, "", "Sets the CPU architecture. By default x86 is used.")
264267
cmd.Flags().Bool(bootMenuFlag, false, "Enables the BIOS bootmenu.")
265268
cmd.Flags().String(cdromBusFlag, "", "Sets CDROM bus controller type.")
266269
cmd.Flags().String(diskBusFlag, "", "Sets Disk bus controller type.")
@@ -302,6 +305,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) {
302305
Labels: flags.FlagToStringToStringPointer(p, cmd, labelsFlag),
303306
NoProgressIndicator: flags.FlagToBoolPointer(p, cmd, noProgressIndicatorFlag),
304307
Config: &imageConfig{
308+
Architecture: flags.FlagToStringPointer(p, cmd, architectureFlag),
305309
BootMenu: flags.FlagToBoolPointer(p, cmd, bootMenuFlag),
306310
CdromBus: flags.FlagToStringPointer(p, cmd, cdromBusFlag),
307311
DiskBus: flags.FlagToStringPointer(p, cmd, diskBusFlag),
@@ -348,21 +352,47 @@ func createPayload(_ context.Context, model *inputModel) iaas.CreateImagePayload
348352
MinRam: model.MinRam,
349353
Protected: model.Protected,
350354
}
351-
if model.Config != nil {
352-
payload.Config = &iaas.ImageConfig{
353-
BootMenu: model.Config.BootMenu,
354-
CdromBus: iaas.NewNullableString(model.Config.CdromBus),
355-
DiskBus: iaas.NewNullableString(model.Config.DiskBus),
356-
NicModel: iaas.NewNullableString(model.Config.NicModel),
357-
OperatingSystem: model.Config.OperatingSystem,
358-
OperatingSystemDistro: iaas.NewNullableString(model.Config.OperatingSystemDistro),
359-
OperatingSystemVersion: iaas.NewNullableString(model.Config.OperatingSystemVersion),
360-
RescueBus: iaas.NewNullableString(model.Config.RescueBus),
361-
RescueDevice: iaas.NewNullableString(model.Config.RescueDevice),
362-
SecureBoot: model.Config.SecureBoot,
363-
Uefi: utils.Ptr(model.Config.Uefi),
364-
VideoModel: iaas.NewNullableString(model.Config.VideoModel),
365-
VirtioScsi: model.Config.VirtioScsi,
355+
if config := model.Config; config != nil {
356+
payload.Config = &iaas.ImageConfig{}
357+
payload.Config.Uefi = utils.Ptr(config.Uefi)
358+
if config.Architecture != nil {
359+
payload.Config.Architecture = model.Config.Architecture
360+
}
361+
if config.BootMenu != nil {
362+
payload.Config.BootMenu = model.Config.BootMenu
363+
}
364+
if config.CdromBus != nil {
365+
payload.Config.CdromBus = iaas.NewNullableString(model.Config.CdromBus)
366+
}
367+
if config.DiskBus != nil {
368+
payload.Config.DiskBus = iaas.NewNullableString(config.DiskBus)
369+
}
370+
if config.NicModel != nil {
371+
payload.Config.NicModel = iaas.NewNullableString(config.NicModel)
372+
}
373+
if config.OperatingSystem != nil {
374+
payload.Config.OperatingSystem = config.OperatingSystem
375+
}
376+
if config.OperatingSystemDistro != nil {
377+
payload.Config.OperatingSystemDistro = iaas.NewNullableString(config.OperatingSystemDistro)
378+
}
379+
if config.OperatingSystemVersion != nil {
380+
payload.Config.OperatingSystemVersion = iaas.NewNullableString(config.OperatingSystemVersion)
381+
}
382+
if config.RescueBus != nil {
383+
payload.Config.RescueBus = iaas.NewNullableString(config.RescueBus)
384+
}
385+
if config.RescueDevice != nil {
386+
payload.Config.RescueDevice = iaas.NewNullableString(config.RescueDevice)
387+
}
388+
if config.SecureBoot != nil {
389+
payload.Config.SecureBoot = config.SecureBoot
390+
}
391+
if config.VideoModel != nil {
392+
payload.Config.VideoModel = iaas.NewNullableString(config.VideoModel)
393+
}
394+
if config.VirtioScsi != nil {
395+
payload.Config.VirtioScsi = config.VirtioScsi
366396
}
367397
}
368398

internal/cmd/image/create/create_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ var (
3939
testOperatingSystemVersion = "test-distro-version"
4040
testRescueBus = "test-rescue-bus"
4141
testRescueDevice = "test-rescue-device"
42+
testArchitecture = "arm64"
4243
testBootmenu = true
4344
testSecureBoot = true
4445
testUefi = true
@@ -54,6 +55,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st
5455
nameFlag: testName,
5556
diskFormatFlag: testDiskFormat,
5657
localFilePathFlag: testLocalImagePath,
58+
architectureFlag: testArchitecture,
5759
bootMenuFlag: strconv.FormatBool(testBootmenu),
5860
cdromBusFlag: testCdRomBus,
5961
diskBusFlag: testDiskBus,
@@ -96,6 +98,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
9698
LocalFilePath: testLocalImagePath,
9799
Labels: utils.Ptr(parseLabels(testLabels)),
98100
Config: &imageConfig{
101+
Architecture: &testArchitecture,
99102
BootMenu: &testBootmenu,
100103
CdromBus: &testCdRomBus,
101104
DiskBus: &testDiskBus,
@@ -123,6 +126,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
123126
func fixtureCreatePayload(mods ...func(payload *iaas.CreateImagePayload)) (payload iaas.CreateImagePayload) {
124127
payload = iaas.CreateImagePayload{
125128
Config: &iaas.ImageConfig{
129+
Architecture: &testArchitecture,
126130
BootMenu: &testBootmenu,
127131
CdromBus: iaas.NewNullableString(&testCdRomBus),
128132
DiskBus: iaas.NewNullableString(&testDiskBus),

internal/cmd/image/describe/describe.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ func outputResult(p *print.Printer, outputFormat string, resp *iaas.Image) error
141141
table.AddSeparator()
142142
}
143143
if config := resp.Config; config != nil {
144+
if architecture := config.Architecture; architecture != nil {
145+
table.AddRow("ARCHITECTURE", *architecture)
146+
table.AddSeparator()
147+
}
144148
if os := config.OperatingSystem; os != nil {
145149
table.AddRow("OPERATING SYSTEM", *os)
146150
table.AddSeparator()

internal/cmd/image/list/list.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,18 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) err
165165
return nil
166166
default:
167167
table := tables.NewTable()
168-
table.SetHeader("ID", "NAME", "OS", "DISTRIBUTION", "VERSION", "LABELS")
168+
table.SetHeader("ID", "NAME", "OS", "ARCHITECTURE", "DISTRIBUTION", "VERSION", "LABELS")
169169
for _, item := range items {
170170
var (
171-
os string = "n/a"
172-
distro string = "n/a"
173-
version string = "n/a"
171+
architecture string = "n/a"
172+
os string = "n/a"
173+
distro string = "n/a"
174+
version string = "n/a"
174175
)
175176
if cfg := item.Config; cfg != nil {
177+
if v := cfg.Architecture; v != nil {
178+
architecture = *v
179+
}
176180
if v := cfg.OperatingSystem; v != nil {
177181
os = *v
178182
}
@@ -186,6 +190,7 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) err
186190
table.AddRow(utils.PtrString(item.Id),
187191
utils.PtrString(item.Name),
188192
os,
193+
architecture,
189194
distro,
190195
version,
191196
utils.JoinStringKeysPtr(*item.Labels, ","))

internal/cmd/image/update/update.go

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
)
2121

2222
type imageConfig struct {
23+
Architecture *string
2324
BootMenu *bool
2425
CdromBus *string
2526
DiskBus *string
@@ -80,6 +81,7 @@ const (
8081
nameFlag = "name"
8182
diskFormatFlag = "disk-format"
8283

84+
architectureFlag = "architecture"
8385
bootMenuFlag = "boot-menu"
8486
cdromBusFlag = "cdrom-bus"
8587
diskBusFlag = "disk-bus"
@@ -98,7 +100,6 @@ const (
98100

99101
minDiskSizeFlag = "min-disk-size"
100102
minRamFlag = "min-ram"
101-
ownerFlag = "owner"
102103
protectedFlag = "protected"
103104
)
104105

@@ -166,6 +167,7 @@ func configureFlags(cmd *cobra.Command) {
166167
cmd.Flags().String(nameFlag, "", "The name of the image.")
167168
cmd.Flags().String(diskFormatFlag, "", "The disk format of the image. ")
168169

170+
cmd.Flags().String(architectureFlag, "", "Sets the CPU architecture.")
169171
cmd.Flags().Bool(bootMenuFlag, false, "Enables the BIOS bootmenu.")
170172
cmd.Flags().String(cdromBusFlag, "", "Sets CDROM bus controller type.")
171173
cmd.Flags().String(diskBusFlag, "", "Sets Disk bus controller type.")
@@ -203,6 +205,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM
203205
DiskFormat: flags.FlagToStringPointer(p, cmd, diskFormatFlag),
204206
Labels: flags.FlagToStringToStringPointer(p, cmd, labelsFlag),
205207
Config: &imageConfig{
208+
Architecture: flags.FlagToStringPointer(p, cmd, architectureFlag),
206209
BootMenu: flags.FlagToBoolPointer(p, cmd, bootMenuFlag),
207210
CdromBus: flags.FlagToStringPointer(p, cmd, cdromBusFlag),
208211
DiskBus: flags.FlagToStringPointer(p, cmd, diskBusFlag),
@@ -226,6 +229,10 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM
226229
return nil, fmt.Errorf("no flags have been passed")
227230
}
228231

232+
if model.Config.isEmpty() {
233+
model.Config = nil
234+
}
235+
229236
if p.IsVerbosityDebug() {
230237
modelStr, err := print.BuildDebugStrFromInputModel(model)
231238
if err != nil {
@@ -249,22 +256,48 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli
249256
payload.MinRam = model.MinRam
250257
payload.Name = model.Name
251258
payload.Protected = model.Protected
259+
payload.Config = nil
252260

253-
if model.Config != nil {
254-
payload.Config = &iaas.ImageConfig{
255-
BootMenu: model.Config.BootMenu,
256-
CdromBus: iaas.NewNullableString(model.Config.CdromBus),
257-
DiskBus: iaas.NewNullableString(model.Config.DiskBus),
258-
NicModel: iaas.NewNullableString(model.Config.NicModel),
259-
OperatingSystem: model.Config.OperatingSystem,
260-
OperatingSystemDistro: iaas.NewNullableString(model.Config.OperatingSystemDistro),
261-
OperatingSystemVersion: iaas.NewNullableString(model.Config.OperatingSystemVersion),
262-
RescueBus: iaas.NewNullableString(model.Config.RescueBus),
263-
RescueDevice: iaas.NewNullableString(model.Config.RescueDevice),
264-
SecureBoot: model.Config.SecureBoot,
265-
Uefi: model.Config.Uefi,
266-
VideoModel: iaas.NewNullableString(model.Config.VideoModel),
267-
VirtioScsi: model.Config.VirtioScsi,
261+
if config := model.Config; config != nil {
262+
payload.Config = &iaas.ImageConfig{}
263+
if model.Config.BootMenu != nil {
264+
payload.Config.BootMenu = model.Config.BootMenu
265+
}
266+
if model.Config.CdromBus != nil {
267+
payload.Config.CdromBus = iaas.NewNullableString(model.Config.CdromBus)
268+
}
269+
if model.Config.DiskBus != nil {
270+
payload.Config.DiskBus = iaas.NewNullableString(model.Config.DiskBus)
271+
}
272+
if model.Config.NicModel != nil {
273+
payload.Config.NicModel = iaas.NewNullableString(model.Config.NicModel)
274+
}
275+
if model.Config.OperatingSystem != nil {
276+
payload.Config.OperatingSystem = model.Config.OperatingSystem
277+
}
278+
if model.Config.OperatingSystemDistro != nil {
279+
payload.Config.OperatingSystemDistro = iaas.NewNullableString(model.Config.OperatingSystemDistro)
280+
}
281+
if model.Config.OperatingSystemVersion != nil {
282+
payload.Config.OperatingSystemVersion = iaas.NewNullableString(model.Config.OperatingSystemVersion)
283+
}
284+
if model.Config.RescueBus != nil {
285+
payload.Config.RescueBus = iaas.NewNullableString(model.Config.RescueBus)
286+
}
287+
if model.Config.RescueDevice != nil {
288+
payload.Config.RescueDevice = iaas.NewNullableString(model.Config.RescueDevice)
289+
}
290+
if model.Config.SecureBoot != nil {
291+
payload.Config.SecureBoot = model.Config.SecureBoot
292+
}
293+
if model.Config.Uefi != nil {
294+
payload.Config.Uefi = model.Config.Uefi
295+
}
296+
if model.Config.VideoModel != nil {
297+
payload.Config.VideoModel = iaas.NewNullableString(model.Config.VideoModel)
298+
}
299+
if model.Config.VirtioScsi != nil {
300+
payload.Config.VirtioScsi = model.Config.VirtioScsi
268301
}
269302
}
270303

internal/cmd/image/update/update_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,20 @@ func TestParseInput(t *testing.T) {
298298
model.Config.RescueDevice = nil
299299
}),
300300
},
301+
{
302+
description: "update only name",
303+
flagValues: map[string]string{
304+
projectIdFlag: testProjectId,
305+
nameFlag: "foo",
306+
},
307+
args: testImageId,
308+
isValid: true,
309+
expectedModel: &inputModel{
310+
Name: utils.Ptr("foo"),
311+
GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault},
312+
Id: testImageId[0],
313+
},
314+
},
301315
}
302316

303317
for _, tt := range tests {
@@ -400,6 +414,17 @@ func TestBuildRequest(t *testing.T) {
400414
}))
401415
}),
402416
},
417+
{
418+
description: "no config set",
419+
model: fixtureInputModel(func(model *inputModel) {
420+
model.Config = nil
421+
}),
422+
expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateImageRequest) {
423+
*request = (*request).UpdateImagePayload(fixtureCreatePayload(func(payload *iaas.UpdateImagePayload) {
424+
payload.Config = nil
425+
}))
426+
}),
427+
},
403428
}
404429

405430
for _, tt := range tests {

0 commit comments

Comments
 (0)