private Task addFloppyDrive()

in src/main/java/com/vmware/vim25/mox/VirtualMachineDeviceManager.java [155:215]


    private Task addFloppyDrive(String floppyImagePath, String newFloppyImagePath, String hostDevice, boolean startConnected) throws InvalidName, VmConfigFault, DuplicateName, TaskInProgress, FileFault, InvalidState, ConcurrentAccess, InvalidDatastore, InsufficientResourcesFault, RuntimeFault, RemoteException {
        // Any VM associated with the device must be powered off.
        if (vm.getRuntime().getPowerState() == VirtualMachinePowerState.poweredOff) {
            throw new RuntimeException("Invalid power state: power off this VM before adding a floppy drive.");
        }

        VirtualFloppy floppy = new VirtualFloppy();
        floppy.connectable = new VirtualDeviceConnectInfo();
        floppy.connectable.startConnected = startConnected;

        if (hostDevice != null) {
            VirtualFloppyDeviceBackingInfo backing = new VirtualFloppyDeviceBackingInfo();
            backing.deviceName = hostDevice;
            floppy.backing = backing;
        }
        else if (floppyImagePath != null) {
            VirtualFloppyImageBackingInfo backing = new VirtualFloppyImageBackingInfo();
            backing.fileName = floppyImagePath;
            floppy.backing = backing;
        }
        else if (newFloppyImagePath != null) {
            VirtualFloppyImageBackingInfo backing = new VirtualFloppyImageBackingInfo();
            backing.fileName = newFloppyImagePath;
            floppy.backing = backing;
        }
        else {
            // The VIM API doesn't allow for the possibility of adding a drive
            // without hooking it up to something. In an ideal world, I'd probably
            // want an ISO backing without having to specify a valid ISO at this
            // time. So we'll create a remote passthrough backing and just set it
            // as not connected.
            VirtualFloppyRemoteDeviceBackingInfo backing = new VirtualFloppyRemoteDeviceBackingInfo();
            backing.deviceName = "";
            floppy.backing = backing;
            floppy.connectable.startConnected = false;
            floppy.connectable.connected = false;
        }

        floppy.key = -1;

        VirtualDeviceConfigSpec floppySpec = new VirtualDeviceConfigSpec();
        floppySpec.operation = VirtualDeviceConfigSpecOperation.add;
        if (newFloppyImagePath != null) {
            floppySpec.fileOperation = VirtualDeviceConfigSpecFileOperation.create;
        }
        floppySpec.device = floppy;

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

        VirtualIDEController controller = getFirstAvailableController(VirtualIDEController.class);

        if (controller != null) {
            config.deviceChange[0].device.controllerKey = controller.key;
        }
        else {
            throw new RuntimeException("No available IDE controller for floppy drive.");
        }

        return vm.reconfigVM_Task(config);
    }