summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/virtualization
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/virtualization')
-rw-r--r--src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java95
-rw-r--r--src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuUtils.java40
-rw-r--r--src/main/java/org/openslx/virtualization/configuration/transformation/TransformationManager.java11
-rw-r--r--src/main/java/org/openslx/virtualization/hardware/ConfigurationGroups.java1
-rw-r--r--src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java8
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.