summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/virtualization/configuration/logic
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/virtualization/configuration/logic')
-rw-r--r--src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogic.java12
-rw-r--r--src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServer.java44
-rw-r--r--src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClient.java143
-rw-r--r--src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java74
4 files changed, 273 insertions, 0 deletions
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<T> extends TransformationGeneric<VirtualizationConfiguration<?, ?, ?, ?, ?>, 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<ConfigurationDataDozModClientToDozModServer>
+{
+ 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<ConfigurationDataDozModServerToDozModClient>
+{
+ 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<String, String> 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<ConfigurationDataDozModServerToStatelessClient>
+{
+ 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() );
+ }
+ }
+}