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 ++-- 9 files changed, 80 insertions(+), 22 deletions(-) (limited to 'core/modules/qemu/runvirt-plugin-qemu/src/main') 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 { -- cgit v1.2.3-55-g7522