From 110afb975a086cd059b695763655bcdf5f151e1e Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Fri, 30 Apr 2021 10:22:59 +0200 Subject: Add unit tests for transformation logic (dozmod-server --> stateless client) --- .../configuration/VirtualizationConfiguration.java | 2 + .../VirtualizationConfigurationDocker.java | 5 + .../VirtualizationConfigurationQemu.java | 19 ++- .../VirtualizationConfigurationVirtualBox.java | 6 + .../VirtualizationConfigurationVmware.java | 7 + ...gurationLogicDozModServerToStatelessClient.java | 4 +- ...urationLogicDozModServerToDozModClientTest.java | 5 +- ...tionLogicDozModServerToStatelessClientTest.java | 99 +++++++++++++ ...lt-ubuntu-20-04-vm_transform-non-persistent.xml | 164 +++++++++++++++++++++ ...ox_default-ubuntu_transform-non-persistent.vbox | 53 +++++++ ...yer_default-ubuntu_transform-non-persistent.vmx | 42 ++++++ 11 files changed, 400 insertions(+), 6 deletions(-) create mode 100644 src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClientTest.java create mode 100644 src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-non-persistent.xml create mode 100644 src/test/resources/virtualbox/xml/virtualbox_default-ubuntu_transform-non-persistent.vbox create mode 100644 src/test/resources/vmware/vmx/vmware-player_default-ubuntu_transform-non-persistent.vmx diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java index c5381c5..b8e46ed 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfiguration.java @@ -326,6 +326,8 @@ public abstract class VirtualizationConfiguration */ public abstract String getFileNameExtension(); + public abstract boolean addEmptyHddTemplate(); + public abstract boolean addHddTemplate( File diskImage, String hddMode, String redoDir ); public abstract boolean addHddTemplate( String diskImagePath, String hddMode, String redoDir ); diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java index 5b1615f..d5e9abb 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationDocker.java @@ -104,6 +104,11 @@ public class VirtualizationConfigurationDocker extends VirtualizationConfigurati public void transformPrivacy() throws VirtualizationConfigurationException { } + @Override + public boolean addEmptyHddTemplate() { + return false; + } + @Override public boolean addHddTemplate(File diskImage, String hddMode, String redoDir) { return false; } diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java index 716a2f3..710a42d 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java @@ -312,6 +312,12 @@ public class VirtualizationConfigurationQemu extends this.vmConfig.removeInterfaceDevicesSource(); } + @Override + public boolean addEmptyHddTemplate() + { + return this.addHddTemplate( new String(), null, null ); + } + @Override public boolean addHddTemplate( File diskImage, String hddMode, String redoDir ) { @@ -348,13 +354,22 @@ public class VirtualizationConfigurationQemu extends storageDiskDevice.setBusType( BusType.VIRTIO ); String targetDevName = VirtualizationConfigurationQemuUtils.createAlphabeticalDeviceName( "vd", index ); storageDiskDevice.setTargetDevice( targetDevName ); - storageDiskDevice.setStorage( StorageType.FILE, diskImagePath ); + + if ( diskImagePath == null || diskImagePath.isEmpty() ) { + storageDiskDevice.removeStorage(); + } else { + storageDiskDevice.setStorage( StorageType.FILE, diskImagePath ); + } // add new created HDD to the metadata of the QemuMetaData object, too this.addHddMetaData( storageDiskDevice ); } else { // HDD exists, so update existing storage (HDD) device - storageDiskDevice.setStorage( StorageType.FILE, diskImagePath ); + if ( diskImagePath == null || diskImagePath.isEmpty() ) { + storageDiskDevice.removeStorage(); + } else { + storageDiskDevice.setStorage( StorageType.FILE, diskImagePath ); + } } return true; diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java index d32d496..c53a7e0 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVirtualBox.java @@ -131,6 +131,12 @@ public class VirtualizationConfigurationVirtualBox extends VirtualizationConfigu return config.toString( true ).getBytes( StandardCharsets.UTF_8 ); } + @Override + public boolean addEmptyHddTemplate() + { + return this.addHddTemplate( "%VM_DISK_PATH%", "%VM_DISK_MODE%", "%VM_DISK_REDOLOGDIR%" ); + } + @Override public boolean addHddTemplate( String diskImage, String hddMode, String redoDir ) { diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java index e1102b6..3e8d913 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationVmware.java @@ -238,6 +238,12 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati } } + @Override + public boolean addEmptyHddTemplate() + { + return this.addHddTemplate( "%VM_DISK_PATH%", "%VM_DISK_MODE%", "%VM_DISK_REDOLOGDIR%" ); + } + @Override public boolean addHddTemplate( File diskImage, String hddMode, String redoDir ) { @@ -251,6 +257,7 @@ public class VirtualizationConfigurationVmware extends VirtualizationConfigurati LOGGER.error( "Empty disk image path given!" ); return false; } + DriveBusType bus; try { bus = DriveBusType.valueOf( config.get( "#SLX_HDD_BUS" ) ); 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 6c573bb..580b0fc 100644 --- a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java @@ -78,8 +78,8 @@ public class ConfigurationLogicDozModServerToStatelessClient 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%" ) ) { + // append hard disk drive (with no referenced image as content) + if ( !config.addEmptyHddTemplate() ) { throw new TransformationException( "Can not configure hard disk in virtualization configuration!" ); } diff --git a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java index b3cbd8a..034269b 100644 --- a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java +++ b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java @@ -56,8 +56,8 @@ public class ConfigurationLogicDozModServerToDozModClientTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertDoesNotThrow( () -> config.validate() ); assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + assertDoesNotThrow( () -> config.validate() ); } @Test @@ -77,7 +77,8 @@ public class ConfigurationLogicDozModServerToDozModClientTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue(ConfigurationLogicTestUtils.isVirtualBoxContentEqual( expectedTransformedConfig, transformedConfig ) ); + assertTrue( + ConfigurationLogicTestUtils.isVirtualBoxContentEqual( expectedTransformedConfig, transformedConfig ) ); assertDoesNotThrow( () -> config.validate() ); } diff --git a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClientTest.java b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClientTest.java new file mode 100644 index 0000000..186f422 --- /dev/null +++ b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClientTest.java @@ -0,0 +1,99 @@ +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.libvirt.xml.LibvirtXmlTestResources; +import org.openslx.virtualization.configuration.VirtualizationConfiguration; +import org.openslx.virtualization.configuration.data.ConfigurationDataDozModServerToStatelessClient; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +public class ConfigurationLogicDozModServerToStatelessClientTest +{ + private static final String DEFAULT_DISPLAY_NAME = "Test"; + private static final String DEFAULT_OS_ID = null; + private static final boolean DEFAULT_HAS_USB_ACCESS = true; + + private static final ConfigurationDataDozModServerToStatelessClient DEFAULT_CONFIG_DATA = new ConfigurationDataDozModServerToStatelessClient( + ConfigurationLogicDozModServerToStatelessClientTest.DEFAULT_DISPLAY_NAME, + ConfigurationLogicDozModServerToStatelessClientTest.DEFAULT_OS_ID, + ConfigurationLogicDozModServerToStatelessClientTest.DEFAULT_HAS_USB_ACCESS ); + + @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 stateless client for Libvirt/QEMU configuration" ) + public void testConfigurationLogicDozModServerToStatelessClientLibvirt() 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-non-persistent.xml"; + final File inputConfig = LibvirtXmlTestResources.getLibvirtXmlFile( inputConfigFileName ); + final File expectedConfig = LibvirtXmlTestResources.getLibvirtXmlFile( expectedConfigFileName ); + final VirtualizationConfiguration config; + config = ConfigurationLogicTestUtils.newVirtualizationConfigurationInstance( inputConfig ); + final ConfigurationLogicDozModServerToStatelessClient logic = new ConfigurationLogicDozModServerToStatelessClient(); + + logic.apply( config, ConfigurationLogicDozModServerToStatelessClientTest.DEFAULT_CONFIG_DATA ); + + final String transformedConfig = config.getConfigurationAsString(); + final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); + + assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + assertDoesNotThrow( () -> config.validate() ); + } + + @Test + @DisplayName( "Test transformation logic between a dozmod-server and a stateless client for VirtualBox configuration" ) + public void testConfigurationLogicDozModServerToStatelessClientVirtualBox() throws TransformationException + { + final String inputConfigFileName = "virtualbox_default-ubuntu_transform-privacy.vbox"; + final String expectedConfigFileName = "virtualbox_default-ubuntu_transform-non-persistent.vbox"; + final File inputConfig = ConfigurationLogicTestResources.getVirtualBoxXmlFile( inputConfigFileName ); + final File expectedConfig = ConfigurationLogicTestResources.getVirtualBoxXmlFile( expectedConfigFileName ); + final VirtualizationConfiguration config; + config = ConfigurationLogicTestUtils.newVirtualizationConfigurationInstance( inputConfig ); + final ConfigurationLogicDozModServerToStatelessClient logic = new ConfigurationLogicDozModServerToStatelessClient(); + + logic.apply( config, ConfigurationLogicDozModServerToStatelessClientTest.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 stateless client for VMware configuration" ) + public void testConfigurationLogicDozModServerToStatelessClientVmware() throws TransformationException + { + final String inputConfigFileName = "vmware-player_default-ubuntu_transform-privacy.vmx"; + final String expectedConfigFileName = "vmware-player_default-ubuntu_transform-non-persistent.vmx"; + final File inputConfig = ConfigurationLogicTestResources.getVmwareVmxFile( inputConfigFileName ); + final File expectedConfig = ConfigurationLogicTestResources.getVmwareVmxFile( expectedConfigFileName ); + final VirtualizationConfiguration config; + config = ConfigurationLogicTestUtils.newVirtualizationConfigurationInstance( inputConfig ); + final ConfigurationLogicDozModServerToStatelessClient logic = new ConfigurationLogicDozModServerToStatelessClient(); + + logic.apply( config, ConfigurationLogicDozModServerToStatelessClientTest.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/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-non-persistent.xml b/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-non-persistent.xml new file mode 100644 index 0000000..2f283ca --- /dev/null +++ b/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-non-persistent.xml @@ -0,0 +1,164 @@ + + Test + 8dc5433c-0228-49e4-b019-fa2b606aa544 + Ubuntu 20.04 + Ubuntu 20.04 desktop installation + + + + + + 4194304 + 4194304 + 2 + + hvm + + + + + + + + + + + + + + destroy + restart + destroy + + + + + + /usr/bin/qemu-system-x86_64 + + + +
+ + + + + +
+ + + + +
+ + +
+ + + +
+ + + +
+ + + +
+ + +
+ + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + +
+ + +
+ + + + + + +
+ + + + + + + + + + + +
+ + + +
+ + +
+ + + + + + + + +
+ +