in src/main/java/com/vmware/vim25/mox/VirtualMachineDeviceManager.java [685:757]
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);
}
return vm.reconfigVM_Task(config);
}
return null;
}