summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/virtualization/configuration
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/virtualization/configuration')
-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
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 ) {