From f4c21ccda4f786fe388ffed1e4bd9a18aabea4bd Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Thu, 15 Apr 2021 15:10:38 +0200 Subject: [qemu] Move generic filtering/transformation to master-sync-shared --- .../TransformationGenericDiskStorageDevices.java | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java (limited to 'core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java') diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java new file mode 100644 index 00000000..8d98937e --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java @@ -0,0 +1,49 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import java.util.ArrayList; + +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.Disk.StorageType; +import org.openslx.libvirt.domain.device.DiskStorage; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.machine.QemuMetaDataUtils; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public class TransformationGenericDiskStorageDevices extends TransformationGeneric +{ + private static final String FILTER_NAME = "Disk storage devices [HDD, SSD, ...]"; + + public TransformationGenericDiskStorageDevices() + { + super( TransformationGenericDiskStorageDevices.FILTER_NAME ); + } + + private void filterDiskStorageDevice( Domain config, String fileName, int index ) throws TransformationException + { + final ArrayList devices = config.getDiskStorageDevices(); + final DiskStorage disk = QemuMetaDataUtils.getArrayIndex( devices, index ); + + if ( disk != null ) { + if ( fileName == null ) { + // remove disk storage device if disk image file name is not set + disk.remove(); + } else { + // set image file of disk storage if disk storage device is available + disk.setStorage( StorageType.FILE, fileName ); + } + } + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + this.filterDiskStorageDevice( config, args.getVmDiskFileNameHDD0(), 0 ); + + // remove all additional disk storage devices + final ArrayList devices = config.getDiskStorageDevices(); + for ( int i = 1; i < devices.size(); i++ ) { + devices.get( i ).remove(); + } + } +} -- cgit v1.2.3-55-g7522 From 3d6e9c8081e1187b6e9960fd75839992e1890b38 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Fri, 16 Apr 2021 14:11:48 +0200 Subject: [qemu] Rename VmMetaData classes --- .../qemu/configuration/TransformationGenericDiskCdromDevices.java | 8 ++++---- .../configuration/TransformationGenericDiskFloppyDevices.java | 4 ++-- .../configuration/TransformationGenericDiskStorageDevices.java | 4 ++-- .../configuration/TransformationGenericFileSystemDevices.java | 4 ++-- .../qemu/configuration/TransformationGenericInterfaceDevices.java | 4 ++-- .../qemu/configuration/TransformationGenericParallelDevices.java | 4 ++-- .../configuration/TransformationSpecificQemuSerialDevices.java | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) (limited to 'core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java') diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java index 860e0f1e..345dd5a9 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java @@ -6,8 +6,8 @@ import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.device.Disk.StorageType; import org.openslx.libvirt.domain.device.DiskCdrom; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.virtualization.configuration.machine.QemuMetaData; -import org.openslx.virtualization.configuration.machine.QemuMetaDataUtils; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemu; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; @@ -23,12 +23,12 @@ public class TransformationGenericDiskCdromDevices extends TransformationGeneric private void filterDiskCdromDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = config.getDiskCdromDevices(); - final DiskCdrom disk = QemuMetaDataUtils.getArrayIndex( devices, index ); + final DiskCdrom disk = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); if ( disk != null ) { if ( fileName == null ) { // do not remove disk CDROM drive, but set local physical drive as input source - disk.setStorage( StorageType.BLOCK, QemuMetaData.CDROM_DEFAULT_PHYSICAL_DRIVE ); + disk.setStorage( StorageType.BLOCK, VirtualizationConfigurationQemu.CDROM_DEFAULT_PHYSICAL_DRIVE ); } else if ( fileName.equals( "" ) ) { // remove storage source if empty string is specified to emulate an empty CDROM drive disk.removeStorage(); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java index 7386a0b5..6ceae846 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java @@ -6,7 +6,7 @@ import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.device.Disk.StorageType; import org.openslx.libvirt.domain.device.DiskFloppy; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.virtualization.configuration.machine.QemuMetaDataUtils; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; @@ -22,7 +22,7 @@ public class TransformationGenericDiskFloppyDevices extends TransformationGeneri private void filterDiskFloppyDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = config.getDiskFloppyDevices(); - final DiskFloppy disk = QemuMetaDataUtils.getArrayIndex( devices, index ); + final DiskFloppy disk = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); if ( disk != null ) { if ( fileName == null ) { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java index 8d98937e..ca71f7a3 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java @@ -6,7 +6,7 @@ import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.device.Disk.StorageType; import org.openslx.libvirt.domain.device.DiskStorage; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.virtualization.configuration.machine.QemuMetaDataUtils; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; @@ -22,7 +22,7 @@ public class TransformationGenericDiskStorageDevices extends TransformationGener private void filterDiskStorageDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = config.getDiskStorageDevices(); - final DiskStorage disk = QemuMetaDataUtils.getArrayIndex( devices, index ); + final DiskStorage disk = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); if ( disk != null ) { if ( fileName == null ) { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java index 8a312433..0417bfdf 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java @@ -7,7 +7,7 @@ import org.openslx.libvirt.domain.device.FileSystem; import org.openslx.libvirt.domain.device.FileSystem.AccessMode; import org.openslx.libvirt.domain.device.FileSystem.Type; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.virtualization.configuration.machine.QemuMetaDataUtils; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; @@ -23,7 +23,7 @@ public class TransformationGenericFileSystemDevices extends TransformationGeneri private void filterFileSystemDevice( Domain config, String source, String target, int index ) throws TransformationException { final ArrayList devices = config.getFileSystemDevices(); - final FileSystem fileSystem = QemuMetaDataUtils.getArrayIndex( devices, index ); + final FileSystem fileSystem = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); if ( fileSystem == null ) { // check if file system device source directory is specified diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java index e4fba36e..3b45de78 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.device.Interface; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.virtualization.configuration.machine.QemuMetaDataUtils; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; @@ -21,7 +21,7 @@ public class TransformationGenericInterfaceDevices extends TransformationGeneric private void filterInterfaceDevice( Domain config, String macAddress, int index ) throws TransformationException { final ArrayList devices = config.getInterfaceDevices(); - final Interface device = QemuMetaDataUtils.getArrayIndex( devices, index ); + final Interface device = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); if ( device != null ) { if ( macAddress == null ) { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java index e24a2ac5..7350df32 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java @@ -6,7 +6,7 @@ import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.device.Parallel; import org.openslx.libvirt.domain.device.Parallel.Type; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.virtualization.configuration.machine.QemuMetaDataUtils; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; @@ -22,7 +22,7 @@ public class TransformationGenericParallelDevices extends TransformationGeneric< private void filterParallelDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = config.getParallelDevices(); - final Parallel device = QemuMetaDataUtils.getArrayIndex( devices, index ); + final Parallel device = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); if ( device == null ) { // check if device file name is specified diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java index 9d35fbad..5c4509d7 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java @@ -9,7 +9,7 @@ import org.openslx.libvirt.domain.device.Serial.Type; import org.openslx.libvirt.domain.device.Serial; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu; -import org.openslx.virtualization.configuration.machine.QemuMetaDataUtils; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationSpecific; @@ -33,7 +33,7 @@ public class TransformationSpecificQemuSerialDevices extends TransformationSpeci private void filterSerialDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = this.getSerialDevDevices( config ); - final Serial device = QemuMetaDataUtils.getArrayIndex( devices, index ); + final Serial device = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); if ( device == null ) { // check if device file name is specified -- cgit v1.2.3-55-g7522 From 4ee74c1bdcd21ad6f0152c5806a3eca0f0700b69 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Fri, 14 May 2021 14:39:33 +0200 Subject: [qemu] Document configuration transformations and Libvirt QEMU hypervisor --- .../java/org/openslx/runvirt/plugin/qemu/App.java | 4 +- .../runvirt/plugin/qemu/cmdln/CommandLineArgs.java | 10 ++- .../configuration/TransformationGenericCpu.java | 35 +++++++++- .../TransformationGenericDiskCdromDevices.java | 49 ++++++++++++-- .../TransformationGenericDiskFloppyDevices.java | 48 +++++++++++-- .../TransformationGenericDiskStorageDevices.java | 49 ++++++++++++-- .../TransformationGenericFileSystemDevices.java | 53 +++++++++++++-- .../TransformationGenericInterfaceDevices.java | 48 +++++++++++-- .../configuration/TransformationGenericMemory.java | 35 +++++++++- .../configuration/TransformationGenericName.java | 38 ++++++++++- .../TransformationGenericParallelDevices.java | 47 +++++++++++-- .../configuration/TransformationGenericUuid.java | 35 +++++++++- .../TransformationSpecificQemuArchitecture.java | 79 ++++++++++++++++++++-- ...sformationSpecificQemuGpuPassthroughNvidia.java | 59 ++++++++++++++++ ...sformationSpecificQemuNvidiaGpuPassthrough.java | 26 ------- .../TransformationSpecificQemuSerialDevices.java | 58 ++++++++++++++-- .../qemu/virtualization/LibvirtHypervisorQemu.java | 38 +++++++++-- .../runvirt/virtualization/LibvirtHypervisor.java | 76 +++++++++++++++++++-- .../virtualization/LibvirtHypervisorException.java | 11 +++ .../virtualization/LibvirtVirtualMachine.java | 50 ++++++++++++++ .../LibvirtVirtualMachineException.java | 11 +++ 21 files changed, 773 insertions(+), 86 deletions(-) create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuGpuPassthroughNvidia.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuNvidiaGpuPassthrough.java (limited to 'core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java') diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/App.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/App.java index 4e872ffc..b026a540 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/App.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/App.java @@ -24,7 +24,7 @@ import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericParall import org.openslx.runvirt.plugin.qemu.configuration.TransformationSpecificQemuSerialDevices; import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericUuid; import org.openslx.runvirt.plugin.qemu.configuration.TransformationSpecificQemuArchitecture; -import org.openslx.runvirt.plugin.qemu.configuration.TransformationSpecificQemuNvidiaGpuPassthrough; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationSpecificQemuGpuPassthroughNvidia; import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu; import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu.QemuSessionType; import org.openslx.runvirt.virtualization.LibvirtHypervisor; @@ -135,7 +135,7 @@ public class App transformationManager.register( new TransformationSpecificQemuArchitecture( hypervisorQemu ), true ); transformationManager.register( new TransformationSpecificQemuSerialDevices( hypervisorQemu ), true ); - transformationManager.register( new TransformationSpecificQemuNvidiaGpuPassthrough( hypervisorQemu ), false ); + transformationManager.register( new TransformationSpecificQemuGpuPassthroughNvidia( hypervisorQemu ), false ); } // finalize Libvirt VM configuration template diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/cmdln/CommandLineArgs.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/cmdln/CommandLineArgs.java index 7e1a7a22..03df8923 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/cmdln/CommandLineArgs.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/cmdln/CommandLineArgs.java @@ -194,8 +194,14 @@ public class CommandLineArgs */ public int getVmNumCpus() { - final String numCpus = this.getArgument( CmdLnOption.VM_NCPUS ); - return Integer.parseInt( numCpus ); + final String numCpuArg = this.getArgument( CmdLnOption.VM_NCPUS ); + int numCpus = 0; + + if ( numCpuArg != null ) { + numCpus = Integer.parseInt( numCpuArg ); + } + + return numCpus; } /** diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpu.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpu.java index cdb0a63d..9d9237c7 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpu.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpu.java @@ -7,18 +7,49 @@ import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic CPU transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericCpu extends TransformationGeneric { - private static final String FILTER_NAME = "CPU [number of cores, mode, ...]"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "CPU [number of cores, mode, ...]"; + /** + * Creates a new generic CPU transformation for Libvirt/QEMU virtualization configurations. + */ public TransformationGenericCpu() { - super( TransformationGenericCpu.FILTER_NAME ); + super( TransformationGenericCpu.NAME ); + } + + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } else if ( args.getVmNumCpus() < 1 ) { + throw new TransformationException( "Invalid number of CPUs specified! Expected a number n > 0!" ); + } } @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { + // validate configuration and input arguments + this.validateInputs( config, args ); + config.setVCpu( args.getVmNumCpus() ); config.setCpuMode( CpuMode.HOST_PASSTHROUGH ); config.setCpuCheck( CpuCheck.PARTIAL ); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java index 345dd5a9..066af763 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java @@ -11,16 +11,51 @@ import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuU import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic CDROM drive transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericDiskCdromDevices extends TransformationGeneric { - private static final String FILTER_NAME = "Disk CDROM devices"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "Disk CDROM devices"; + /** + * Creates a new generic CDROM drive transformation for Libvirt/QEMU virtualization + * configurations. + */ public TransformationGenericDiskCdromDevices() { - super( TransformationGenericDiskCdromDevices.FILTER_NAME ); + super( TransformationGenericDiskCdromDevices.NAME ); } - private void filterDiskCdromDevice( Domain config, String fileName, int index ) throws TransformationException + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } + } + + /** + * Transforms a CDROM drive in a virtualization configuration selected by its {@code index}. + * + * @param config virtualization configuration for the transformation. + * @param fileName name of the image file for the CDROM drive. + * @param index number of the CDROM drive in the virtualization configuration that is selected. + * @throws TransformationException transformation has failed. + */ + private void transformDiskCdromDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = config.getDiskCdromDevices(); final DiskCdrom disk = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); @@ -42,8 +77,12 @@ public class TransformationGenericDiskCdromDevices extends TransformationGeneric @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { - this.filterDiskCdromDevice( config, args.getVmDiskFileNameCdrom0(), 0 ); - this.filterDiskCdromDevice( config, args.getVmDiskFileNameCdrom1(), 1 ); + // validate configuration and input arguments + this.validateInputs( config, args ); + + // alter CDROM drives + this.transformDiskCdromDevice( config, args.getVmDiskFileNameCdrom0(), 0 ); + this.transformDiskCdromDevice( config, args.getVmDiskFileNameCdrom1(), 1 ); // remove all additional disk CDROM devices final ArrayList devices = config.getDiskCdromDevices(); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java index 6ceae846..87b0eb5c 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java @@ -10,16 +10,50 @@ import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuU import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic floppy drive transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericDiskFloppyDevices extends TransformationGeneric { - private static final String FILTER_NAME = "Disk floppy devices"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "Disk floppy devices"; + /** + * Creates a new floppy drive transformation for Libvirt/QEMU virtualization configurations. + */ public TransformationGenericDiskFloppyDevices() { - super( TransformationGenericDiskFloppyDevices.FILTER_NAME ); + super( TransformationGenericDiskFloppyDevices.NAME ); } - private void filterDiskFloppyDevice( Domain config, String fileName, int index ) throws TransformationException + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } + } + + /** + * Transforms a floppy drive in a virtualization configuration selected by its {@code index}. + * + * @param config virtualization configuration for the transformation. + * @param fileName name of the image file for the floppy drive. + * @param index number of the floppy drive in the virtualization configuration that is selected. + * @throws TransformationException transformation has failed. + */ + private void transformDiskFloppyDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = config.getDiskFloppyDevices(); final DiskFloppy disk = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); @@ -38,8 +72,12 @@ public class TransformationGenericDiskFloppyDevices extends TransformationGeneri @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { - this.filterDiskFloppyDevice( config, args.getVmDiskFileNameFloppy0(), 0 ); - this.filterDiskFloppyDevice( config, args.getVmDiskFileNameFloppy1(), 1 ); + // validate configuration and input arguments + this.validateInputs( config, args ); + + // alter floppy drives + this.transformDiskFloppyDevice( config, args.getVmDiskFileNameFloppy0(), 0 ); + this.transformDiskFloppyDevice( config, args.getVmDiskFileNameFloppy1(), 1 ); // remove all additional disk storage devices final ArrayList devices = config.getDiskFloppyDevices(); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java index ca71f7a3..30c26cae 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java @@ -10,16 +10,53 @@ import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuU import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic storage device (HDD, SSD, ...) transformation for Libvirt/QEMU virtualization + * configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericDiskStorageDevices extends TransformationGeneric { - private static final String FILTER_NAME = "Disk storage devices [HDD, SSD, ...]"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "Disk storage devices [HDD, SSD, ...]"; + /** + * Creates a new storage device (HDD, SSD, ...) transformation for Libvirt/QEMU virtualization + * configurations. + */ public TransformationGenericDiskStorageDevices() { - super( TransformationGenericDiskStorageDevices.FILTER_NAME ); + super( TransformationGenericDiskStorageDevices.NAME ); } - private void filterDiskStorageDevice( Domain config, String fileName, int index ) throws TransformationException + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } + } + + /** + * Transforms a storage device in a virtualization configuration selected by its {@code index}. + * + * @param config virtualization configuration for the transformation. + * @param fileName name of the image file for the storage device. + * @param index number of the storage device in the virtualization configuration that is + * selected. + * @throws TransformationException transformation has failed. + */ + private void transformDiskStorageDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = config.getDiskStorageDevices(); final DiskStorage disk = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); @@ -38,7 +75,11 @@ public class TransformationGenericDiskStorageDevices extends TransformationGener @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { - this.filterDiskStorageDevice( config, args.getVmDiskFileNameHDD0(), 0 ); + // validate configuration and input arguments + this.validateInputs( config, args ); + + // alter storage device + this.transformDiskStorageDevice( config, args.getVmDiskFileNameHDD0(), 0 ); // remove all additional disk storage devices final ArrayList devices = config.getDiskStorageDevices(); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java index 0417bfdf..88939302 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java @@ -11,16 +11,55 @@ import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuU import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic file system device (shared folder) transformation for Libvirt/QEMU virtualization + * configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericFileSystemDevices extends TransformationGeneric { - private static final String FILTER_NAME = "File system devices"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "File system devices"; + /** + * Creates a new file system device (shared folder) transformation for Libvirt/QEMU + * virtualization configurations. + */ public TransformationGenericFileSystemDevices() { - super( TransformationGenericFileSystemDevices.FILTER_NAME ); + super( TransformationGenericFileSystemDevices.NAME ); } - private void filterFileSystemDevice( Domain config, String source, String target, int index ) throws TransformationException + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } + } + + /** + * Transforms a storage device in a virtualization configuration selected by its {@code index}. + * + * @param config virtualization configuration for the transformation. + * @param source path of the file system source on a host system. + * @param target path of the file system destination in a virtualization guest. + * @param index number of the file system device in the virtualization configuration that is + * selected. + * @throws TransformationException transformation has failed. + */ + private void transformFileSystemDevice( Domain config, String source, String target, int index ) + throws TransformationException { final ArrayList devices = config.getFileSystemDevices(); final FileSystem fileSystem = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); @@ -52,8 +91,12 @@ public class TransformationGenericFileSystemDevices extends TransformationGeneri @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { - this.filterFileSystemDevice( config, args.getVmFsSrc0(), args.getVmFsTgt0(), 0 ); - this.filterFileSystemDevice( config, args.getVmFsSrc1(), args.getVmFsTgt1(), 1 ); + // validate configuration and input arguments + this.validateInputs( config, args ); + + // alter file system devices + this.transformFileSystemDevice( config, args.getVmFsSrc0(), args.getVmFsTgt0(), 0 ); + this.transformFileSystemDevice( config, args.getVmFsSrc1(), args.getVmFsTgt1(), 1 ); // remove all additional file system devices final ArrayList devices = config.getFileSystemDevices(); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java index 3b45de78..ab44b784 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java @@ -9,16 +9,52 @@ import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuU import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic network interface transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericInterfaceDevices extends TransformationGeneric { - private static final String FILTER_NAME = "Network interface devices"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "Network interface devices"; + /** + * Creates a new network interface transformation for Libvirt/QEMU virtualization configurations. + */ public TransformationGenericInterfaceDevices() { - super( TransformationGenericInterfaceDevices.FILTER_NAME ); + super( TransformationGenericInterfaceDevices.NAME ); } - private void filterInterfaceDevice( Domain config, String macAddress, int index ) throws TransformationException + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } + } + + /** + * Transforms a network interface in a virtualization configuration selected by its + * {@code index}. + * + * @param config virtualization configuration for the transformation. + * @param macAddress MAC address for the network interface. + * @param index number of the network interface in the virtualization configuration that is + * selected. + * @throws TransformationException transformation has failed. + */ + private void transformInterfaceDevice( Domain config, String macAddress, int index ) throws TransformationException { final ArrayList devices = config.getInterfaceDevices(); final Interface device = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); @@ -37,7 +73,11 @@ public class TransformationGenericInterfaceDevices extends TransformationGeneric @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { - this.filterInterfaceDevice( config, args.getVmMacAddress0(), 0 ); + // validate configuration and input arguments + this.validateInputs( config, args ); + + // alter network interface + this.transformInterfaceDevice( config, args.getVmMacAddress0(), 0 ); // remove all additional disk storage devices final ArrayList devices = config.getInterfaceDevices(); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemory.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemory.java index 341a5b7f..fce373f7 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemory.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemory.java @@ -8,18 +8,49 @@ import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic memory transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericMemory extends TransformationGeneric { - private static final String FILTER_NAME = "Memory [normal, current (balloning)]"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "Memory [normal, current (balloning)]"; + /** + * Creates a new memory transformation for Libvirt/QEMU virtualization configurations. + */ public TransformationGenericMemory() { - super( TransformationGenericMemory.FILTER_NAME ); + super( TransformationGenericMemory.NAME ); + } + + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } else if ( args.getVmMemory() == null || args.getVmMemory().isEmpty() ) { + throw new TransformationException( "Amount of memory in MiB is not specified!" ); + } } @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { + // validate configuration and input arguments + this.validateInputs( config, args ); + BigInteger memory = DomainUtils.decodeMemory( args.getVmMemory(), "MiB" ); config.setMemory( memory ); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericName.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericName.java index 3cc2572d..b96793d5 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericName.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericName.java @@ -5,18 +5,52 @@ import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic name transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericName extends TransformationGeneric { - private static final String FILTER_NAME = "Name [(display) name]"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "Name [(display) name]"; + /** + * Creates a new name transformation for Libvirt/QEMU virtualization configurations. + */ public TransformationGenericName() { - super( TransformationGenericName.FILTER_NAME ); + super( TransformationGenericName.NAME ); + } + + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } else if ( args.getVmName() == null || args.getVmName().isEmpty() ) { + throw new TransformationException( "Name is not specified!" ); + } else if ( args.getVmDisplayName() == null || args.getVmDisplayName().isEmpty() ) { + throw new TransformationException( "Display name is not specified!" ); + } } @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { + // validate configuration and input arguments + this.validateInputs( config, args ); + + // alter names in the configuration config.setName( args.getVmName() ); config.setTitle( args.getVmDisplayName() ); } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java index 7350df32..dff86132 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java @@ -10,16 +10,51 @@ import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuU import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic parallel device transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericParallelDevices extends TransformationGeneric { - private static final String FILTER_NAME = "Parallel devices"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "Parallel devices"; + /** + * Creates a new parallel device transformation for Libvirt/QEMU virtualization configurations. + */ public TransformationGenericParallelDevices() { - super( TransformationGenericParallelDevices.FILTER_NAME ); + super( TransformationGenericParallelDevices.NAME ); } - private void filterParallelDevice( Domain config, String fileName, int index ) throws TransformationException + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } + } + + /** + * Transforms a parallel device in a virtualization configuration selected by its {@code index}. + * + * @param config virtualization configuration for the transformation. + * @param fileName path to the parallel device file on the host system. + * @param index number of the parallel device in the virtualization configuration that is + * selected. + * @throws TransformationException transformation has failed. + */ + private void transformParallelDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = config.getParallelDevices(); final Parallel device = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); @@ -47,7 +82,11 @@ public class TransformationGenericParallelDevices extends TransformationGeneric< @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { - this.filterParallelDevice( config, args.getVmDeviceSerial0(), 0 ); + // validate configuration and input arguments + this.validateInputs( config, args ); + + // alter parallel device + this.transformParallelDevice( config, args.getVmDeviceParallel0(), 0 ); // remove all additional parallel devices final ArrayList devices = config.getParallelDevices(); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuid.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuid.java index c60c794f..43fb6412 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuid.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuid.java @@ -5,18 +5,49 @@ import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; +/** + * Generic UUID transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ public class TransformationGenericUuid extends TransformationGeneric { - private static final String FILTER_NAME = "UUID"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "UUID"; + /** + * Creates a new UUID transformation for Libvirt/QEMU virtualization configurations. + */ public TransformationGenericUuid() { - super( TransformationGenericUuid.FILTER_NAME ); + super( TransformationGenericUuid.NAME ); + } + + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } else if ( args.getVmUuid() == null || args.getVmUuid().isEmpty() ) { + throw new TransformationException( "UUID is not specified!" ); + } } @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { + // validate configuration and input arguments + this.validateInputs( config, args ); + config.setUuid( args.getVmUuid() ); } } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java index bdded447..0c32a3b3 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java @@ -15,18 +15,59 @@ import org.openslx.runvirt.virtualization.LibvirtHypervisorException; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationSpecific; -public class TransformationSpecificQemuArchitecture extends TransformationSpecific +/** + * Specific architecture transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ +public class TransformationSpecificQemuArchitecture + extends TransformationSpecific { - private static final String FILTER_NAME = "QEMU Architecture [CPU architecture, machine type, ...]"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "QEMU Architecture [CPU architecture, machine type, ...]"; - // used as instance of an singelton, always use getCapabilities to retrieve caps instance + /** + * Capabilities of the Libvirt/QEMU hypervisor. + * + * @implNote This field is used as an instance of a singelton. Please always use + * {@link #getCapabilities()} to retrieve the {@code capabilities} instance. + */ private Capabilities capabilities = null; + /** + * Creates a new architecture transformation for Libvirt/QEMU virtualization configurations. + * + * @param hypervisor Libvirt/QEMU hypervisor. + */ public TransformationSpecificQemuArchitecture( LibvirtHypervisorQemu hypervisor ) { - super( TransformationSpecificQemuArchitecture.FILTER_NAME, hypervisor ); + super( TransformationSpecificQemuArchitecture.NAME, hypervisor ); } + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null ) { + throw new TransformationException( "Virtualization configuration is missing!" ); + } + } + + /** + * Queries and returns the capabilities of the Libvirt/QEMU hypervisor. + * + * @return capabilities of the Libvirt/QEMU hypervisor. + * @throws TransformationException failed to query and return the capabilities of the + * Libvirt/QEMU hypervisor. + */ private Capabilities getCapabilities() throws TransformationException { // retrieve capabilities from QEMU hypervisor only once @@ -43,6 +84,14 @@ public class TransformationSpecificQemuArchitecture extends TransformationSpecif return this.capabilities; } + /** + * Returns a guest capability of the hypervisor's host system based on a given target + * architecture name. + * + * @param architectureName target architecture of the guest that is returned + * @return guest capability of the hypervisor's host system with target architecture name. + * @throws TransformationException failed to return guest capability of the hypervisor's host. + */ private Guest getTargetGuestFromArchName( String architectureName ) throws TransformationException { final List guests = this.getCapabilities().getGuests(); @@ -63,6 +112,16 @@ public class TransformationSpecificQemuArchitecture extends TransformationSpecif return targetGuest; } + /** + * Returns the target machine description of a host system's guest capability based on a given + * target machine name. + * + * @param guest guest capability of a host system. + * @param machineName name of the machine description. + * @return target machine description of a host system's guest capability. + * @throws TransformationException failed to return the target machine description of a host + * system's guest capabilities. + */ private Machine getTargetMachineFromGuest( Guest guest, String machineName ) throws TransformationException { final List machines = guest.getArchMachines(); @@ -82,6 +141,15 @@ public class TransformationSpecificQemuArchitecture extends TransformationSpecif return targetMachine; } + /** + * Returns the canonical names of a target machine description of a host system's guest + * capability. + * + * @param guest guest capability of a host system. + * @return canonical names of a target machine description of a host system's guest capability. + * @throws TransformationException failed to return the canonical names of a target machine + * description of a host system's guest capability + */ private List getCanonicalNamesFromTargetMachines( Guest guest ) throws TransformationException { final List machines = guest.getArchMachines(); @@ -100,6 +168,9 @@ public class TransformationSpecificQemuArchitecture extends TransformationSpecif @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { + // validate configuration and input arguments + this.validateInputs( config, args ); + // get source architecture, machine- and OS type final String sourceArchitectureName = config.getOsArch(); final String sourceMachine = config.getOsMachine(); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuGpuPassthroughNvidia.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuGpuPassthroughNvidia.java new file mode 100644 index 00000000..c41f989c --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuGpuPassthroughNvidia.java @@ -0,0 +1,59 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import org.openslx.libvirt.domain.Domain; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationSpecific; + +/** + * Specific Nvidia GPU passthrough transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ +public class TransformationSpecificQemuGpuPassthroughNvidia + extends TransformationSpecific +{ + /** + * Name of the configuration transformation. + */ + private static final String NAME = "QEMU GPU passthrough [Nvidia]"; + + /** + * Creates a new Nvidia GPU passthrough transformation for Libvirt/QEMU virtualization + * configurations. + * + * @param hypervisor Libvirt/QEMU hypervisor. + */ + public TransformationSpecificQemuGpuPassthroughNvidia( LibvirtHypervisorQemu hypervisor ) + { + super( TransformationSpecificQemuGpuPassthroughNvidia.NAME, hypervisor ); + } + + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + // validate configuration and input arguments + this.validateInputs( config, args ); + + // check if IOMMU support is available on the host + + // TODO: implement Nvidia hypervisor shadowing + // call this filter at the end, since -> override of software graphics to 'none' necessary + } +} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuNvidiaGpuPassthrough.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuNvidiaGpuPassthrough.java deleted file mode 100644 index 80349188..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuNvidiaGpuPassthrough.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import org.openslx.libvirt.domain.Domain; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu; -import org.openslx.virtualization.configuration.transformation.TransformationException; -import org.openslx.virtualization.configuration.transformation.TransformationSpecific; - -public class TransformationSpecificQemuNvidiaGpuPassthrough extends TransformationSpecific -{ - private static final String FILTER_NAME = "QEMU GPU passthrough [Nvidia]"; - - public TransformationSpecificQemuNvidiaGpuPassthrough( LibvirtHypervisorQemu hypervisor ) - { - super( TransformationSpecificQemuNvidiaGpuPassthrough.FILTER_NAME, hypervisor ); - } - - @Override - public void transform( Domain config, CommandLineArgs args ) throws TransformationException - { - // check if IOMMU support is available on the host - - // TODO: implement Nvidia hypervisor shadowing - // call this filter at the end, since -> override of software graphics to 'none' necessary - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java index 5c4509d7..1cd3c9b0 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java @@ -13,15 +13,51 @@ import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuU import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationSpecific; -public class TransformationSpecificQemuSerialDevices extends TransformationSpecific +/** + * Specific serial device transformation for Libvirt/QEMU virtualization configurations. + * + * @author Manuel Bentele + * @version 1.0 + */ +public class TransformationSpecificQemuSerialDevices + extends TransformationSpecific { - private static final String FILTER_NAME = "Serial devices"; + /** + * Name of the configuration transformation. + */ + private static final String NAME = "Serial devices"; + /** + * Creates a new serial device transformation for Libvirt/QEMU virtualization configurations. + * + * @param hypervisor Libvirt/QEMU hypervisor. + */ public TransformationSpecificQemuSerialDevices( LibvirtHypervisorQemu hypervisor ) { - super( TransformationSpecificQemuSerialDevices.FILTER_NAME, hypervisor ); + super( TransformationSpecificQemuSerialDevices.NAME, hypervisor ); } + /** + * Validates a virtualization configuration and input arguments for this transformation. + * + * @param config virtualization configuration for the validation. + * @param args input arguments for the validation. + * @throws TransformationException validation has failed. + */ + private void validateInputs( Domain config, CommandLineArgs args ) throws TransformationException + { + if ( config == null || args == null ) { + throw new TransformationException( "Virtualization configuration or input arguments are missing!" ); + } + } + + /** + * Returns all serial devices from a virtualization configuration that link to a host system's + * serial device. + * + * @param config virtualization configuration. + * @return all serial devices that link to a host system's serial device. + */ private ArrayList getSerialDevDevices( Domain config ) { final ArrayList devices = config.getSerialDevices(); @@ -30,7 +66,15 @@ public class TransformationSpecificQemuSerialDevices extends TransformationSpeci return devices.stream().filter( byDeviceTypeDev ).collect( Collectors.toCollection( ArrayList::new ) ); } - private void filterSerialDevice( Domain config, String fileName, int index ) throws TransformationException + /** + * Transforms a serial device in a virtualization configuration selected by its {@code index}. + * + * @param config virtualization configuration for the transformation. + * @param fileName path to the serial device file on the host system. + * @param index number of the serial device in the virtualization configuration that is selected. + * @throws TransformationException transformation has failed. + */ + private void transformSerialDevice( Domain config, String fileName, int index ) throws TransformationException { final ArrayList devices = this.getSerialDevDevices( config ); final Serial device = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); @@ -58,7 +102,11 @@ public class TransformationSpecificQemuSerialDevices extends TransformationSpeci @Override public void transform( Domain config, CommandLineArgs args ) throws TransformationException { - this.filterSerialDevice( config, args.getVmDeviceSerial0(), 0 ); + // validate configuration and input arguments + this.validateInputs( config, args ); + + // alter serial device + this.transformSerialDevice( config, args.getVmDeviceSerial0(), 0 ); // remove all additional serial devices final ArrayList devices = this.getSerialDevDevices( config ); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/virtualization/LibvirtHypervisorQemu.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/virtualization/LibvirtHypervisorQemu.java index 260c3f4e..34cf33cf 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/virtualization/LibvirtHypervisorQemu.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/virtualization/LibvirtHypervisorQemu.java @@ -3,13 +3,31 @@ package org.openslx.runvirt.plugin.qemu.virtualization; import org.openslx.runvirt.virtualization.LibvirtHypervisor; import org.openslx.runvirt.virtualization.LibvirtHypervisorException; +/** + * Representation of the Libvirt QEMU hypervisor backend. + * + * @author Manuel Bentele + * @version 1.0 + */ public class LibvirtHypervisorQemu extends LibvirtHypervisor { + /** + * Creates a new Libvirt QEMU hypervisor backend and connects to the specified backend. + * + * @param type session type of the connection to the Libvirt QEMU hypervisor backend. + * @throws LibvirtHypervisorException failed to connect to the Libvirt QEMU hypervisor backend. + */ public LibvirtHypervisorQemu( QemuSessionType type ) throws LibvirtHypervisorException { super( type.getConnectionUri() ); } + /** + * Type of Libvirt QEMU hypervisor backend session. + * + * @author Manuel Bentele + * @version 1.0 + */ public enum QemuSessionType { // @formatter:off @@ -17,23 +35,29 @@ public class LibvirtHypervisorQemu extends LibvirtHypervisor LOCAL_USER_SESSION ( "qemu:///session" ); // @formatter:on + /** + * Connection URI of the QEMU session type. + */ private final String connectionUri; + /** + * Creates a new QEMU session type. + * + * @param connectionUri URI for the connection of the session. + */ QemuSessionType( String connectionUri ) { this.connectionUri = connectionUri; } + /** + * Returns the URI of the connection for the session. + * + * @return URI of the connection for the session. + */ public String getConnectionUri() { return this.connectionUri; } - - // TODO: - // Implement capabilities -> get host architecture => decision whether to emulate or use KVM? -> change domain of XML - // fill in given HDD file, CDROM, ... - // GPU-Passthrough: patch XML with hypervisor disable bit, ..., to get Nvidia driver working - // Add hostdev für GPU passthrough -> add PCI ID arguments to cmdln parser - // } } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtHypervisor.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtHypervisor.java index 345900ab..3c654880 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtHypervisor.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtHypervisor.java @@ -8,16 +8,47 @@ import org.openslx.libvirt.capabilities.Capabilities; import org.openslx.libvirt.xml.LibvirtXmlDocumentException; import org.openslx.libvirt.xml.LibvirtXmlSerializationException; import org.openslx.libvirt.xml.LibvirtXmlValidationException; - +import org.openslx.virtualization.Version; + +/** + * Representation of a Libvirt hypervisor backend (e.g. QEMU or VMware). + *

+ * The representation allows to connect to a running Libvirt service and query the host system's + * capabilities or manage virtual machines. + * + * @implNote This class is the abstract representation to implement various Libvirt hypervisor + * backends using inheritance. + * + * @author Manuel Bentele + * @version 1.0 + */ public abstract class LibvirtHypervisor implements Closeable { + /** + * Connection to a Libvirt hypervisor backend. + */ protected Connect hypervisor = null; + /** + * Creates a new Libvirt hypervisor backend specified by an URI and connects to the specified + * backend. + * + * @param connectionUri URI of a specific Libvirt hypervisor backend. + * @throws LibvirtHypervisorException failed to connect to the specified Libvirt hypervisor + * backend. + */ public LibvirtHypervisor( String connectionUri ) throws LibvirtHypervisorException { this.connect( connectionUri ); } + /** + * Connects to the Libvirt hypervisor backend specified by an URI. + * + * @param connectionUri URI of a specific Libvirt hypervisor backend. + * @throws LibvirtHypervisorException failed to connect to the specified Libvirt hypervisor + * backend. + */ protected void connect( String connectionUri ) throws LibvirtHypervisorException { try { @@ -27,6 +58,13 @@ public abstract class LibvirtHypervisor implements Closeable } } + /** + * Returns the queried Libvirt hypervisor's host system capabilities. + * + * @return queried Libvirt hypervisor's host system capabilities. + * @throws LibvirtHypervisorException failed to query and return the Libvirt hypervisor's host + * system capabilities. + */ public Capabilities getCapabilites() throws LibvirtHypervisorException { Capabilities hypervisorCapabilities = null; @@ -42,20 +80,41 @@ public abstract class LibvirtHypervisor implements Closeable return hypervisorCapabilities; } - public int getVersion() throws LibvirtHypervisorException + /** + * Returns the version of the Libvirt hypervisor backend. + * + * @return version of the Libvirt hypervisor backend. + * @throws LibvirtHypervisorException failed to get the version of the Libvirt hypervisor + * backend. + */ + public Version getVersion() throws LibvirtHypervisorException { - int hypervisorVersion = 0; + long hypervisorVersionRaw = 0; + Version hypervisorVersion = null; try { - final long hypervisorVersionLong = this.hypervisor.getVersion(); - hypervisorVersion = Long.valueOf( hypervisorVersionLong ).intValue(); + hypervisorVersionRaw = this.hypervisor.getVersion(); } catch ( LibvirtException e ) { throw new LibvirtHypervisorException( e.getLocalizedMessage() ); } + if ( hypervisorVersionRaw > 0 ) { + final short major = Long.valueOf( hypervisorVersionRaw / Long.valueOf( 1000000 ) ).shortValue(); + hypervisorVersionRaw %= Long.valueOf( 1000000 ); + final short minor = Long.valueOf( hypervisorVersionRaw / Long.valueOf( 1000 ) ).shortValue(); + hypervisorVersion = new Version( major, minor ); + } + return hypervisorVersion; } + /** + * Register a virtual machine by the Libvirt hypervisor based on a virtualization configuration. + * + * @param vmConfiguration virtualization configuration for the virtual machine. + * @return instance of the registered and defined virtual machine. + * @throws LibvirtHypervisorException failed to register and define virtual machine. + */ public LibvirtVirtualMachine registerVm( org.openslx.libvirt.domain.Domain vmConfiguration ) throws LibvirtHypervisorException { @@ -71,6 +130,13 @@ public abstract class LibvirtHypervisor implements Closeable return new LibvirtVirtualMachine( libvirtDomain ); } + /** + * Deregisters an already registered virtual machine by the Libvirt hypervisor. + * + * @param vm virtual machine that should be deregistered + * @throws LibvirtHypervisorException failed to deregister virtual machine by the Libvirt hypervisor. + * @throws LibvirtVirtualMachineException failed to check and stop the virtual machine. + */ public void deregisterVm( LibvirtVirtualMachine vm ) throws LibvirtHypervisorException, LibvirtVirtualMachineException { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtHypervisorException.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtHypervisorException.java index acf640e1..64ae6b20 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtHypervisorException.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtHypervisorException.java @@ -1,5 +1,11 @@ package org.openslx.runvirt.virtualization; +/** + * An exception of a Libvirt hypervisor error during acquiring the hypervisor's functionality. + * + * @author Manuel Bentele + * @version 1.0 + */ public class LibvirtHypervisorException extends Exception { /** @@ -7,6 +13,11 @@ public class LibvirtHypervisorException extends Exception */ private static final long serialVersionUID = -3631452625806770209L; + /** + * Creates a Libvirt hypervisor exception including an error message. + * + * @param errorMsg message to describe a specific Libvirt hypervisor error. + */ LibvirtHypervisorException( String errorMsg ) { super( errorMsg ); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtVirtualMachine.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtVirtualMachine.java index 781bd938..32b99d66 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtVirtualMachine.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtVirtualMachine.java @@ -3,20 +3,45 @@ package org.openslx.runvirt.virtualization; import org.libvirt.Domain; import org.libvirt.LibvirtException; +/** + * Representation of a Libvirt virtual machine. + * + * @author Manuel Bentele + * @version 1.0 + */ public class LibvirtVirtualMachine { + /** + * Libvirt virtualization configuration of the virtual machine. + */ private Domain domain; + /** + * Creates a new Libvirt virtual machine specified by a virtualization configuration. + * + * @param vm Libvirt virtualization configuration to specify the Libvirt virtual machine. + */ LibvirtVirtualMachine( Domain vm ) { this.domain = vm; } + /** + * Returns the Libvirt virtualization configuration of the Libvirt virtual machine. + * + * @return Libvirt virtualization configuration of the Libvirt virtual machine. + */ public Domain getLibvirtDomain() { return this.domain; } + /** + * Checks if the Libvirt virtual machine is running. + * + * @return state of the Libvirt virtual machine whether it is running or not. + * @throws LibvirtVirtualMachineException failed to check if Libvirt machine is running or not. + */ public boolean isRunning() throws LibvirtVirtualMachineException { int state = 0; @@ -30,6 +55,11 @@ public class LibvirtVirtualMachine return ( state == 0 ) ? false : true; } + /** + * Starts the Libvirt virtual machine. + * + * @throws LibvirtVirtualMachineException failed to start the Libvirt virtual machine. + */ public void start() throws LibvirtVirtualMachineException { if ( !this.isRunning() ) { @@ -41,6 +71,11 @@ public class LibvirtVirtualMachine } } + /** + * Stops the Libvirt virtual machine. + * + * @throws LibvirtVirtualMachineException failed to stop the Libvirt virtual machine. + */ public void stop() throws LibvirtVirtualMachineException { if ( this.isRunning() ) { @@ -52,6 +87,11 @@ public class LibvirtVirtualMachine } } + /** + * Suspends the Libvirt virtual machine. + * + * @throws LibvirtVirtualMachineException failed to suspend the Libvirt virtual machine. + */ public void suspend() throws LibvirtVirtualMachineException { try { @@ -61,6 +101,11 @@ public class LibvirtVirtualMachine } } + /** + * Resumes the Libvirt virtual machine. + * + * @throws LibvirtVirtualMachineException faild to resume the Libvirt virtual machine. + */ public void resume() throws LibvirtVirtualMachineException { try { @@ -70,6 +115,11 @@ public class LibvirtVirtualMachine } } + /** + * Reboot the Libvirt virtual machine. + * + * @throws LibvirtVirtualMachineException failed to reboot the Libvirt virtual machine. + */ public void reboot() throws LibvirtVirtualMachineException { try { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtVirtualMachineException.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtVirtualMachineException.java index 4e8ee1ba..dd490be3 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtVirtualMachineException.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/virtualization/LibvirtVirtualMachineException.java @@ -1,5 +1,11 @@ package org.openslx.runvirt.virtualization; +/** + * An exception of a Libvirt virtual machine error during controlling the virtual machine. + * + * @author Manuel Bentele + * @version 1.0 + */ public class LibvirtVirtualMachineException extends Exception { /** @@ -7,6 +13,11 @@ public class LibvirtVirtualMachineException extends Exception */ private static final long serialVersionUID = -5371327391243047616L; + /** + * Creates a Libvirt virtual machine exception including an error message. + * + * @param errorMsg message to describe a specific Libvirt virtual machine error. + */ public LibvirtVirtualMachineException( String errorMsg ) { super( errorMsg ); -- cgit v1.2.3-55-g7522 From 985b51d7a308ce468105b2c38a293e9f4bd1f48e Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Wed, 26 May 2021 11:32:54 +0200 Subject: [qemu] Add unit tests for Libvirt configuration transformations --- .../runvirt/plugin/qemu/cmdln/CommandLineArgs.java | 2 +- .../TransformationGenericDiskCdromDevices.java | 27 +++++- .../TransformationGenericDiskFloppyDevices.java | 22 ++++- .../TransformationGenericDiskStorageDevices.java | 16 +++- .../TransformationGenericFileSystemDevices.java | 6 +- .../TransformationGenericInterfaceDevices.java | 17 +++- .../TransformationGenericParallelDevices.java | 2 +- .../TransformationSpecificQemuArchitecture.java | 6 +- .../TransformationSpecificQemuSerialDevices.java | 4 +- .../org/openslx/runvirt/plugin/qemu/AppTest.java | 8 +- .../TransformationGenericCpuTest.java | 12 +++ .../TransformationGenericDiskCdromDevicesTest.java | 60 ++++++++++++ ...TransformationGenericDiskFloppyDevicesTest.java | 61 ++++++++++++ ...TransformationGenericFileSystemDevicesTest.java | 61 ++++++++++++ .../TransformationGenericInterfaceDevicesTest.java | 58 ++++++++++++ .../TransformationGenericMemoryTest.java | 12 +++ .../TransformationGenericNameTest.java | 12 +++ .../TransformationGenericParallelDevicesTest.java | 53 +++++++++++ .../TransformationGenericUuidTest.java | 12 +++ ...TransformationSpecificQemuArchitectureTest.java | 102 +++++++++++++++++++++ ...ransformationSpecificQemuSerialDevicesTest.java | 69 ++++++++++++++ 21 files changed, 596 insertions(+), 26 deletions(-) create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevicesTest.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevicesTest.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevicesTest.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevicesTest.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevicesTest.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitectureTest.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevicesTest.java (limited to 'core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java') diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/cmdln/CommandLineArgs.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/cmdln/CommandLineArgs.java index eb7c8739..1fe342b1 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/cmdln/CommandLineArgs.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/cmdln/CommandLineArgs.java @@ -373,7 +373,7 @@ public class CommandLineArgs VM_SERIAL0 ( 'q', "vmserial0", true, "Device for the first serial port interface" ), VM_MAC0 ( 'a', "vmmac0", true, "MAC address for the first network interface" ), VM_FSSRC0 ( 't', "vmfssrc0", true, "Source directory for first file system passthrough (shared folder)" ), - VM_FSTGT0 ( 'u', "vmfstgt0", true, "Target directory for first file system passthrough (shared folder)" ), + VM_FSTGT0 ( 'e', "vmfstgt0", true, "Target directory for first file system passthrough (shared folder)" ), VM_FSSRC1 ( 'v', "vmfssrc1", true, "Source directory for second file system passthrough (shared folder)" ), VM_FSTGT1 ( 'w', "vmfstgt1", true, "Target directory for second file system passthrough (shared folder)" ); // @formatter:on diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java index 066af763..643c40ed 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java @@ -3,10 +3,10 @@ package org.openslx.runvirt.plugin.qemu.configuration; import java.util.ArrayList; import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.Disk.BusType; import org.openslx.libvirt.domain.device.Disk.StorageType; import org.openslx.libvirt.domain.device.DiskCdrom; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.virtualization.configuration.VirtualizationConfigurationQemu; import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; @@ -60,11 +60,28 @@ public class TransformationGenericDiskCdromDevices extends TransformationGeneric final ArrayList devices = config.getDiskCdromDevices(); final DiskCdrom disk = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); - if ( disk != null ) { + if ( disk == null ) { + if ( fileName != null ) { + // CDROM drive does not exist, so create new CDROM drive + final DiskCdrom newDisk = config.addDiskCdromDevice(); + newDisk.setBusType( BusType.SATA ); + String targetDevName = VirtualizationConfigurationQemuUtils.createAlphabeticalDeviceName( "sd", index ); + newDisk.setTargetDevice( targetDevName ); + + if ( fileName.isEmpty() ) { + // remove storage source if empty string is specified to emulate an empty CDROM drive + newDisk.removeStorage(); + } else { + // set disk image file as storage source of the disk CDROM drive + newDisk.setStorage( StorageType.FILE, fileName ); + } + } + } else { + // CDROM drive exists, so update existing CDROM drive if ( fileName == null ) { - // do not remove disk CDROM drive, but set local physical drive as input source - disk.setStorage( StorageType.BLOCK, VirtualizationConfigurationQemu.CDROM_DEFAULT_PHYSICAL_DRIVE ); - } else if ( fileName.equals( "" ) ) { + // remove disk storage device if disk image file name is not set + disk.remove(); + } else if ( fileName.isEmpty() ) { // remove storage source if empty string is specified to emulate an empty CDROM drive disk.removeStorage(); } else { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java index 87b0eb5c..fe3d3c34 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java @@ -3,6 +3,7 @@ package org.openslx.runvirt.plugin.qemu.configuration; import java.util.ArrayList; import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.Disk.BusType; import org.openslx.libvirt.domain.device.Disk.StorageType; import org.openslx.libvirt.domain.device.DiskFloppy; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; @@ -58,12 +59,27 @@ public class TransformationGenericDiskFloppyDevices extends TransformationGeneri final ArrayList devices = config.getDiskFloppyDevices(); final DiskFloppy disk = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); - if ( disk != null ) { + if ( disk == null ) { + if ( fileName != null ) { + // floppy device does not exist, so create new floppy device + final DiskFloppy newDisk = config.addDiskFloppyDevice(); + newDisk.setBusType( BusType.FDC ); + String targetDevName = VirtualizationConfigurationQemuUtils.createAlphabeticalDeviceName( "fd", index ); + newDisk.setTargetDevice( targetDevName ); + + if ( fileName.isEmpty() ) { + newDisk.removeStorage(); + } else { + newDisk.setStorage( StorageType.FILE, fileName ); + } + } + } else { + // floppy device exists, so update existing floppy device if ( fileName == null ) { - // remove disk floppy device if disk image file name is not set disk.remove(); + } else if ( fileName.isEmpty() ) { + disk.removeStorage(); } else { - // set image file of disk storage if disk floppy device is available disk.setStorage( StorageType.FILE, fileName ); } } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java index 30c26cae..9bd1edbb 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java @@ -3,7 +3,9 @@ package org.openslx.runvirt.plugin.qemu.configuration; import java.util.ArrayList; import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.Disk.BusType; import org.openslx.libvirt.domain.device.Disk.StorageType; +import org.openslx.libvirt.domain.device.DiskFloppy; import org.openslx.libvirt.domain.device.DiskStorage; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; @@ -61,8 +63,18 @@ public class TransformationGenericDiskStorageDevices extends TransformationGener final ArrayList devices = config.getDiskStorageDevices(); final DiskStorage disk = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); - if ( disk != null ) { - if ( fileName == null ) { + if ( disk == null ) { + if ( fileName != null && !fileName.isEmpty() ) { + // storage device does not exist, so create new storage device + final DiskFloppy newDisk = config.addDiskFloppyDevice(); + newDisk.setBusType( BusType.VIRTIO ); + String targetDevName = VirtualizationConfigurationQemuUtils.createAlphabeticalDeviceName( "vd", index ); + newDisk.setTargetDevice( targetDevName ); + newDisk.setStorage( StorageType.FILE, fileName ); + } + } else { + // storage device exists, so update existing storage device + if ( fileName == null || fileName.isEmpty() ) { // remove disk storage device if disk image file name is not set disk.remove(); } else { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java index 88939302..a4f77b0d 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java @@ -66,7 +66,7 @@ public class TransformationGenericFileSystemDevices extends TransformationGeneri if ( fileSystem == null ) { // check if file system device source directory is specified - if ( source != null && target != null ) { + if ( source != null && !source.isEmpty() && target != null && !target.isEmpty() ) { // file system device does not exist, so create new file system device final FileSystem newFileSystem = config.addFileSystemDevice(); newFileSystem.setType( Type.MOUNT ); @@ -75,7 +75,7 @@ public class TransformationGenericFileSystemDevices extends TransformationGeneri newFileSystem.setTarget( target ); } } else { - if ( source == null || target == null ) { + if ( source == null || source.isEmpty() || target == null || target.isEmpty() ) { // remove file system device since device source or target is not specified fileSystem.remove(); } else { @@ -100,7 +100,7 @@ public class TransformationGenericFileSystemDevices extends TransformationGeneri // remove all additional file system devices final ArrayList devices = config.getFileSystemDevices(); - for ( int i = 1; i < devices.size(); i++ ) { + for ( int i = 2; i < devices.size(); i++ ) { devices.get( i ).remove(); } } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java index ab44b784..6cf12ce2 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java @@ -4,7 +4,11 @@ import java.util.ArrayList; import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.device.Interface; +import org.openslx.libvirt.domain.device.InterfaceBridge; +import org.openslx.libvirt.domain.device.Interface.Model; +import org.openslx.libvirt.domain.device.Interface.Type; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemu; import org.openslx.virtualization.configuration.VirtualizationConfigurationQemuUtils; import org.openslx.virtualization.configuration.transformation.TransformationException; import org.openslx.virtualization.configuration.transformation.TransformationGeneric; @@ -59,8 +63,17 @@ public class TransformationGenericInterfaceDevices extends TransformationGeneric final ArrayList devices = config.getInterfaceDevices(); final Interface device = VirtualizationConfigurationQemuUtils.getArrayIndex( devices, index ); - if ( device != null ) { - if ( macAddress == null ) { + if ( device == null ) { + if ( macAddress != null && !macAddress.isEmpty() ) { + // create network interface if it does not exists + final InterfaceBridge newDevice = config.addInterfaceBridgeDevice(); + newDevice.setType( Type.BRIDGE ); + newDevice.setModel( Model.VIRTIO ); + newDevice.setMacAddress( macAddress ); + newDevice.setSource( VirtualizationConfigurationQemu.NETWORK_BRIDGE_NAT_DEFAULT ); + } + } else { + if ( macAddress == null || macAddress.isEmpty() ) { // remove network interface device if MAC address is not set device.remove(); } else { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java index dff86132..08d43ef0 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java @@ -68,7 +68,7 @@ public class TransformationGenericParallelDevices extends TransformationGeneric< newDevice.setSource( fileName ); } } else { - if ( fileName == null ) { + if ( fileName == null || fileName.isEmpty() ) { // remove device since device file is not specified device.remove(); } else { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java index 0c32a3b3..f507237d 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java @@ -42,9 +42,9 @@ public class TransformationSpecificQemuArchitecture * * @param hypervisor Libvirt/QEMU hypervisor. */ - public TransformationSpecificQemuArchitecture( LibvirtHypervisorQemu hypervisor ) + public TransformationSpecificQemuArchitecture( LibvirtHypervisorQemu virtualizer ) { - super( TransformationSpecificQemuArchitecture.NAME, hypervisor ); + super( TransformationSpecificQemuArchitecture.NAME, virtualizer ); } /** @@ -68,7 +68,7 @@ public class TransformationSpecificQemuArchitecture * @throws TransformationException failed to query and return the capabilities of the * Libvirt/QEMU hypervisor. */ - private Capabilities getCapabilities() throws TransformationException + protected Capabilities getCapabilities() throws TransformationException { // retrieve capabilities from QEMU hypervisor only once if ( this.capabilities == null ) { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java index 1cd3c9b0..30f60289 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java @@ -81,14 +81,14 @@ public class TransformationSpecificQemuSerialDevices if ( device == null ) { // check if device file name is specified - if ( fileName != null ) { + if ( fileName != null && !fileName.isEmpty() ) { // serial port device is not available, so create new serial port device final Serial newDevice = config.addSerialDevice(); newDevice.setType( Type.DEV ); newDevice.setSource( fileName ); } } else { - if ( fileName == null ) { + if ( fileName == null || fileName.isEmpty() ) { // remove serial port device if device file name is not set device.remove(); } else { diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/AppTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/AppTest.java index a7929ab0..1db1525b 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/AppTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/AppTest.java @@ -63,7 +63,7 @@ public class AppTest assertTrue( shortHelpOptionCorrectOutput.contains( App.APP_DESC ) ); // test that no error was logged and output is available - assertEquals( 2093, shortHelpOptionCorrectOutput.length() ); + assertEquals( 2160, shortHelpOptionCorrectOutput.length() ); assertEquals( 0, shortHelpOptionCorrectErrOutput.length() ); } @@ -91,7 +91,7 @@ public class AppTest assertTrue( longHelpOptionCorrectOutput.contains( App.APP_DESC ) ); // test that no error was logged and output is available - assertEquals( 2093, longHelpOptionCorrectOutput.length() ); + assertEquals( 2160, longHelpOptionCorrectOutput.length() ); assertEquals( 0, longHelpOptionCorrectErrOutput.length() ); } @@ -119,7 +119,7 @@ public class AppTest assertTrue( shortHelpOptionIncorrectOutput.contains( App.APP_DESC ) ); // test that error was logged and output is available - assertEquals( 2093, shortHelpOptionIncorrectOutput.length() ); + assertEquals( 2160, shortHelpOptionIncorrectOutput.length() ); assertEquals( 0, shortHelpOptionIncorrectErrOutput.length() ); } @@ -147,7 +147,7 @@ public class AppTest assertTrue( longHelpOptionIncorrectOutput.contains( App.APP_DESC ) ); // test that error was logged and output is available - assertEquals( 2093, longHelpOptionIncorrectOutput.length() ); + assertEquals( 2160, longHelpOptionIncorrectOutput.length() ); assertEquals( 0, longHelpOptionIncorrectErrOutput.length() ); } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpuTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpuTest.java index 260adcc1..7e93513b 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpuTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpuTest.java @@ -2,6 +2,7 @@ package org.openslx.runvirt.plugin.qemu.configuration; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -31,4 +32,15 @@ public class TransformationGenericCpuTest assertEquals( CpuMode.HOST_PASSTHROUGH, config.getCpuMode() ); assertEquals( CpuCheck.PARTIAL, config.getCpuCheck() ); } + + @Test + @DisplayName( "Test transformation of VM CPU configuration with unspecified input data" ) + public void testTransformationGenericCpuNoData() throws TransformationException + { + final TransformationGenericCpu transformation = new TransformationGenericCpu(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + assertThrows( TransformationException.class, () -> transformation.transform( config, args ) ); + } } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevicesTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevicesTest.java new file mode 100644 index 00000000..842e30e6 --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevicesTest.java @@ -0,0 +1,60 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import java.util.ArrayList; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.Disk.StorageType; +import org.openslx.libvirt.domain.device.DiskCdrom; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +public class TransformationGenericDiskCdromDevicesTest +{ + @Test + @DisplayName( "Test transformation of VM disk CDROM devices configuration with specified input data" ) + public void testTransformationGenericDiskCdromDevices() throws TransformationException + { + final TransformationGenericDiskCdromDevices transformation = new TransformationGenericDiskCdromDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getDefaultCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getDiskCdromDevices(); + assertEquals( 1, devicesBeforeTransformation.size() ); + final DiskCdrom cdromDeviceBeforeTransformation = devicesBeforeTransformation.get( 0 ); + assertEquals( StorageType.FILE, cdromDeviceBeforeTransformation.getStorageType() ); + assertNotEquals( TransformationTestUtils.DEFAULT_VM_CDROM0, cdromDeviceBeforeTransformation.getStorageSource() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getDiskCdromDevices(); + assertEquals( 2, devicesAfterTransformation.size() ); + final DiskCdrom cdromDevice1AfterTransformation = devicesAfterTransformation.get( 0 ); + final DiskCdrom cdromDevice2AfterTransformation = devicesAfterTransformation.get( 1 ); + assertEquals( StorageType.FILE, cdromDevice1AfterTransformation.getStorageType() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_CDROM0, cdromDevice1AfterTransformation.getStorageSource() ); + assertEquals( StorageType.FILE, cdromDevice2AfterTransformation.getStorageType() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_CDROM1, cdromDevice2AfterTransformation.getStorageSource() ); + } + + @Test + @DisplayName( "Test transformation of VM disk CDROM devices configuration with unspecified input data" ) + public void testTransformationGenericDiskCdromDevicesNoData() throws TransformationException + { + final TransformationGenericDiskCdromDevices transformation = new TransformationGenericDiskCdromDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getDiskCdromDevices(); + assertEquals( 1, devicesBeforeTransformation.size() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getDiskCdromDevices(); + assertEquals( 0, devicesAfterTransformation.size() ); + } +} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevicesTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevicesTest.java new file mode 100644 index 00000000..d4678f4f --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevicesTest.java @@ -0,0 +1,61 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import java.util.ArrayList; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.Disk.StorageType; +import org.openslx.libvirt.domain.device.DiskFloppy; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +public class TransformationGenericDiskFloppyDevicesTest +{ + @Test + @DisplayName( "Test transformation of VM disk floppy devices configuration with specified input data" ) + public void testTransformationGenericDiskFloppyDevices() throws TransformationException + { + final TransformationGenericDiskFloppyDevices transformation = new TransformationGenericDiskFloppyDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getDefaultCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getDiskFloppyDevices(); + assertEquals( 1, devicesBeforeTransformation.size() ); + final DiskFloppy floppyDeviceBeforeTransformation = devicesBeforeTransformation.get( 0 ); + assertEquals( StorageType.FILE, floppyDeviceBeforeTransformation.getStorageType() ); + assertNotEquals( TransformationTestUtils.DEFAULT_VM_FLOPPY0, + floppyDeviceBeforeTransformation.getStorageSource() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getDiskFloppyDevices(); + assertEquals( 2, devicesAfterTransformation.size() ); + final DiskFloppy floppyDevice1AfterTransformation = devicesAfterTransformation.get( 0 ); + final DiskFloppy floppyDevice2AfterTransformation = devicesAfterTransformation.get( 1 ); + assertEquals( StorageType.FILE, floppyDevice1AfterTransformation.getStorageType() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_FLOPPY0, floppyDevice1AfterTransformation.getStorageSource() ); + assertEquals( StorageType.FILE, floppyDevice2AfterTransformation.getStorageType() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_FLOPPY1, floppyDevice2AfterTransformation.getStorageSource() ); + } + + @Test + @DisplayName( "Test transformation of VM disk floppy devices configuration with unspecified input data" ) + public void testTransformationGenericDiskFloppyDevicesNoData() throws TransformationException + { + final TransformationGenericDiskFloppyDevices transformation = new TransformationGenericDiskFloppyDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getDiskFloppyDevices(); + assertEquals( 1, devicesBeforeTransformation.size() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getDiskFloppyDevices(); + assertEquals( 0, devicesAfterTransformation.size() ); + } +} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevicesTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevicesTest.java new file mode 100644 index 00000000..38a07e38 --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevicesTest.java @@ -0,0 +1,61 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.FileSystem; +import org.openslx.libvirt.domain.device.FileSystem.AccessMode; +import org.openslx.libvirt.domain.device.FileSystem.Type; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +public class TransformationGenericFileSystemDevicesTest +{ + @Test + @DisplayName( "Test transformation of VM file system devices configuration with specified input data" ) + public void testTransformationGenericFileSystemDevices() throws TransformationException + { + final TransformationGenericFileSystemDevices transformation = new TransformationGenericFileSystemDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getDefaultCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getFileSystemDevices(); + assertEquals( 0, devicesBeforeTransformation.size() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getFileSystemDevices(); + assertEquals( 2, devicesAfterTransformation.size() ); + final FileSystem fs1AfterTransformation = devicesAfterTransformation.get( 0 ); + final FileSystem fs2AfterTransformation = devicesAfterTransformation.get( 1 ); + assertEquals( Type.MOUNT, fs1AfterTransformation.getType() ); + assertEquals( AccessMode.MAPPED, fs1AfterTransformation.getAccessMode() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_FSSRC0, fs1AfterTransformation.getSource() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_FSTGT0, fs1AfterTransformation.getTarget() ); + assertEquals( Type.MOUNT, fs2AfterTransformation.getType() ); + assertEquals( AccessMode.MAPPED, fs2AfterTransformation.getAccessMode() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_FSSRC1, fs2AfterTransformation.getSource() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_FSTGT1, fs2AfterTransformation.getTarget() ); + } + + @Test + @DisplayName( "Test transformation of VM file system devices configuration with unspecified input data" ) + public void testTransformationGenericFileSystemDevicesNoData() throws TransformationException + { + final TransformationGenericFileSystemDevices transformation = new TransformationGenericFileSystemDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getFileSystemDevices(); + assertEquals( 0, devicesBeforeTransformation.size() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getFileSystemDevices(); + assertEquals( 0, devicesAfterTransformation.size() ); + } +} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevicesTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevicesTest.java new file mode 100644 index 00000000..6257e98f --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevicesTest.java @@ -0,0 +1,58 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.Interface; +import org.openslx.libvirt.domain.device.Interface.Model; +import org.openslx.libvirt.domain.device.Interface.Type; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.VirtualizationConfigurationQemu; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +public class TransformationGenericInterfaceDevicesTest +{ + @Test + @DisplayName( "Test transformation of VM network interface devices configuration with specified input data" ) + public void testTransformationGenericInterfaceDevices() throws TransformationException + { + final TransformationGenericInterfaceDevices transformation = new TransformationGenericInterfaceDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getDefaultCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getInterfaceDevices(); + assertEquals( 1, devicesBeforeTransformation.size() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getInterfaceDevices(); + assertEquals( 1, devicesAfterTransformation.size() ); + final Interface interfaceAfterTransformation = devicesAfterTransformation.get( 0 ); + assertEquals( Type.BRIDGE, interfaceAfterTransformation.getType() ); + assertEquals( Model.VIRTIO, interfaceAfterTransformation.getModel() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_MAC0, interfaceAfterTransformation.getMacAddress() ); + assertEquals( VirtualizationConfigurationQemu.NETWORK_BRIDGE_NAT_DEFAULT, + interfaceAfterTransformation.getSource() ); + } + + @Test + @DisplayName( "Test transformation of VM network interface devices configuration with unspecified input data" ) + public void testTransformationGenericInterfaceDevicesNoData() throws TransformationException + { + final TransformationGenericInterfaceDevices transformation = new TransformationGenericInterfaceDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getInterfaceDevices(); + assertEquals( 1, devicesBeforeTransformation.size() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getInterfaceDevices(); + assertEquals( 0, devicesAfterTransformation.size() ); + } +} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemoryTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemoryTest.java index 812982ee..76f53e40 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemoryTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemoryTest.java @@ -2,6 +2,7 @@ package org.openslx.runvirt.plugin.qemu.configuration; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.math.BigInteger; @@ -32,4 +33,15 @@ public class TransformationGenericMemoryTest assertEquals( defaultMemory.toString(), config.getMemory().toString() ); assertEquals( defaultMemory.toString(), config.getCurrentMemory().toString() ); } + + @Test + @DisplayName( "Test transformation of VM memory configuration with unspecified input data" ) + public void testTransformationGenericMemoryNoData() throws TransformationException + { + final TransformationGenericMemory transformation = new TransformationGenericMemory(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + assertThrows( TransformationException.class, () -> transformation.transform( config, args ) ); + } } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericNameTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericNameTest.java index 2403b83f..b52162d7 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericNameTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericNameTest.java @@ -2,6 +2,7 @@ package org.openslx.runvirt.plugin.qemu.configuration; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -27,4 +28,15 @@ public class TransformationGenericNameTest assertEquals( TransformationTestUtils.DEFAULT_VM_NAME, config.getName() ); assertEquals( TransformationTestUtils.DEFAULT_VM_DSPLNAME, config.getTitle() ); } + + @Test + @DisplayName( "Test transformation of VM (display) name configuration with unspecified input data" ) + public void testTransformationGenericNameNoData() throws TransformationException + { + final TransformationGenericName transformation = new TransformationGenericName(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + assertThrows( TransformationException.class, () -> transformation.transform( config, args ) ); + } } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevicesTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevicesTest.java new file mode 100644 index 00000000..63fb134c --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevicesTest.java @@ -0,0 +1,53 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.Parallel; +import org.openslx.libvirt.domain.device.Parallel.Type; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +public class TransformationGenericParallelDevicesTest +{ + @Test + @DisplayName( "Test transformation of VM parallel devices configuration with specified input data" ) + public void testTransformationGenericParallelDevices() throws TransformationException + { + final TransformationGenericParallelDevices transformation = new TransformationGenericParallelDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getDefaultCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getParallelDevices(); + assertEquals( 0, devicesBeforeTransformation.size() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getParallelDevices(); + assertEquals( 1, devicesAfterTransformation.size() ); + final Parallel parallelDeviceAfterTransformation = devicesAfterTransformation.get( 0 ); + assertEquals( Type.DEV, parallelDeviceAfterTransformation.getType() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_PARALLEL0, parallelDeviceAfterTransformation.getSource() ); + } + + @Test + @DisplayName( "Test transformation of VM parallel devices configuration with unspecified input data" ) + public void testTransformationGenericParallelDevicesNoData() throws TransformationException + { + final TransformationGenericParallelDevices transformation = new TransformationGenericParallelDevices(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getParallelDevices(); + assertEquals( 0, devicesBeforeTransformation.size() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getParallelDevices(); + assertEquals( 0, devicesAfterTransformation.size() ); + } +} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuidTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuidTest.java index d42a84eb..8fe20886 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuidTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuidTest.java @@ -2,6 +2,7 @@ package org.openslx.runvirt.plugin.qemu.configuration; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -25,4 +26,15 @@ public class TransformationGenericUuidTest assertEquals( TransformationTestUtils.DEFAULT_VM_UUID, config.getUuid() ); } + + @Test + @DisplayName( "Test transformation of VM UUID configuration with unspecified input data" ) + public void testTransformationGenericUuidNoData() throws TransformationException + { + final TransformationGenericUuid transformation = new TransformationGenericUuid(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + assertThrows( TransformationException.class, () -> transformation.transform( config, args ) ); + } } diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitectureTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitectureTest.java new file mode 100644 index 00000000..50689c4e --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitectureTest.java @@ -0,0 +1,102 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.InputStream; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openslx.libvirt.capabilities.Capabilities; +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.Domain.OsType; +import org.openslx.libvirt.domain.Domain.Type; +import org.openslx.libvirt.xml.LibvirtXmlDocumentException; +import org.openslx.libvirt.xml.LibvirtXmlSerializationException; +import org.openslx.libvirt.xml.LibvirtXmlTestResources; +import org.openslx.libvirt.xml.LibvirtXmlValidationException; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +class TransformationSpecificQemuArchitectureStub extends TransformationSpecificQemuArchitecture +{ + final String capabilityFileName; + + public TransformationSpecificQemuArchitectureStub( String capabilityFileName ) + { + super( null ); + + this.capabilityFileName = capabilityFileName; + } + + @Override + protected Capabilities getCapabilities() throws TransformationException + { + final InputStream capabilityContent = LibvirtXmlTestResources.getLibvirtXmlStream( this.capabilityFileName ); + Capabilities capabilites = null; + + try { + capabilites = new Capabilities( capabilityContent ); + } catch ( LibvirtXmlDocumentException | LibvirtXmlSerializationException | LibvirtXmlValidationException e ) { + fail( "Could not create stub for getCapabilities(): " + e.getLocalizedMessage() ); + } + + return capabilites; + } +} + +public class TransformationSpecificQemuArchitectureTest +{ + @Test + @DisplayName( "Test transformation of VM architecture configuration if KVM required and available" ) + public void testTransformationSpecificQemuArchitectureKvm() throws TransformationException + { + final TransformationSpecificQemuArchitectureStub transformation; + transformation = new TransformationSpecificQemuArchitectureStub( "qemu-kvm_capabilities_default.xml" ); + final Domain config = TransformationTestUtils.getDefaultDomain(); + + assertEquals( Type.KVM, config.getType() ); + assertEquals( "x86_64", config.getOsArch() ); + assertEquals( "pc-q35-5.1", config.getOsMachine() ); + assertEquals( OsType.HVM, config.getOsType() ); + + transformation.transform( config, null ); + + assertEquals( Type.KVM, config.getType() ); + assertEquals( "x86_64", config.getOsArch() ); + assertEquals( "pc-q35-5.1", config.getOsMachine() ); + assertEquals( OsType.HVM, config.getOsType() ); + } + + @Test + @DisplayName( "Test transformation of VM architecture configuration if KVM required but not available" ) + public void testTransformationSpecificQemuArchitectureNoKvm() throws TransformationException + { + final TransformationSpecificQemuArchitectureStub transformation; + transformation = new TransformationSpecificQemuArchitectureStub( "qemu-kvm_capabilities_no-kvm.xml" ); + final Domain config = TransformationTestUtils.getDefaultDomain(); + + assertEquals( Type.KVM, config.getType() ); + assertEquals( "x86_64", config.getOsArch() ); + assertEquals( "pc-q35-5.1", config.getOsMachine() ); + assertEquals( OsType.HVM, config.getOsType() ); + + assertThrows( TransformationException.class, () -> transformation.transform( config, null ) ); + } + + @Test + @DisplayName( "Test transformation of VM architecture configuration if version is not supported (machine version too new)" ) + public void testTransformationSpecificQemuArchitectureMachineVersionDowngrade() throws TransformationException + { + final TransformationSpecificQemuArchitectureStub transformation; + transformation = new TransformationSpecificQemuArchitectureStub( "qemu-kvm_capabilities_old-version.xml" ); + final Domain config = TransformationTestUtils.getDefaultDomain(); + + assertEquals( Type.KVM, config.getType() ); + assertEquals( "x86_64", config.getOsArch() ); + assertEquals( "pc-q35-5.1", config.getOsMachine() ); + assertEquals( OsType.HVM, config.getOsType() ); + + assertThrows( TransformationException.class, () -> transformation.transform( config, null ) ); + } +} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevicesTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevicesTest.java new file mode 100644 index 00000000..270bfff9 --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevicesTest.java @@ -0,0 +1,69 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.device.Serial; +import org.openslx.libvirt.domain.device.Serial.Type; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; + +class TransformationSpecificQemuSerialDevicesStub extends TransformationSpecificQemuSerialDevices +{ + public TransformationSpecificQemuSerialDevicesStub() + { + super( null ); + } +} + +public class TransformationSpecificQemuSerialDevicesTest +{ + @Test + @DisplayName( "Test transformation of VM serial devices configuration with specified input data" ) + public void testTransformationGenericSerialDevices() throws TransformationException + { + final TransformationSpecificQemuSerialDevicesStub transformation = new TransformationSpecificQemuSerialDevicesStub(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getDefaultCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getSerialDevices(); + assertEquals( 1, devicesBeforeTransformation.size() ); + final Serial serialDeviceBeforeTransformation = devicesBeforeTransformation.get( 0 ); + assertEquals( Type.PTY, serialDeviceBeforeTransformation.getType() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getSerialDevices(); + assertEquals( 2, devicesAfterTransformation.size() ); + final Serial serialDevice1AfterTransformation = devicesAfterTransformation.get( 0 ); + assertEquals( Type.PTY, serialDevice1AfterTransformation.getType() ); + final Serial serialDevice2AfterTransformation = devicesAfterTransformation.get( 1 ); + assertEquals( Type.DEV, serialDevice2AfterTransformation.getType() ); + assertEquals( TransformationTestUtils.DEFAULT_VM_SERIAL0, serialDevice2AfterTransformation.getSource() ); + } + + @Test + @DisplayName( "Test transformation of VM serial devices configuration with unspecified input data" ) + public void testTransformationGenericSerialDevicesNoData() throws TransformationException + { + final TransformationSpecificQemuSerialDevicesStub transformation = new TransformationSpecificQemuSerialDevicesStub(); + final Domain config = TransformationTestUtils.getDefaultDomain(); + final CommandLineArgs args = TransformationTestUtils.getEmptyCmdLnArgs(); + + final ArrayList devicesBeforeTransformation = config.getSerialDevices(); + assertEquals( 1, devicesBeforeTransformation.size() ); + final Serial serialDeviceBeforeTransformation = devicesBeforeTransformation.get( 0 ); + assertEquals( Type.PTY, serialDeviceBeforeTransformation.getType() ); + + transformation.transform( config, args ); + + final ArrayList devicesAfterTransformation = config.getSerialDevices(); + assertEquals( 1, devicesAfterTransformation.size() ); + final Serial serialDeviceAfterTransformation = devicesBeforeTransformation.get( 0 ); + assertEquals( Type.PTY, serialDeviceAfterTransformation.getType() ); + } +} -- cgit v1.2.3-55-g7522