diff options
Diffstat (limited to 'src/main/java/org/openslx')
6 files changed, 91 insertions, 45 deletions
diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java index 3cbe71b..c5381c5 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java @@ -30,7 +30,7 @@ public abstract class VirtualizationConfiguration<T, U, W, X> protected Map<DDAcceleration, U> ddacc = new HashMap<>(); protected Map<EthernetDevType, W> networkCards = new HashMap<>(); protected Map<UsbSpeed, X> usbSpeeds = new HashMap<>(); - + private final Virtualizer virtualizer; /** @@ -38,7 +38,8 @@ public abstract class VirtualizationConfiguration<T, U, W, X> */ public static enum SoundCardType { - NONE( "None" ), DEFAULT( "(default)" ), SOUND_BLASTER( "Sound Blaster 16" ), ES( "ES 1371" ), HD_AUDIO( "Intel Integrated HD Audio" ), AC( "Intel ICH Audio Codec 97" ); + NONE( "None" ), DEFAULT( "(default)" ), SOUND_BLASTER( "Sound Blaster 16" ), ES( "ES 1371" ), HD_AUDIO( + "Intel Integrated HD Audio" ), AC( "Intel ICH Audio Codec 97" ); public final String displayName; @@ -68,9 +69,12 @@ public abstract class VirtualizationConfiguration<T, U, W, X> */ public static enum EthernetDevType { - AUTO( "(default)" ), PCNET32( "AMD PCnet32" ), E1000( "Intel E1000 (PCI)" ), E1000E( "Intel E1000e (PCI-Express)" ), VMXNET( "VMXnet" ), VMXNET3( "VMXnet 3" ), PCNETPCI2( - "PCnet-PCI II" ), PCNETFAST3( "PCnet-FAST III" ), PRO1000MTD( "Intel PRO/1000 MT Desktop" ), PRO1000TS( - "Intel PRO/1000 T Server" ), PRO1000MTS( "Intel PRO/1000 MT Server" ), PARAVIRT( "Paravirtualized Network" ), NONE( "No Network Card" ); + AUTO( "(default)" ), PCNET32( "AMD PCnet32" ), E1000( "Intel E1000 (PCI)" ), E1000E( + "Intel E1000e (PCI-Express)" ), VMXNET( "VMXnet" ), VMXNET3( "VMXnet 3" ), PCNETPCI2( + "PCnet-PCI II" ), PCNETFAST3( "PCnet-FAST III" ), PRO1000MTD( + "Intel PRO/1000 MT Desktop" ), PRO1000TS( + "Intel PRO/1000 T Server" ), PRO1000MTS( "Intel PRO/1000 MT Server" ), PARAVIRT( + "Paravirtualized Network" ), NONE( "No Network Card" ); public final String displayName; @@ -82,10 +86,7 @@ public abstract class VirtualizationConfiguration<T, U, W, X> public static enum UsbSpeed { - NONE( "None" ), - USB1_1( "USB 1.1" ), - USB2_0( "USB 2.0" ), - USB3_0( "USB 3.0" ); + NONE( "None" ), USB1_1( "USB 1.1" ), USB2_0( "USB 2.0" ), USB3_0( "USB 3.0" ); public final String displayName; @@ -271,7 +272,7 @@ public abstract class VirtualizationConfiguration<T, U, W, X> LOGGER.debug( "Not a Libvirt file", e ); } try { - return new VirtualizationConfigurationDocker(osList, file); + return new VirtualizationConfigurationDocker( osList, file ); } catch ( VirtualizationConfigurationException e ) { LOGGER.debug( "Not a tar.gz file, for docker container", e ); } @@ -289,7 +290,8 @@ public abstract class VirtualizationConfiguration<T, U, W, X> * @return VmMetaData object representing the relevant parts of the given machine description * @throws IOException */ - public static VirtualizationConfiguration<?, ?, ?, ?> getInstance( List<OperatingSystem> osList, byte[] vmContent, int length ) + public static VirtualizationConfiguration<?, ?, ?, ?> getInstance( List<OperatingSystem> osList, byte[] vmContent, + int length ) throws IOException { try { @@ -316,7 +318,7 @@ public abstract class VirtualizationConfiguration<T, U, W, X> LOGGER.error( "Could not detect any known virtualizer format" ); return null; } - + /** * Returns the file name extension for the virtualization configuration file. * @@ -383,6 +385,15 @@ public abstract class VirtualizationConfiguration<T, U, W, X> } /** + * Validates the virtualization configuration and reports errors if its content is not a valid + * virtualization configuration. + * + * @throws VirtualizationConfigurationException validation of the virtualization configuration + * failed. + */ + public abstract void validate() throws VirtualizationConfigurationException; + + /** * Transforms the virtualization configuration in terms of a privacy filter to filter out * sensitive information like name of users in absolute paths. * @@ -390,7 +401,7 @@ public abstract class VirtualizationConfiguration<T, U, W, X> * configuration failed. */ public abstract void transformPrivacy() throws VirtualizationConfigurationException; - + /** * Transforms the virtualization configuration applying options that are desired when locally * editing a virtualized system (e.g. disables automatic DPI scaling). @@ -399,7 +410,7 @@ public abstract class VirtualizationConfiguration<T, U, W, X> * configuration failed. */ public abstract void transformEditable() throws VirtualizationConfigurationException; - + /** * Transforms the virtualization configuration applying options that are desired when running a * virtualized system in a stateless manner. @@ -408,7 +419,7 @@ public abstract class VirtualizationConfiguration<T, U, W, X> * configuration failed. */ public abstract void transformNonPersistent() throws VirtualizationConfigurationException; - + /** * Function used to register virtual devices. */ diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java index 4c727a6..5b1615f 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java @@ -200,4 +200,9 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati public String getFileNameExtension() { return VirtualizationConfigurationDocker.FILE_NAME_EXTENSION; } + + @Override + public void validate() throws VirtualizationConfigurationException + { + } } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java index bd25f79..716a2f3 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java @@ -9,6 +9,7 @@ import java.util.Map.Entry; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.DomainUtils; import org.openslx.libvirt.domain.device.ControllerUsb; import org.openslx.libvirt.domain.device.Disk.BusType; import org.openslx.libvirt.domain.device.Disk.StorageType; @@ -219,21 +220,6 @@ public class VirtualizationConfigurationQemu extends private Domain vmConfig = null; /** - * Stores current index of added HDD device to the Libvirt XML configuration file. - */ - private int vmDeviceIndexHddAdd = 0; - - /** - * Stores current index of added CDROM device to the Libvirt XML configuration file. - */ - private int vmDeviceIndexCdromAdd = 0; - - /** - * Stores current index of added ethernet device to the Libvirt XML configuration file. - */ - private int vmDeviceIndexEthernetAdd = 0; - - /** * Creates new virtual machine configuration (managed by Libvirt) for the QEMU hypervisor. * * @param osList list of operating systems. @@ -335,7 +321,9 @@ public class VirtualizationConfigurationQemu extends @Override public boolean addHddTemplate( String diskImagePath, String hddMode, String redoDir ) { - return this.addHddTemplate( this.vmDeviceIndexHddAdd++, diskImagePath, hddMode, redoDir ); + int index = this.vmConfig.getDiskStorageDevices().size() - 1; + index = ( index > 0 ) ? index : 0; + return this.addHddTemplate( index, diskImagePath, hddMode, redoDir ); } /** @@ -369,7 +357,7 @@ public class VirtualizationConfigurationQemu extends storageDiskDevice.setStorage( StorageType.FILE, diskImagePath ); } - return false; + return true; } @Override @@ -397,13 +385,14 @@ public class VirtualizationConfigurationQemu extends @Override public boolean addRam( int mem ) { - BigInteger memory = BigInteger.valueOf( mem ); + // convert given memory in MiB to memory in bytes for Libvirt XML Domain API functions + final BigInteger memory = DomainUtils.decodeMemory( Integer.toString( mem ), "MiB" ); this.vmConfig.setMemory( memory ); this.vmConfig.setCurrentMemory( memory ); - final boolean isMemorySet = this.vmConfig.getMemory().toString().equals( memory.toString() ); - final boolean isCurrentMemorySet = this.vmConfig.getCurrentMemory().toString().equals( memory.toString() ); + final boolean isMemorySet = this.vmConfig.getMemory().equals( memory ); + final boolean isCurrentMemorySet = this.vmConfig.getCurrentMemory().equals( memory ); return isMemorySet && isCurrentMemorySet; } @@ -421,18 +410,30 @@ public class VirtualizationConfigurationQemu extends String targetDevName = VirtualizationConfigurationQemuUtils.createAlphabeticalDeviceName( "fd", index ); floppyDiskDevice.setTargetDevice( targetDevName ); floppyDiskDevice.setReadOnly( readOnly ); - floppyDiskDevice.setStorage( StorageType.FILE, image ); + + if ( image == null || image.isEmpty() ) { + floppyDiskDevice.removeStorage(); + } else { + floppyDiskDevice.setStorage( StorageType.FILE, image ); + } } else { // floppy device exists, so update existing floppy device floppyDiskDevice.setReadOnly( readOnly ); - floppyDiskDevice.setStorage( StorageType.FILE, image ); + + if ( image == null || image.isEmpty() ) { + floppyDiskDevice.removeStorage(); + } else { + floppyDiskDevice.setStorage( StorageType.FILE, image ); + } } } @Override public boolean addCdrom( String image ) { - return this.addCdrom( this.vmDeviceIndexCdromAdd++, image ); + int index = this.vmConfig.getDiskCdromDevices().size() - 1; + index = ( index > 0 ) ? index : 0; + return this.addCdrom( index, image ); } /** @@ -458,7 +459,11 @@ public class VirtualizationConfigurationQemu extends if ( image == null ) { cdromDiskDevice.setStorage( StorageType.BLOCK, CDROM_DEFAULT_PHYSICAL_DRIVE ); } else { - cdromDiskDevice.setStorage( StorageType.FILE, image ); + if ( image.isEmpty() ) { + cdromDiskDevice.removeStorage(); + } else { + cdromDiskDevice.setStorage( StorageType.FILE, image ); + } } } else { // CDROM device exists, so update existing CDROM device @@ -467,11 +472,15 @@ public class VirtualizationConfigurationQemu extends if ( image == null ) { cdromDiskDevice.setStorage( StorageType.BLOCK, CDROM_DEFAULT_PHYSICAL_DRIVE ); } else { - cdromDiskDevice.setStorage( StorageType.FILE, image ); + if ( image.isEmpty() ) { + cdromDiskDevice.removeStorage(); + } else { + cdromDiskDevice.setStorage( StorageType.FILE, image ); + } } } - return false; + return true; } @Override @@ -731,7 +740,9 @@ public class VirtualizationConfigurationQemu extends @Override public boolean addEthernet( EtherType type ) { - return this.addEthernet( this.vmDeviceIndexEthernetAdd++, type ); + int index = this.vmConfig.getInterfaceDevices().size() - 1; + index = ( index > 0 ) ? index : 0; + return this.addEthernet( index, type ); } /** @@ -790,7 +801,7 @@ public class VirtualizationConfigurationQemu extends } } - return false; + return true; } @Override @@ -840,4 +851,14 @@ public class VirtualizationConfigurationQemu extends { return VirtualizationConfigurationQemu.FILE_NAME_EXTENSION; } + + @Override + public void validate() throws VirtualizationConfigurationException + { + try { + this.vmConfig.validateXml(); + } catch ( LibvirtXmlValidationException e ) { + throw new VirtualizationConfigurationException( e.getLocalizedMessage() ); + } + } } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuUtils.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuUtils.java index 3abc2f3..7ac3632 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuUtils.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuUtils.java @@ -194,7 +194,7 @@ public class VirtualizationConfigurationQemuUtils throw new IllegalArgumentException( errorMsg ); } - return devicePrefix + ( 'a' + deviceNumber ); + return devicePrefix + Character.valueOf( (char) ( 'a' + deviceNumber ) ).toString(); } /** diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java index d987495..d32d496 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java @@ -508,4 +508,9 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu { return VirtualizationConfigurationVirtualBox.FILE_NAME_EXTENSION; } + + @Override + public void validate() throws VirtualizationConfigurationException + { + } } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java index 894f52b..e1102b6 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java @@ -590,7 +590,7 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati public boolean addCpuCoreCount( int numCores ) { // TODO actually add the cpu core count to the machine description - return false; + return true; } @Override @@ -631,4 +631,8 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati return VirtualizationConfigurationVmware.FILE_NAME_EXTENSION; } + @Override + public void validate() throws VirtualizationConfigurationException + { + } } |