Skip to content

Commit 5ef4aaa

Browse files
committed
fix: DiskFileOperation must consider both capacity fields
Config spec helpers have logic to clear the DiskFileOperation for existing disks, when 'CapacityInKB' is '0'. But we also need to check 'Capacity'. Refactor some duplicate code into a separate function. Closes #2805
1 parent 806905d commit 5ef4aaa

File tree

3 files changed

+74
-37
lines changed

3 files changed

+74
-37
lines changed

object/virtual_device_list.go

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -939,25 +939,9 @@ func (l VirtualDeviceList) ConfigSpec(op types.VirtualDeviceConfigSpecOperation)
939939
var res []types.BaseVirtualDeviceConfigSpec
940940
for _, device := range l {
941941
config := &types.VirtualDeviceConfigSpec{
942-
Device: device,
943-
Operation: op,
944-
}
945-
946-
if disk, ok := device.(*types.VirtualDisk); ok {
947-
config.FileOperation = fop
948-
949-
// Special case to attach an existing disk
950-
if op == types.VirtualDeviceConfigSpecOperationAdd && disk.CapacityInKB == 0 {
951-
childDisk := false
952-
if b, ok := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok {
953-
childDisk = b.Parent != nil
954-
}
955-
956-
if !childDisk {
957-
// Existing disk, clear file operation
958-
config.FileOperation = ""
959-
}
960-
}
942+
Device: device,
943+
Operation: op,
944+
FileOperation: diskFileOperation(op, fop, device),
961945
}
962946

963947
res = append(res, config)

object/virtual_machine.go

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -461,29 +461,33 @@ func (v VirtualMachine) ResourcePool(ctx context.Context) (*ResourcePool, error)
461461
return NewResourcePool(v.c, *rp), nil
462462
}
463463

464-
func (v VirtualMachine) configureDevice(ctx context.Context, op types.VirtualDeviceConfigSpecOperation, fop types.VirtualDeviceConfigSpecFileOperation, devices ...types.BaseVirtualDevice) error {
465-
spec := types.VirtualMachineConfigSpec{}
464+
func diskFileOperation(op types.VirtualDeviceConfigSpecOperation, fop types.VirtualDeviceConfigSpecFileOperation, device types.BaseVirtualDevice) types.VirtualDeviceConfigSpecFileOperation {
465+
if disk, ok := device.(*types.VirtualDisk); ok {
466+
// Special case to attach an existing disk
467+
if op == types.VirtualDeviceConfigSpecOperationAdd && disk.CapacityInKB == 0 && disk.CapacityInBytes == 0 {
468+
childDisk := false
469+
if b, ok := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok {
470+
childDisk = b.Parent != nil
471+
}
466472

467-
for _, device := range devices {
468-
config := &types.VirtualDeviceConfigSpec{
469-
Device: device,
470-
Operation: op,
473+
if !childDisk {
474+
fop = "" // existing disk
475+
}
471476
}
477+
return fop
478+
}
472479

473-
if disk, ok := device.(*types.VirtualDisk); ok {
474-
config.FileOperation = fop
480+
return ""
481+
}
475482

476-
// Special case to attach an existing disk
477-
if op == types.VirtualDeviceConfigSpecOperationAdd && disk.CapacityInKB == 0 {
478-
childDisk := false
479-
if b, ok := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok {
480-
childDisk = b.Parent != nil
481-
}
483+
func (v VirtualMachine) configureDevice(ctx context.Context, op types.VirtualDeviceConfigSpecOperation, fop types.VirtualDeviceConfigSpecFileOperation, devices ...types.BaseVirtualDevice) error {
484+
spec := types.VirtualMachineConfigSpec{}
482485

483-
if !childDisk {
484-
config.FileOperation = "" // existing disk
485-
}
486-
}
486+
for _, device := range devices {
487+
config := &types.VirtualDeviceConfigSpec{
488+
Device: device,
489+
Operation: op,
490+
FileOperation: diskFileOperation(op, fop, device),
487491
}
488492

489493
spec.DeviceChange = append(spec.DeviceChange, config)

object/virtual_machine_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,52 @@ func TestVirtualMachineSnapshotMap(t *testing.T) {
204204
}
205205
}
206206
}
207+
208+
func TestDiskFileOperation(t *testing.T) {
209+
backing := &types.VirtualDiskFlatVer2BackingInfo{
210+
VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{
211+
FileName: "[datastore1] data/disk1.vmdk",
212+
},
213+
Parent: nil,
214+
}
215+
216+
parent := &types.VirtualDiskFlatVer2BackingInfo{
217+
VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{
218+
FileName: "[datastore1] data/parent.vmdk",
219+
},
220+
}
221+
222+
disk := &types.VirtualDisk{
223+
VirtualDevice: types.VirtualDevice{
224+
Backing: backing,
225+
},
226+
}
227+
228+
op := types.VirtualDeviceConfigSpecOperationAdd
229+
fop := types.VirtualDeviceConfigSpecFileOperationCreate
230+
231+
res := diskFileOperation(op, fop, disk)
232+
if res != "" {
233+
t.Errorf("res=%s", res)
234+
}
235+
236+
disk.CapacityInKB = 1
237+
res = diskFileOperation(op, fop, disk)
238+
if res != types.VirtualDeviceConfigSpecFileOperationCreate {
239+
t.Errorf("res=%s", res)
240+
}
241+
242+
disk.CapacityInKB = 0
243+
disk.CapacityInBytes = 1
244+
res = diskFileOperation(op, fop, disk)
245+
if res != types.VirtualDeviceConfigSpecFileOperationCreate {
246+
t.Errorf("res=%s", res)
247+
}
248+
249+
disk.CapacityInBytes = 0
250+
backing.Parent = parent
251+
res = diskFileOperation(op, fop, disk)
252+
if res != types.VirtualDeviceConfigSpecFileOperationCreate {
253+
t.Errorf("res=%s", res)
254+
}
255+
}

0 commit comments

Comments
 (0)