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 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