Skip to content

Commit e21ac36

Browse files
authored
Merge pull request #4043 from nickcaballero/fix/vm-clone-invalid-folder
vcsim: handle invalid folder during VM cloning
2 parents 69da7a1 + 0a2f905 commit e21ac36

2 files changed

Lines changed: 45 additions & 13 deletions

File tree

simulator/virtual_machine.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2655,7 +2655,13 @@ func (vm *VirtualMachine) CloneVMTask(ctx *Context, req *types.CloneVM_Task) soa
26552655
destHost = req.Spec.Location.Host
26562656
}
26572657

2658-
folder, _ := asFolderMO(ctx.Map.Get(req.Folder))
2658+
folder, ok := asFolderMO(ctx.Map.Get(req.Folder))
2659+
if !ok {
2660+
return &methods.CloneVM_TaskBody{
2661+
Fault_: Fault("Invalid folder", &types.RuntimeFault{}),
2662+
}
2663+
}
2664+
26592665
host := ctx.Map.Get(*destHost).(*HostSystem)
26602666
event := vm.event(ctx)
26612667

simulator/virtual_machine_test.go

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -437,24 +437,49 @@ func TestCloneVm(t *testing.T) {
437437
vmName string
438438
config types.VirtualMachineCloneSpec
439439
fail bool
440+
folder func(*object.Folder) *object.Folder
440441
}{
441442
{
442-
"clone a vm",
443-
"cloned-vm",
444-
types.VirtualMachineCloneSpec{
443+
name: "clone a vm",
444+
vmName: "cloned-vm",
445+
config: types.VirtualMachineCloneSpec{
445446
Template: false,
446447
PowerOn: false,
447448
},
448-
false,
449+
fail: false,
449450
},
450451
{
451-
"vm name is duplicated",
452-
"DC0_H0_VM0",
453-
types.VirtualMachineCloneSpec{
452+
name: "vm name is duplicated",
453+
vmName: "DC0_H0_VM0",
454+
config: types.VirtualMachineCloneSpec{
454455
Template: false,
455456
PowerOn: false,
456457
},
457-
true,
458+
fail: true,
459+
},
460+
{
461+
name: "clone to non-existent folder",
462+
vmName: "cloned-vm",
463+
config: types.VirtualMachineCloneSpec{
464+
Template: false,
465+
PowerOn: false,
466+
},
467+
fail: true,
468+
folder: func(f *object.Folder) *object.Folder {
469+
return object.NewFolder(f.Client(), types.ManagedObjectReference{Type: "Folder", Value: "invalid-folder-value"})
470+
},
471+
},
472+
{
473+
name: "clone to invalid folder type",
474+
vmName: "cloned-vm",
475+
config: types.VirtualMachineCloneSpec{
476+
Template: false,
477+
PowerOn: false,
478+
},
479+
fail: true,
480+
folder: func(f *object.Folder) *object.Folder {
481+
return object.NewFolder(f.Client(), types.ManagedObjectReference{Type: "HostSystem", Value: "host-12"})
482+
},
458483
},
459484
}
460485

@@ -478,16 +503,17 @@ func TestCloneVm(t *testing.T) {
478503
}
479504

480505
vmFolder := folders.VmFolder
506+
if test.folder != nil {
507+
vmFolder = test.folder(vmFolder)
508+
}
481509

482510
vmm := m.Map().Any("VirtualMachine").(*VirtualMachine)
483511
vm := object.NewVirtualMachine(c, vmm.Reference())
484512

485513
task, err := vm.Clone(ctx, vmFolder, test.vmName, test.config)
486-
if err != nil {
487-
t.Fatal(err)
514+
if err == nil {
515+
err = task.Wait(ctx)
488516
}
489-
490-
err = task.Wait(ctx)
491517
if test.fail {
492518
if err == nil {
493519
t.Errorf("%s: expected error", test.name)

0 commit comments

Comments
 (0)