From 2d91c4b1094e25b4c4c94335364f5d3c31729521 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Fri, 16 Apr 2021 10:24:39 +0200 Subject: Rename VmMetaData classes --- .../configuration/VirtualizationConfiguration.java | 425 +++++++++++++++++++++ 1 file changed, 425 insertions(+) create mode 100644 src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java (limited to 'src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java') diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java new file mode 100644 index 0000000..4f00b92 --- /dev/null +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java @@ -0,0 +1,425 @@ +package org.openslx.virtualization.configuration; + +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.log4j.Logger; +import org.openslx.bwlp.thrift.iface.OperatingSystem; +import org.openslx.bwlp.thrift.iface.Virtualizer; +import org.openslx.vm.disk.DiskImage; + +/** + * Describes a configured virtual machine. This class is parsed from a machine + * description, like a *.vmx for VMware machines. + */ +public abstract class VirtualizationConfiguration +{ + private static final Logger LOGGER = Logger.getLogger( VirtualizationConfiguration.class ); + + /* + * Helper types + */ + protected Map soundCards = new HashMap<>(); + protected Map ddacc = new HashMap<>(); + protected Map hwversion = new HashMap<>(); + protected Map networkCards = new HashMap<>(); + protected Map usbSpeeds = new HashMap<>(); + + /** + * Virtual sound cards types + */ + 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" ); + + public final String displayName; + + private SoundCardType( String dName ) + { + this.displayName = dName; + } + } + + /** + * 3D acceleration types + */ + public static enum DDAcceleration + { + OFF( "Off" ), ON( "On" ); + + public final String displayName; + + private DDAcceleration( String dName ) + { + this.displayName = dName; + } + } + + /** + * Virtual hardware version - currently only in use for VMPlayer + */ + public static enum HWVersion + { + NONE( "(invalid)" ), + THREE( " 3 (Workstation 4/5, Player 1)" ), + FOUR( " 4 (Workstation 4/5, Player 1/2, Fusion 1)" ), + SIX( " 6 (Workstation 6)" ), + SEVEN( " 7 (Workstation 6.5/7, Player 3, Fusion 2/3)" ), + EIGHT( " 8 (Workstation 8, Player/Fusion 4)" ), + NINE( " 9 (Workstation 9, Player/Fusion 5)" ), + TEN( "10 (Workstation 10, Player/Fusion 6)" ), + ELEVEN( "11 (Workstation 11, Player/Fusion 7)" ), + TWELVE( "12 (Workstation/Player 12, Fusion 8)" ), + FOURTEEN( "14 (Workstation/Player 14, Fusion 10)"), + FIFTEEN( "15 (Workstation/Player 15, Fusion 11)"), + FIFTEEN_ONE( "16 (Workstation/Player 15.1, Fusion 11.1)"), + SIXTEEN( "17 (Workstation/Player 16, Fusion 12)"), + SIXTEEN_ONE( "18 (Workstation/Player 16.1, Fusion 12.1)"), + DEFAULT( "default" ); + + public final String displayName; + + private HWVersion( String dName ) + { + this.displayName = dName; + } + } + + /** + * Virtual network cards + */ + 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" ); + + public final String displayName; + + private EthernetDevType( String dName ) + { + this.displayName = dName; + } + } + + public static enum UsbSpeed + { + NONE( "None" ), + USB1_1( "USB 1.1" ), + USB2_0( "USB 2.0" ), + USB3_0( "USB 3.0" ); + + public final String displayName; + + private UsbSpeed( String dName ) + { + this.displayName = dName; + } + } + + public static enum DriveBusType + { + SCSI, IDE, SATA, NVME; + } + + public static class HardDisk + { + public final String chipsetDriver; + public final DriveBusType bus; + public final String diskImage; + + public HardDisk( String chipsetDriver, DriveBusType bus, String diskImage ) + { + this.chipsetDriver = chipsetDriver; + this.bus = bus; + this.diskImage = diskImage; + } + } + + public static enum EtherType + { + NAT, BRIDGED, HOST_ONLY; + } + /* + * Members + */ + + protected final List hdds = new ArrayList(); + + private final List osList; + + private OperatingSystem os = null; + + protected String displayName = null; + + protected boolean isMachineSnapshot; + + /* + * Getters for virtual hardware + */ + public List getSupportedSoundCards() + { + ArrayList availables = new ArrayList( soundCards.keySet() ); + Collections.sort( availables ); + return availables; + } + + public List getSupportedDDAccs() + { + ArrayList availables = new ArrayList( ddacc.keySet() ); + Collections.sort( availables ); + return availables; + } + + public List getSupportedHWVersions() + { + ArrayList availables = new ArrayList( hwversion.keySet() ); + Collections.sort( availables ); + return availables; + } + + public List getSupportedEthernetDevices() + { + ArrayList availables = new ArrayList( networkCards.keySet() ); + Collections.sort( availables ); + return availables; + } + + public List getSupportedUsbSpeeds() + { + ArrayList availables = new ArrayList<>( usbSpeeds.keySet() ); + Collections.sort( availables ); + return availables; + } + + /** + * Get operating system of this VM. + */ + public OperatingSystem getOs() + { + return os; + } + + /** + * Get all hard disks of this VM. + */ + public List getHdds() + { + return Collections.unmodifiableList( hdds ); + } + + /** + * Get display name of VM. + */ + public String getDisplayName() + { + return displayName; + } + + /* + * Getter for isMachineSnapshot + */ + public boolean isMachineSnapshot() + { + return isMachineSnapshot; + } + + /** + * This method should return a minimal representation of the input meta data. + * The representation is platform dependent, and should be stripped of all + * non-essential configuration, such as CD/DVD/FLoppy drives, serial or parallel + * ports, shared folders, or anything else that could be considered sensible + * information (absolute paths containing the local user's name). + */ + public abstract byte[] getFilteredDefinitionArray(); + + public final ByteBuffer getFilteredDefinition() + { + return ByteBuffer.wrap( getFilteredDefinitionArray() ); + } + + /* + * Methods + */ + + public VirtualizationConfiguration( List osList ) + { + this.osList = osList; + + // register virtual hardware models for graphical editing of virtual devices (GPU, sound, USB, ...) + this.registerVirtualHW(); + } + + /** + * Called from subclass to set the OS. If the OS cannot be determined from the + * given parameters, it will not be set. + * + * @param virtId + * virtualizer, eg "vmware" for VMware + * @param virtOsId + * the os identifier used by the virtualizer, eg. windows7-64 for + * 64bit Windows 7 on VMware + */ + protected final void setOs( String virtId, String virtOsId ) + { + OperatingSystem lazyMatch = null; + for ( OperatingSystem os : osList ) { + if ( os.getVirtualizerOsId() == null ) + continue; + for ( Entry entry : os.getVirtualizerOsId().entrySet() ) { + if ( !entry.getValue().equals( virtOsId ) ) + continue; + if ( entry.getKey().equals( virtId ) ) { + this.os = os; + return; + } else { + lazyMatch = os; + } + } + } + this.os = lazyMatch; + } + + /** + * Returns list of image formats supported by the VM's hypervisor. + * + * @return list of image formats. + */ + public abstract List getSupportedImageFormats(); + + /** + * Apply config options that are desired when locally editing a VM. for vmware, + * this disables automatic DPI scaling of the guest. + */ + public abstract void applySettingsForLocalEdit(); + + /** + * Returns a VmMetaData instance of the given machine description given as file + * + * @param osList List of supported operating systems + * @param file VM's machine description file to get the metadata instance from + * @return VmMetaData object representing the relevant parts of the given machine description + */ + public static VirtualizationConfiguration getInstance( List osList, File file ) + throws IOException + { + try { + return new VirtualizationConfigurationVmware( osList, file ); + } catch ( VirtualizationConfigurationException e ) { + LOGGER.info( "Not a VMware file", e ); + } + try { + return new VirtualizationConfigurationVirtualBox( osList, file ); + } catch ( VirtualizationConfigurationException e ) { + LOGGER.info( "Not a VirtualBox file", e ); + } + try { + return new VirtualizationConfigurationQemu( osList, file ); + } catch ( VirtualizationConfigurationException e ) { + LOGGER.info( "Not a Libvirt file", e ); + } + try { + return new VirtualizationConfigurationDocker(osList, file); + } catch ( Exception e ) { + LOGGER.info( "Not a tar.gz file, for docker container", e ); + } + + LOGGER.error( "Could not detect any known virtualizer format" ); + return null; + } + + /** + * Returns a VmMetaData instance of the given machine description given as a byte array + * + * @param osList List of supported operating systems + * @param vmContent VM's machine description as byte array (e.g. stored in DB) + * @param length length of the byte array given as vmContent + * @return VmMetaData object representing the relevant parts of the given machine description + * @throws IOException + */ + public static VirtualizationConfiguration getInstance( List osList, byte[] vmContent, int length ) + throws IOException + { + try { + return new VirtualizationConfigurationVmware( osList, vmContent, length ); + } catch ( VirtualizationConfigurationException e ) { + LOGGER.info( "Not a VMware file", e ); + } + try { + return new VirtualizationConfigurationVirtualBox( osList, vmContent, length ); + } catch ( VirtualizationConfigurationException e ) { + LOGGER.info( "Not a VirtualBox file", e ); + } + try { + return new VirtualizationConfigurationQemu( osList, vmContent, length ); + } catch ( VirtualizationConfigurationException e ) { + LOGGER.info( "Not a Libvirt file", e ); + } + try { + return new VirtualizationConfigurationDocker( osList, vmContent, length ); + } catch ( VirtualizationConfigurationException e ) { + LOGGER.info( "Not a tar.gz file, for docker container", e ); + } + + LOGGER.error( "Could not detect any known virtualizer format" ); + return null; + } + + public abstract boolean addHddTemplate( File diskImage, String hddMode, String redoDir ); + + public abstract boolean addHddTemplate( String diskImagePath, String hddMode, String redoDir ); + + public abstract boolean addDefaultNat(); + + public abstract void setOs( String vendorOsId ); + + public abstract boolean addDisplayName( String name ); + + public abstract boolean addRam( int mem ); + + public abstract void addFloppy( int index, String image, boolean readOnly ); + + public abstract boolean addCdrom( String image ); + + public abstract boolean addCpuCoreCount( int nrOfCores ); + + public abstract void setSoundCard( SoundCardType type ); + + public abstract SoundCardType getSoundCard(); + + public abstract void setDDAcceleration( DDAcceleration type ); + + public abstract DDAcceleration getDDAcceleration(); + + public abstract void setHWVersion( HWVersion type ); + + public abstract HWVersion getHWVersion(); + + public abstract void setEthernetDevType( int cardIndex, EthernetDevType type ); + + public abstract EthernetDevType getEthernetDevType( int cardIndex ); + + public abstract void setMaxUsbSpeed( UsbSpeed speed ); + + public abstract UsbSpeed getMaxUsbSpeed(); + + public abstract byte[] getDefinitionArray(); + + public abstract boolean addEthernet( EtherType type ); + + public abstract Virtualizer getVirtualizer(); + + public abstract boolean tweakForNonPersistent(); + + /** + * Function used to register virtual devices + */ + public abstract void registerVirtualHW(); +} -- cgit v1.2.3-55-g7522 From 230e75e440428c4a6309213777f87f7e3e07760f Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Tue, 20 Apr 2021 13:56:25 +0200 Subject: Encapsulate transformation logic for virtualization configurations --- .../configuration/VirtualizationConfiguration.java | 56 ++++++-- .../VirtualizationConfigurationDocker.java | 33 +++-- .../VirtualizationConfigurationQemu.java | 45 ++++--- .../VirtualizationConfigurationVirtualBox.java | 36 ++++-- .../VirtualizationConfigurationVmware.java | 35 +++-- ...onfigurationDataDozModClientToDozModServer.java | 8 ++ ...onfigurationDataDozModServerToDozModClient.java | 49 +++++++ ...igurationDataDozModServerToStatelessClient.java | 30 +++++ .../configuration/logic/ConfigurationLogic.java | 12 ++ ...nfigurationLogicDozModClientToDozModServer.java | 44 +++++++ ...nfigurationLogicDozModServerToDozModClient.java | 143 +++++++++++++++++++++ ...gurationLogicDozModServerToStatelessClient.java | 74 +++++++++++ .../virtualization/virtualizer/Virtualizer.java | 19 +-- .../virtualizer/VirtualizerDocker.java | 8 +- .../virtualizer/VirtualizerQemu.java | 8 +- .../virtualizer/VirtualizerVirtualBox.java | 7 +- .../virtualizer/VirtualizerVmware.java | 8 +- .../java/org/openslx/vm/disk/DiskImageUtils.java | 10 ++ 18 files changed, 506 insertions(+), 119 deletions(-) create mode 100644 src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModClientToDozModServer.java create mode 100644 src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModServerToDozModClient.java create mode 100644 src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModServerToStatelessClient.java create mode 100644 src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogic.java create mode 100644 src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServer.java create mode 100644 src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClient.java create mode 100644 src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java (limited to 'src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java') diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java index 4f00b92..69cd3d5 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java @@ -12,7 +12,7 @@ import java.util.Map.Entry; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; -import org.openslx.bwlp.thrift.iface.Virtualizer; +import org.openslx.virtualization.virtualizer.Virtualizer; import org.openslx.vm.disk.DiskImage; /** @@ -31,6 +31,8 @@ public abstract class VirtualizationConfiguration protected Map hwversion = new HashMap<>(); protected Map networkCards = new HashMap<>(); protected Map usbSpeeds = new HashMap<>(); + + private final Virtualizer virtualizer; /** * Virtual sound cards types @@ -249,8 +251,9 @@ public abstract class VirtualizationConfiguration * Methods */ - public VirtualizationConfiguration( List osList ) + public VirtualizationConfiguration( Virtualizer virtualizer, List osList ) { + this.virtualizer = virtualizer; this.osList = osList; // register virtual hardware models for graphical editing of virtual devices (GPU, sound, USB, ...) @@ -293,12 +296,6 @@ public abstract class VirtualizationConfiguration * @return list of image formats. */ public abstract List getSupportedImageFormats(); - - /** - * Apply config options that are desired when locally editing a VM. for vmware, - * this disables automatic DPI scaling of the guest. - */ - public abstract void applySettingsForLocalEdit(); /** * Returns a VmMetaData instance of the given machine description given as file @@ -327,7 +324,7 @@ public abstract class VirtualizationConfiguration } try { return new VirtualizationConfigurationDocker(osList, file); - } catch ( Exception e ) { + } catch ( VirtualizationConfigurationException e ) { LOGGER.info( "Not a tar.gz file, for docker container", e ); } @@ -371,6 +368,13 @@ public abstract class VirtualizationConfiguration LOGGER.error( "Could not detect any known virtualizer format" ); return null; } + + /** + * Returns the file name extension for the virtualization configuration file. + * + * @return file name extension for the virtualization configuration file. + */ + public abstract String getFileNameExtension(); public abstract boolean addHddTemplate( File diskImage, String hddMode, String redoDir ); @@ -414,10 +418,38 @@ public abstract class VirtualizationConfiguration public abstract boolean addEthernet( EtherType type ); - public abstract Virtualizer getVirtualizer(); - - public abstract boolean tweakForNonPersistent(); + public Virtualizer getVirtualizer() + { + return this.virtualizer; + } + /** + * Transforms the virtualization configuration in terms of a privacy filter to filter out + * sensitive information like name of users in absolute paths. + * + * @throws VirtualizationConfigurationException transformation of the virtualization + * 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). + * + * @throws VirtualizationConfigurationException transformation of the virtualization + * 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. + * + * @throws VirtualizationConfigurationException transformation of the virtualization + * 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 b6f237b..3c21fe4 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java @@ -2,8 +2,7 @@ package org.openslx.virtualization.configuration; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; -import org.openslx.bwlp.thrift.iface.Virtualizer; -import org.openslx.thrifthelper.TConst; +import org.openslx.virtualization.virtualizer.VirtualizerDocker; import org.openslx.vm.disk.DiskImage; import org.openslx.vm.disk.DiskImage.ImageFormat; @@ -37,6 +36,11 @@ class DockerUsbSpeedMeta public class VirtualizationConfigurationDocker extends VirtualizationConfiguration { + /** + * File name extension for Docker virtualization configuration files. + */ + private static final String CONFIGURATION_FILE_NAME_EXTENSION = null; + /** * List of supported image formats by the Docker hypervisor. */ @@ -45,8 +49,6 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati private static final Logger LOGGER = Logger.getLogger( VirtualizationConfigurationDocker.class); - private final Virtualizer virtualizer = new Virtualizer(TConst.VIRT_DOCKER, "Docker"); - /** * containerDefinition is a serialized tar.gz archive and represents a * ContainerDefinition. This archive contains a serialized Container Recipe (e.g. Dockerfile) @@ -60,7 +62,7 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati private byte[] containerDefinition; public VirtualizationConfigurationDocker(List osList, File file) throws VirtualizationConfigurationException { - super(osList); + super(new VirtualizerDocker(), osList); BufferedInputStream bis = null; @@ -83,7 +85,7 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati public VirtualizationConfigurationDocker(List osList, byte[] vmContent, int length) throws VirtualizationConfigurationException { - super(osList); + super(new VirtualizerDocker(), osList); containerDefinition = vmContent; @@ -117,9 +119,13 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati return VirtualizationConfigurationDocker.SUPPORTED_IMAGE_FORMATS; } - @Override public void applySettingsForLocalEdit() { + @Override public void transformEditable() throws VirtualizationConfigurationException { } + + @Override + public void transformPrivacy() throws VirtualizationConfigurationException { + } @Override public boolean addHddTemplate(File diskImage, String hddMode, String redoDir) { return false; @@ -205,15 +211,16 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati return false; } - @Override public Virtualizer getVirtualizer() { - return virtualizer; - } - - @Override public boolean tweakForNonPersistent() { - return false; + @Override public void transformNonPersistent() throws VirtualizationConfigurationException { + } @Override public void registerVirtualHW() { } + + @Override + public String getFileNameExtension() { + return VirtualizationConfigurationDocker.CONFIGURATION_FILE_NAME_EXTENSION; + } } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java index 91bb9ae..534f0e5 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java @@ -10,7 +10,6 @@ import java.util.List; import java.util.Map.Entry; import org.openslx.bwlp.thrift.iface.OperatingSystem; -import org.openslx.bwlp.thrift.iface.Virtualizer; import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.device.ControllerUsb; import org.openslx.libvirt.domain.device.Disk.BusType; @@ -26,7 +25,7 @@ import org.openslx.libvirt.domain.device.Video; import org.openslx.libvirt.xml.LibvirtXmlDocumentException; import org.openslx.libvirt.xml.LibvirtXmlSerializationException; import org.openslx.libvirt.xml.LibvirtXmlValidationException; -import org.openslx.thrifthelper.TConst; +import org.openslx.virtualization.virtualizer.VirtualizerQemu; import org.openslx.vm.disk.DiskImage; import org.openslx.vm.disk.DiskImage.ImageFormat; @@ -247,15 +246,15 @@ public class VirtualizationConfigurationQemu extends public static final String CDROM_DEFAULT_PHYSICAL_DRIVE = "/dev/sr0"; /** - * List of supported image formats by the QEMU hypervisor. + * File name extension for QEMU (Libvirt) virtualization configuration files. */ - private static final List SUPPORTED_IMAGE_FORMATS = Collections.unmodifiableList( - Arrays.asList( ImageFormat.QCOW2, ImageFormat.VMDK, ImageFormat.VDI ) ); + private static final String CONFIGURATION_FILE_NAME_EXTENSION = ".xml"; /** - * Representation of a QEMU hypervisor (managed by Libvirt). + * List of supported image formats by the QEMU hypervisor. */ - private static final Virtualizer VIRTUALIZER = new Virtualizer( TConst.VIRT_QEMU, "QEMU" ); + private static final List SUPPORTED_IMAGE_FORMATS = Collections.unmodifiableList( + Arrays.asList( ImageFormat.QCOW2, ImageFormat.VMDK, ImageFormat.VDI ) ); /** * Libvirt XML configuration file to modify configuration of virtual machine for QEMU. @@ -285,9 +284,10 @@ public class VirtualizationConfigurationQemu extends * * @throws VirtualizationConfigurationException Libvirt XML configuration cannot be processed. */ - public VirtualizationConfigurationQemu( List osList, File file ) throws VirtualizationConfigurationException + public VirtualizationConfigurationQemu( List osList, File file ) + throws VirtualizationConfigurationException { - super( osList ); + super( new VirtualizerQemu(), osList ); try { // read and parse Libvirt domain XML configuration document @@ -312,7 +312,7 @@ public class VirtualizationConfigurationQemu extends public VirtualizationConfigurationQemu( List osList, byte[] vmContent, int length ) throws VirtualizationConfigurationException { - super( osList ); + super( new VirtualizerQemu(), osList ); try { // read and parse Libvirt domain XML configuration document @@ -341,10 +341,6 @@ public class VirtualizationConfigurationQemu extends for ( DiskStorage storageDiskDevice : this.vmConfig.getDiskStorageDevices() ) { this.addHddMetaData( storageDiskDevice ); } - - // start of privacy filters to filter out sensitive information like name of users in absolute paths, ... - // removes all referenced storage files of all specified CDROMs, Floppy drives and HDDs - this.vmConfig.removeDiskDevicesStorage(); } /** @@ -356,7 +352,8 @@ public class VirtualizationConfigurationQemu extends private void addHddMetaData( DiskStorage storageDiskDevice ) { String hddChipsetModel = null; - DriveBusType hddChipsetBus = VirtualizationConfigurationQemuUtils.convertBusType( storageDiskDevice.getBusType() ); + DriveBusType hddChipsetBus = VirtualizationConfigurationQemuUtils + .convertBusType( storageDiskDevice.getBusType() ); String hddImagePath = storageDiskDevice.getStorageSource(); this.hdds.add( new HardDisk( hddChipsetModel, hddChipsetBus, hddImagePath ) ); @@ -383,7 +380,7 @@ public class VirtualizationConfigurationQemu extends } @Override - public void applySettingsForLocalEdit() + public void transformEditable() throws VirtualizationConfigurationException { // NOT implemented yet } @@ -836,16 +833,16 @@ public class VirtualizationConfigurationQemu extends } @Override - public Virtualizer getVirtualizer() + public void transformNonPersistent() throws VirtualizationConfigurationException { - return VirtualizationConfigurationQemu.VIRTUALIZER; + // NOT implemented yet } @Override - public boolean tweakForNonPersistent() + public void transformPrivacy() throws VirtualizationConfigurationException { - // NOT implemented yet - return false; + // removes all referenced storage files of all specified CDROMs, Floppy drives and HDDs + this.vmConfig.removeDiskDevicesStorage(); } @Override @@ -878,4 +875,10 @@ public class VirtualizationConfigurationQemu extends usbSpeeds.put( VirtualizationConfiguration.UsbSpeed.USB3_0, new QemuUsbSpeedMeta( 3, ControllerUsb.Model.QEMU_XHCI ) ); // @formatter:on } + + @Override + public String getFileNameExtension() + { + return VirtualizationConfigurationQemu.CONFIGURATION_FILE_NAME_EXTENSION; + } } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java index 39e78ea..90b1879 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java @@ -13,9 +13,9 @@ import java.util.UUID; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; -import org.openslx.bwlp.thrift.iface.Virtualizer; import org.openslx.thrifthelper.TConst; import org.openslx.virtualization.configuration.VirtualizationConfigurationVirtualboxFileFormat.PlaceHolder; +import org.openslx.virtualization.virtualizer.VirtualizerVirtualBox; import org.openslx.vm.disk.DiskImage; import org.openslx.vm.disk.DiskImage.ImageFormat; import org.w3c.dom.Attr; @@ -80,6 +80,11 @@ class VBoxUsbSpeedMeta public class VirtualizationConfigurationVirtualBox extends VirtualizationConfiguration { + /** + * File name extension for VirtualBox virtualization configuration files.. + */ + private static final String CONFIGURATION_FILE_NAME_EXTENSION = ".vbox"; + /** * List of supported image formats by the VirtualBox hypervisor. */ @@ -88,8 +93,6 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu private static final Logger LOGGER = Logger.getLogger( VirtualizationConfigurationVirtualBox.class ); - private static final Virtualizer virtualizer = new Virtualizer( TConst.VIRT_VIRTUALBOX, "VirtualBox" ); - private final VirtualizationConfigurationVirtualboxFileFormat config; public static enum EthernetType @@ -106,14 +109,14 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu public VirtualizationConfigurationVirtualBox( List osList, File file ) throws IOException, VirtualizationConfigurationException { - super( osList ); + super( new VirtualizerVirtualBox(), osList ); this.config = new VirtualizationConfigurationVirtualboxFileFormat( file ); init(); } public VirtualizationConfigurationVirtualBox( List osList, byte[] vmContent, int length ) throws IOException, VirtualizationConfigurationException { - super( osList ); + super( new VirtualizerVirtualBox(), osList ); this.config = new VirtualizationConfigurationVirtualboxFileFormat( vmContent, length ); init(); } @@ -127,12 +130,6 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu hdds.add( hardDisk ); } } - - @Override - public Virtualizer getVirtualizer() - { - return virtualizer; - } @Override public List getSupportedImageFormats() @@ -141,10 +138,16 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu } @Override - public void applySettingsForLocalEdit() + public void transformEditable() throws VirtualizationConfigurationException { // TODO Auto-generated method stub } + + @Override + public void transformPrivacy() throws VirtualizationConfigurationException + { + + } @Override public byte[] getDefinitionArray() @@ -470,7 +473,7 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu } @Override - public boolean tweakForNonPersistent() + public void transformNonPersistent() throws VirtualizationConfigurationException { // Cannot disable suspend // https://forums.virtualbox.org/viewtopic.php?f=6&t=77169 @@ -484,7 +487,6 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu config.setExtraData( "GUI/PreventSnapshotOperations", "true" ); config.setExtraData( "GUI/PreventApplicationUpdate", "true" ); config.setExtraData( "GUI/RestrictedCloseActions", "SaveState,PowerOffRestoringSnapshot,Detach" ); - return true; } @Override @@ -532,4 +534,10 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu } return maxItem; } + + @Override + public String getFileNameExtension() + { + return VirtualizationConfigurationVirtualBox.CONFIGURATION_FILE_NAME_EXTENSION; + } } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java index 5dfd5f9..9f490d4 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java @@ -14,10 +14,10 @@ import java.util.regex.Pattern; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; -import org.openslx.bwlp.thrift.iface.Virtualizer; import org.openslx.thrifthelper.TConst; import org.openslx.util.Util; import org.openslx.virtualization.configuration.VirtualizationConfigurationVmwareFileFormat.ConfigEntry; +import org.openslx.virtualization.virtualizer.VirtualizerVmware; import org.openslx.vm.disk.DiskImage; import org.openslx.vm.disk.DiskImage.ImageFormat; @@ -77,6 +77,11 @@ class VmwareUsbSpeed public class VirtualizationConfigurationVmware extends VirtualizationConfiguration { + /** + * File name extension for VMware virtualization configuration files. + */ + private static final String CONFIGURATION_FILE_NAME_EXTENSION = ".vmx"; + /** * List of supported image formats by the VMware hypervisor. */ @@ -85,8 +90,6 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati private static final Logger LOGGER = Logger.getLogger( VirtualizationConfigurationVmware.class ); - private static final Virtualizer virtualizer = new Virtualizer( TConst.VIRT_VMWARE, "VMware" ); - private static final Pattern hddKey = Pattern.compile( "^(ide\\d|scsi\\d|sata\\d|nvme\\d):?(\\d)?\\.(.*)", Pattern.CASE_INSENSITIVE ); // Lowercase list of allowed settings for upload (as regex) @@ -122,14 +125,14 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati public VirtualizationConfigurationVmware( List osList, File file ) throws IOException, VirtualizationConfigurationException { - super( osList ); + super( new VirtualizerVmware(), osList ); this.config = new VirtualizationConfigurationVmwareFileFormat( file ); init(); } public VirtualizationConfigurationVmware( List osList, byte[] vmxContent, int length ) throws VirtualizationConfigurationException { - super( osList ); + super( new VirtualizerVmware(), osList ); this.config = new VirtualizationConfigurationVmwareFileFormat( vmxContent, length ); // still unfiltered init(); // now filtered } @@ -412,10 +415,9 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati } @Override - public boolean tweakForNonPersistent() + public void transformNonPersistent() throws VirtualizationConfigurationException { addFiltered( "suspend.disabled", "TRUE" ); - return true; } @Override @@ -449,12 +451,6 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati return config.toString( false, false ).getBytes( StandardCharsets.UTF_8 ); } - @Override - public Virtualizer getVirtualizer() - { - return virtualizer; - } - private static class Device { public boolean present = false; @@ -482,7 +478,7 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati } @Override - public void applySettingsForLocalEdit() + public void transformEditable() throws VirtualizationConfigurationException { addFiltered( "gui.applyHostDisplayScalingToGuest", "FALSE" ); } @@ -639,6 +635,11 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati return false; } + @Override + public void transformPrivacy() throws VirtualizationConfigurationException + { + } + public void registerVirtualHW() { soundCards.put( VirtualizationConfiguration.SoundCardType.NONE, new VmWareSoundCardMeta( false, null ) ); @@ -679,4 +680,10 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati usbSpeeds.put( VirtualizationConfiguration.UsbSpeed.USB3_0, new VmwareUsbSpeed( 3, "usb_xhci" ) ); } + @Override + public String getFileNameExtension() + { + return VirtualizationConfigurationVmware.CONFIGURATION_FILE_NAME_EXTENSION; + } + } diff --git a/src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModClientToDozModServer.java b/src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModClientToDozModServer.java new file mode 100644 index 0000000..dda62aa --- /dev/null +++ b/src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModClientToDozModServer.java @@ -0,0 +1,8 @@ +package org.openslx.virtualization.configuration.data; + +public class ConfigurationDataDozModClientToDozModServer +{ + public ConfigurationDataDozModClientToDozModServer() + { + } +} diff --git a/src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModServerToDozModClient.java b/src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModServerToDozModClient.java new file mode 100644 index 0000000..c1ae37a --- /dev/null +++ b/src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModServerToDozModClient.java @@ -0,0 +1,49 @@ +package org.openslx.virtualization.configuration.data; + +import java.io.File; + +import org.openslx.bwlp.thrift.iface.OperatingSystem; + +public class ConfigurationDataDozModServerToDozModClient +{ + private final String displayName; + private final File diskImage; + private final OperatingSystem guestOs; + private final String virtualizerId; + private final int totalMemory; + + public ConfigurationDataDozModServerToDozModClient( String displayName, File diskImage, OperatingSystem guestOs, + String virtualizerId, int totalMemory ) + { + this.displayName = displayName; + this.diskImage = diskImage; + this.guestOs = guestOs; + this.virtualizerId = virtualizerId; + this.totalMemory = totalMemory; + } + + public String getDisplayName() + { + return this.displayName; + } + + public File getDiskImage() + { + return this.diskImage; + } + + public OperatingSystem getGuestOs() + { + return this.guestOs; + } + + public String getVirtualizerId() + { + return this.virtualizerId; + } + + public int getTotalMemory() + { + return this.totalMemory; + } +} diff --git a/src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModServerToStatelessClient.java b/src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModServerToStatelessClient.java new file mode 100644 index 0000000..f5d9a31 --- /dev/null +++ b/src/main/java/org/openslx/virtualization/configuration/data/ConfigurationDataDozModServerToStatelessClient.java @@ -0,0 +1,30 @@ +package org.openslx.virtualization.configuration.data; + +public class ConfigurationDataDozModServerToStatelessClient +{ + private final String displayName; + private final String osId; + private final boolean hasUsbAccess; + + public ConfigurationDataDozModServerToStatelessClient( String displayName, String osId, boolean hasUsbAccess ) + { + this.displayName = displayName; + this.osId = osId; + this.hasUsbAccess = hasUsbAccess; + } + + public String getDisplayName() + { + return this.displayName; + } + + public String getOsId() + { + return this.osId; + } + + public boolean hasUsbAccess() + { + return this.hasUsbAccess; + } +} diff --git a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogic.java b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogic.java new file mode 100644 index 0000000..5bfbf8f --- /dev/null +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogic.java @@ -0,0 +1,12 @@ +package org.openslx.virtualization.configuration.logic; + +import org.openslx.virtualization.configuration.VirtualizationConfiguration; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public abstract class ConfigurationLogic extends TransformationGeneric, T> +{ + public ConfigurationLogic( String name ) + { + super( name ); + } +} diff --git a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServer.java b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServer.java new file mode 100644 index 0000000..76a845f --- /dev/null +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServer.java @@ -0,0 +1,44 @@ +package org.openslx.virtualization.configuration.logic; + +import org.openslx.virtualization.configuration.VirtualizationConfiguration; +import org.openslx.virtualization.configuration.VirtualizationConfigurationException; +import org.openslx.virtualization.configuration.data.ConfigurationDataDozModClientToDozModServer; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +public class ConfigurationLogicDozModClientToDozModServer + extends ConfigurationLogic +{ + private static final String CONFIGURATION_LOGIC_NAME = "Transformation of virtualization configuration during upload from DozMod client to DozMod server"; + + public ConfigurationLogicDozModClientToDozModServer() + { + super( ConfigurationLogicDozModClientToDozModServer.CONFIGURATION_LOGIC_NAME ); + } + + private void validateInputs( VirtualizationConfiguration config, + ConfigurationDataDozModClientToDozModServer args ) + throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } else if ( config.getDisplayName() == null ) { + throw new TransformationException( "Display name is missing in virtualization configuration!" ); + } + } + + @Override + public void transform( VirtualizationConfiguration config, + ConfigurationDataDozModClientToDozModServer args ) + throws TransformationException + { + // check if input parameters for a transformation are valid + this.validateInputs( config, args ); + + // apply the privacy filter on the given virtualization configuration + try { + config.transformPrivacy(); + } catch ( VirtualizationConfigurationException e ) { + throw new TransformationException( e.getLocalizedMessage() ); + } + } +} diff --git a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClient.java b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClient.java new file mode 100644 index 0000000..fa3a505 --- /dev/null +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClient.java @@ -0,0 +1,143 @@ +package org.openslx.virtualization.configuration.logic; + +import java.util.Map; + +import org.openslx.bwlp.thrift.iface.OperatingSystem; +import org.openslx.virtualization.configuration.VirtualizationConfiguration; +import org.openslx.virtualization.configuration.VirtualizationConfiguration.UsbSpeed; +import org.openslx.virtualization.configuration.VirtualizationConfigurationException; +import org.openslx.virtualization.configuration.data.ConfigurationDataDozModServerToDozModClient; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +public class ConfigurationLogicDozModServerToDozModClient + extends ConfigurationLogic +{ + private static final String CONFIGURATION_LOGIC_NAME = "Transformation of virtualization configuration during download from DozMod server to DozMod client"; + + private static final int CONFIGURATION_LOGIC_NUM_CPU_CORES = 1; + private static final int CONFIGURATION_LOGIC_MEMORY_MIN = 1024; + + public ConfigurationLogicDozModServerToDozModClient() + { + super( ConfigurationLogicDozModServerToDozModClient.CONFIGURATION_LOGIC_NAME ); + } + + private void validateInputs( VirtualizationConfiguration config, + ConfigurationDataDozModServerToDozModClient args ) + throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } else if ( args.getDisplayName() == null || args.getDisplayName().isEmpty() ) { + throw new TransformationException( "Valid display name is not specified!" ); + } else if ( args.getDiskImage() == null || !args.getDiskImage().exists() ) { + throw new TransformationException( "Valid disk image file is not specified!" ); + } else if ( ! ( args.getTotalMemory() > 0 ) ) { + throw new TransformationException( "Total memory amount is not specified!" ); + } + } + + private static int roundToNearest( int value, int nearestFactor ) + { + return ( value / nearestFactor ) * nearestFactor; + } + + private static int calculateVirtualizationMemoryOnDozmodClient( int totalMemory, int osMaxMemory ) + { + // calculate the amount of memory + int memory = totalMemory / 2 - 512; + + // increase calculated memory if lower memory limit is undercut + if ( memory < ConfigurationLogicDozModServerToDozModClient.CONFIGURATION_LOGIC_MEMORY_MIN ) { + memory = ConfigurationLogicDozModServerToDozModClient.CONFIGURATION_LOGIC_MEMORY_MIN; + } + + // limit virtualization memory if the available host's system memory amount is smaller + if ( osMaxMemory > 0 && memory > osMaxMemory ) { + memory = osMaxMemory; + } + + // round to nearest factor of 4, otherwise VMware virtualization configuration files are invalid + return ConfigurationLogicDozModServerToDozModClient.roundToNearest( memory, 4 ); + } + + @Override + public void transform( VirtualizationConfiguration config, + ConfigurationDataDozModServerToDozModClient args ) + throws TransformationException + { + // check if input parameters for a transformation are valid + this.validateInputs( config, args ); + + // set display name + if ( !config.addDisplayName( args.getDisplayName() ) ) { + throw new TransformationException( "Can not set display name in virtualization configuration!" ); + } + + // append hard disk drive + if ( !config.addHddTemplate( args.getDiskImage(), null, null ) ) { + throw new TransformationException( "Can not configure hard disk in virtualization configuration!" ); + } + + // append default NAT interface + if ( !config.addDefaultNat() ) { + throw new TransformationException( "Can not configure NAT interface in virtualization configuration!" ); + } + + // set the guest OS if specified + final OperatingSystem guestOs = args.getGuestOs(); + final String virtualizerId = args.getVirtualizerId(); + int osMaxMemory = 0; + + if ( guestOs != null && virtualizerId != null ) { + final Map virtOsIdMap = guestOs.getVirtualizerOsId(); + if ( virtOsIdMap != null ) { + // set guest operating system if possible + final String virtOsId = virtOsIdMap.get( virtualizerId ); + if ( virtOsId != null ) { + config.setOs( virtOsId ); + } + + // get maximum memory of editable host for guestOs if possible + final int maxMemMb = guestOs.getMaxMemMb(); + if ( maxMemMb > 0 ) { + osMaxMemory = maxMemMb; + } + } + } + + // set CPU core count + if ( !config.addCpuCoreCount( ConfigurationLogicDozModServerToDozModClient.CONFIGURATION_LOGIC_NUM_CPU_CORES ) ) { + throw new TransformationException( "Can not set CPU core count in virtualization configuration!" ); + } + + // calculate and set memory + final int virtualizationMemory = ConfigurationLogicDozModServerToDozModClient + .calculateVirtualizationMemoryOnDozmodClient( args.getTotalMemory(), osMaxMemory ); + if ( !config.addRam( virtualizationMemory ) ) { + throw new TransformationException( "Can not set memory in virtualization configuration!" ); + } + + // append first empty floppy drive + config.addFloppy( 0, null, true ); + // append second empty floppy drive + config.addFloppy( 1, null, true ); + + // append first empty (ISO-based) CDROM drive + config.addCdrom( "" ); + // append second CDROM drive connected to the host's physical drive + config.addCdrom( null ); + + // set maximum USB speed + if ( config.getMaxUsbSpeed() != UsbSpeed.USB3_0 ) { + config.setMaxUsbSpeed( UsbSpeed.USB2_0 ); + } + + // apply settings to edit virtualized system locally + try { + config.transformEditable(); + } catch ( VirtualizationConfigurationException e ) { + throw new TransformationException( e.getLocalizedMessage() ); + } + } +} diff --git a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java new file mode 100644 index 0000000..4c20b1f --- /dev/null +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java @@ -0,0 +1,74 @@ +package org.openslx.virtualization.configuration.logic; + +import org.openslx.virtualization.configuration.VirtualizationConfiguration; +import org.openslx.virtualization.configuration.VirtualizationConfiguration.EtherType; +import org.openslx.virtualization.configuration.VirtualizationConfiguration.UsbSpeed; +import org.openslx.virtualization.configuration.VirtualizationConfigurationException; +import org.openslx.virtualization.configuration.data.ConfigurationDataDozModServerToStatelessClient; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +public class ConfigurationLogicDozModServerToStatelessClient + extends ConfigurationLogic +{ + private static final String CONFIGURATION_LOGIC_NAME = "Transformation of virtualization configuration during download from DozMod server to stateless client"; + + private static final EtherType CONFIGURATION_DEFAULT_ETHERNET_TYPE = EtherType.NAT; + + public ConfigurationLogicDozModServerToStatelessClient() + { + super( ConfigurationLogicDozModServerToStatelessClient.CONFIGURATION_LOGIC_NAME ); + } + + private void validateInputs( VirtualizationConfiguration config, + ConfigurationDataDozModServerToStatelessClient args ) + throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } else if ( args.getDisplayName() == null || args.getDisplayName().isEmpty() ) { + throw new TransformationException( "Valid display name is not specified!" ); + } + } + + @Override + public void transform( VirtualizationConfiguration config, + ConfigurationDataDozModServerToStatelessClient args ) + throws TransformationException + { + // check if input parameters for a transformation are valid + this.validateInputs( config, args ); + + // set display name of lecture + if ( !config.addDisplayName( args.getDisplayName() ) ) { + throw new TransformationException( "Can not set display name in virtualization configuration!" ); + } + + // append hard disk drive + if ( !config.addHddTemplate( "%VM_DISK_PATH%", "%VM_DISK_MODE%", "%VM_DISK_REDOLOGDIR%" ) ) { + throw new TransformationException( "Can not configure hard disk in virtualization configuration!" ); + } + + // append default NAT interface + if ( !config.addEthernet( + ConfigurationLogicDozModServerToStatelessClient.CONFIGURATION_DEFAULT_ETHERNET_TYPE ) ) { + throw new TransformationException( "Can not configure NAT interface in virtualization configuration!" ); + } + + // set the guest OS if specified + if ( args.getOsId() != null ) { + config.setOs( args.getOsId() ); + } + + // disable USB if necessary + if ( !args.hasUsbAccess() ) { + config.setMaxUsbSpeed( UsbSpeed.NONE ); + } + + // apply settings to run virtualized system in a stateless manner + try { + config.transformNonPersistent(); + } catch ( VirtualizationConfigurationException e ) { + throw new TransformationException( e.getLocalizedMessage() ); + } + } +} diff --git a/src/main/java/org/openslx/virtualization/virtualizer/Virtualizer.java b/src/main/java/org/openslx/virtualization/virtualizer/Virtualizer.java index 1411e6a..e74d15e 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/Virtualizer.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/Virtualizer.java @@ -21,21 +21,14 @@ public abstract class Virtualizer */ protected final org.openslx.bwlp.thrift.iface.Virtualizer internalVirtualizer; - /** - * File name suffix for virtualization configuration files of the virtualizer. - */ - public final String configFileNameSuffix; - /** * Creates a new virtualizer. * * @param internalVirtualizer internal data representation for the new virtualizer. - * @param configFileNameSuffix */ - public Virtualizer( org.openslx.bwlp.thrift.iface.Virtualizer internalVirtualizer, String configFileNameSuffix ) + public Virtualizer( org.openslx.bwlp.thrift.iface.Virtualizer internalVirtualizer ) { this.internalVirtualizer = internalVirtualizer; - this.configFileNameSuffix = configFileNameSuffix; } /** @@ -58,16 +51,6 @@ public abstract class Virtualizer return this.internalVirtualizer.getVirtName(); } - /** - * Returns the file name suffix for virtualization configuration files of the virtualizer. - * - * @return file name suffix for virtualization configuration files of the virtualizer. - */ - public String getConfigFileNameSuffix() - { - return this.configFileNameSuffix; - } - /** * Returns a list of supported disk image formats by the virtualizer. * diff --git a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerDocker.java b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerDocker.java index cd8907a..4461595 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerDocker.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerDocker.java @@ -21,11 +21,6 @@ public class VirtualizerDocker extends Virtualizer */ private static final String VIRTUALIZER_NAME = "Docker"; - /** - * File name suffix for virtualization configuration files of the Docker virtualizer. - */ - private static final String VIRTUALIZER_CONFIG_FILE_NAME_SUFFIX = null; - /** * List of supported image formats by the Docker virtualizer. */ @@ -37,8 +32,7 @@ public class VirtualizerDocker extends Virtualizer */ public VirtualizerDocker() { - super( new org.openslx.bwlp.thrift.iface.Virtualizer( TConst.VIRT_DOCKER, VirtualizerDocker.VIRTUALIZER_NAME ), - VirtualizerDocker.VIRTUALIZER_CONFIG_FILE_NAME_SUFFIX ); + super( new org.openslx.bwlp.thrift.iface.Virtualizer( TConst.VIRT_DOCKER, VirtualizerDocker.VIRTUALIZER_NAME )); } @Override diff --git a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java index 0b8c962..731209b 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java @@ -21,11 +21,6 @@ public class VirtualizerQemu extends Virtualizer */ private static final String VIRTUALIZER_NAME = "QEMU"; - /** - * File name suffix for virtualization configuration files (Libvirt) of the QEMU virtualizer. - */ - private static final String VIRTUALIZER_CONFIG_FILE_NAME_SUFFIX = "xml"; - /** * List of supported image formats by the QEMU virtualizer. */ @@ -37,8 +32,7 @@ public class VirtualizerQemu extends Virtualizer */ public VirtualizerQemu() { - super( new org.openslx.bwlp.thrift.iface.Virtualizer( TConst.VIRT_QEMU, VirtualizerQemu.VIRTUALIZER_NAME ), - VirtualizerQemu.VIRTUALIZER_CONFIG_FILE_NAME_SUFFIX ); + super( new org.openslx.bwlp.thrift.iface.Virtualizer( TConst.VIRT_QEMU, VirtualizerQemu.VIRTUALIZER_NAME ) ); } @Override diff --git a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVirtualBox.java b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVirtualBox.java index ff2fc2d..77662ab 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVirtualBox.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVirtualBox.java @@ -21,11 +21,6 @@ public class VirtualizerVirtualBox extends Virtualizer */ private static final String VIRTUALIZER_NAME = "VirtualBox"; - /** - * File name suffix for virtualization configuration files of the VirtualBox virtualizer. - */ - private static final String VIRTUALIZER_CONFIG_FILE_NAME_SUFFIX = "vbox"; - /** * List of supported image formats by the VirtualBox virtualizer. */ @@ -38,7 +33,7 @@ public class VirtualizerVirtualBox extends Virtualizer public VirtualizerVirtualBox() { super( new org.openslx.bwlp.thrift.iface.Virtualizer( TConst.VIRT_VIRTUALBOX, - VirtualizerVirtualBox.VIRTUALIZER_NAME ), VirtualizerVirtualBox.VIRTUALIZER_CONFIG_FILE_NAME_SUFFIX ); + VirtualizerVirtualBox.VIRTUALIZER_NAME ) ); } @Override diff --git a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVmware.java b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVmware.java index 48a3ad7..7b766eb 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVmware.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVmware.java @@ -21,11 +21,6 @@ public class VirtualizerVmware extends Virtualizer */ private static final String VIRTUALIZER_NAME = "VMware"; - /** - * File name suffix for virtualization configuration files of the VMware virtualizer. - */ - private static final String VIRTUALIZER_CONFIG_FILE_NAME_SUFFIX = "vmx"; - /** * List of supported image formats by the VMware virtualizer. */ @@ -37,8 +32,7 @@ public class VirtualizerVmware extends Virtualizer */ public VirtualizerVmware() { - super( new org.openslx.bwlp.thrift.iface.Virtualizer( TConst.VIRT_VMWARE, VirtualizerVmware.VIRTUALIZER_NAME ), - VirtualizerVmware.VIRTUALIZER_CONFIG_FILE_NAME_SUFFIX ); + super( new org.openslx.bwlp.thrift.iface.Virtualizer( TConst.VIRT_VMWARE, VirtualizerVmware.VIRTUALIZER_NAME ) ); } @Override diff --git a/src/main/java/org/openslx/vm/disk/DiskImageUtils.java b/src/main/java/org/openslx/vm/disk/DiskImageUtils.java index fbed6f9..e704b74 100644 --- a/src/main/java/org/openslx/vm/disk/DiskImageUtils.java +++ b/src/main/java/org/openslx/vm/disk/DiskImageUtils.java @@ -151,4 +151,14 @@ public class DiskImageUtils { return DiskImageUtils.versionFromMajorMinor( major, Short.valueOf( "0" ) ); } + + public static short versionToMajor( final int version ) + { + return Integer.valueOf( version >> 16 ).shortValue(); + } + + public static short versionToMinor( final int version ) + { + return Integer.valueOf( version & 0x0000FFFF ).shortValue(); + } } -- cgit v1.2.3-55-g7522 From 966cbd842fac0996742f33c85c60221c9e461930 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Fri, 23 Apr 2021 16:44:18 +0200 Subject: Refactors and abstracts version information in config logic and disk image --- .../java/org/openslx/virtualization/Version.java | 190 +++++++++++++++++++++ .../configuration/VirtualizationConfiguration.java | 87 +++------- .../VirtualizationConfigurationDocker.java | 43 ++--- .../VirtualizationConfigurationQemu.java | 77 +-------- .../VirtualizationConfigurationVirtualBox.java | 50 +----- .../VirtualizationConfigurationVmware.java | 91 ++-------- .../configuration/logic/ConfigurationLogic.java | 2 +- ...nfigurationLogicDozModClientToDozModServer.java | 4 +- ...nfigurationLogicDozModServerToDozModClient.java | 4 +- ...gurationLogicDozModServerToStatelessClient.java | 4 +- .../virtualization/virtualizer/Virtualizer.java | 8 + .../virtualizer/VirtualizerDocker.java | 14 +- .../virtualizer/VirtualizerQemu.java | 12 ++ .../virtualizer/VirtualizerVirtualBox.java | 12 ++ .../virtualizer/VirtualizerVmware.java | 28 +++ src/main/java/org/openslx/vm/disk/DiskImage.java | 3 +- .../java/org/openslx/vm/disk/DiskImageQcow2.java | 8 +- .../java/org/openslx/vm/disk/DiskImageUtils.java | 20 --- .../java/org/openslx/vm/disk/DiskImageVdi.java | 6 +- .../java/org/openslx/vm/disk/DiskImageVmdk.java | 13 +- .../org/openslx/virtualization/VersionTest.java | 98 +++++++++++ .../VirtualizationConfigurationQemuTest.java | 35 +--- .../org/openslx/vm/disk/DiskImageQcow2Test.java | 27 +-- .../java/org/openslx/vm/disk/DiskImageVdiTest.java | 7 +- .../org/openslx/vm/disk/DiskImageVmdkTest.java | 13 +- 25 files changed, 482 insertions(+), 374 deletions(-) create mode 100644 src/main/java/org/openslx/virtualization/Version.java create mode 100644 src/test/java/org/openslx/virtualization/VersionTest.java (limited to 'src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java') diff --git a/src/main/java/org/openslx/virtualization/Version.java b/src/main/java/org/openslx/virtualization/Version.java new file mode 100644 index 0000000..7d4d016 --- /dev/null +++ b/src/main/java/org/openslx/virtualization/Version.java @@ -0,0 +1,190 @@ +package org.openslx.virtualization; + +import java.util.List; +import java.util.function.Predicate; + +/** + * Represents a version information. + * + * The version information is used in the field of virtualization (for virtualizers, disk images, + * virtualization configuration files, ...). + * + * @author Manuel Bentele + * @version 1.0 + */ +public class Version implements Comparable +{ + private final short major; + private final short minor; + private final String name; + + /** + * Creates a new version. + * + * The version consists of a major version, whereas the minor version is set to the value + * 0 and the version name is undefined. + * + * @param major + */ + public Version( short major ) + { + this( major, Short.valueOf( "0" ), null ); + } + + /** + * Creates a new version. + * + * The version consists of a major version labeled with a version name, whereas the minor version + * is set to the value 0. + * + * @param major major version. + * @param name version name. + */ + public Version( short major, String name ) + { + this( major, Short.valueOf( "0" ), name ); + } + + /** + * Creates a new version. + * + * The version consists of a major and a minor version, whereas the version name is undefined. + * + * @param major major version. + * @param minor minor version. + */ + public Version( short major, short minor ) + { + this( major, minor, null ); + } + + /** + * Creates a new version. + * + * The version consists of a major and a minor version labeled with a version name. + * + * @param major major version. + * @param minor minor version. + * @param name version name. + */ + public Version( short major, short minor, String name ) + { + this.major = major; + this.minor = minor; + this.name = name; + } + + /** + * Returns the major version. + * + * @return major version. + */ + public short getMajor() + { + return this.major; + } + + /** + * Returns the minor version. + * + * @return minor version. + */ + public short getMinor() + { + return this.minor; + } + + /** + * Returns the full version as {@link Integer}. + * + * The full version consists of the major and minor version where both are combined in one + * {@link Integer} value. The upper 16-bits of the value represent the major number, whereas + * the lower 16-bits represent the minor number. + * + * @return full version as {@link Integer}. + */ + public int getVersion() + { + final int major = this.major; + final int minor = this.minor; + + return ( major << Short.SIZE ) | minor; + } + + /** + * Returns the name of the version. + * + * @return name of the version. + */ + public String getName() + { + return this.name; + } + + /** + * Checks if version is supported by a version from a list of supported versions. + * + * @param supportedVersions list of supported versions. + * @return state whether version is supported by a version from the list of versions or not. + */ + public boolean isSupported( List supportedVersions ) + { + return supportedVersions.contains( this ); + } + + /** + * Returns a version from a list of supported versions by its given major version. + * + * @param major version. + * @param supportedVersions list of supported versions. + * @return version from a list of supported versions by its given major version. + */ + public static Version getInstanceByMajorFromVersions( short major, List supportedVersions ) + { + final Predicate byMajor = version -> major == version.getMajor(); + return supportedVersions.stream().filter( byMajor ).findFirst().orElse( null ); + } + + @Override + public boolean equals( Object obj ) + { + if ( obj == null ) { + return false; + } else if ( this.getClass() != obj.getClass() ) { + return false; + } else if ( this.compareTo( Version.class.cast( obj ) ) == 0 ) { + return true; + } else { + return false; + } + } + + @Override + public int compareTo( Version v ) + { + // compare the current version to the specified version + if ( this.getMajor() < v.getMajor() ) { + // current major version is smaller than the given major version + return -1; + } else if ( this.getMajor() > v.getMajor() ) { + // current major version is larger than the given major version + return 1; + } else { + // current major version is equal to the given major version + // so compare the current minor version to the specified minor version + if ( this.getMinor() < v.getMinor() ) { + // current minor version is smaller than the given minor version + // so the entire version is smaller than the given version + return -1; + } else if ( this.getMinor() > v.getMinor() ) { + // current minor version is larger than the given minor version + // so the entire version is larger than the given version + return 1; + } else { + // current minor version is equal to the given minor version + // so the entire version is equal to the given version + return 0; + } + } + } +} diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java index 69cd3d5..04260df 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java @@ -2,7 +2,7 @@ package org.openslx.virtualization.configuration; import java.io.File; import java.io.IOException; -import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -12,14 +12,14 @@ import java.util.Map.Entry; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; +import org.openslx.virtualization.Version; import org.openslx.virtualization.virtualizer.Virtualizer; -import org.openslx.vm.disk.DiskImage; /** * Describes a configured virtual machine. This class is parsed from a machine * description, like a *.vmx for VMware machines. */ -public abstract class VirtualizationConfiguration +public abstract class VirtualizationConfiguration { private static final Logger LOGGER = Logger.getLogger( VirtualizationConfiguration.class ); @@ -28,7 +28,6 @@ public abstract class VirtualizationConfiguration */ protected Map soundCards = new HashMap<>(); protected Map ddacc = new HashMap<>(); - protected Map hwversion = new HashMap<>(); protected Map networkCards = new HashMap<>(); protected Map usbSpeeds = new HashMap<>(); @@ -64,36 +63,6 @@ public abstract class VirtualizationConfiguration } } - /** - * Virtual hardware version - currently only in use for VMPlayer - */ - public static enum HWVersion - { - NONE( "(invalid)" ), - THREE( " 3 (Workstation 4/5, Player 1)" ), - FOUR( " 4 (Workstation 4/5, Player 1/2, Fusion 1)" ), - SIX( " 6 (Workstation 6)" ), - SEVEN( " 7 (Workstation 6.5/7, Player 3, Fusion 2/3)" ), - EIGHT( " 8 (Workstation 8, Player/Fusion 4)" ), - NINE( " 9 (Workstation 9, Player/Fusion 5)" ), - TEN( "10 (Workstation 10, Player/Fusion 6)" ), - ELEVEN( "11 (Workstation 11, Player/Fusion 7)" ), - TWELVE( "12 (Workstation/Player 12, Fusion 8)" ), - FOURTEEN( "14 (Workstation/Player 14, Fusion 10)"), - FIFTEEN( "15 (Workstation/Player 15, Fusion 11)"), - FIFTEEN_ONE( "16 (Workstation/Player 15.1, Fusion 11.1)"), - SIXTEEN( "17 (Workstation/Player 16, Fusion 12)"), - SIXTEEN_ONE( "18 (Workstation/Player 16.1, Fusion 12.1)"), - DEFAULT( "default" ); - - public final String displayName; - - private HWVersion( String dName ) - { - this.displayName = dName; - } - } - /** * Virtual network cards */ @@ -180,11 +149,11 @@ public abstract class VirtualizationConfiguration return availables; } - public List getSupportedHWVersions() + public List getSupportedHWVersions() { - ArrayList availables = new ArrayList( hwversion.keySet() ); + final List availables = this.getVirtualizer().getSupportedVersions(); Collections.sort( availables ); - return availables; + return Collections.unmodifiableList( availables ); } public List getSupportedEthernetDevices() @@ -233,20 +202,6 @@ public abstract class VirtualizationConfiguration return isMachineSnapshot; } - /** - * This method should return a minimal representation of the input meta data. - * The representation is platform dependent, and should be stripped of all - * non-essential configuration, such as CD/DVD/FLoppy drives, serial or parallel - * ports, shared folders, or anything else that could be considered sensible - * information (absolute paths containing the local user's name). - */ - public abstract byte[] getFilteredDefinitionArray(); - - public final ByteBuffer getFilteredDefinition() - { - return ByteBuffer.wrap( getFilteredDefinitionArray() ); - } - /* * Methods */ @@ -290,13 +245,6 @@ public abstract class VirtualizationConfiguration this.os = lazyMatch; } - /** - * Returns list of image formats supported by the VM's hypervisor. - * - * @return list of image formats. - */ - public abstract List getSupportedImageFormats(); - /** * Returns a VmMetaData instance of the given machine description given as file * @@ -304,7 +252,7 @@ public abstract class VirtualizationConfiguration * @param file VM's machine description file to get the metadata instance from * @return VmMetaData object representing the relevant parts of the given machine description */ - public static VirtualizationConfiguration getInstance( List osList, File file ) + public static VirtualizationConfiguration getInstance( List osList, File file ) throws IOException { try { @@ -341,7 +289,7 @@ public abstract class VirtualizationConfiguration * @return VmMetaData object representing the relevant parts of the given machine description * @throws IOException */ - public static VirtualizationConfiguration getInstance( List osList, byte[] vmContent, int length ) + public static VirtualizationConfiguration getInstance( List osList, byte[] vmContent, int length ) throws IOException { try { @@ -402,9 +350,9 @@ public abstract class VirtualizationConfiguration public abstract DDAcceleration getDDAcceleration(); - public abstract void setHWVersion( HWVersion type ); + public abstract void setVirtualizerVersion( Version type ); - public abstract HWVersion getHWVersion(); + public abstract Version getVirtualizerVersion(); public abstract void setEthernetDevType( int cardIndex, EthernetDevType type ); @@ -414,7 +362,18 @@ public abstract class VirtualizationConfiguration public abstract UsbSpeed getMaxUsbSpeed(); - public abstract byte[] getDefinitionArray(); + public abstract byte[] getConfigurationAsByteArray(); + + public String getConfigurationAsString() + { + return new String( this.getConfigurationAsByteArray(), StandardCharsets.UTF_8 ); + } + + @Override + public String toString() + { + return this.getConfigurationAsString(); + } public abstract boolean addEthernet( EtherType type ); @@ -451,7 +410,7 @@ public abstract class VirtualizationConfiguration public abstract void transformNonPersistent() throws VirtualizationConfigurationException; /** - * Function used to register virtual devices + * Function used to register virtual devices. */ public abstract void registerVirtualHW(); } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java index 3c21fe4..4c727a6 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java @@ -2,16 +2,13 @@ package org.openslx.virtualization.configuration; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; +import org.openslx.virtualization.Version; import org.openslx.virtualization.virtualizer.VirtualizerDocker; -import org.openslx.vm.disk.DiskImage; -import org.openslx.vm.disk.DiskImage.ImageFormat; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; import java.util.List; class DockerSoundCardMeta @@ -22,10 +19,6 @@ class DockerDDAccelMeta { } -class DockerHWVersionMeta -{ -} - class DockerEthernetDevTypeMeta { } @@ -34,19 +27,13 @@ class DockerUsbSpeedMeta { } -public class VirtualizationConfigurationDocker extends VirtualizationConfiguration { +public class VirtualizationConfigurationDocker extends VirtualizationConfiguration { /** * File name extension for Docker virtualization configuration files. */ - private static final String CONFIGURATION_FILE_NAME_EXTENSION = null; - - /** - * List of supported image formats by the Docker hypervisor. - */ - private static final List SUPPORTED_IMAGE_FORMATS = Collections.unmodifiableList( - Arrays.asList( ImageFormat.NONE ) ); - + private static final String FILE_NAME_EXTENSION = null; + private static final Logger LOGGER = Logger.getLogger( VirtualizationConfigurationDocker.class); /** @@ -109,16 +96,6 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati } } - @Override public byte[] getFilteredDefinitionArray() { - return containerDefinition; - } - - @Override - public List getSupportedImageFormats() - { - return VirtualizationConfigurationDocker.SUPPORTED_IMAGE_FORMATS; - } - @Override public void transformEditable() throws VirtualizationConfigurationException { } @@ -179,12 +156,12 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati return DDAcceleration.OFF; } - @Override public void setHWVersion(HWVersion type) { + @Override public void setVirtualizerVersion(Version type) { } - @Override public HWVersion getHWVersion() { - return HWVersion.DEFAULT; + @Override public Version getVirtualizerVersion() { + return null; } @Override public void setEthernetDevType(int cardIndex, EthernetDevType type) { @@ -203,8 +180,8 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati return UsbSpeed.NONE; } - @Override public byte[] getDefinitionArray() { - return new byte[0]; + @Override public byte[] getConfigurationAsByteArray() { + return this.containerDefinition; } @Override public boolean addEthernet(EtherType type) { @@ -221,6 +198,6 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati @Override public String getFileNameExtension() { - return VirtualizationConfigurationDocker.CONFIGURATION_FILE_NAME_EXTENSION; + return VirtualizationConfigurationDocker.FILE_NAME_EXTENSION; } } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java index 534f0e5..37186b9 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java @@ -4,8 +4,6 @@ import java.io.File; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map.Entry; @@ -25,9 +23,8 @@ import org.openslx.libvirt.domain.device.Video; import org.openslx.libvirt.xml.LibvirtXmlDocumentException; import org.openslx.libvirt.xml.LibvirtXmlSerializationException; import org.openslx.libvirt.xml.LibvirtXmlValidationException; +import org.openslx.virtualization.Version; import org.openslx.virtualization.virtualizer.VirtualizerQemu; -import org.openslx.vm.disk.DiskImage; -import org.openslx.vm.disk.DiskImage.ImageFormat; /** * Metadata to describe the hardware type of a QEMU sound card. @@ -97,40 +94,6 @@ class QemuDDAccelMeta } } -/** - * Metadata to describe the version of a QEMU virtual machine configuration. - * - * @author Manuel Bentele - * @version 1.0 - */ -class QemuHWVersionMeta -{ - /** - * Stores the version of a QEMU virtual machine configuration. - */ - private final int version; - - /** - * Creates metadata to describe the version of a QEMU virtual machine configuration. - * - * @param version version of the QEMU virtual machine configuration. - */ - public QemuHWVersionMeta( int version ) - { - this.version = version; - } - - /** - * Returns version of the QEMU virtual machine configuration. - * - * @return version of the QEMU virtual machine configuration. - */ - public int getVersion() - { - return this.version; - } -} - /** * Metadata to describe the hardware type of a QEMU ethernet device. * @@ -223,7 +186,7 @@ class QemuUsbSpeedMeta * @version 1.0 */ public class VirtualizationConfigurationQemu extends - VirtualizationConfiguration + VirtualizationConfiguration { /** * Name of the network bridge for the LAN. @@ -248,13 +211,7 @@ public class VirtualizationConfigurationQemu extends /** * File name extension for QEMU (Libvirt) virtualization configuration files. */ - private static final String CONFIGURATION_FILE_NAME_EXTENSION = ".xml"; - - /** - * List of supported image formats by the QEMU hypervisor. - */ - private static final List SUPPORTED_IMAGE_FORMATS = Collections.unmodifiableList( - Arrays.asList( ImageFormat.QCOW2, ImageFormat.VMDK, ImageFormat.VDI ) ); + public static final String FILE_NAME_EXTENSION = "xml"; /** * Libvirt XML configuration file to modify configuration of virtual machine for QEMU. @@ -360,29 +317,13 @@ public class VirtualizationConfigurationQemu extends } @Override - public byte[] getFilteredDefinitionArray() + public void transformEditable() throws VirtualizationConfigurationException { // removes all specified boot order entries this.vmConfig.removeBootOrder(); // removes all source networks of all specified network interfaces this.vmConfig.removeInterfaceDevicesSource(); - - // output filtered Libvirt domain XML configuration - String configuration = this.vmConfig.toString(); - return configuration.getBytes( StandardCharsets.UTF_8 ); - } - - @Override - public List getSupportedImageFormats() - { - return VirtualizationConfigurationQemu.SUPPORTED_IMAGE_FORMATS; - } - - @Override - public void transformEditable() throws VirtualizationConfigurationException - { - // NOT implemented yet } @Override @@ -668,13 +609,13 @@ public class VirtualizationConfigurationQemu extends } @Override - public void setHWVersion( HWVersion type ) + public void setVirtualizerVersion( Version type ) { // NOT supported by the QEMU hypervisor } @Override - public HWVersion getHWVersion() + public Version getVirtualizerVersion() { // NOT supported by the QEMU hypervisor return null; @@ -754,7 +695,7 @@ public class VirtualizationConfigurationQemu extends } @Override - public byte[] getDefinitionArray() + public byte[] getConfigurationAsByteArray() { String configuration = this.vmConfig.toString(); @@ -859,8 +800,6 @@ public class VirtualizationConfigurationQemu extends ddacc.put( VirtualizationConfiguration.DDAcceleration.OFF, new QemuDDAccelMeta( false ) ); ddacc.put( VirtualizationConfiguration.DDAcceleration.ON, new QemuDDAccelMeta( true ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.DEFAULT, new QemuHWVersionMeta( 0 ) ); - networkCards.put( VirtualizationConfiguration.EthernetDevType.NONE, new QemuEthernetDevTypeMeta( null ) ); networkCards.put( VirtualizationConfiguration.EthernetDevType.AUTO, new QemuEthernetDevTypeMeta( Interface.Model.VIRTIO_NET_PCI ) ); networkCards.put( VirtualizationConfiguration.EthernetDevType.PCNETPCI2, new QemuEthernetDevTypeMeta( Interface.Model.PCNET ) ); @@ -879,6 +818,6 @@ public class VirtualizationConfigurationQemu extends @Override public String getFileNameExtension() { - return VirtualizationConfigurationQemu.CONFIGURATION_FILE_NAME_EXTENSION; + return VirtualizationConfigurationQemu.FILE_NAME_EXTENSION; } } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java index 90b1879..d987495 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java @@ -6,7 +6,6 @@ import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map.Entry; import java.util.UUID; @@ -14,10 +13,9 @@ import java.util.UUID; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.thrifthelper.TConst; +import org.openslx.virtualization.Version; import org.openslx.virtualization.configuration.VirtualizationConfigurationVirtualboxFileFormat.PlaceHolder; import org.openslx.virtualization.virtualizer.VirtualizerVirtualBox; -import org.openslx.vm.disk.DiskImage; -import org.openslx.vm.disk.DiskImage.ImageFormat; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -45,16 +43,6 @@ class VBoxDDAccelMeta } } -class VBoxHWVersionMeta -{ - public final int version; - - public VBoxHWVersionMeta( int vers ) - { - version = vers; - } -} - class VBoxEthernetDevTypeMeta { public final String value; @@ -78,18 +66,12 @@ class VBoxUsbSpeedMeta } } -public class VirtualizationConfigurationVirtualBox extends VirtualizationConfiguration +public class VirtualizationConfigurationVirtualBox extends VirtualizationConfiguration { /** * File name extension for VirtualBox virtualization configuration files.. */ - private static final String CONFIGURATION_FILE_NAME_EXTENSION = ".vbox"; - - /** - * List of supported image formats by the VirtualBox hypervisor. - */ - private static final List SUPPORTED_IMAGE_FORMATS = Collections.unmodifiableList( - Arrays.asList( ImageFormat.VDI ) ); + public static final String FILE_NAME_EXTENSION = "vbox"; private static final Logger LOGGER = Logger.getLogger( VirtualizationConfigurationVirtualBox.class ); @@ -130,12 +112,6 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu hdds.add( hardDisk ); } } - - @Override - public List getSupportedImageFormats() - { - return VirtualizationConfigurationVirtualBox.SUPPORTED_IMAGE_FORMATS; - } @Override public void transformEditable() throws VirtualizationConfigurationException @@ -150,15 +126,9 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu } @Override - public byte[] getDefinitionArray() + public byte[] getConfigurationAsByteArray() { - return config.toString( false ).getBytes( StandardCharsets.UTF_8 ); - } - - @Override - public byte[] getFilteredDefinitionArray() - { - return config.toString( false ).getBytes( StandardCharsets.UTF_8 ); + return config.toString( true ).getBytes( StandardCharsets.UTF_8 ); } @Override @@ -384,15 +354,15 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu * Virtual Box accepts per default only one hardware version and is hidden from the user */ @Override - public void setHWVersion( HWVersion type ) + public void setVirtualizerVersion( Version type ) { } @Override - public VirtualizationConfiguration.HWVersion getHWVersion() + public Version getVirtualizerVersion() { // Virtual Box uses only one virtual hardware version and can't be changed - return VirtualizationConfiguration.HWVersion.DEFAULT; + return null; } @Override @@ -444,8 +414,6 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu ddacc.put( VirtualizationConfiguration.DDAcceleration.OFF, new VBoxDDAccelMeta( false ) ); ddacc.put( VirtualizationConfiguration.DDAcceleration.ON, new VBoxDDAccelMeta( true ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.DEFAULT, new VBoxHWVersionMeta( 0 ) ); - // none type needs to have a valid value; it takes the value of pcnetcpi2; if value is left null or empty vm will not start because value is not valid networkCards.put( VirtualizationConfiguration.EthernetDevType.NONE, new VBoxEthernetDevTypeMeta( false, "Am79C970A" ) ); networkCards.put( VirtualizationConfiguration.EthernetDevType.PCNETPCI2, new VBoxEthernetDevTypeMeta( true, "Am79C970A" ) ); @@ -538,6 +506,6 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu @Override public String getFileNameExtension() { - return VirtualizationConfigurationVirtualBox.CONFIGURATION_FILE_NAME_EXTENSION; + return VirtualizationConfigurationVirtualBox.FILE_NAME_EXTENSION; } } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java index 9f490d4..894f52b 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java @@ -3,8 +3,6 @@ package org.openslx.virtualization.configuration; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -16,10 +14,9 @@ import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.thrifthelper.TConst; import org.openslx.util.Util; +import org.openslx.virtualization.Version; import org.openslx.virtualization.configuration.VirtualizationConfigurationVmwareFileFormat.ConfigEntry; import org.openslx.virtualization.virtualizer.VirtualizerVmware; -import org.openslx.vm.disk.DiskImage; -import org.openslx.vm.disk.DiskImage.ImageFormat; class VmWareSoundCardMeta { @@ -43,16 +40,6 @@ class VmWareDDAccelMeta } } -class VmWareHWVersionMeta -{ - public final int version; - - public VmWareHWVersionMeta( int vers ) - { - version = vers; - } -} - class VmWareEthernetDevTypeMeta { public final String value; @@ -75,18 +62,12 @@ class VmwareUsbSpeed } } -public class VirtualizationConfigurationVmware extends VirtualizationConfiguration +public class VirtualizationConfigurationVmware extends VirtualizationConfiguration { /** * File name extension for VMware virtualization configuration files. */ - private static final String CONFIGURATION_FILE_NAME_EXTENSION = ".vmx"; - - /** - * List of supported image formats by the VMware hypervisor. - */ - private static final List SUPPORTED_IMAGE_FORMATS = Collections.unmodifiableList( - Arrays.asList( ImageFormat.VMDK ) ); + public static final String FILE_NAME_EXTENSION = "vmx"; private static final Logger LOGGER = Logger.getLogger( VirtualizationConfigurationVmware.class ); @@ -256,12 +237,6 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati device.present = Boolean.parseBoolean( value ); } } - - @Override - public List getSupportedImageFormats() - { - return VirtualizationConfigurationVmware.SUPPORTED_IMAGE_FORMATS; - } @Override public boolean addHddTemplate( File diskImage, String hddMode, String redoDir ) @@ -440,17 +415,11 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati setOs( TConst.VIRT_VMWARE, vendorOsId ); } - @Override - public byte[] getFilteredDefinitionArray() + public byte[] getConfigurationAsByteArray() { return config.toString( true, false ).getBytes( StandardCharsets.UTF_8 ); } - public byte[] getDefinitionArray() - { - return config.toString( false, false ).getBytes( StandardCharsets.UTF_8 ); - } - private static class Device { public boolean present = false; @@ -534,26 +503,15 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati } } - public void setHWVersion( VirtualizationConfiguration.HWVersion type ) + public void setVirtualizerVersion( Version type ) { - VmWareHWVersionMeta hwVersionMeta = hwversion.get( type ); - addFiltered( "virtualHW.version", vmInteger( hwVersionMeta.version ) ); + addFiltered( "virtualHW.version", vmInteger( type.getMajor() ) ); } - public VirtualizationConfiguration.HWVersion getHWVersion() + public Version getVirtualizerVersion() { - int currentValue = Util.parseInt( config.get( "virtualHW.version" ), -1 ); - VmWareHWVersionMeta hwVersionMeta = null; - for ( VirtualizationConfiguration.HWVersion ver : VirtualizationConfiguration.HWVersion.values() ) { - hwVersionMeta = hwversion.get( ver ); - if ( hwVersionMeta == null ) { - continue; - } - if ( currentValue == hwVersionMeta.version ) { - return ver; - } - } - return HWVersion.NONE; + final short major = Integer.valueOf( Util.parseInt( config.get( "virtualHW.version" ), -1 ) ).shortValue(); + return Version.getInstanceByMajorFromVersions( major, this.getVirtualizer().getSupportedVersions() ); } public void setEthernetDevType( int cardIndex, VirtualizationConfiguration.EthernetDevType type ) @@ -644,37 +602,24 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati { soundCards.put( VirtualizationConfiguration.SoundCardType.NONE, new VmWareSoundCardMeta( false, null ) ); soundCards.put( VirtualizationConfiguration.SoundCardType.DEFAULT, new VmWareSoundCardMeta( true, null ) ); - soundCards.put( VirtualizationConfiguration.SoundCardType.SOUND_BLASTER, new VmWareSoundCardMeta( true, "sb16" ) ); + soundCards.put( VirtualizationConfiguration.SoundCardType.SOUND_BLASTER, + new VmWareSoundCardMeta( true, "sb16" ) ); soundCards.put( VirtualizationConfiguration.SoundCardType.ES, new VmWareSoundCardMeta( true, "es1371" ) ); soundCards.put( VirtualizationConfiguration.SoundCardType.HD_AUDIO, new VmWareSoundCardMeta( true, "hdaudio" ) ); ddacc.put( VirtualizationConfiguration.DDAcceleration.OFF, new VmWareDDAccelMeta( false ) ); ddacc.put( VirtualizationConfiguration.DDAcceleration.ON, new VmWareDDAccelMeta( true ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.NONE, new VmWareHWVersionMeta( 0 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.THREE, new VmWareHWVersionMeta( 3 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.FOUR, new VmWareHWVersionMeta( 4 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.SIX, new VmWareHWVersionMeta( 6 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.SEVEN, new VmWareHWVersionMeta( 7 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.EIGHT, new VmWareHWVersionMeta( 8 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.NINE, new VmWareHWVersionMeta( 9 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.TEN, new VmWareHWVersionMeta( 10 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.ELEVEN, new VmWareHWVersionMeta( 11 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.TWELVE, new VmWareHWVersionMeta( 12 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.FOURTEEN, new VmWareHWVersionMeta( 14 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.FIFTEEN, new VmWareHWVersionMeta( 15 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.FIFTEEN_ONE, new VmWareHWVersionMeta( 16 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.SIXTEEN, new VmWareHWVersionMeta( 17 ) ); - hwversion.put( VirtualizationConfiguration.HWVersion.SIXTEEN_ONE, new VmWareHWVersionMeta( 18 ) ); - networkCards.put( VirtualizationConfiguration.EthernetDevType.AUTO, new VmWareEthernetDevTypeMeta( null ) ); - networkCards.put( VirtualizationConfiguration.EthernetDevType.PCNET32, new VmWareEthernetDevTypeMeta( "vlance" ) ); + networkCards.put( VirtualizationConfiguration.EthernetDevType.PCNET32, + new VmWareEthernetDevTypeMeta( "vlance" ) ); networkCards.put( VirtualizationConfiguration.EthernetDevType.E1000, new VmWareEthernetDevTypeMeta( "e1000" ) ); networkCards.put( VirtualizationConfiguration.EthernetDevType.E1000E, new VmWareEthernetDevTypeMeta( "e1000e" ) ); networkCards.put( VirtualizationConfiguration.EthernetDevType.VMXNET, new VmWareEthernetDevTypeMeta( "vmxnet" ) ); - networkCards.put( VirtualizationConfiguration.EthernetDevType.VMXNET3, new VmWareEthernetDevTypeMeta( "vmxnet3" ) ); - - usbSpeeds.put( VirtualizationConfiguration.UsbSpeed.NONE, new VmwareUsbSpeed( 0, null )); + networkCards.put( VirtualizationConfiguration.EthernetDevType.VMXNET3, + new VmWareEthernetDevTypeMeta( "vmxnet3" ) ); + + usbSpeeds.put( VirtualizationConfiguration.UsbSpeed.NONE, new VmwareUsbSpeed( 0, null ) ); usbSpeeds.put( VirtualizationConfiguration.UsbSpeed.USB1_1, new VmwareUsbSpeed( 1, "usb" ) ); usbSpeeds.put( VirtualizationConfiguration.UsbSpeed.USB2_0, new VmwareUsbSpeed( 2, "ehci" ) ); usbSpeeds.put( VirtualizationConfiguration.UsbSpeed.USB3_0, new VmwareUsbSpeed( 3, "usb_xhci" ) ); @@ -683,7 +628,7 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati @Override public String getFileNameExtension() { - return VirtualizationConfigurationVmware.CONFIGURATION_FILE_NAME_EXTENSION; + return VirtualizationConfigurationVmware.FILE_NAME_EXTENSION; } } diff --git a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogic.java b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogic.java index 5bfbf8f..1aac943 100644 --- a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogic.java +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogic.java @@ -3,7 +3,7 @@ package org.openslx.virtualization.configuration.logic; import org.openslx.virtualization.configuration.VirtualizationConfiguration; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; -public abstract class ConfigurationLogic extends TransformationGeneric, T> +public abstract class ConfigurationLogic extends TransformationGeneric, T> { public ConfigurationLogic( String name ) { diff --git a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServer.java b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServer.java index 76a845f..ca25aa3 100644 --- a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServer.java +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServer.java @@ -15,7 +15,7 @@ public class ConfigurationLogicDozModClientToDozModServer super( ConfigurationLogicDozModClientToDozModServer.CONFIGURATION_LOGIC_NAME ); } - private void validateInputs( VirtualizationConfiguration config, + private void validateInputs( VirtualizationConfiguration config, ConfigurationDataDozModClientToDozModServer args ) throws TransformationException { @@ -27,7 +27,7 @@ public class ConfigurationLogicDozModClientToDozModServer } @Override - public void transform( VirtualizationConfiguration config, + public void transform( VirtualizationConfiguration config, ConfigurationDataDozModClientToDozModServer args ) throws TransformationException { diff --git a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClient.java b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClient.java index fa3a505..6d8687f 100644 --- a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClient.java +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClient.java @@ -22,7 +22,7 @@ public class ConfigurationLogicDozModServerToDozModClient super( ConfigurationLogicDozModServerToDozModClient.CONFIGURATION_LOGIC_NAME ); } - private void validateInputs( VirtualizationConfiguration config, + private void validateInputs( VirtualizationConfiguration config, ConfigurationDataDozModServerToDozModClient args ) throws TransformationException { @@ -62,7 +62,7 @@ public class ConfigurationLogicDozModServerToDozModClient } @Override - public void transform( VirtualizationConfiguration config, + public void transform( VirtualizationConfiguration config, ConfigurationDataDozModServerToDozModClient args ) throws TransformationException { diff --git a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java index 4c20b1f..8697df1 100644 --- a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java @@ -19,7 +19,7 @@ public class ConfigurationLogicDozModServerToStatelessClient super( ConfigurationLogicDozModServerToStatelessClient.CONFIGURATION_LOGIC_NAME ); } - private void validateInputs( VirtualizationConfiguration config, + private void validateInputs( VirtualizationConfiguration config, ConfigurationDataDozModServerToStatelessClient args ) throws TransformationException { @@ -31,7 +31,7 @@ public class ConfigurationLogicDozModServerToStatelessClient } @Override - public void transform( VirtualizationConfiguration config, + public void transform( VirtualizationConfiguration config, ConfigurationDataDozModServerToStatelessClient args ) throws TransformationException { diff --git a/src/main/java/org/openslx/virtualization/virtualizer/Virtualizer.java b/src/main/java/org/openslx/virtualization/virtualizer/Virtualizer.java index e74d15e..ac3a4ec 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/Virtualizer.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/Virtualizer.java @@ -2,6 +2,7 @@ package org.openslx.virtualization.virtualizer; import java.util.List; +import org.openslx.virtualization.Version; import org.openslx.vm.disk.DiskImage.ImageFormat; /** @@ -57,4 +58,11 @@ public abstract class Virtualizer * @return list of supported disk image formats by the virtualizer. */ public abstract List getSupportedImageFormats(); + + /** + * Returns a list of supported versions of the virtualizer. + * + * @return list of supported versions of the virtualizer. + */ + public abstract List getSupportedVersions(); } diff --git a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerDocker.java b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerDocker.java index 4461595..673447b 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerDocker.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerDocker.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import org.openslx.thrifthelper.TConst; +import org.openslx.virtualization.Version; import org.openslx.vm.disk.DiskImage; import org.openslx.vm.disk.DiskImage.ImageFormat; @@ -27,12 +28,17 @@ public class VirtualizerDocker extends Virtualizer private static final List VIRTUALIZER_SUPPORTED_IMAGE_FORMATS = Collections .unmodifiableList( Arrays.asList( ImageFormat.NONE ) ); + /** + * List of supported versions of the Docker virtualizer. + */ + private static final List VIRTUALIZER_SUPPORTED_VERSIONS = null; + /** * Creates a new Docker virtualizer. */ public VirtualizerDocker() { - super( new org.openslx.bwlp.thrift.iface.Virtualizer( TConst.VIRT_DOCKER, VirtualizerDocker.VIRTUALIZER_NAME )); + super( new org.openslx.bwlp.thrift.iface.Virtualizer( TConst.VIRT_DOCKER, VirtualizerDocker.VIRTUALIZER_NAME ) ); } @Override @@ -40,4 +46,10 @@ public class VirtualizerDocker extends Virtualizer { return VirtualizerDocker.VIRTUALIZER_SUPPORTED_IMAGE_FORMATS; } + + @Override + public List getSupportedVersions() + { + return VirtualizerDocker.VIRTUALIZER_SUPPORTED_VERSIONS; + } } diff --git a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java index 731209b..4456538 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerQemu.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import org.openslx.thrifthelper.TConst; +import org.openslx.virtualization.Version; import org.openslx.vm.disk.DiskImage; import org.openslx.vm.disk.DiskImage.ImageFormat; @@ -27,6 +28,11 @@ public class VirtualizerQemu extends Virtualizer private static final List VIRTUALIZER_SUPPORTED_IMAGE_FORMATS = Collections .unmodifiableList( Arrays.asList( ImageFormat.QCOW2, ImageFormat.VMDK, ImageFormat.VDI ) ); + /** + * List of supported versions of the QEMU virtualizer. + */ + private static final List VIRTUALIZER_SUPPORTED_VERSIONS = null; + /** * Creates a new QEMU virtualizer. */ @@ -40,4 +46,10 @@ public class VirtualizerQemu extends Virtualizer { return VirtualizerQemu.VIRTUALIZER_SUPPORTED_IMAGE_FORMATS; } + + @Override + public List getSupportedVersions() + { + return VirtualizerQemu.VIRTUALIZER_SUPPORTED_VERSIONS; + } } diff --git a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVirtualBox.java b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVirtualBox.java index 77662ab..6be7cbf 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVirtualBox.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVirtualBox.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import org.openslx.thrifthelper.TConst; +import org.openslx.virtualization.Version; import org.openslx.vm.disk.DiskImage; import org.openslx.vm.disk.DiskImage.ImageFormat; @@ -27,6 +28,11 @@ public class VirtualizerVirtualBox extends Virtualizer private static final List VIRTUALIZER_SUPPORTED_IMAGE_FORMATS = Collections .unmodifiableList( Arrays.asList( ImageFormat.VDI ) ); + /** + * List of supported version of the VirtualBox virtualizer. + */ + private static final List VIRTUALIZER_SUPPORTED_VERSIONS = null; + /** * Creates a new VirtualBox virtualizer. */ @@ -41,4 +47,10 @@ public class VirtualizerVirtualBox extends Virtualizer { return VirtualizerVirtualBox.VIRTUALIZER_SUPPORTED_IMAGE_FORMATS; } + + @Override + public List getSupportedVersions() + { + return VirtualizerVirtualBox.VIRTUALIZER_SUPPORTED_VERSIONS; + } } diff --git a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVmware.java b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVmware.java index 7b766eb..6e676f3 100644 --- a/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVmware.java +++ b/src/main/java/org/openslx/virtualization/virtualizer/VirtualizerVmware.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import org.openslx.thrifthelper.TConst; +import org.openslx.virtualization.Version; import org.openslx.vm.disk.DiskImage; import org.openslx.vm.disk.DiskImage.ImageFormat; @@ -27,6 +28,26 @@ public class VirtualizerVmware extends Virtualizer private static final List VIRTUALIZER_SUPPORTED_IMAGE_FORMATS = Collections .unmodifiableList( Arrays.asList( ImageFormat.VMDK ) ); + /** + * List of supported versions of the VMware virtualizer. + */ + private static final List VIRTUALIZER_SUPPORTED_VERSIONS = Collections.unmodifiableList( + Arrays.asList( + new Version( Short.valueOf( "03" ), "Workstation 4/5, Player 1" ), + new Version( Short.valueOf( "04" ), "Workstation 4/5, Player 1/2, Fusion 1" ), + new Version( Short.valueOf( "06" ), "Workstation 6" ), + new Version( Short.valueOf( "07" ), "Workstation 6.5/7, Player 3, Fusion 2/3" ), + new Version( Short.valueOf( "08" ), "Workstation 8, Player/Fusion 4" ), + new Version( Short.valueOf( "09" ), "Workstation 9, Player/Fusion 5" ), + new Version( Short.valueOf( "10" ), "Workstation 10, Player/Fusion 6" ), + new Version( Short.valueOf( "11" ), "Workstation 11, Player/Fusion 7" ), + new Version( Short.valueOf( "12" ), "Workstation/Player 12, Fusion 8" ), + new Version( Short.valueOf( "14" ), "Workstation/Player 14, Fusion 10" ), + new Version( Short.valueOf( "15" ), "Workstation/Player 15, Fusion 11" ), + new Version( Short.valueOf( "16" ), "Workstation/Player 15.1, Fusion 11.1" ), + new Version( Short.valueOf( "17" ), "Workstation/Player 16, Fusion 12" ), + new Version( Short.valueOf( "18" ), "Workstation/Player 16.1, Fusion 12.1" ) ) ); + /** * Creates a new VMware virtualizer. */ @@ -40,4 +61,11 @@ public class VirtualizerVmware extends Virtualizer { return VirtualizerVmware.VIRTUALIZER_SUPPORTED_IMAGE_FORMATS; } + + @Override + public List getSupportedVersions() + { + return VirtualizerVmware.VIRTUALIZER_SUPPORTED_VERSIONS; + } + } diff --git a/src/main/java/org/openslx/vm/disk/DiskImage.java b/src/main/java/org/openslx/vm/disk/DiskImage.java index 38964f4..309ad77 100644 --- a/src/main/java/org/openslx/vm/disk/DiskImage.java +++ b/src/main/java/org/openslx/vm/disk/DiskImage.java @@ -9,6 +9,7 @@ import java.util.function.Predicate; import org.openslx.bwlp.thrift.iface.Virtualizer; import org.openslx.thrifthelper.TConst; +import org.openslx.virtualization.Version; /** * Disk image for virtual machines. @@ -103,7 +104,7 @@ public abstract class DiskImage * * @throws DiskImageException unable to obtain version of the disk image format. */ - public abstract int getVersion() throws DiskImageException; + public abstract Version getVersion() throws DiskImageException; /** * Returns the disk image description. diff --git a/src/main/java/org/openslx/vm/disk/DiskImageQcow2.java b/src/main/java/org/openslx/vm/disk/DiskImageQcow2.java index 5f72a00..04e61ea 100644 --- a/src/main/java/org/openslx/vm/disk/DiskImageQcow2.java +++ b/src/main/java/org/openslx/vm/disk/DiskImageQcow2.java @@ -5,6 +5,8 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; +import org.openslx.virtualization.Version; + /** * QCOW2 disk image for virtual machines. * @@ -120,7 +122,7 @@ public class DiskImageQcow2 extends DiskImage // check if QCOW2 image uses extended L2 tables // extended L2 tables are only possible in QCOW2 version 3 header format - if ( this.getVersion() >= 3 ) { + if ( this.getVersion().getMajor() >= Short.valueOf( "3" ) ) { // read incompatible feature bits final long qcowIncompatibleFeatures = DiskImageUtils.readLong( diskFile, 72 ); @@ -216,7 +218,7 @@ public class DiskImageQcow2 extends DiskImage } @Override - public int getVersion() throws DiskImageException + public Version getVersion() throws DiskImageException { final RandomAccessFile diskFile = this.getDiskImage(); final int qcowVersion = DiskImageUtils.readInt( diskFile, 4 ); @@ -228,7 +230,7 @@ public class DiskImageQcow2 extends DiskImage throw new DiskImageException( errorMsg ); } - return DiskImageUtils.versionFromMajor( Integer.valueOf( qcowVersion ).shortValue() ); + return new Version( Integer.valueOf( qcowVersion ).shortValue() ); } @Override diff --git a/src/main/java/org/openslx/vm/disk/DiskImageUtils.java b/src/main/java/org/openslx/vm/disk/DiskImageUtils.java index e704b74..cc29721 100644 --- a/src/main/java/org/openslx/vm/disk/DiskImageUtils.java +++ b/src/main/java/org/openslx/vm/disk/DiskImageUtils.java @@ -141,24 +141,4 @@ public class DiskImageUtils return new String( values ); } - - public static int versionFromMajorMinor( final short major, final short minor ) - { - return ( ( Integer.valueOf( major ) << 16 ) | minor ); - } - - public static int versionFromMajor( final short major ) - { - return DiskImageUtils.versionFromMajorMinor( major, Short.valueOf( "0" ) ); - } - - public static short versionToMajor( final int version ) - { - return Integer.valueOf( version >> 16 ).shortValue(); - } - - public static short versionToMinor( final int version ) - { - return Integer.valueOf( version & 0x0000FFFF ).shortValue(); - } } diff --git a/src/main/java/org/openslx/vm/disk/DiskImageVdi.java b/src/main/java/org/openslx/vm/disk/DiskImageVdi.java index 1c34c1d..16db956 100644 --- a/src/main/java/org/openslx/vm/disk/DiskImageVdi.java +++ b/src/main/java/org/openslx/vm/disk/DiskImageVdi.java @@ -5,6 +5,8 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; +import org.openslx.virtualization.Version; + /** * VDI disk image for virtual machines. * @@ -94,14 +96,14 @@ public class DiskImageVdi extends DiskImage } @Override - public int getVersion() throws DiskImageException + public Version getVersion() throws DiskImageException { final RandomAccessFile diskFile = this.getDiskImage(); final short vdiVersionMajor = Short.reverseBytes( DiskImageUtils.readShort( diskFile, 68 ) ); final short vdiVersionMinor = Short.reverseBytes( DiskImageUtils.readShort( diskFile, 70 ) ); - return DiskImageUtils.versionFromMajorMinor( vdiVersionMajor, vdiVersionMinor ); + return new Version( vdiVersionMajor, vdiVersionMinor ); } @Override diff --git a/src/main/java/org/openslx/vm/disk/DiskImageVmdk.java b/src/main/java/org/openslx/vm/disk/DiskImageVmdk.java index 1f475d9..7f59bc3 100644 --- a/src/main/java/org/openslx/vm/disk/DiskImageVmdk.java +++ b/src/main/java/org/openslx/vm/disk/DiskImageVmdk.java @@ -7,6 +7,7 @@ import java.io.RandomAccessFile; import org.openslx.util.Util; import org.openslx.virtualization.configuration.VirtualizationConfigurationVmwareFileFormat; +import org.openslx.virtualization.Version; import org.openslx.virtualization.configuration.VirtualizationConfigurationException; /** @@ -184,10 +185,10 @@ public class DiskImageVmdk extends DiskImage * * @throws DiskImageException */ - public int getHwVersion() throws DiskImageException + public Version getHwVersion() throws DiskImageException { final VirtualizationConfigurationVmwareFileFormat vmdkConfig = this.getVmdkConfig(); - final int hwVersion; + final Version hwVersion; if ( vmdkConfig != null ) { // VMDK image contains a hardware version, so return parsed hardware version @@ -195,11 +196,11 @@ public class DiskImageVmdk extends DiskImage final String hwVersionStr = vmdkConfig.get( "ddb.virtualHWVersion" ); final int hwVersionMajor = Util.parseInt( hwVersionStr, DiskImageVmdk.VMDK_DEFAULT_HW_VERSION ); - hwVersion = DiskImageUtils.versionFromMajor( Integer.valueOf( hwVersionMajor ).shortValue() ); + hwVersion = new Version( Integer.valueOf( hwVersionMajor ).shortValue() ); } else { // VMDK image does not contain any hardware version, so return default hardware version final int hwVersionMajor = DiskImageVmdk.VMDK_DEFAULT_HW_VERSION; - hwVersion = DiskImageUtils.versionFromMajor( Integer.valueOf( hwVersionMajor ).shortValue() ); + hwVersion = new Version( Integer.valueOf( hwVersionMajor ).shortValue() ); } return hwVersion; @@ -276,12 +277,12 @@ public class DiskImageVmdk extends DiskImage } @Override - public int getVersion() throws DiskImageException + public Version getVersion() throws DiskImageException { final RandomAccessFile diskFile = this.getDiskImage(); final int vmdkVersion = Integer.reverseBytes( DiskImageUtils.readInt( diskFile, 4 ) ); - return DiskImageUtils.versionFromMajor( Integer.valueOf( vmdkVersion ).shortValue() ); + return new Version( Integer.valueOf( vmdkVersion ).shortValue() ); } @Override diff --git a/src/test/java/org/openslx/virtualization/VersionTest.java b/src/test/java/org/openslx/virtualization/VersionTest.java new file mode 100644 index 0000000..c1ad21b --- /dev/null +++ b/src/test/java/org/openslx/virtualization/VersionTest.java @@ -0,0 +1,98 @@ +package org.openslx.virtualization; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class VersionTest +{ + @Test + @DisplayName( "Test that version is supported in list of versions" ) + public void testVersionIsSupported() + { + final Version version = new Version( Short.valueOf( "2" ), Short.valueOf( "3" ) ); + final List versions = Collections.unmodifiableList( Arrays.asList( + new Version( Short.valueOf( "2" ) ), + new Version( Short.valueOf( "4" ), Short.valueOf( "3" ) ), + new Version( Short.valueOf( "2" ), Short.valueOf( "3" ) ), + new Version( Short.valueOf( "1" ), Short.valueOf( "3" ) ) ) ); + + assertTrue( version.isSupported( versions ) ); + } + + @Test + @DisplayName( "Test that version is not supported in list of versions" ) + public void testVersionIsNotSupported() + { + final Version version = new Version( Short.valueOf( "2" ), Short.valueOf( "3" ) ); + final List versions = Collections.unmodifiableList( Arrays.asList( + new Version( Short.valueOf( "2" ) ), + new Version( Short.valueOf( "4" ), Short.valueOf( "3" ) ), + new Version( Short.valueOf( "6" ), Short.valueOf( "9" ) ), + new Version( Short.valueOf( "1" ), Short.valueOf( "3" ) ) ) ); + + assertFalse( version.isSupported( versions ) ); + } + + @Test + @DisplayName( "Test that versions are equal" ) + public void testVersionEquals() + { + final Version versionOne = new Version( Short.valueOf( "2" ), Short.valueOf( "3" ) ); + final Version versionTwo = new Version( Short.valueOf( "2" ), Short.valueOf( "3" ) ); + + assertTrue( versionOne.equals( versionTwo ) ); + assertTrue( versionTwo.equals( versionOne ) ); + } + + @Test + @DisplayName( "Test that versions are not equal" ) + public void testVersionNotEquals() + { + final Version versionOne = new Version( Short.valueOf( "3" ), Short.valueOf( "2" ) ); + final Version versionTwo = new Version( Short.valueOf( "3" ), Short.valueOf( "3" ) ); + + assertFalse( versionOne.equals( versionTwo ) ); + assertFalse( versionTwo.equals( versionOne ) ); + } + + @Test + @DisplayName( "Test that version is smaller than" ) + public void testVersionSmallerThan() + { + final Version versionOne = new Version( Short.valueOf( "2" ), Short.valueOf( "3" ) ); + final Version versionTwo = new Version( Short.valueOf( "3" ), Short.valueOf( "2" ) ); + + assertEquals( -1, versionOne.compareTo( versionTwo ) ); + assertEquals( 1, versionTwo.compareTo( versionOne ) ); + } + + @Test + @DisplayName( "Test that version is larger than" ) + public void testVersionLargerThan() + { + final Version versionOne = new Version( Short.valueOf( "3" ), Short.valueOf( "3" ) ); + final Version versionTwo = new Version( Short.valueOf( "3" ), Short.valueOf( "2" ) ); + + assertEquals( 1, versionOne.compareTo( versionTwo ) ); + assertEquals( -1, versionTwo.compareTo( versionOne ) ); + } + + @Test + @DisplayName( "Test that versions are equal (compareTo)" ) + public void testVersionEqualCompareTo() + { + final Version versionOne = new Version( Short.valueOf( "2" ), Short.valueOf( "3" ) ); + final Version versionTwo = new Version( Short.valueOf( "2" ), Short.valueOf( "3" ) ); + + assertEquals( 0, versionOne.compareTo( versionTwo ) ); + assertEquals( 0, versionTwo.compareTo( versionOne ) ); + } +} diff --git a/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java b/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java index fe82a53..0412002 100644 --- a/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java +++ b/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java @@ -107,7 +107,7 @@ public class VirtualizationConfigurationQemuTest final Domain vmLibvirtDomainConfig = VirtualizationConfigurationQemuTest .getPrivateDomainFromQemuMetaData( vmConfig ); - final List supportedImageFormats = vmConfig.getSupportedImageFormats(); + final List supportedImageFormats = vmConfig.getVirtualizer().getSupportedImageFormats(); assertNotNull( supportedImageFormats ); assertEquals( 3, supportedImageFormats.size() ); @@ -150,9 +150,7 @@ public class VirtualizationConfigurationQemuTest final Domain vmLibvirtDomainConfig = VirtualizationConfigurationQemuTest .getPrivateDomainFromQemuMetaData( vmConfig ); - final int numberOfDeletedElements = 1; - - final String unfilteredXmlConfig = new String( vmConfig.getDefinitionArray(), StandardCharsets.UTF_8 ); + final String unfilteredXmlConfig = new String( vmConfig.getConfigurationAsByteArray(), StandardCharsets.UTF_8 ); final String originalXmlConfig = FileUtils.readFileToString( file, StandardCharsets.UTF_8 ); assertNotNull( unfilteredXmlConfig ); @@ -160,34 +158,7 @@ public class VirtualizationConfigurationQemuTest final int lengthUnfilteredXmlConfig = unfilteredXmlConfig.split( System.lineSeparator() ).length; final int lengthOriginalXmlConfig = originalXmlConfig.split( System.lineSeparator() ).length; - assertEquals( lengthOriginalXmlConfig, lengthUnfilteredXmlConfig + numberOfDeletedElements ); - - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); - } - - @Test - @DisplayName( "Test output of filtered VM configuration" ) - public void testQemuMetaDataGetFilteredDefinitionArray() - throws VirtualizationConfigurationException, IOException, NoSuchFieldException, SecurityException, - IllegalArgumentException, IllegalAccessException - { - File file = LibvirtXmlTestResources.getLibvirtXmlFile( "qemu-kvm_default-archlinux-vm.xml" ); - VirtualizationConfigurationQemu vmConfig = new VirtualizationConfigurationQemu( null, file ); - - final Domain vmLibvirtDomainConfig = VirtualizationConfigurationQemuTest - .getPrivateDomainFromQemuMetaData( vmConfig ); - - final int numberOfDeletedElements = 2; - - final String filteredXmlConfig = new String( vmConfig.getFilteredDefinitionArray(), StandardCharsets.UTF_8 ); - final String originalXmlConfig = FileUtils.readFileToString( file, StandardCharsets.UTF_8 ); - - assertNotNull( filteredXmlConfig ); - - final int lengthFilteredXmlConfig = filteredXmlConfig.split( System.lineSeparator() ).length; - final int lengthOriginalXmlConfig = originalXmlConfig.split( System.lineSeparator() ).length; - - assertEquals( lengthOriginalXmlConfig, lengthFilteredXmlConfig + numberOfDeletedElements ); + assertEquals( lengthOriginalXmlConfig, lengthUnfilteredXmlConfig ); assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); } diff --git a/src/test/java/org/openslx/vm/disk/DiskImageQcow2Test.java b/src/test/java/org/openslx/vm/disk/DiskImageQcow2Test.java index 530cd60..7804d7d 100644 --- a/src/test/java/org/openslx/vm/disk/DiskImageQcow2Test.java +++ b/src/test/java/org/openslx/vm/disk/DiskImageQcow2Test.java @@ -7,6 +7,7 @@ import java.io.IOException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.openslx.virtualization.Version; import org.openslx.vm.disk.DiskImage.ImageFormat; public class DiskImageQcow2Test @@ -16,7 +17,7 @@ public class DiskImageQcow2Test public void testQcow2DiskImage() throws DiskImageException, IOException { final DiskImage image = DiskImage.newInstance( DiskImageTestResources.getDiskFile( "image-default.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -32,7 +33,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-16384_cp-on_l2-on.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -48,7 +49,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-16384_cp-on_l2-off.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -64,7 +65,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-16384_cp-off_l2-on.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -80,7 +81,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-16384_cp-off_l2-off.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -96,7 +97,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-65536_cp-on_l2-on.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -112,7 +113,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-65536_cp-on_l2-off.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -128,7 +129,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-65536_cp-off_l2-on.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -144,7 +145,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-65536_cp-off_l2-off.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -160,7 +161,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-2097152_cp-on_l2-on.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -176,7 +177,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-2097152_cp-on_l2-off.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -192,7 +193,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-2097152_cp-off_l2-on.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -208,7 +209,7 @@ public class DiskImageQcow2Test { final DiskImage image = DiskImage .newInstance( DiskImageTestResources.getDiskFile( "image_cs-2097152_cp-off_l2-off.qcow2" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); assertEquals( ImageFormat.QCOW2.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); diff --git a/src/test/java/org/openslx/vm/disk/DiskImageVdiTest.java b/src/test/java/org/openslx/vm/disk/DiskImageVdiTest.java index 492c6aa..85112cc 100644 --- a/src/test/java/org/openslx/vm/disk/DiskImageVdiTest.java +++ b/src/test/java/org/openslx/vm/disk/DiskImageVdiTest.java @@ -7,6 +7,7 @@ import java.io.IOException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.openslx.virtualization.Version; import org.openslx.vm.disk.DiskImage.ImageFormat; public class DiskImageVdiTest @@ -16,7 +17,7 @@ public class DiskImageVdiTest public void testVdiDiskImage() throws DiskImageException, IOException { final DiskImage image = DiskImage.newInstance( DiskImageTestResources.getDiskFile( "image-default.vdi" ) ); - final int imageVersion = DiskImageUtils.versionFromMajorMinor( Short.valueOf( "1" ), Short.valueOf( "1" ) ); + final Version imageVersion = new Version( Short.valueOf( "1" ), Short.valueOf( "1" ) ); assertEquals( ImageFormat.VDI.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -25,13 +26,13 @@ public class DiskImageVdiTest assertEquals( imageVersion, image.getVersion() ); assertNotNull( image.getDescription() ); } - + @Test @DisplayName( "Test detection of VDI disk image snapshot" ) public void testVdiDiskImageSnapshot() throws DiskImageException, IOException { final DiskImage image = DiskImage.newInstance( DiskImageTestResources.getDiskFile( "image-default_snapshot.vdi" ) ); - final int imageVersion = DiskImageUtils.versionFromMajorMinor( Short.valueOf( "1" ), Short.valueOf( "1" ) ); + final Version imageVersion = new Version( Short.valueOf( "1" ), Short.valueOf( "1" ) ); assertEquals( ImageFormat.VDI.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); diff --git a/src/test/java/org/openslx/vm/disk/DiskImageVmdkTest.java b/src/test/java/org/openslx/vm/disk/DiskImageVmdkTest.java index 00cf561..4c8be82 100644 --- a/src/test/java/org/openslx/vm/disk/DiskImageVmdkTest.java +++ b/src/test/java/org/openslx/vm/disk/DiskImageVmdkTest.java @@ -8,6 +8,7 @@ import java.io.IOException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.openslx.virtualization.Version; import org.openslx.vm.disk.DiskImage.ImageFormat; public class DiskImageVmdkTest @@ -17,8 +18,8 @@ public class DiskImageVmdkTest public void testVmdkDiskImage() throws DiskImageException, IOException { final DiskImage image = DiskImage.newInstance( DiskImageTestResources.getDiskFile( "image-default.vmdk" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "1" ) ); - final int imageHwVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "18" ) ); + final Version imageVersion = new Version( Short.valueOf( "1" ) ); + final Version imageHwVersion = new Version( Short.valueOf( "18" ) ); assertEquals( ImageFormat.VMDK.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -37,8 +38,8 @@ public class DiskImageVmdkTest public void testVmdkDiskImageType0() throws DiskImageException, IOException { final DiskImage image = DiskImage.newInstance( DiskImageTestResources.getDiskFile( "image_t0.vmdk" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "1" ) ); - final int imageHwVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "18" ) ); + final Version imageVersion = new Version( Short.valueOf( "1" ) ); + final Version imageHwVersion = new Version( Short.valueOf( "18" ) ); assertEquals( ImageFormat.VMDK.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); @@ -93,8 +94,8 @@ public class DiskImageVmdkTest public void testVmdkDiskImageType5() throws DiskImageException, IOException { final DiskImage image = DiskImage.newInstance( DiskImageTestResources.getDiskFile( "image_t5.vmdk" ) ); - final int imageVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "3" ) ); - final int imageHwVersion = DiskImageUtils.versionFromMajor( Short.valueOf( "18" ) ); + final Version imageVersion = new Version( Short.valueOf( "3" ) ); + final Version imageHwVersion = new Version( Short.valueOf( "18" ) ); assertEquals( ImageFormat.VMDK.toString(), image.getFormat().toString() ); assertEquals( true, image.isStandalone() ); -- cgit v1.2.3-55-g7522 From 958f737dec30fbbb98a84c2e745f6ee2e00b8b84 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Mon, 26 Apr 2021 15:39:18 +0200 Subject: Log failed instanciations of virtualization config files as debug info --- .../configuration/VirtualizationConfiguration.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java') diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java index 04260df..3cbe71b 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java @@ -258,22 +258,22 @@ public abstract class VirtualizationConfiguration try { return new VirtualizationConfigurationVmware( osList, file ); } catch ( VirtualizationConfigurationException e ) { - LOGGER.info( "Not a VMware file", e ); + LOGGER.debug( "Not a VMware file", e ); } try { return new VirtualizationConfigurationVirtualBox( osList, file ); } catch ( VirtualizationConfigurationException e ) { - LOGGER.info( "Not a VirtualBox file", e ); + LOGGER.debug( "Not a VirtualBox file", e ); } try { return new VirtualizationConfigurationQemu( osList, file ); } catch ( VirtualizationConfigurationException e ) { - LOGGER.info( "Not a Libvirt file", e ); + LOGGER.debug( "Not a Libvirt file", e ); } try { return new VirtualizationConfigurationDocker(osList, file); } catch ( VirtualizationConfigurationException e ) { - LOGGER.info( "Not a tar.gz file, for docker container", e ); + LOGGER.debug( "Not a tar.gz file, for docker container", e ); } LOGGER.error( "Could not detect any known virtualizer format" ); @@ -295,22 +295,22 @@ public abstract class VirtualizationConfiguration try { return new VirtualizationConfigurationVmware( osList, vmContent, length ); } catch ( VirtualizationConfigurationException e ) { - LOGGER.info( "Not a VMware file", e ); + LOGGER.debug( "Not a VMware file", e ); } try { return new VirtualizationConfigurationVirtualBox( osList, vmContent, length ); } catch ( VirtualizationConfigurationException e ) { - LOGGER.info( "Not a VirtualBox file", e ); + LOGGER.debug( "Not a VirtualBox file", e ); } try { return new VirtualizationConfigurationQemu( osList, vmContent, length ); } catch ( VirtualizationConfigurationException e ) { - LOGGER.info( "Not a Libvirt file", e ); + LOGGER.debug( "Not a Libvirt file", e ); } try { return new VirtualizationConfigurationDocker( osList, vmContent, length ); } catch ( VirtualizationConfigurationException e ) { - LOGGER.info( "Not a tar.gz file, for docker container", e ); + LOGGER.debug( "Not a tar.gz file, for docker container", e ); } LOGGER.error( "Could not detect any known virtualizer format" ); -- cgit v1.2.3-55-g7522 From 4073fa2a38d5e73ec2a89eaea84e5183b0e599e5 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Fri, 30 Apr 2021 09:05:24 +0200 Subject: Add unit tests for transformation logic (dozmod-server --> dozmod-client) --- .../configuration/VirtualizationConfiguration.java | 41 +++-- .../VirtualizationConfigurationDocker.java | 5 + .../VirtualizationConfigurationQemu.java | 77 ++++++---- .../VirtualizationConfigurationQemuUtils.java | 2 +- .../VirtualizationConfigurationVirtualBox.java | 5 + .../VirtualizationConfigurationVmware.java | 6 +- .../VirtualizationConfigurationQemuTest.java | 53 +++---- ...urationLogicDozModClientToDozModServerTest.java | 4 + ...urationLogicDozModServerToDozModClientTest.java | 104 +++++++++++++ .../logic/ConfigurationLogicTestUtils.java | 22 +++ ..._default-ubuntu-20-04-vm_transform-editable.xml | 170 +++++++++++++++++++++ ...rtualbox_default-ubuntu_transform-editable.vbox | 48 ++++++ ...re-player_default-ubuntu_transform-editable.vmx | 54 +++++++ 13 files changed, 512 insertions(+), 79 deletions(-) create mode 100644 src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java create mode 100644 src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-editable.xml create mode 100644 src/test/resources/virtualbox/xml/virtualbox_default-ubuntu_transform-editable.vbox create mode 100644 src/test/resources/vmware/vmx/vmware-player_default-ubuntu_transform-editable.vmx (limited to 'src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java') 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 protected Map ddacc = new HashMap<>(); protected Map networkCards = new HashMap<>(); protected Map usbSpeeds = new HashMap<>(); - + private final Virtualizer virtualizer; /** @@ -38,7 +38,8 @@ public abstract class VirtualizationConfiguration */ 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 */ 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 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 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 * @return VmMetaData object representing the relevant parts of the given machine description * @throws IOException */ - public static VirtualizationConfiguration getInstance( List osList, byte[] vmContent, int length ) + public static VirtualizationConfiguration getInstance( List osList, byte[] vmContent, + int length ) throws IOException { try { @@ -316,7 +318,7 @@ public abstract class VirtualizationConfiguration LOGGER.error( "Could not detect any known virtualizer format" ); return null; } - + /** * Returns the file name extension for the virtualization configuration file. * @@ -382,6 +384,15 @@ public abstract class VirtualizationConfiguration return this.virtualizer; } + /** + * 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 * 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 * 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 * 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; @@ -218,21 +219,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. * @@ -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 + { + } } diff --git a/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java b/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java index 93f3750..b59a86d 100644 --- a/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java +++ b/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java @@ -68,14 +68,11 @@ public class VirtualizationConfigurationQemuTest File file = LibvirtXmlTestResources.getLibvirtXmlFile( "qemu-kvm_default-archlinux-vm.xml" ); VirtualizationConfigurationQemu vmConfig = new VirtualizationConfigurationQemu( null, file ); - final Domain vmLibvirtDomainConfig = VirtualizationConfigurationQemuTest - .getPrivateDomainFromQemuMetaData( vmConfig ); - final String displayName = vmConfig.getDisplayName(); assertEquals( "archlinux", displayName ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @Test @@ -87,14 +84,11 @@ public class VirtualizationConfigurationQemuTest File file = LibvirtXmlTestResources.getLibvirtXmlFile( "qemu-kvm_default-archlinux-vm.xml" ); VirtualizationConfigurationQemu vmConfig = new VirtualizationConfigurationQemu( null, file ); - final Domain vmLibvirtDomainConfig = VirtualizationConfigurationQemuTest - .getPrivateDomainFromQemuMetaData( vmConfig ); - final boolean isVmSnapshot = vmConfig.isMachineSnapshot(); assertEquals( false, isVmSnapshot ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @Test @@ -106,9 +100,6 @@ public class VirtualizationConfigurationQemuTest File file = LibvirtXmlTestResources.getLibvirtXmlFile( "qemu-kvm_default-archlinux-vm.xml" ); VirtualizationConfigurationQemu vmConfig = new VirtualizationConfigurationQemu( null, file ); - final Domain vmLibvirtDomainConfig = VirtualizationConfigurationQemuTest - .getPrivateDomainFromQemuMetaData( vmConfig ); - final List supportedImageFormats = vmConfig.getVirtualizer().getSupportedImageFormats(); assertNotNull( supportedImageFormats ); @@ -116,7 +107,7 @@ public class VirtualizationConfigurationQemuTest assertEquals( true, supportedImageFormats .containsAll( Arrays.asList( ImageFormat.QCOW2, ImageFormat.VMDK, ImageFormat.VDI ) ) ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @Test @@ -128,16 +119,13 @@ public class VirtualizationConfigurationQemuTest File file = LibvirtXmlTestResources.getLibvirtXmlFile( "qemu-kvm_default-archlinux-vm.xml" ); VirtualizationConfigurationQemu vmConfig = new VirtualizationConfigurationQemu( null, file ); - final Domain vmLibvirtDomainConfig = VirtualizationConfigurationQemuTest - .getPrivateDomainFromQemuMetaData( vmConfig ); - final List hdds = vmConfig.getHdds(); assertNotNull( hdds ); assertEquals( 1, hdds.size() ); assertEquals( "/var/lib/libvirt/images/archlinux.qcow2", hdds.get( 0 ).diskImage ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @Test @@ -149,9 +137,6 @@ public class VirtualizationConfigurationQemuTest File file = LibvirtXmlTestResources.getLibvirtXmlFile( "qemu-kvm_default-archlinux-vm.xml" ); VirtualizationConfigurationQemu vmConfig = new VirtualizationConfigurationQemu( null, file ); - final Domain vmLibvirtDomainConfig = VirtualizationConfigurationQemuTest - .getPrivateDomainFromQemuMetaData( vmConfig ); - final String unfilteredXmlConfig = new String( vmConfig.getConfigurationAsByteArray(), StandardCharsets.UTF_8 ); final String originalXmlConfig = FileUtils.readFileToString( file, StandardCharsets.UTF_8 ); @@ -162,7 +147,7 @@ public class VirtualizationConfigurationQemuTest assertEquals( lengthOriginalXmlConfig, lengthUnfilteredXmlConfig ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -204,7 +189,7 @@ public class VirtualizationConfigurationQemuTest DiskStorage addedStorageDevice = vmLibvirtDomainConfig.getDiskStorageDevices().get( 0 ); assertEquals( diskFile.getAbsolutePath(), addedStorageDevice.getStorageSource() ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -233,7 +218,7 @@ public class VirtualizationConfigurationQemuTest DiskCdrom addedCdromDevice = vmLibvirtDomainConfig.getDiskCdromDevices().get( 0 ); assertEquals( diskFile.getAbsolutePath(), addedCdromDevice.getStorageSource() ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -261,7 +246,7 @@ public class VirtualizationConfigurationQemuTest DiskCdrom addedCdromDevice = vmLibvirtDomainConfig.getDiskCdromDevices().get( 0 ); assertEquals( VirtualizationConfigurationQemu.CDROM_DEFAULT_PHYSICAL_DRIVE, addedCdromDevice.getStorageSource() ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -291,7 +276,7 @@ public class VirtualizationConfigurationQemuTest assertTrue( addedFloppyDevice.isReadOnly() ); assertEquals( diskFile.getAbsolutePath(), addedFloppyDevice.getStorageSource() ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -311,7 +296,7 @@ public class VirtualizationConfigurationQemuTest assertEquals( coreCount, vmLibvirtDomainConfig.getVCpu() ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -335,7 +320,7 @@ public class VirtualizationConfigurationQemuTest assertEquals( SoundCardType.HD_AUDIO, soundCardType ); } - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -363,7 +348,7 @@ public class VirtualizationConfigurationQemuTest Sound addedSoundDevice = vmLibvirtDomainConfig.getSoundDevices().get( 0 ); assertEquals( Sound.Model.SB16, addedSoundDevice.getModel() ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -387,7 +372,7 @@ public class VirtualizationConfigurationQemuTest assertEquals( EthernetDevType.PARAVIRT, ethernetDeviceType ); } - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -410,7 +395,7 @@ public class VirtualizationConfigurationQemuTest assertEquals( Interface.Model.E1000E, addedEthernetDevice.getModel() ); } - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -434,7 +419,7 @@ public class VirtualizationConfigurationQemuTest assertEquals( UsbSpeed.USB3_0, maxUsbSpeed ); } - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -462,7 +447,7 @@ public class VirtualizationConfigurationQemuTest ControllerUsb addedUsbControllerDevice = vmLibvirtDomainConfig.getUsbControllerDevices().get( 0 ); assertEquals( ControllerUsb.Model.ICH9_EHCI1, addedUsbControllerDevice.getModel() ); - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } static Stream configAndEthernetTypeProvider() @@ -518,7 +503,7 @@ public class VirtualizationConfigurationQemuTest break; } - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -542,7 +527,7 @@ public class VirtualizationConfigurationQemuTest assertEquals( new Version( Short.valueOf( "3" ), Short.valueOf( "1" ) ), machineVersion ); } - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } @ParameterizedTest @@ -574,6 +559,6 @@ public class VirtualizationConfigurationQemuTest assertEquals( "pc-q35-4.1", modifiedOsMachine ); } - assertDoesNotThrow( () -> vmLibvirtDomainConfig.validateXml() ); + assertDoesNotThrow( () -> vmConfig.validate() ); } } diff --git a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServerTest.java b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServerTest.java index 4654957..68a39c6 100644 --- a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServerTest.java +++ b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServerTest.java @@ -1,5 +1,6 @@ package org.openslx.virtualization.configuration.logic; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; @@ -41,6 +42,7 @@ public class ConfigurationLogicDozModClientToDozModServerTest final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + assertDoesNotThrow( () -> config.validate() ); } @Test @@ -61,6 +63,7 @@ public class ConfigurationLogicDozModClientToDozModServerTest final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + assertDoesNotThrow( () -> config.validate() ); } @Test @@ -81,5 +84,6 @@ public class ConfigurationLogicDozModClientToDozModServerTest final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + assertDoesNotThrow( () -> config.validate() ); } } diff --git a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java new file mode 100644 index 0000000..b3cbd8a --- /dev/null +++ b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java @@ -0,0 +1,104 @@ +package org.openslx.virtualization.configuration.logic; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; + +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openslx.bwlp.thrift.iface.OperatingSystem; +import org.openslx.libvirt.xml.LibvirtXmlTestResources; +import org.openslx.virtualization.configuration.VirtualizationConfiguration; +import org.openslx.virtualization.configuration.data.ConfigurationDataDozModServerToDozModClient; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.vm.disk.DiskImageTestResources; + +public class ConfigurationLogicDozModServerToDozModClientTest +{ + private static final String DEFAULT_DISPLAY_NAME = "Test"; + private static final File DEFAULT_DISK_IMAGE = DiskImageTestResources.getDiskFile( "image-default.vmdk" ); + private static final OperatingSystem DEFAULT_GUEST_OS = null; + private static final String DEFAULT_VIRTUALIZER_ID = null; + private static final int DEFAULT_TOTAL_MEMORY = 4096; + + private static final ConfigurationDataDozModServerToDozModClient DEFAULT_CONFIG_DATA = new ConfigurationDataDozModServerToDozModClient( + ConfigurationLogicDozModServerToDozModClientTest.DEFAULT_DISPLAY_NAME, + ConfigurationLogicDozModServerToDozModClientTest.DEFAULT_DISK_IMAGE, + ConfigurationLogicDozModServerToDozModClientTest.DEFAULT_GUEST_OS, + ConfigurationLogicDozModServerToDozModClientTest.DEFAULT_VIRTUALIZER_ID, + ConfigurationLogicDozModServerToDozModClientTest.DEFAULT_TOTAL_MEMORY ); + + @BeforeAll + public static void setUp() + { + // disable logging with log4j + LogManager.getRootLogger().setLevel( Level.OFF ); + } + + @Test + @DisplayName( "Test transformation logic between a dozmod-server and a dozmod-client for Libvirt/QEMU configuration" ) + public void testConfigurationLogicDozModServerToDozModClientLibvirt() throws TransformationException + { + final String inputConfigFileName = "qemu-kvm_default-ubuntu-20-04-vm_transform-privacy.xml"; + final String expectedConfigFileName = "qemu-kvm_default-ubuntu-20-04-vm_transform-editable.xml"; + final File inputConfig = LibvirtXmlTestResources.getLibvirtXmlFile( inputConfigFileName ); + final File expectedConfig = LibvirtXmlTestResources.getLibvirtXmlFile( expectedConfigFileName ); + final VirtualizationConfiguration config; + config = ConfigurationLogicTestUtils.newVirtualizationConfigurationInstance( inputConfig ); + final ConfigurationLogicDozModServerToDozModClient logic = new ConfigurationLogicDozModServerToDozModClient(); + + logic.apply( config, ConfigurationLogicDozModServerToDozModClientTest.DEFAULT_CONFIG_DATA ); + + final String transformedConfig = config.getConfigurationAsString(); + final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); + + assertDoesNotThrow( () -> config.validate() ); + assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + } + + @Test + @DisplayName( "Test transformation logic between a dozmod-server and a dozmod-client for VirtualBox configuration" ) + public void testConfigurationLogicDozModServerToDozModClientVirtualBox() throws TransformationException + { + final String inputConfigFileName = "virtualbox_default-ubuntu_transform-privacy.vbox"; + final String expectedConfigFileName = "virtualbox_default-ubuntu_transform-editable.vbox"; + final File inputConfig = ConfigurationLogicTestResources.getVirtualBoxXmlFile( inputConfigFileName ); + final File expectedConfig = ConfigurationLogicTestResources.getVirtualBoxXmlFile( expectedConfigFileName ); + final VirtualizationConfiguration config; + config = ConfigurationLogicTestUtils.newVirtualizationConfigurationInstance( inputConfig ); + final ConfigurationLogicDozModServerToDozModClient logic = new ConfigurationLogicDozModServerToDozModClient(); + + logic.apply( config, ConfigurationLogicDozModServerToDozModClientTest.DEFAULT_CONFIG_DATA ); + + final String transformedConfig = config.getConfigurationAsString(); + final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); + + assertTrue(ConfigurationLogicTestUtils.isVirtualBoxContentEqual( expectedTransformedConfig, transformedConfig ) ); + assertDoesNotThrow( () -> config.validate() ); + } + + @Test + @DisplayName( "Test transformation logic between dozmod-server and a dozmod-client for VMware configuration" ) + public void testConfigurationLogicDozModServerToDozModClientVmware() throws TransformationException + { + final String inputConfigFileName = "vmware-player_default-ubuntu_transform-privacy.vmx"; + final String expectedConfigFileName = "vmware-player_default-ubuntu_transform-editable.vmx"; + final File inputConfig = ConfigurationLogicTestResources.getVmwareVmxFile( inputConfigFileName ); + final File expectedConfig = ConfigurationLogicTestResources.getVmwareVmxFile( expectedConfigFileName ); + final VirtualizationConfiguration config; + config = ConfigurationLogicTestUtils.newVirtualizationConfigurationInstance( inputConfig ); + final ConfigurationLogicDozModServerToDozModClient logic = new ConfigurationLogicDozModServerToDozModClient(); + + logic.apply( config, ConfigurationLogicDozModServerToDozModClientTest.DEFAULT_CONFIG_DATA ); + + final String transformedConfig = config.getConfigurationAsString(); + final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); + + assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + assertDoesNotThrow( () -> config.validate() ); + } +} diff --git a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicTestUtils.java b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicTestUtils.java index 32aa344..4f85719 100644 --- a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicTestUtils.java +++ b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicTestUtils.java @@ -10,6 +10,8 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import org.apache.commons.io.FileUtils; @@ -33,6 +35,8 @@ public class ConfigurationLogicTestUtils new OperatingSystem( 11, "Windows 2000 Professional", null, "x86", 4096, 4 ) ) ); // @formatter:on + private static final String REGEX_UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"; + public static VirtualizationConfiguration newVirtualizationConfigurationInstance( File configFile ) { VirtualizationConfiguration config = null; @@ -75,4 +79,22 @@ public class ConfigurationLogicTestUtils return linesContent1.equals( linesContent2 ); } + + public static String removeUuid( String content ) + { + final Pattern patternUuid = Pattern.compile( ConfigurationLogicTestUtils.REGEX_UUID ); + final Matcher matcherUuidContent = patternUuid.matcher( content ); + + // replace all UUIDs with the empty String + return matcherUuidContent.replaceAll( "" ); + } + + public static boolean isVirtualBoxContentEqual( String content1, String content2 ) + { + // replace all UUIDs with the empty String + final String filteredContent1 = ConfigurationLogicTestUtils.removeUuid( content1 ); + final String filteredContent2 = ConfigurationLogicTestUtils.removeUuid( content2 ); + + return ConfigurationLogicTestUtils.isContentEqual( filteredContent1, filteredContent2 ); + } } diff --git a/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-editable.xml b/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-editable.xml new file mode 100644 index 0000000..ca09cf6 --- /dev/null +++ b/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-editable.xml @@ -0,0 +1,170 @@ + + Test + 8dc5433c-0228-49e4-b019-fa2b606aa544 + Ubuntu 20.04 + Ubuntu 20.04 desktop installation + + + + + + 1572864 + 1572864 + 1 + + hvm + + + + + + + + + + + + + destroy + restart + destroy + + + + + + /usr/bin/qemu-system-x86_64 + + + +
+ + + + + + +
+ + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + +
+ + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + +
+ + +
+ + + + + + +
+ + + + + + + + + + + +
+ + + +
+ + +
+ + + + + + + + +
+ +