in src/com/vmware/vim25/mox/VirtualMachineDeviceManager.java [761:850]
public Task removeDevices(List<VirtualDevice> deviceList, boolean destroyDeviceBacking) throws InvalidName, VmConfigFault, DuplicateName, TaskInProgress, FileFault, InvalidState, ConcurrentAccess, InvalidDatastore, InsufficientResourcesFault, RuntimeFault, RemoteException
{
List<VirtualDeviceConfigSpec> configSpecList = new ArrayList<VirtualDeviceConfigSpec>();
boolean allDevicesSupportHotRemoval = allSupportHotRemoval(deviceList);
VirtualMachinePowerState powerState = vm.getRuntime().getPowerState();
if (!allDevicesSupportHotRemoval && powerState!= VirtualMachinePowerState.poweredOff )
{
throw new RuntimeException("Invalid power state: power off the VM first.");
}
for(VirtualDevice device : deviceList)
{
try
{
// Empty SCSI controller removal
// If the device's SCSI controller will get free after device removal
// then also remove the controller. But only if the VM is powered off.
if (device instanceof VirtualDisk && powerState == VirtualMachinePowerState.poweredOff)
{
List<VirtualSCSIController> contollerList = getVirtualDevicesOfType(VirtualSCSIController.class);
for(VirtualSCSIController controller : contollerList)
{
if (controller.key == device.controllerKey)
{
if (controller.device.length == 1 && controller.device[0] == device.key)
{
VirtualDeviceConfigSpec controllerSpec = new VirtualDeviceConfigSpec();
controllerSpec.operation = VirtualDeviceConfigSpecOperation.remove;
controllerSpec.device = controller;
configSpecList.add(controllerSpec);
}
break;
}
}
}
//region Usb controller removal.
// If the device's SCSI controller will get free after device removal, also remove the controller.
if (device instanceof VirtualUSB)
{
//TODO remove duplication of this and above section of code
List<VirtualUSBController> contollerList = getVirtualDevicesOfType(VirtualUSBController.class);
for (VirtualUSBController controller : contollerList)
{
if (controller.key == device.controllerKey)
{
if (controller.device.length == 1 && controller.device[0] == device.key)
{
VirtualDeviceConfigSpec controllerSpec = new VirtualDeviceConfigSpec();
controllerSpec.operation = VirtualDeviceConfigSpecOperation.remove;
controllerSpec.device = controller;
configSpecList.add(controllerSpec);
}
break;
}
}
// remove the Usb controller when we want to remove the usb device.
continue;
}
VirtualDeviceConfigSpec deviceSpec = new VirtualDeviceConfigSpec();
deviceSpec.operation = VirtualDeviceConfigSpecOperation.remove;
deviceSpec.device = device;
if(destroyDeviceBacking)
{
deviceSpec.fileOperation = VirtualDeviceConfigSpecFileOperation.destroy;
}
configSpecList.add(deviceSpec);
}
catch (Exception ex)
{
throw new RuntimeException(ex);
}
}
if (configSpecList.size() > 0)
{
VirtualMachineConfigSpec config = new VirtualMachineConfigSpec();
config.deviceChange = new VirtualDeviceConfigSpec[configSpecList.size()];
for(int i=0; i< configSpecList.size(); i++)
{
config.deviceChange[i] = configSpecList.get(i);
}
Task task = vm.reconfigVM_Task(config);
return task;
}
return null;
}