private Task addFloppyDrive()

in src/com/vmware/vim25/mox/VirtualMachineDeviceManager.java [154:223]


  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);
  }