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 --- .../org/openslx/runvirt/configuration/Filter.java | 28 --- .../runvirt/configuration/FilterException.java | 14 -- .../runvirt/configuration/FilterFunction.java | 12 -- .../runvirt/configuration/FilterGeneric.java | 9 - .../runvirt/configuration/FilterManager.java | 77 -------- .../runvirt/configuration/FilterSpecific.java | 18 -- .../java/org/openslx/runvirt/plugin/qemu/App.java | 74 ++++---- .../qemu/configuration/FilterGenericCpu.java | 26 --- .../FilterGenericDiskCdromDevices.java | 54 ------ .../FilterGenericDiskFloppyDevices.java | 50 ------ .../FilterGenericDiskStorageDevices.java | 49 ----- .../FilterGenericFileSystemDevices.java | 64 ------- .../FilterGenericInterfaceDevices.java | 48 ----- .../qemu/configuration/FilterGenericMemory.java | 28 --- .../qemu/configuration/FilterGenericName.java | 23 --- .../FilterGenericParallelDevices.java | 58 ------ .../qemu/configuration/FilterGenericUuid.java | 22 --- .../FilterSpecificQemuArchitecture.java | 199 --------------------- .../FilterSpecificQemuNvidiaGpuPassthrough.java | 26 --- .../FilterSpecificQemuSerialDevices.java | 69 ------- .../configuration/TransformationGenericCpu.java | 26 +++ .../TransformationGenericDiskCdromDevices.java | 54 ++++++ .../TransformationGenericDiskFloppyDevices.java | 50 ++++++ .../TransformationGenericDiskStorageDevices.java | 49 +++++ .../TransformationGenericFileSystemDevices.java | 64 +++++++ .../TransformationGenericInterfaceDevices.java | 48 +++++ .../configuration/TransformationGenericMemory.java | 28 +++ .../configuration/TransformationGenericName.java | 23 +++ .../TransformationGenericParallelDevices.java | 58 ++++++ .../configuration/TransformationGenericUuid.java | 22 +++ .../TransformationSpecificQemuArchitecture.java | 199 +++++++++++++++++++++ ...sformationSpecificQemuNvidiaGpuPassthrough.java | 26 +++ .../TransformationSpecificQemuSerialDevices.java | 69 +++++++ .../qemu/configuration/FilterGenericCpuTest.java | 8 +- .../FilterGenericDiskStorageDevicesTest.java | 16 +- .../configuration/FilterGenericMemoryTest.java | 8 +- .../qemu/configuration/FilterGenericNameTest.java | 8 +- .../qemu/configuration/FilterGenericUuidTest.java | 8 +- 38 files changed, 777 insertions(+), 935 deletions(-) delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/Filter.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterException.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterFunction.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterGeneric.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterManager.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterSpecific.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericCpu.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskCdromDevices.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskFloppyDevices.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskStorageDevices.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericFileSystemDevices.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericInterfaceDevices.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericMemory.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericName.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericParallelDevices.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericUuid.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuArchitecture.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuNvidiaGpuPassthrough.java delete mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuSerialDevices.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpu.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskStorageDevices.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemory.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericName.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuid.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuNvidiaGpuPassthrough.java create mode 100644 core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/Filter.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/Filter.java deleted file mode 100644 index 3fb594a2..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/Filter.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.openslx.runvirt.configuration; - -public abstract class Filter implements FilterFunction -{ - private final String name; - private boolean enabled; - - public Filter( String name ) - { - this.name = name; - this.setEnabled( true ); - } - - public String getName() - { - return this.name; - } - - public boolean isEnabled() - { - return this.enabled; - } - - public void setEnabled( boolean enabled ) - { - this.enabled = enabled; - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterException.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterException.java deleted file mode 100644 index 8969d1a2..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterException.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.openslx.runvirt.configuration; - -public class FilterException extends Exception -{ - /** - * Version for serialization. - */ - private static final long serialVersionUID = 7293420658901349154L; - - public FilterException( String errorMsg ) - { - super( errorMsg ); - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterFunction.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterFunction.java deleted file mode 100644 index 1d716201..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterFunction.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.openslx.runvirt.configuration; - -@FunctionalInterface -public interface FilterFunction -{ - public void filter( T config, R args ) throws FilterException; - - public default void apply( T config, R args ) throws FilterException - { - this.filter( config, args ); - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterGeneric.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterGeneric.java deleted file mode 100644 index e66c8f21..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterGeneric.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.openslx.runvirt.configuration; - -public abstract class FilterGeneric extends Filter -{ - public FilterGeneric( String name ) - { - super( name ); - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterManager.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterManager.java deleted file mode 100644 index d9509099..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterManager.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.openslx.runvirt.configuration; - -import java.util.ArrayList; - -public final class FilterManager -{ - private ArrayList> filters; - private T config; - private R args; - - public FilterManager( T config, R args ) - { - this.filters = new ArrayList>(); - this.config = config; - this.args = args; - } - - public void register( Filter filter ) - { - this.register( filter, true ); - } - - public void register( Filter filter, boolean enabled ) - { - filter.setEnabled( enabled ); - this.filters.add( filter ); - } - - public void register( String name, FilterFunction filterFunction ) - { - this.register( name, filterFunction, true ); - } - - public void register( String name, FilterFunction filterFunction, boolean enabled ) - { - this.register( new Filter( name ) { - @Override - public void filter( T document, R args ) throws FilterException - { - filterFunction.apply( document, args ); - } - }, enabled ); - } - - public void filterAll() throws FilterException - { - for ( Filter filter : this.filters ) { - try { - filter.apply( this.config, this.args ); - } catch ( FilterException e ) { - final String errorMsg = new String( - "Error in configuration filter '" + filter.getName() + "':" + e.getLocalizedMessage() ); - throw new FilterException( errorMsg ); - } - } - } - - private String showFilters() - { - String filterSummary = new String(); - final int maxFilterNumCharacters = ( this.filters.size() + 1 ) / 10; - - for ( int i = 0; i < this.filters.size(); i++ ) { - final Filter filter = this.filters.get( i ); - final String paddedNumber = String.format( "%-" + maxFilterNumCharacters + "s", i + 1 ); - filterSummary += paddedNumber + ": " + filter.getName() + System.lineSeparator(); - } - - return filterSummary; - } - - @Override - public String toString() - { - return this.showFilters(); - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterSpecific.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterSpecific.java deleted file mode 100644 index 8cff83bd..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/configuration/FilterSpecific.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.openslx.runvirt.configuration; - -public abstract class FilterSpecific extends Filter -{ - private final H hypervisor; - - public FilterSpecific( String name, H hypervisor ) - { - super( name ); - - this.hypervisor = hypervisor; - } - - public H getHypervisor() - { - return this.hypervisor; - } -} 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 bf76ebf2..4e872ffc 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 @@ -9,30 +9,30 @@ import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.xml.LibvirtXmlDocumentException; import org.openslx.libvirt.xml.LibvirtXmlSerializationException; import org.openslx.libvirt.xml.LibvirtXmlValidationException; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterManager; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs.CmdLnOption; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgsException; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericCpu; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericDiskCdromDevices; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericDiskFloppyDevices; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericDiskStorageDevices; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericFileSystemDevices; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericInterfaceDevices; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericMemory; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericName; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericParallelDevices; -import org.openslx.runvirt.plugin.qemu.configuration.FilterSpecificQemuSerialDevices; -import org.openslx.runvirt.plugin.qemu.configuration.FilterGenericUuid; -import org.openslx.runvirt.plugin.qemu.configuration.FilterSpecificQemuArchitecture; -import org.openslx.runvirt.plugin.qemu.configuration.FilterSpecificQemuNvidiaGpuPassthrough; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericCpu; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericDiskCdromDevices; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericDiskFloppyDevices; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericDiskStorageDevices; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericFileSystemDevices; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericInterfaceDevices; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericMemory; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericName; +import org.openslx.runvirt.plugin.qemu.configuration.TransformationGenericParallelDevices; +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.virtualization.LibvirtHypervisorQemu; import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu.QemuSessionType; import org.openslx.runvirt.virtualization.LibvirtHypervisor; import org.openslx.runvirt.virtualization.LibvirtHypervisorException; import org.openslx.runvirt.virtualization.LibvirtVirtualMachine; import org.openslx.runvirt.virtualization.LibvirtVirtualMachineException; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationManager; /** * Run-virt QEMU plugin (command line tool) to finalize a Libvirt domain XML configuration. @@ -113,35 +113,35 @@ public class App System.exit( 3 ); } - // create filter manager to finalize VM configuration - final FilterManager filterManager; - filterManager = new FilterManager( config, cmdLn ); - - // register necessary filters to finalize configuration template - filterManager.register( new FilterGenericName(), true ); - filterManager.register( new FilterGenericUuid(), true ); - filterManager.register( new FilterGenericCpu(), true ); - filterManager.register( new FilterGenericMemory(), true ); - filterManager.register( new FilterGenericDiskStorageDevices(), true ); - filterManager.register( new FilterGenericDiskCdromDevices(), true ); - filterManager.register( new FilterGenericDiskFloppyDevices(), true ); - filterManager.register( new FilterGenericInterfaceDevices(), true ); - filterManager.register( new FilterGenericParallelDevices(), true ); - filterManager.register( new FilterGenericFileSystemDevices(), true ); - - // register QEMU specific filters to finalize configuration template + // create transformation manager to finalize VM configuration + final TransformationManager transformationManager; + transformationManager = new TransformationManager( config, cmdLn ); + + // register necessary transformations to finalize configuration template + transformationManager.register( new TransformationGenericName(), true ); + transformationManager.register( new TransformationGenericUuid(), true ); + transformationManager.register( new TransformationGenericCpu(), true ); + transformationManager.register( new TransformationGenericMemory(), true ); + transformationManager.register( new TransformationGenericDiskStorageDevices(), true ); + transformationManager.register( new TransformationGenericDiskCdromDevices(), true ); + transformationManager.register( new TransformationGenericDiskFloppyDevices(), true ); + transformationManager.register( new TransformationGenericInterfaceDevices(), true ); + transformationManager.register( new TransformationGenericParallelDevices(), true ); + transformationManager.register( new TransformationGenericFileSystemDevices(), true ); + + // register QEMU specific transformations to finalize configuration template if ( hypervisor instanceof LibvirtHypervisorQemu ) { final LibvirtHypervisorQemu hypervisorQemu = LibvirtHypervisorQemu.class.cast( hypervisor ); - filterManager.register( new FilterSpecificQemuArchitecture( hypervisorQemu ), true ); - filterManager.register( new FilterSpecificQemuSerialDevices( hypervisorQemu ), true ); - filterManager.register( new FilterSpecificQemuNvidiaGpuPassthrough( hypervisorQemu ), false ); + transformationManager.register( new TransformationSpecificQemuArchitecture( hypervisorQemu ), true ); + transformationManager.register( new TransformationSpecificQemuSerialDevices( hypervisorQemu ), true ); + transformationManager.register( new TransformationSpecificQemuNvidiaGpuPassthrough( hypervisorQemu ), false ); } // finalize Libvirt VM configuration template try { - filterManager.filterAll(); - } catch ( FilterException e ) { + transformationManager.transform(); + } catch ( TransformationException e ) { LOGGER.error( "Failed to finalize VM configuration file: " + e.getLocalizedMessage() ); hypervisor.close(); System.exit( 4 ); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericCpu.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericCpu.java deleted file mode 100644 index 1fbcd568..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericCpu.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import org.openslx.libvirt.domain.Domain; -import org.openslx.libvirt.domain.Domain.CpuCheck; -import org.openslx.libvirt.domain.Domain.CpuMode; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; - -public class FilterGenericCpu extends FilterGeneric -{ - private static final String FILTER_NAME = "CPU [number of cores, mode, ...]"; - - public FilterGenericCpu() - { - super( FilterGenericCpu.FILTER_NAME ); - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - 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/FilterGenericDiskCdromDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskCdromDevices.java deleted file mode 100644 index a17f3a8b..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskCdromDevices.java +++ /dev/null @@ -1,54 +0,0 @@ -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.DiskCdrom; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.vm.QemuMetaData; -import org.openslx.vm.QemuMetaDataUtils; - -public class FilterGenericDiskCdromDevices extends FilterGeneric -{ - private static final String FILTER_NAME = "Disk CDROM devices"; - - public FilterGenericDiskCdromDevices() - { - super( FilterGenericDiskCdromDevices.FILTER_NAME ); - } - - private void filterDiskCdromDevice( Domain config, String fileName, int index ) throws FilterException - { - final ArrayList devices = config.getDiskCdromDevices(); - final DiskCdrom disk = QemuMetaDataUtils.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 ); - } else if ( fileName.equals( "" ) ) { - // remove storage source if empty string is specified to emulate an empty CDROM drive - disk.removeStorage(); - } else { - // set disk image file as storage source of the disk CDROM drive - disk.setStorage( StorageType.FILE, fileName ); - } - } - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - this.filterDiskCdromDevice( config, args.getVmDiskFileNameCdrom0(), 0 ); - this.filterDiskCdromDevice( config, args.getVmDiskFileNameCdrom1(), 1 ); - - // remove all additional disk CDROM devices - final ArrayList devices = config.getDiskCdromDevices(); - 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/FilterGenericDiskFloppyDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskFloppyDevices.java deleted file mode 100644 index 106e499e..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskFloppyDevices.java +++ /dev/null @@ -1,50 +0,0 @@ -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.DiskFloppy; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.vm.QemuMetaDataUtils; - -public class FilterGenericDiskFloppyDevices extends FilterGeneric -{ - private static final String FILTER_NAME = "Disk floppy devices"; - - public FilterGenericDiskFloppyDevices() - { - super( FilterGenericDiskFloppyDevices.FILTER_NAME ); - } - - private void filterDiskFloppyDevice( Domain config, String fileName, int index ) throws FilterException - { - final ArrayList devices = config.getDiskFloppyDevices(); - final DiskFloppy disk = QemuMetaDataUtils.getArrayIndex( devices, index ); - - if ( disk != null ) { - if ( fileName == null ) { - // remove disk floppy device if disk image file name is not set - disk.remove(); - } else { - // set image file of disk storage if disk floppy device is available - disk.setStorage( StorageType.FILE, fileName ); - } - } - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - this.filterDiskFloppyDevice( config, args.getVmDiskFileNameFloppy0(), 0 ); - this.filterDiskFloppyDevice( config, args.getVmDiskFileNameFloppy1(), 1 ); - - // remove all additional disk storage devices - final ArrayList devices = config.getDiskFloppyDevices(); - 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/FilterGenericDiskStorageDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskStorageDevices.java deleted file mode 100644 index 0dcfddf9..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskStorageDevices.java +++ /dev/null @@ -1,49 +0,0 @@ -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.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.vm.QemuMetaDataUtils; - -public class FilterGenericDiskStorageDevices extends FilterGeneric -{ - private static final String FILTER_NAME = "Disk storage devices [HDD, SSD, ...]"; - - public FilterGenericDiskStorageDevices() - { - super( FilterGenericDiskStorageDevices.FILTER_NAME ); - } - - private void filterDiskStorageDevice( Domain config, String fileName, int index ) throws FilterException - { - 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 filter( Domain config, CommandLineArgs args ) throws FilterException - { - 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(); - } - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericFileSystemDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericFileSystemDevices.java deleted file mode 100644 index 1d06474f..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericFileSystemDevices.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import java.util.ArrayList; - -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.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.vm.QemuMetaDataUtils; - -public class FilterGenericFileSystemDevices extends FilterGeneric -{ - private static final String FILTER_NAME = "File system devices"; - - public FilterGenericFileSystemDevices() - { - super( FilterGenericFileSystemDevices.FILTER_NAME ); - } - - private void filterFileSystemDevice( Domain config, String source, String target, int index ) throws FilterException - { - final ArrayList devices = config.getFileSystemDevices(); - final FileSystem fileSystem = QemuMetaDataUtils.getArrayIndex( devices, index ); - - if ( fileSystem == null ) { - // check if file system device source directory is specified - if ( source != null && target != null ) { - // file system device does not exist, so create new file system device - final FileSystem newFileSystem = config.addFileSystemDevice(); - newFileSystem.setType( Type.MOUNT ); - newFileSystem.setAccessMode( AccessMode.MAPPED ); - newFileSystem.setSource( source ); - newFileSystem.setTarget( target ); - } - } else { - if ( source == null || target == null ) { - // remove file system device since device source or target is not specified - fileSystem.remove(); - } else { - // change type, access mode, source and target of existing file system device - fileSystem.setType( Type.MOUNT ); - fileSystem.setAccessMode( AccessMode.MAPPED ); - fileSystem.setSource( source ); - fileSystem.setTarget( target ); - } - } - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - this.filterFileSystemDevice( config, args.getVmFsSrc0(), args.getVmFsTgt0(), 0 ); - this.filterFileSystemDevice( config, args.getVmFsSrc1(), args.getVmFsTgt1(), 1 ); - - // remove all additional file system devices - final ArrayList devices = config.getFileSystemDevices(); - for ( int i = 1; 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/FilterGenericInterfaceDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericInterfaceDevices.java deleted file mode 100644 index ea2782ba..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericInterfaceDevices.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import java.util.ArrayList; - -import org.openslx.libvirt.domain.Domain; -import org.openslx.libvirt.domain.device.Interface; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.vm.QemuMetaDataUtils; - -public class FilterGenericInterfaceDevices extends FilterGeneric -{ - private static final String FILTER_NAME = "Network interface devices"; - - public FilterGenericInterfaceDevices() - { - super( FilterGenericInterfaceDevices.FILTER_NAME ); - } - - private void filterInterfaceDevice( Domain config, String macAddress, int index ) throws FilterException - { - final ArrayList devices = config.getInterfaceDevices(); - final Interface device = QemuMetaDataUtils.getArrayIndex( devices, index ); - - if ( device != null ) { - if ( macAddress == null ) { - // remove network interface device if MAC address is not set - device.remove(); - } else { - // set MAC address of network interface device if network interface device is available - device.setMacAddress( macAddress ); - } - } - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - this.filterInterfaceDevice( config, args.getVmMacAddress0(), 0 ); - - // remove all additional disk storage devices - final ArrayList devices = config.getInterfaceDevices(); - for ( int i = 1; 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/FilterGenericMemory.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericMemory.java deleted file mode 100644 index d8d901d4..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericMemory.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import java.math.BigInteger; - -import org.openslx.libvirt.domain.Domain; -import org.openslx.libvirt.domain.DomainUtils; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; - -public class FilterGenericMemory extends FilterGeneric -{ - private static final String FILTER_NAME = "Memory [normal, current (balloning)]"; - - public FilterGenericMemory() - { - super( FilterGenericMemory.FILTER_NAME ); - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - BigInteger memory = DomainUtils.decodeMemory( args.getVmMemory(), "MiB" ); - - config.setMemory( memory ); - config.setCurrentMemory( memory ); - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericName.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericName.java deleted file mode 100644 index 00644b23..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericName.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import org.openslx.libvirt.domain.Domain; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; - -public class FilterGenericName extends FilterGeneric -{ - private static final String FILTER_NAME = "Name [(display) name]"; - - public FilterGenericName() - { - super( FilterGenericName.FILTER_NAME ); - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - 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/FilterGenericParallelDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericParallelDevices.java deleted file mode 100644 index 458f69cb..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericParallelDevices.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import java.util.ArrayList; - -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.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.vm.QemuMetaDataUtils; - -public class FilterGenericParallelDevices extends FilterGeneric -{ - private static final String FILTER_NAME = "Parallel devices"; - - public FilterGenericParallelDevices() - { - super( FilterGenericParallelDevices.FILTER_NAME ); - } - - private void filterParallelDevice( Domain config, String fileName, int index ) throws FilterException - { - final ArrayList devices = config.getParallelDevices(); - final Parallel device = QemuMetaDataUtils.getArrayIndex( devices, index ); - - if ( device == null ) { - // check if device file name is specified - if ( fileName != null ) { - // parallel port device does not exist, so create new parallel port device - final Parallel newDevice = config.addParallelDevice(); - newDevice.setType( Type.DEV ); - newDevice.setSource( fileName ); - } - } else { - if ( fileName == null ) { - // remove device since device file is not specified - device.remove(); - } else { - // change type and source of existing parallel port device - device.setType( Type.DEV ); - device.setSource( fileName ); - } - } - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - this.filterParallelDevice( config, args.getVmDeviceSerial0(), 0 ); - - // remove all additional parallel devices - final ArrayList devices = config.getParallelDevices(); - for ( int i = 1; 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/FilterGenericUuid.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericUuid.java deleted file mode 100644 index f10a32b7..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericUuid.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import org.openslx.libvirt.domain.Domain; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterGeneric; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; - -public class FilterGenericUuid extends FilterGeneric -{ - private static final String FILTER_NAME = "UUID"; - - public FilterGenericUuid() - { - super( FilterGenericUuid.FILTER_NAME ); - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - config.setUuid( args.getVmUuid() ); - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuArchitecture.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuArchitecture.java deleted file mode 100644 index 0466b5e9..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuArchitecture.java +++ /dev/null @@ -1,199 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import java.util.ArrayList; -import java.util.List; - -import org.openslx.libvirt.capabilities.Capabilities; -import org.openslx.libvirt.capabilities.guest.Guest; -import org.openslx.libvirt.capabilities.guest.Machine; -import org.openslx.libvirt.domain.Domain; -import org.openslx.libvirt.domain.Domain.OsType; -import org.openslx.libvirt.domain.Domain.Type; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterSpecific; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu; -import org.openslx.runvirt.virtualization.LibvirtHypervisorException; - -public class FilterSpecificQemuArchitecture extends FilterSpecific -{ - private static final String FILTER_NAME = "QEMU Architecture [CPU architecture, machine type, ...]"; - - // used as instance of an singelton, always use getCapabilities to retrieve caps instance - private Capabilities capabilities = null; - - public FilterSpecificQemuArchitecture( LibvirtHypervisorQemu hypervisor ) - { - super( FilterSpecificQemuArchitecture.FILTER_NAME, hypervisor ); - } - - private Capabilities getCapabilities() throws FilterException - { - // retrieve capabilities from QEMU hypervisor only once - if ( this.capabilities == null ) { - try { - this.capabilities = this.getHypervisor().getCapabilites(); - } catch ( LibvirtHypervisorException e ) { - final String errorMsg = new String( - "Failed to get host capabilities from QEMU virtualizer: " + e.getLocalizedMessage() ); - throw new FilterException( errorMsg ); - } - } - - return this.capabilities; - } - - private Guest getTargetGuestFromArchName( String architectureName ) throws FilterException - { - final List guests = this.getCapabilities().getGuests(); - Guest targetGuest = null; - - if ( architectureName == null ) { - return targetGuest; - } - - for ( Guest guest : guests ) { - final String guestArchitectureName = guest.getArchName(); - if ( architectureName.equals( guestArchitectureName ) ) { - targetGuest = guest; - break; - } - } - - return targetGuest; - } - - private Machine getTargetMachineFromGuest( Guest guest, String machineName ) throws FilterException - { - final List machines = guest.getArchMachines(); - Machine targetMachine = null; - - if ( machineName == null ) { - return targetMachine; - } - - for ( Machine machine : machines ) { - if ( machineName.equals( machine.getName() ) ) { - targetMachine = machine; - break; - } - } - - return targetMachine; - } - - private List getCanonicalNamesFromTargetMachines( Guest guest ) throws FilterException - { - final List machines = guest.getArchMachines(); - final List canonicalNames = new ArrayList(); - - for ( Machine machine : machines ) { - final String canonicalName = machine.getCanonicalMachine(); - if ( canonicalName != null ) { - canonicalNames.add( canonicalName ); - } - } - - return canonicalNames; - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - // get source architecture, machine- and OS type - final String sourceArchitectureName = config.getOsArch(); - final String sourceMachine = config.getOsMachine(); - final OsType sourceOsType = config.getOsType(); - final Type sourceDomainType = config.getType(); - - // check if source architecture is supported by one of the hypervisor's guests - Guest targetGuest = null; - if ( sourceArchitectureName == null ) { - final String errorMsg = new String( "Source architecture is not specified!" ); - throw new FilterException( errorMsg ); - } else { - targetGuest = this.getTargetGuestFromArchName( sourceArchitectureName ); - if ( targetGuest == null ) { - final String errorMsg = new String( "Source architecture is not supported by the virtualizer!" ); - throw new FilterException( errorMsg ); - } - } - - // check if source machine is supported by the hypervisor - Machine targetMachine = null; - if ( sourceMachine == null ) { - final String errorMsg = new String( "Source machine type is not specified!" ); - throw new FilterException( errorMsg ); - } else { - // get all possible machine type for supported source architecture - targetMachine = this.getTargetMachineFromGuest( targetGuest, sourceMachine ); - - if ( targetMachine == null ) { - // source machine is not directly supported by the hypervisor - // check if up- or downgraded version of the chipset is supported by the hypervisor - List targetMachineCanonicalNames = this.getCanonicalNamesFromTargetMachines( targetGuest ); - - // retrieve overwrite chipset name from canonical machine names - String sourceMachineOverwrite = null; - for ( String targetMachineCanonicalName : targetMachineCanonicalNames ) { - if ( sourceMachine.contains( targetMachineCanonicalName ) ) { - sourceMachineOverwrite = targetMachineCanonicalName; - break; - } - } - - // if overwrite available, patch the machine type - if ( sourceMachineOverwrite != null ) { - config.setOsMachine( sourceMachineOverwrite ); - } else { - final String errorMsg = new String( "Source machine type is not supported by the virtualizer!" ); - throw new FilterException( errorMsg ); - } - } - } - - // check if source OS type is supported by the hypervisor's architecture - if ( sourceOsType == null ) { - final String errorMsg = new String( "OS type is not specified!" ); - throw new FilterException( errorMsg ); - } else { - if ( !sourceOsType.toString().equals( targetGuest.getOsType().toString() ) ) { - final String errorMsg = new String( "OS type is not supported by the virtualizer!" ); - throw new FilterException( errorMsg ); - } - } - - // check if source domain type is supported by the hypervisor's architecture - Type targetDomainType = null; - if ( sourceDomainType == null ) { - final String errorMsg = new String( "Source domain type is not specified!" ); - throw new FilterException( errorMsg ); - } else { - final List targetDomains = targetGuest.getArchDomains(); - - // retrieve supported domain type - for ( org.openslx.libvirt.capabilities.guest.Domain domain : targetDomains ) { - final Type domainType = domain.getType(); - if ( domainType == sourceDomainType ) { - targetDomainType = domainType; - break; - } - } - - // check supported domain type - if ( targetDomainType == null ) { - final String errorMsg = new String( "Source domain type is not supported by the virtualizer!" ); - throw new FilterException( errorMsg ); - } - } - - // patch path of QEMU emulator binary - final String archEmulator = targetGuest.getArchEmulator(); - if ( archEmulator == null ) { - final String errorMsg = new String( "Emulation of source architecture is not supported by the virtualizer!" ); - throw new FilterException( errorMsg ); - } else { - config.setDevicesEmulator( targetGuest.getArchEmulator() ); - } - } -} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuNvidiaGpuPassthrough.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuNvidiaGpuPassthrough.java deleted file mode 100644 index 913eeb5a..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuNvidiaGpuPassthrough.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import org.openslx.libvirt.domain.Domain; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterSpecific; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu; - -public class FilterSpecificQemuNvidiaGpuPassthrough extends FilterSpecific -{ - private static final String FILTER_NAME = "QEMU GPU passthrough [Nvidia]"; - - public FilterSpecificQemuNvidiaGpuPassthrough( LibvirtHypervisorQemu hypervisor ) - { - super( FilterSpecificQemuNvidiaGpuPassthrough.FILTER_NAME, hypervisor ); - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - // 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/FilterSpecificQemuSerialDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuSerialDevices.java deleted file mode 100644 index 258027b8..00000000 --- a/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/FilterSpecificQemuSerialDevices.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.openslx.runvirt.plugin.qemu.configuration; - -import java.util.ArrayList; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import org.openslx.libvirt.domain.Domain; -import org.openslx.libvirt.domain.device.Serial.Type; -import org.openslx.libvirt.domain.device.Serial; -import org.openslx.runvirt.configuration.FilterException; -import org.openslx.runvirt.configuration.FilterSpecific; -import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; -import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu; -import org.openslx.vm.QemuMetaDataUtils; - -public class FilterSpecificQemuSerialDevices extends FilterSpecific -{ - private static final String FILTER_NAME = "Serial devices"; - - public FilterSpecificQemuSerialDevices( LibvirtHypervisorQemu hypervisor ) - { - super( FilterSpecificQemuSerialDevices.FILTER_NAME, hypervisor ); - } - - private ArrayList getSerialDevDevices( Domain config ) - { - final ArrayList devices = config.getSerialDevices(); - final Predicate byDeviceTypeDev = device -> device.getType() == Type.DEV; - - return devices.stream().filter( byDeviceTypeDev ).collect( Collectors.toCollection( ArrayList::new ) ); - } - - private void filterSerialDevice( Domain config, String fileName, int index ) throws FilterException - { - final ArrayList devices = this.getSerialDevDevices( config ); - final Serial device = QemuMetaDataUtils.getArrayIndex( devices, index ); - - if ( device == null ) { - // check if device file name is specified - if ( fileName != null ) { - // 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 ) { - // remove serial port device if device file name is not set - device.remove(); - } else { - // set type and source of existing serial port device - device.setType( Type.DEV ); - device.setSource( fileName ); - } - } - } - - @Override - public void filter( Domain config, CommandLineArgs args ) throws FilterException - { - this.filterSerialDevice( config, args.getVmDeviceSerial0(), 0 ); - - // remove all additional serial devices - final ArrayList devices = this.getSerialDevDevices( config ); - for ( int i = 1; 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/TransformationGenericCpu.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpu.java new file mode 100644 index 00000000..cdb0a63d --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericCpu.java @@ -0,0 +1,26 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.Domain.CpuCheck; +import org.openslx.libvirt.domain.Domain.CpuMode; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public class TransformationGenericCpu extends TransformationGeneric +{ + private static final String FILTER_NAME = "CPU [number of cores, mode, ...]"; + + public TransformationGenericCpu() + { + super( TransformationGenericCpu.FILTER_NAME ); + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + 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 new file mode 100644 index 00000000..860e0f1e --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskCdromDevices.java @@ -0,0 +1,54 @@ +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.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.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public class TransformationGenericDiskCdromDevices extends TransformationGeneric +{ + private static final String FILTER_NAME = "Disk CDROM devices"; + + public TransformationGenericDiskCdromDevices() + { + super( TransformationGenericDiskCdromDevices.FILTER_NAME ); + } + + private void filterDiskCdromDevice( Domain config, String fileName, int index ) throws TransformationException + { + final ArrayList devices = config.getDiskCdromDevices(); + final DiskCdrom disk = QemuMetaDataUtils.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 ); + } else if ( fileName.equals( "" ) ) { + // remove storage source if empty string is specified to emulate an empty CDROM drive + disk.removeStorage(); + } else { + // set disk image file as storage source of the disk CDROM drive + disk.setStorage( StorageType.FILE, fileName ); + } + } + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + this.filterDiskCdromDevice( config, args.getVmDiskFileNameCdrom0(), 0 ); + this.filterDiskCdromDevice( config, args.getVmDiskFileNameCdrom1(), 1 ); + + // remove all additional disk CDROM devices + final ArrayList devices = config.getDiskCdromDevices(); + 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/TransformationGenericDiskFloppyDevices.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java new file mode 100644 index 00000000..7386a0b5 --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericDiskFloppyDevices.java @@ -0,0 +1,50 @@ +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.DiskFloppy; +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 TransformationGenericDiskFloppyDevices extends TransformationGeneric +{ + private static final String FILTER_NAME = "Disk floppy devices"; + + public TransformationGenericDiskFloppyDevices() + { + super( TransformationGenericDiskFloppyDevices.FILTER_NAME ); + } + + private void filterDiskFloppyDevice( Domain config, String fileName, int index ) throws TransformationException + { + final ArrayList devices = config.getDiskFloppyDevices(); + final DiskFloppy disk = QemuMetaDataUtils.getArrayIndex( devices, index ); + + if ( disk != null ) { + if ( fileName == null ) { + // remove disk floppy device if disk image file name is not set + disk.remove(); + } else { + // set image file of disk storage if disk floppy device is available + disk.setStorage( StorageType.FILE, fileName ); + } + } + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + this.filterDiskFloppyDevice( config, args.getVmDiskFileNameFloppy0(), 0 ); + this.filterDiskFloppyDevice( config, args.getVmDiskFileNameFloppy1(), 1 ); + + // remove all additional disk storage devices + final ArrayList devices = config.getDiskFloppyDevices(); + 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/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(); + } + } +} 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 new file mode 100644 index 00000000..8a312433 --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericFileSystemDevices.java @@ -0,0 +1,64 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import java.util.ArrayList; + +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.machine.QemuMetaDataUtils; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public class TransformationGenericFileSystemDevices extends TransformationGeneric +{ + private static final String FILTER_NAME = "File system devices"; + + public TransformationGenericFileSystemDevices() + { + super( TransformationGenericFileSystemDevices.FILTER_NAME ); + } + + 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 ); + + if ( fileSystem == null ) { + // check if file system device source directory is specified + if ( source != null && target != null ) { + // file system device does not exist, so create new file system device + final FileSystem newFileSystem = config.addFileSystemDevice(); + newFileSystem.setType( Type.MOUNT ); + newFileSystem.setAccessMode( AccessMode.MAPPED ); + newFileSystem.setSource( source ); + newFileSystem.setTarget( target ); + } + } else { + if ( source == null || target == null ) { + // remove file system device since device source or target is not specified + fileSystem.remove(); + } else { + // change type, access mode, source and target of existing file system device + fileSystem.setType( Type.MOUNT ); + fileSystem.setAccessMode( AccessMode.MAPPED ); + fileSystem.setSource( source ); + fileSystem.setTarget( target ); + } + } + } + + @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 ); + + // remove all additional file system devices + final ArrayList devices = config.getFileSystemDevices(); + for ( int i = 1; 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 new file mode 100644 index 00000000..e4fba36e --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericInterfaceDevices.java @@ -0,0 +1,48 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +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.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public class TransformationGenericInterfaceDevices extends TransformationGeneric +{ + private static final String FILTER_NAME = "Network interface devices"; + + public TransformationGenericInterfaceDevices() + { + super( TransformationGenericInterfaceDevices.FILTER_NAME ); + } + + private void filterInterfaceDevice( Domain config, String macAddress, int index ) throws TransformationException + { + final ArrayList devices = config.getInterfaceDevices(); + final Interface device = QemuMetaDataUtils.getArrayIndex( devices, index ); + + if ( device != null ) { + if ( macAddress == null ) { + // remove network interface device if MAC address is not set + device.remove(); + } else { + // set MAC address of network interface device if network interface device is available + device.setMacAddress( macAddress ); + } + } + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + this.filterInterfaceDevice( config, args.getVmMacAddress0(), 0 ); + + // remove all additional disk storage devices + final ArrayList devices = config.getInterfaceDevices(); + for ( int i = 1; 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/TransformationGenericMemory.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemory.java new file mode 100644 index 00000000..341a5b7f --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericMemory.java @@ -0,0 +1,28 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import java.math.BigInteger; + +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.DomainUtils; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public class TransformationGenericMemory extends TransformationGeneric +{ + private static final String FILTER_NAME = "Memory [normal, current (balloning)]"; + + public TransformationGenericMemory() + { + super( TransformationGenericMemory.FILTER_NAME ); + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + BigInteger memory = DomainUtils.decodeMemory( args.getVmMemory(), "MiB" ); + + config.setMemory( memory ); + config.setCurrentMemory( 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 new file mode 100644 index 00000000..3cc2572d --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericName.java @@ -0,0 +1,23 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import org.openslx.libvirt.domain.Domain; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public class TransformationGenericName extends TransformationGeneric +{ + private static final String FILTER_NAME = "Name [(display) name]"; + + public TransformationGenericName() + { + super( TransformationGenericName.FILTER_NAME ); + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + 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 new file mode 100644 index 00000000..e24a2ac5 --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericParallelDevices.java @@ -0,0 +1,58 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import java.util.ArrayList; + +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.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public class TransformationGenericParallelDevices extends TransformationGeneric +{ + private static final String FILTER_NAME = "Parallel devices"; + + public TransformationGenericParallelDevices() + { + super( TransformationGenericParallelDevices.FILTER_NAME ); + } + + private void filterParallelDevice( Domain config, String fileName, int index ) throws TransformationException + { + final ArrayList devices = config.getParallelDevices(); + final Parallel device = QemuMetaDataUtils.getArrayIndex( devices, index ); + + if ( device == null ) { + // check if device file name is specified + if ( fileName != null ) { + // parallel port device does not exist, so create new parallel port device + final Parallel newDevice = config.addParallelDevice(); + newDevice.setType( Type.DEV ); + newDevice.setSource( fileName ); + } + } else { + if ( fileName == null ) { + // remove device since device file is not specified + device.remove(); + } else { + // change type and source of existing parallel port device + device.setType( Type.DEV ); + device.setSource( fileName ); + } + } + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + this.filterParallelDevice( config, args.getVmDeviceSerial0(), 0 ); + + // remove all additional parallel devices + final ArrayList devices = config.getParallelDevices(); + for ( int i = 1; 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/TransformationGenericUuid.java b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuid.java new file mode 100644 index 00000000..c60c794f --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationGenericUuid.java @@ -0,0 +1,22 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import org.openslx.libvirt.domain.Domain; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationGeneric; + +public class TransformationGenericUuid extends TransformationGeneric +{ + private static final String FILTER_NAME = "UUID"; + + public TransformationGenericUuid() + { + super( TransformationGenericUuid.FILTER_NAME ); + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + 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 new file mode 100644 index 00000000..bdded447 --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuArchitecture.java @@ -0,0 +1,199 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import java.util.ArrayList; +import java.util.List; + +import org.openslx.libvirt.capabilities.Capabilities; +import org.openslx.libvirt.capabilities.guest.Guest; +import org.openslx.libvirt.capabilities.guest.Machine; +import org.openslx.libvirt.domain.Domain; +import org.openslx.libvirt.domain.Domain.OsType; +import org.openslx.libvirt.domain.Domain.Type; +import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.runvirt.plugin.qemu.virtualization.LibvirtHypervisorQemu; +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 +{ + private static final String FILTER_NAME = "QEMU Architecture [CPU architecture, machine type, ...]"; + + // used as instance of an singelton, always use getCapabilities to retrieve caps instance + private Capabilities capabilities = null; + + public TransformationSpecificQemuArchitecture( LibvirtHypervisorQemu hypervisor ) + { + super( TransformationSpecificQemuArchitecture.FILTER_NAME, hypervisor ); + } + + private Capabilities getCapabilities() throws TransformationException + { + // retrieve capabilities from QEMU hypervisor only once + if ( this.capabilities == null ) { + try { + this.capabilities = this.getVirtualizer().getCapabilites(); + } catch ( LibvirtHypervisorException e ) { + final String errorMsg = new String( + "Failed to get host capabilities from QEMU virtualizer: " + e.getLocalizedMessage() ); + throw new TransformationException( errorMsg ); + } + } + + return this.capabilities; + } + + private Guest getTargetGuestFromArchName( String architectureName ) throws TransformationException + { + final List guests = this.getCapabilities().getGuests(); + Guest targetGuest = null; + + if ( architectureName == null ) { + return targetGuest; + } + + for ( Guest guest : guests ) { + final String guestArchitectureName = guest.getArchName(); + if ( architectureName.equals( guestArchitectureName ) ) { + targetGuest = guest; + break; + } + } + + return targetGuest; + } + + private Machine getTargetMachineFromGuest( Guest guest, String machineName ) throws TransformationException + { + final List machines = guest.getArchMachines(); + Machine targetMachine = null; + + if ( machineName == null ) { + return targetMachine; + } + + for ( Machine machine : machines ) { + if ( machineName.equals( machine.getName() ) ) { + targetMachine = machine; + break; + } + } + + return targetMachine; + } + + private List getCanonicalNamesFromTargetMachines( Guest guest ) throws TransformationException + { + final List machines = guest.getArchMachines(); + final List canonicalNames = new ArrayList(); + + for ( Machine machine : machines ) { + final String canonicalName = machine.getCanonicalMachine(); + if ( canonicalName != null ) { + canonicalNames.add( canonicalName ); + } + } + + return canonicalNames; + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + // get source architecture, machine- and OS type + final String sourceArchitectureName = config.getOsArch(); + final String sourceMachine = config.getOsMachine(); + final OsType sourceOsType = config.getOsType(); + final Type sourceDomainType = config.getType(); + + // check if source architecture is supported by one of the hypervisor's guests + Guest targetGuest = null; + if ( sourceArchitectureName == null ) { + final String errorMsg = new String( "Source architecture is not specified!" ); + throw new TransformationException( errorMsg ); + } else { + targetGuest = this.getTargetGuestFromArchName( sourceArchitectureName ); + if ( targetGuest == null ) { + final String errorMsg = new String( "Source architecture is not supported by the virtualizer!" ); + throw new TransformationException( errorMsg ); + } + } + + // check if source machine is supported by the hypervisor + Machine targetMachine = null; + if ( sourceMachine == null ) { + final String errorMsg = new String( "Source machine type is not specified!" ); + throw new TransformationException( errorMsg ); + } else { + // get all possible machine type for supported source architecture + targetMachine = this.getTargetMachineFromGuest( targetGuest, sourceMachine ); + + if ( targetMachine == null ) { + // source machine is not directly supported by the hypervisor + // check if up- or downgraded version of the chipset is supported by the hypervisor + List targetMachineCanonicalNames = this.getCanonicalNamesFromTargetMachines( targetGuest ); + + // retrieve overwrite chipset name from canonical machine names + String sourceMachineOverwrite = null; + for ( String targetMachineCanonicalName : targetMachineCanonicalNames ) { + if ( sourceMachine.contains( targetMachineCanonicalName ) ) { + sourceMachineOverwrite = targetMachineCanonicalName; + break; + } + } + + // if overwrite available, patch the machine type + if ( sourceMachineOverwrite != null ) { + config.setOsMachine( sourceMachineOverwrite ); + } else { + final String errorMsg = new String( "Source machine type is not supported by the virtualizer!" ); + throw new TransformationException( errorMsg ); + } + } + } + + // check if source OS type is supported by the hypervisor's architecture + if ( sourceOsType == null ) { + final String errorMsg = new String( "OS type is not specified!" ); + throw new TransformationException( errorMsg ); + } else { + if ( !sourceOsType.toString().equals( targetGuest.getOsType().toString() ) ) { + final String errorMsg = new String( "OS type is not supported by the virtualizer!" ); + throw new TransformationException( errorMsg ); + } + } + + // check if source domain type is supported by the hypervisor's architecture + Type targetDomainType = null; + if ( sourceDomainType == null ) { + final String errorMsg = new String( "Source domain type is not specified!" ); + throw new TransformationException( errorMsg ); + } else { + final List targetDomains = targetGuest.getArchDomains(); + + // retrieve supported domain type + for ( org.openslx.libvirt.capabilities.guest.Domain domain : targetDomains ) { + final Type domainType = domain.getType(); + if ( domainType == sourceDomainType ) { + targetDomainType = domainType; + break; + } + } + + // check supported domain type + if ( targetDomainType == null ) { + final String errorMsg = new String( "Source domain type is not supported by the virtualizer!" ); + throw new TransformationException( errorMsg ); + } + } + + // patch path of QEMU emulator binary + final String archEmulator = targetGuest.getArchEmulator(); + if ( archEmulator == null ) { + final String errorMsg = new String( "Emulation of source architecture is not supported by the virtualizer!" ); + throw new TransformationException( errorMsg ); + } else { + config.setDevicesEmulator( targetGuest.getArchEmulator() ); + } + } +} 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 new file mode 100644 index 00000000..80349188 --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuNvidiaGpuPassthrough.java @@ -0,0 +1,26 @@ +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 new file mode 100644 index 00000000..9d35fbad --- /dev/null +++ b/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/configuration/TransformationSpecificQemuSerialDevices.java @@ -0,0 +1,69 @@ +package org.openslx.runvirt.plugin.qemu.configuration; + +import java.util.ArrayList; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.openslx.libvirt.domain.Domain; +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.transformation.TransformationException; +import org.openslx.virtualization.configuration.transformation.TransformationSpecific; + +public class TransformationSpecificQemuSerialDevices extends TransformationSpecific +{ + private static final String FILTER_NAME = "Serial devices"; + + public TransformationSpecificQemuSerialDevices( LibvirtHypervisorQemu hypervisor ) + { + super( TransformationSpecificQemuSerialDevices.FILTER_NAME, hypervisor ); + } + + private ArrayList getSerialDevDevices( Domain config ) + { + final ArrayList devices = config.getSerialDevices(); + final Predicate byDeviceTypeDev = device -> device.getType() == Type.DEV; + + return devices.stream().filter( byDeviceTypeDev ).collect( Collectors.toCollection( ArrayList::new ) ); + } + + private void filterSerialDevice( Domain config, String fileName, int index ) throws TransformationException + { + final ArrayList devices = this.getSerialDevDevices( config ); + final Serial device = QemuMetaDataUtils.getArrayIndex( devices, index ); + + if ( device == null ) { + // check if device file name is specified + if ( fileName != null ) { + // 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 ) { + // remove serial port device if device file name is not set + device.remove(); + } else { + // set type and source of existing serial port device + device.setType( Type.DEV ); + device.setSource( fileName ); + } + } + } + + @Override + public void transform( Domain config, CommandLineArgs args ) throws TransformationException + { + this.filterSerialDevice( config, args.getVmDeviceSerial0(), 0 ); + + // remove all additional serial devices + final ArrayList devices = this.getSerialDevDevices( config ); + for ( int i = 1; i < devices.size(); i++ ) { + devices.get( i ).remove(); + } + } +} diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericCpuTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericCpuTest.java index 3814bfb6..560d4b7c 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericCpuTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericCpuTest.java @@ -8,16 +8,16 @@ import org.junit.jupiter.api.Test; import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.Domain.CpuCheck; import org.openslx.libvirt.domain.Domain.CpuMode; -import org.openslx.runvirt.configuration.FilterException; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; public class FilterGenericCpuTest { @Test @DisplayName( "Test filtering of VM CPU configuration" ) - public void testFilterGenericCpu() throws FilterException + public void testFilterGenericCpu() throws TransformationException { - final FilterGenericCpu filter = new FilterGenericCpu(); + final TransformationGenericCpu filter = new TransformationGenericCpu(); final Domain config = FilterTestUtils.getDefaultDomain(); final CommandLineArgs args = FilterTestUtils.getDefaultCmdLnArgs(); @@ -25,7 +25,7 @@ public class FilterGenericCpuTest assertNotEquals( CpuMode.HOST_PASSTHROUGH, config.getCpuMode() ); assertEquals( CpuCheck.PARTIAL, config.getCpuCheck() ); - filter.filter( config, args ); + filter.transform( config, args ); assertEquals( Integer.parseInt( FilterTestUtils.DEFAULT_VM_NCPUS ), config.getVCpu() ); assertEquals( CpuMode.HOST_PASSTHROUGH, config.getCpuMode() ); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskStorageDevicesTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskStorageDevicesTest.java index 93282e78..5dd9e4cc 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskStorageDevicesTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericDiskStorageDevicesTest.java @@ -10,16 +10,16 @@ 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.DiskStorage; -import org.openslx.runvirt.configuration.FilterException; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; public class FilterGenericDiskStorageDevicesTest { @Test @DisplayName( "Test filtering of VM disk storage devices configuration with specified input data" ) - public void testFilterGenericDiskStorageDevices() throws FilterException + public void testFilterGenericDiskStorageDevices() throws TransformationException { - final FilterGenericDiskStorageDevices filter = new FilterGenericDiskStorageDevices(); + final TransformationGenericDiskStorageDevices filter = new TransformationGenericDiskStorageDevices(); final Domain config = FilterTestUtils.getDefaultDomain(); final CommandLineArgs args = FilterTestUtils.getDefaultCmdLnArgs(); @@ -28,7 +28,7 @@ public class FilterGenericDiskStorageDevicesTest assertNotEquals( StorageType.FILE, devicesBeforeFiltering.get( 0 ).getStorageType() ); assertNotEquals( FilterTestUtils.DEFAULT_VM_HDD0, devicesBeforeFiltering.get( 0 ).getStorageSource() ); - filter.filter( config, args ); + filter.transform( config, args ); final ArrayList devicesAfterFiltering = config.getDiskStorageDevices(); assertEquals( 1, devicesAfterFiltering.size() ); @@ -38,22 +38,22 @@ public class FilterGenericDiskStorageDevicesTest @Test @DisplayName( "Test filtering of VM disk storage devices configuration with unspecified input data" ) - public void testFilterGenericDiskStorageDevicesNoData() throws FilterException + public void testFilterGenericDiskStorageDevicesNoData() throws TransformationException { - final FilterGenericDiskStorageDevices filter = new FilterGenericDiskStorageDevices(); + final TransformationGenericDiskStorageDevices filter = new TransformationGenericDiskStorageDevices(); final Domain config = FilterTestUtils.getDefaultDomain(); final CommandLineArgs args = FilterTestUtils.getEmptyCmdLnArgs(); final ArrayList devicesBeforeFiltering = config.getDiskStorageDevices(); assertEquals( 1, devicesBeforeFiltering.size() ); - filter.filter( config, args ); + filter.transform( config, args ); final ArrayList devicesAfterFiltering = config.getDiskStorageDevices(); assertEquals( 0, devicesAfterFiltering.size() ); } - public static void main( String[] args ) throws FilterException + public static void main( String[] args ) throws TransformationException { FilterGenericDiskStorageDevicesTest test = new FilterGenericDiskStorageDevicesTest(); test.testFilterGenericDiskStorageDevicesNoData(); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericMemoryTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericMemoryTest.java index 794e251c..2bbda865 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericMemoryTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericMemoryTest.java @@ -9,16 +9,16 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.openslx.libvirt.domain.Domain; import org.openslx.libvirt.domain.DomainUtils; -import org.openslx.runvirt.configuration.FilterException; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; public class FilterGenericMemoryTest { @Test @DisplayName( "Test filtering of VM memory configuration" ) - public void testFilterGenericMemory() throws FilterException + public void testFilterGenericMemory() throws TransformationException { - final FilterGenericMemory filter = new FilterGenericMemory(); + final TransformationGenericMemory filter = new TransformationGenericMemory(); final Domain config = FilterTestUtils.getDefaultDomain(); final CommandLineArgs args = FilterTestUtils.getDefaultCmdLnArgs(); @@ -27,7 +27,7 @@ public class FilterGenericMemoryTest assertNotEquals( defaultMemory.toString(), config.getMemory().toString() ); assertNotEquals( defaultMemory.toString(), config.getCurrentMemory().toString() ); - filter.filter( config, args ); + filter.transform( config, args ); assertEquals( defaultMemory.toString(), config.getMemory().toString() ); assertEquals( defaultMemory.toString(), config.getCurrentMemory().toString() ); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericNameTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericNameTest.java index 93224702..188a13fa 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericNameTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericNameTest.java @@ -6,23 +6,23 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.openslx.libvirt.domain.Domain; -import org.openslx.runvirt.configuration.FilterException; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; public class FilterGenericNameTest { @Test @DisplayName( "Test filtering of VM (display) name configuration" ) - public void testFilterGenericName() throws FilterException + public void testFilterGenericName() throws TransformationException { - final FilterGenericName filter = new FilterGenericName(); + final TransformationGenericName filter = new TransformationGenericName(); final Domain config = FilterTestUtils.getDefaultDomain(); final CommandLineArgs args = FilterTestUtils.getDefaultCmdLnArgs(); assertNotEquals( FilterTestUtils.DEFAULT_VM_NAME, config.getName() ); assertNotEquals( FilterTestUtils.DEFAULT_VM_DSPLNAME, config.getTitle() ); - filter.filter( config, args ); + filter.transform( config, args ); assertEquals( FilterTestUtils.DEFAULT_VM_NAME, config.getName() ); assertEquals( FilterTestUtils.DEFAULT_VM_DSPLNAME, config.getTitle() ); diff --git a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericUuidTest.java b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericUuidTest.java index c206b0e9..e15c1856 100644 --- a/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericUuidTest.java +++ b/core/modules/qemu/runvirt-plugin-qemu/src/test/java/org/openslx/runvirt/plugin/qemu/configuration/FilterGenericUuidTest.java @@ -6,22 +6,22 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.openslx.libvirt.domain.Domain; -import org.openslx.runvirt.configuration.FilterException; import org.openslx.runvirt.plugin.qemu.cmdln.CommandLineArgs; +import org.openslx.virtualization.configuration.transformation.TransformationException; public class FilterGenericUuidTest { @Test @DisplayName( "Test filtering of VM UUID configuration" ) - public void testFilterGenericUuid() throws FilterException + public void testFilterGenericUuid() throws TransformationException { - final FilterGenericUuid filter = new FilterGenericUuid(); + final TransformationGenericUuid filter = new TransformationGenericUuid(); final Domain config = FilterTestUtils.getDefaultDomain(); final CommandLineArgs args = FilterTestUtils.getDefaultCmdLnArgs(); assertNotEquals( FilterTestUtils.DEFAULT_VM_UUID, config.getUuid() ); - filter.filter( config, args ); + filter.transform( config, args ); assertEquals( FilterTestUtils.DEFAULT_VM_UUID, config.getUuid() ); } -- cgit v1.2.3-55-g7522