private Task addCdDrive()

in src/main/java/com/vmware/vim25/mox/VirtualMachineDeviceManager.java [246:298]


    private Task addCdDrive(String isoPath, String hostDevice, boolean startConnected) throws InvalidProperty, RuntimeFault, RemoteException, InterruptedException {
        VirtualMachinePowerState powerState = vm.getRuntime().getPowerState();
        if (powerState != VirtualMachinePowerState.poweredOff) {
            throw new RuntimeException("VM is not yet powered off for adding a CD drive.");
        }

        VirtualCdrom cdrom = new VirtualCdrom();
        cdrom.connectable = new VirtualDeviceConnectInfo();
        cdrom.connectable.allowGuestControl = true;
        cdrom.connectable.startConnected = startConnected;

        if (hostDevice != null) {
            validateCdromHostDevice(hostDevice);
            VirtualCdromAtapiBackingInfo backing = new VirtualCdromAtapiBackingInfo();
            backing.deviceName = hostDevice;
            cdrom.backing = backing;
        }
        else if (isoPath != null) {
            VirtualCdromIsoBackingInfo backing = new VirtualCdromIsoBackingInfo();
            backing.fileName = isoPath;
            cdrom.backing = backing;
        }
        else {
            // We don't allow adding a CD drive without hooking it up to something.
            // In an ideal world, you may want an ISO backing without having to specify a valid ISO
            // at this time. Create a remote passthrough backing and just set it as not connected.
            VirtualCdromRemotePassthroughBackingInfo backing = new VirtualCdromRemotePassthroughBackingInfo();
            backing.exclusive = true;
            backing.deviceName = "";
            cdrom.backing = backing;
        }

        cdrom.key = -1;

        VirtualDeviceConfigSpec cdSpec = new VirtualDeviceConfigSpec();
        cdSpec.operation = VirtualDeviceConfigSpecOperation.add;
        cdSpec.device = cdrom;

        VirtualMachineConfigSpec config = new VirtualMachineConfigSpec();
        config.deviceChange = new VirtualDeviceConfigSpec[]{cdSpec};

        VirtualIDEController controller = getFirstAvailableController(VirtualIDEController.class);

        if (controller != null) {
            config.deviceChange[0].device.controllerKey = controller.key;
        }
        else {
            throw new RuntimeException("No free IDE controller for addtional CD Drive.");
        }

        Task task = vm.reconfigVM_Task(config);
        return task;
    }