diff options
Diffstat (limited to 'src/main/java/org/openslx/virtualization')
5 files changed, 131 insertions, 24 deletions
diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java index bfa385e..706a083 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java @@ -245,10 +245,12 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration if ( storageDiskDevice == null ) { // HDD does not exist, so create new storage (HDD) device + final BusType devBusType = BusType.VIRTIO; + final String targetDevName = VirtualizationConfigurationQemuUtils.createDeviceName( this.vmConfig, + devBusType ); storageDiskDevice = this.vmConfig.addDiskStorageDevice(); storageDiskDevice.setReadOnly( false ); - storageDiskDevice.setBusType( BusType.VIRTIO ); - String targetDevName = VirtualizationConfigurationQemuUtils.createAlphabeticalDeviceName( "vd", index ); + storageDiskDevice.setBusType( devBusType ); storageDiskDevice.setTargetDevice( targetDevName ); if ( diskImagePath == null || diskImagePath.isEmpty() ) { @@ -319,9 +321,11 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration if ( floppyDiskDevice == null ) { // floppy device does not exist, so create new floppy device + final BusType devBusType = BusType.FDC; + final String targetDevName = VirtualizationConfigurationQemuUtils.createDeviceName( this.vmConfig, + devBusType ); floppyDiskDevice = this.vmConfig.addDiskFloppyDevice(); - floppyDiskDevice.setBusType( BusType.FDC ); - String targetDevName = VirtualizationConfigurationQemuUtils.createAlphabeticalDeviceName( "fd", index ); + floppyDiskDevice.setBusType( devBusType ); floppyDiskDevice.setTargetDevice( targetDevName ); floppyDiskDevice.setReadOnly( readOnly ); @@ -364,9 +368,11 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration if ( cdromDiskDevice == null ) { // CDROM device does not exist, so create new CDROM device + final BusType devBusType = BusType.SATA; + final String targetDevName = VirtualizationConfigurationQemuUtils.createDeviceName( this.vmConfig, + devBusType ); cdromDiskDevice = this.vmConfig.addDiskCdromDevice(); - cdromDiskDevice.setBusType( BusType.SATA ); - String targetDevName = VirtualizationConfigurationQemuUtils.createAlphabeticalDeviceName( "sd", index ); + cdromDiskDevice.setBusType( devBusType ); cdromDiskDevice.setTargetDevice( targetDevName ); cdromDiskDevice.setReadOnly( true ); @@ -406,10 +412,55 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration return isVCpuSet; } - - class QemuGfxType extends VirtOptionValue + + class QemuGfxModel extends VirtOptionValue { + public QemuGfxModel( Video.Model model, String displayName ) + { + super( model.toString(), displayName ); + } + @Override + public void apply() + { + final ArrayList<Video> videoDevices = vmConfig.getVideoDevices(); + + if ( videoDevices.isEmpty() ) { + // add new video device with disabled acceleration to VM configuration + final Video videoDevice = vmConfig.addVideoDevice(); + videoDevice.setModel( Video.Model.fromString( this.getId() ) ); + videoDevice.set2DAcceleration( false ); + videoDevice.set3DAcceleration( false ); + } else { + // change graphics model of existing video devices + for ( final Video videoDevice : videoDevices ) { + // remove all old model-related XML attributes + videoDevice.removeXmlElement( "model" ); + // set new model + videoDevice.setModel( Video.Model.fromString( this.getId() ) ); + } + } + } + + @Override + public boolean isActive() + { + final ArrayList<Video> videoDevices = vmConfig.getVideoDevices(); + boolean isActive = true; + + for ( final Video videoDevice : videoDevices ) { + if ( !videoDevice.getModel().toString().equals( this.getId() ) ) { + isActive = false; + break; + } + } + + return isActive; + } + } + + class QemuGfxType extends VirtOptionValue + { public QemuGfxType( String id, String displayName ) { super( id, displayName ); @@ -497,7 +548,6 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration return this.id.equals( "false" ); } } - } @Override @@ -535,7 +585,6 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration class QemuNicModel extends VirtOptionValue { - private final int cardIndex; public QemuNicModel( int cardIndex, Interface.Model model, String displayName ) @@ -574,10 +623,9 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration return networkDeviceModel.toString().equals( this.id ); // XXX: enum would allow simple == } } - + class QemuSoundCardModel extends VirtOptionValue { - public QemuSoundCardModel( Sound.Model id, String displayName ) { super( id.toString(), displayName ); @@ -614,12 +662,11 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration Sound.Model soundDeviceModel = soundDevices.get( 0 ).getModel(); return soundDeviceModel != null && soundDeviceModel.toString().equals( this.id ); } - + } - + class QemuUsbSpeed extends VirtOptionValue { - public QemuUsbSpeed( ControllerUsb.Model id, String displayName ) { super( id.toString(), displayName ); @@ -647,8 +694,6 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration public boolean isActive() { ArrayList<ControllerUsb> usbControllerDevices = vmConfig.getUsbControllerDevices(); - String maxUsbSpeed = null; - int maxUsbSpeedNumeric = 0; for ( ControllerUsb usbControllerDevice : usbControllerDevices ) { ControllerUsb.Model usbControllerModel = usbControllerDevice.getModel(); @@ -662,7 +707,6 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration return false; } - } @Override @@ -756,6 +800,9 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration { // removes all referenced storage files of all specified CDROMs, Floppy drives and HDDs this.vmConfig.removeDiskDevicesStorage(); + + // remove specified NVRAM file of OS loader (firmware) + this.vmConfig.removeOsNvram(); } @Override @@ -774,9 +821,15 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration configurableOptions.add( new ConfigurableOptionGroup( ConfigurationGroups.SOUND_CARD_MODEL, list ) ); list = new ArrayList<>(); - // XXX This would greatly benefit from having more meaningful options for qemu instead of on/off - list.add( new QemuGfxType( "false", "langsam" ) ); - list.add( new QemuGfxType( "true", "3D OpenGL" ) ); + list.add( new QemuGfxModel( Video.Model.VGA, "VGA" ) ); + list.add( new QemuGfxModel( Video.Model.QXL, "QXL" ) ); + list.add( new QemuGfxModel( Video.Model.VMVGA, "VMware VGA" ) ); + list.add( new QemuGfxModel( Video.Model.VIRTIO, "virtio-gpu" ) ); + configurableOptions.add( new ConfigurableOptionGroup( ConfigurationGroups.GFX_MODEL, list ) ); + + list = new ArrayList<>(); + list.add( new QemuGfxType( "false", "2D" ) ); + list.add( new QemuGfxType( "true", "3D" ) ); configurableOptions.add( new ConfigurableOptionGroup( ConfigurationGroups.GFX_TYPE, list ) ); list = new ArrayList<>(); diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuUtils.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuUtils.java index 06091c0..1befdc4 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuUtils.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuUtils.java @@ -1,9 +1,11 @@ package org.openslx.virtualization.configuration; import java.util.ArrayList; +import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.device.Disk; import org.openslx.libvirt.domain.device.Disk.BusType; import org.openslx.virtualization.Version; @@ -109,7 +111,7 @@ public class VirtualizationConfigurationQemuUtils * @param deviceNumber number of the device. * @return alphabetical device name. */ - public static String createAlphabeticalDeviceName( String devicePrefix, int deviceNumber ) + private static String createAlphabeticalDeviceName( String devicePrefix, int deviceNumber ) { if ( deviceNumber < 0 || deviceNumber >= ( 'z' - 'a' ) ) { String errorMsg = new String( "Device number is out of range to be able to create a valid device name." ); @@ -120,6 +122,42 @@ public class VirtualizationConfigurationQemuUtils } /** + * Creates an alphabetical device name for a disk device with a bus <i>type</i> that is unique in + * a Libvirt domain XML configuration. + * + * @param config Libvirt domain XML configuration. + * @param type device type for device name. + * @return alphabetical device name. + */ + public static String createDeviceName( final Domain config, final BusType type ) throws IllegalArgumentException + { + final String devicePrefix; + final int deviceNumber; + + switch ( type ) { + case FDC: + devicePrefix = "fd"; + break; + case IDE: + devicePrefix = "hd"; + break; + case SATA: + devicePrefix = "sd"; + break; + case VIRTIO: + devicePrefix = "vd"; + break; + default: + return null; + } + + final Predicate<Disk> bySpecifiedBusType = d -> d.getBusType() == type; + deviceNumber = Long.valueOf( config.getDiskDevices().stream().filter( bySpecifiedBusType ).count() ).intValue(); + + return VirtualizationConfigurationQemuUtils.createAlphabeticalDeviceName( devicePrefix, deviceNumber ); + } + + /** * Data container to store a Libvirt/QEMU machine name with version information. * * @author Manuel Bentele diff --git a/src/main/java/org/openslx/virtualization/configuration/transformation/TransformationManager.java b/src/main/java/org/openslx/virtualization/configuration/transformation/TransformationManager.java index 197796d..b28fb32 100644 --- a/src/main/java/org/openslx/virtualization/configuration/transformation/TransformationManager.java +++ b/src/main/java/org/openslx/virtualization/configuration/transformation/TransformationManager.java @@ -2,6 +2,8 @@ package org.openslx.virtualization.configuration.transformation; import java.util.ArrayList; +import org.apache.log4j.Logger; + /** * A transformation manager is a class to manage several transformations and their application. * @@ -33,6 +35,11 @@ public class TransformationManager<T, R> private R args; /** + * Logger instance to log messages. + */ + private static final Logger LOGGER = Logger.getLogger( TransformationManager.class ); + + /** * Create a transformation manager. * * @param config configuration which will be transformed. @@ -63,6 +70,9 @@ public class TransformationManager<T, R> */ public void register( Transformation<T, R> transformation, boolean enabled ) { + LOGGER.debug( "Register transformation '" + transformation.getName() + "' and " + + ( enabled ? "enable" : "do not enable" ) + " it" ); + transformation.setEnabled( enabled ); this.transformations.add( transformation ); } @@ -107,6 +117,7 @@ public class TransformationManager<T, R> public void transform() throws TransformationException { for ( Transformation<T, R> transformation : this.transformations ) { + LOGGER.debug( "Apply transformation '" + transformation.getName() + "'" ); try { transformation.apply( this.config, this.args ); } catch ( TransformationException e ) { diff --git a/src/main/java/org/openslx/virtualization/hardware/ConfigurationGroups.java b/src/main/java/org/openslx/virtualization/hardware/ConfigurationGroups.java index ad5b771..8a0ab13 100644 --- a/src/main/java/org/openslx/virtualization/hardware/ConfigurationGroups.java +++ b/src/main/java/org/openslx/virtualization/hardware/ConfigurationGroups.java @@ -6,6 +6,7 @@ public enum ConfigurationGroups NIC_MODEL( "E0VirtDev" ), USB_SPEED( "maxUSBSpeed" ), SOUND_CARD_MODEL( "sound" ), + GFX_MODEL( "graphics" ), GFX_TYPE( "3DAcceleration" ), HW_VERSION( "HWVersion" ); diff --git a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java index d950111..5d933bb 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java @@ -33,7 +33,6 @@ public class VirtualizerQemu extends Virtualizer */ private static final List<Version> VIRTUALIZER_SUPPORTED_VERSIONS = Collections.unmodifiableList( Arrays.asList( - new Version( Short.valueOf( "2" ), Short.valueOf( "1" ), "QEMU 2.1" ), new Version( Short.valueOf( "2" ), Short.valueOf( "4" ), "QEMU 2.4" ), new Version( Short.valueOf( "2" ), Short.valueOf( "5" ), "QEMU 2.5" ), new Version( Short.valueOf( "2" ), Short.valueOf( "6" ), "QEMU 2.6" ), @@ -44,7 +43,12 @@ public class VirtualizerQemu extends Virtualizer new Version( Short.valueOf( "3" ), Short.valueOf( "1" ), "QEMU 3.1" ), new Version( Short.valueOf( "4" ), Short.valueOf( "0" ), "QEMU 4.0" ), new Version( Short.valueOf( "4" ), Short.valueOf( "1" ), "QEMU 4.1" ), - new Version( Short.valueOf( "4" ), Short.valueOf( "2" ), "QEMU 4.2" ) ) ); + new Version( Short.valueOf( "4" ), Short.valueOf( "2" ), "QEMU 4.2" ), + new Version( Short.valueOf( "5" ), Short.valueOf( "0" ), "QEMU 5.0" ), + new Version( Short.valueOf( "5" ), Short.valueOf( "1" ), "QEMU 5.1" ), + new Version( Short.valueOf( "5" ), Short.valueOf( "2" ), "QEMU 5.2" ), + new Version( Short.valueOf( "6" ), Short.valueOf( "0" ), "QEMU 6.0" ), + new Version( Short.valueOf( "6" ), Short.valueOf( "1" ), "QEMU 6.1" ) ) ); /** * Creates a new QEMU virtualizer. |