diff options
Diffstat (limited to 'src/main/java/org/openslx/virtualization/configuration')
3 files changed, 124 insertions, 22 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 ) { |