Skip to content

Commit bc09f66

Browse files
fix: use cdroms len instead of ISOPaths len (#394)
* common: factor out a function to list cdrom devices * common: use cdroms len instead of ISOPaths len * driver/vm_mock: nil-out added ISO paths in EjectCdroms * docs: Add the documentation for `reattach_cdroms` to the generated documentation. --------- Signed-off-by: Ryan Johnson <ryan.johnson@broadcom.com> Co-authored-by: Ryan Johnson <ryan.johnson@broadcom.com>
1 parent 27b6be6 commit bc09f66

9 files changed

Lines changed: 68 additions & 19 deletions

File tree

.web-docs/components/builder/vsphere-iso/README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,17 @@ iso_paths = [
702702
<!-- End of code generated from the comments of the RemoveCDRomConfig struct in builder/vsphere/common/step_remove_cdrom.go; -->
703703

704704

705+
<!-- Code generated from the comments of the ReattachCDRomConfig struct in builder/vsphere/common/step_reattach_cdrom.go; DO NOT EDIT MANUALLY -->
706+
707+
- `reattach_cdroms` (int) - Reattach one or more configured CD-ROM devices. Range: 1-4.
708+
You can reattach up to 4 CD-ROM devices to the final build artifact.
709+
If set to 0, `reattach_cdroms` is ignored and the step is skipped.
710+
When set to a value in the range, `remove_cdrom` is ignored and
711+
the CD-ROM devices are kept without any attached media.
712+
713+
<!-- End of code generated from the comments of the ReattachCDRomConfig struct in builder/vsphere/common/step_reattach_cdrom.go; -->
714+
715+
705716
<!-- Code generated from the comments of the CDConfig struct in multistep/commonsteps/extra_iso_config.go; DO NOT EDIT MANUALLY -->
706717

707718
An iso (CD) containing custom files can be made available for your build.

builder/vsphere/common/step_add_cdrom_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/google/go-cmp/cmp/cmpopts"
1313
"github.com/hashicorp/packer-plugin-sdk/multistep"
1414
"github.com/hashicorp/packer-plugin-vsphere/builder/vsphere/driver"
15+
"github.com/vmware/govmomi/object"
1516
)
1617

1718
func TestCDRomConfig_Prepare(t *testing.T) {
@@ -97,6 +98,7 @@ func TestStepAddCDRom_Run(t *testing.T) {
9798
AddCdromCalledTimes: 3,
9899
AddCdromTypes: []string{"sata", "sata", "sata"},
99100
AddCdromPaths: []string{"remote/path", "iso/path", "cd/path"},
101+
CdromDevicesList: object.VirtualDeviceList{nil, nil, nil},
100102
},
101103
fail: false,
102104
errMessage: "",
@@ -156,6 +158,7 @@ func TestStepAddCDRom_Run(t *testing.T) {
156158
AddCdromCalledTimes: 1,
157159
AddCdromTypes: []string{"ide"},
158160
AddCdromPaths: []string{"iso/path"},
161+
CdromDevicesList: object.VirtualDeviceList{nil},
159162
},
160163
fail: false,
161164
errMessage: "",
@@ -176,6 +179,7 @@ func TestStepAddCDRom_Run(t *testing.T) {
176179
AddCdromCalledTimes: 1,
177180
AddCdromTypes: []string{""},
178181
AddCdromPaths: []string{"iso/path"},
182+
CdromDevicesList: object.VirtualDeviceList{nil},
179183
},
180184
fail: true,
181185
errMessage: fmt.Sprintf("error mounting an image 'iso/path': %v", fmt.Errorf("AddCdrom error")),
@@ -194,6 +198,7 @@ func TestStepAddCDRom_Run(t *testing.T) {
194198
AddCdromCalledTimes: 1,
195199
AddCdromTypes: []string{""},
196200
AddCdromPaths: []string{"remote/path"},
201+
CdromDevicesList: object.VirtualDeviceList{nil},
197202
},
198203
fail: true,
199204
errMessage: fmt.Sprintf("error mounting an image 'remote/path': %v", fmt.Errorf("AddCdrom error")),

builder/vsphere/common/step_reattach_cdrom.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ func (s *StepReattachCDRom) Run(_ context.Context, state multistep.StateBag) mul
5151

5252
// Add the CD-ROM devices to the image based on the value of `reattach_cdroms`.
5353
// A valid ISO path is required for this step. The media will subsequently be ejected.
54-
nAttachableCdroms := ReattachCDRom - len(s.CDRomConfig.ISOPaths)
54+
cdroms, err := vm.CdromDevices()
55+
if err != nil {
56+
state.Put("error listing cdrom devices: %v", err)
57+
return multistep.ActionHalt
58+
}
59+
nAttachableCdroms := ReattachCDRom - len(cdroms)
5560
if nAttachableCdroms < 0 {
5661
err = vm.RemoveNCdroms(int(math.Abs(float64(nAttachableCdroms))))
5762
if err != nil {

builder/vsphere/common/step_reattach_cdrom_test.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/hashicorp/packer-plugin-sdk/multistep"
1515
"github.com/hashicorp/packer-plugin-sdk/packer"
1616
"github.com/hashicorp/packer-plugin-vsphere/builder/vsphere/driver"
17+
"github.com/vmware/govmomi/object"
1718
)
1819

1920
func TestStepReattachCDRom_Run(t *testing.T) {
@@ -40,17 +41,16 @@ func TestStepReattachCDRom_Run(t *testing.T) {
4041
expectedAction: multistep.ActionContinue,
4142
vmMock: &driver.VirtualMachineMock{
4243
ReattachCDRomsCalled: true,
44+
CdromDevicesList: object.VirtualDeviceList{nil},
4345
},
4446
expectedVmMock: &driver.VirtualMachineMock{
4547
EjectCdromsCalled: true,
48+
CdromDevicesCalled: true,
49+
CdromDevicesList: object.VirtualDeviceList{nil, nil, nil, nil},
4650
ReattachCDRomsCalled: true,
4751
FindSATAControllerCalled: true,
48-
AddCdromCalledTimes: 6,
49-
AddCdromTypes: []string{
50-
"sata", "sata",
51-
"sata", "sata",
52-
"sata", "sata",
53-
},
52+
AddCdromCalledTimes: 3,
53+
AddCdromTypes: []string{"sata", "sata", "sata"},
5454
},
5555
fail: false,
5656
},
@@ -73,12 +73,15 @@ func TestStepReattachCDRom_Run(t *testing.T) {
7373
expectedAction: multistep.ActionContinue,
7474
vmMock: &driver.VirtualMachineMock{
7575
ReattachCDRomsCalled: true,
76+
CdromDevicesList: object.VirtualDeviceList{nil, nil, nil, nil},
7677
},
7778
expectedVmMock: &driver.VirtualMachineMock{
7879
RemoveNCdromsCalled: true,
7980
EjectCdromsCalled: true,
81+
CdromDevicesCalled: true,
8082
ReattachCDRomsCalled: true,
8183
AddCdromCalledTimes: 0,
84+
CdromDevicesList: object.VirtualDeviceList{nil, nil},
8285
},
8386
fail: false,
8487
},
@@ -99,11 +102,14 @@ func TestStepReattachCDRom_Run(t *testing.T) {
99102
expectedAction: multistep.ActionContinue,
100103
vmMock: &driver.VirtualMachineMock{
101104
ReattachCDRomsCalled: true,
105+
CdromDevicesList: object.VirtualDeviceList{nil, nil},
102106
},
103107
expectedVmMock: &driver.VirtualMachineMock{
104108
EjectCdromsCalled: true,
109+
CdromDevicesCalled: true,
105110
ReattachCDRomsCalled: true,
106111
AddCdromCalledTimes: 0,
112+
CdromDevicesList: object.VirtualDeviceList{nil, nil},
107113
},
108114
fail: false,
109115
},

builder/vsphere/driver/vm.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
type VirtualMachine interface {
2828
Info(params ...string) (*mo.VirtualMachine, error)
2929
Devices() (object.VirtualDeviceList, error)
30+
CdromDevices() (object.VirtualDeviceList, error)
3031
FloppyDevices() (object.VirtualDeviceList, error)
3132
Clone(ctx context.Context, config *CloneConfig) (VirtualMachine, error)
3233
updateVAppConfig(ctx context.Context, newProps map[string]string) (*types.VmConfigSpec, error)
@@ -313,6 +314,15 @@ func (vm *VirtualMachineDriver) FloppyDevices() (object.VirtualDeviceList, error
313314
return floppies, nil
314315
}
315316

317+
func (vm *VirtualMachineDriver) CdromDevices() (object.VirtualDeviceList, error) {
318+
device, err := vm.Devices()
319+
if err != nil {
320+
return device, err
321+
}
322+
floppies := device.SelectByType((*types.VirtualCdrom)(nil))
323+
return floppies, nil
324+
}
325+
316326
func (vm *VirtualMachineDriver) Clone(ctx context.Context, config *CloneConfig) (VirtualMachine, error) {
317327
folder, err := vm.driver.FindFolder(config.Folder)
318328
if err != nil {

builder/vsphere/driver/vm_cdrom.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,10 @@ func (vm *VirtualMachineDriver) RemoveNCdroms(n int) error {
8080
if n == 0 {
8181
return nil
8282
}
83-
devices, err := vm.Devices()
83+
cdroms, err := vm.CdromDevices()
8484
if err != nil {
8585
return err
8686
}
87-
cdroms := devices.SelectByType((*types.VirtualCdrom)(nil))
8887
if (n < 0) || (n > len(cdroms)) {
8988
return fmt.Errorf("invalid number: n must be between 0 and %d", len(cdroms))
9089
}
@@ -98,11 +97,10 @@ func (vm *VirtualMachineDriver) RemoveNCdroms(n int) error {
9897
}
9998

10099
func (vm *VirtualMachineDriver) EjectCdroms() error {
101-
devices, err := vm.Devices()
100+
cdroms, err := vm.CdromDevices()
102101
if err != nil {
103102
return err
104103
}
105-
cdroms := devices.SelectByType((*types.VirtualCdrom)(nil))
106104
for _, cd := range cdroms {
107105
c := cd.(*types.VirtualCdrom)
108106
c.Backing = &types.VirtualCdromRemotePassthroughBackingInfo{}

builder/vsphere/driver/vm_cdrom_test.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,10 @@ func TestVirtualMachineDriver_CreateAndRemoveCdrom(t *testing.T) {
7575
}
7676

7777
// Verify if CDROM was created
78-
devices, err := vm.Devices()
78+
cdroms, err := vm.CdromDevices()
7979
if err != nil {
8080
t.Fatalf("should not fail: %s", err.Error())
8181
}
82-
cdroms := devices.SelectByType((*types.VirtualCdrom)(nil))
8382
if len(cdroms) != 1 {
8483
t.Fatalf("unexpected numbers of cdrom: %d", len(cdroms))
8584
}
@@ -90,11 +89,10 @@ func TestVirtualMachineDriver_CreateAndRemoveCdrom(t *testing.T) {
9089
t.Fatalf("should not fail: %s", err.Error())
9190
}
9291
// Verify if CDROM was removed
93-
devices, err = vm.Devices()
92+
cdroms, err = vm.CdromDevices()
9493
if err != nil {
9594
t.Fatalf("should not fail: %s", err.Error())
9695
}
97-
cdroms = devices.SelectByType((*types.VirtualCdrom)(nil))
9896
if len(cdroms) != 0 {
9997
t.Fatalf("unexpected numbers of cdrom: %d", len(cdroms))
10098
}
@@ -134,11 +132,10 @@ func TestVirtualMachineDriver_EjectCdrom(t *testing.T) {
134132
}
135133

136134
// Verify if CDROM was created
137-
devices, err := vm.Devices()
135+
cdroms, err := vm.CdromDevices()
138136
if err != nil {
139137
t.Fatalf("should not fail: %s", err.Error())
140138
}
141-
cdroms := devices.SelectByType((*types.VirtualCdrom)(nil))
142139
if len(cdroms) != 1 {
143140
t.Fatalf("unexpected numbers of cdrom: %d", len(cdroms))
144141
}
@@ -149,11 +146,10 @@ func TestVirtualMachineDriver_EjectCdrom(t *testing.T) {
149146
t.Fatalf("should not fail: %s", err.Error())
150147
}
151148
// Verify if CDROM was removed
152-
devices, err = vm.Devices()
149+
cdroms, err = vm.CdromDevices()
153150
if err != nil {
154151
t.Fatalf("should not fail: %s", err.Error())
155152
}
156-
cdroms = devices.SelectByType((*types.VirtualCdrom)(nil))
157153
if len(cdroms) != 1 {
158154
t.Fatalf("unexpected numbers of cdrom: %d", len(cdroms))
159155
}

builder/vsphere/driver/vm_mock.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ type VirtualMachineMock struct {
5353
FloppyDevicesReturn object.VirtualDeviceList
5454
FloppyDevicesCalled bool
5555

56+
CdromDevicesErr error
57+
CdromDevicesList object.VirtualDeviceList
58+
CdromDevicesCalled bool
59+
5660
RemoveDeviceErr error
5761
RemoveDeviceCalled bool
5862
RemoveDeviceKeepFiles bool
@@ -88,6 +92,11 @@ func (vm *VirtualMachineMock) FloppyDevices() (object.VirtualDeviceList, error)
8892
return vm.FloppyDevicesReturn, vm.FloppyDevicesErr
8993
}
9094

95+
func (vm *VirtualMachineMock) CdromDevices() (object.VirtualDeviceList, error) {
96+
vm.CdromDevicesCalled = true
97+
return vm.CdromDevicesList, vm.CdromDevicesErr
98+
}
99+
91100
func (vm *VirtualMachineMock) Clone(ctx context.Context, config *CloneConfig) (VirtualMachine, error) {
92101
vm.CloneCalled = true
93102
vm.CloneConfig = config
@@ -191,6 +200,7 @@ func (vm *VirtualMachineMock) GetDir() (string, error) {
191200
func (vm *VirtualMachineMock) AddCdrom(controllerType string, isoPath string) error {
192201
vm.AddCdromCalledTimes++
193202
vm.AddCdromTypes = append(vm.AddCdromTypes, controllerType)
203+
vm.CdromDevicesList = append(vm.CdromDevicesList, nil)
194204
if isoPath != "" {
195205
vm.AddCdromPaths = append(vm.AddCdromPaths, isoPath)
196206
}
@@ -266,11 +276,16 @@ func (vm *VirtualMachineMock) CreateCdrom(c *types.VirtualController) (*types.Vi
266276

267277
func (vm *VirtualMachineMock) RemoveCdroms() error {
268278
vm.RemoveCdromsCalled = true
279+
vm.CdromDevicesList = nil
269280
return vm.RemoveCdromsErr
270281
}
271282

272283
func (vm *VirtualMachineMock) RemoveNCdroms(n_cdroms int) error {
273284
vm.RemoveNCdromsCalled = true
285+
if n_cdroms == 0 {
286+
return nil
287+
}
288+
vm.CdromDevicesList = vm.CdromDevicesList[:n_cdroms]
274289
return vm.RemoveNCdromsErr
275290
}
276291

@@ -280,6 +295,7 @@ func (vm *VirtualMachineMock) ReattachCDRoms() error {
280295

281296
func (vm *VirtualMachineMock) EjectCdroms() error {
282297
vm.EjectCdromsCalled = true
298+
vm.AddCdromPaths = nil
283299
return vm.EjectCdromsErr
284300
}
285301

docs/builders/vsphere-iso.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ iso_paths = [
168168

169169
@include 'builder/vsphere/common/RemoveCDRomConfig-not-required.mdx'
170170

171+
@include 'builder/vsphere/common/ReattachCDRomConfig-not-required.mdx'
172+
171173
@include 'packer-plugin-sdk/multistep/commonsteps/CDConfig.mdx'
172174

173175
## Optional:

0 commit comments

Comments
 (0)