diff options
author | Manuel Bentele | 2021-03-25 11:25:18 +0100 |
---|---|---|
committer | Manuel Bentele | 2021-03-25 11:25:18 +0100 |
commit | 24d4ebdce0a3c022c7ae7c90139235bb4c8dad67 (patch) | |
tree | 03435b204d0d3ccd0311c63bb3d2983faf404273 /core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/App.java | |
parent | [qemu]: Add Libvirt XML documents as dependencies (diff) | |
download | mltk-24d4ebdce0a3c022c7ae7c90139235bb4c8dad67.tar.gz mltk-24d4ebdce0a3c022c7ae7c90139235bb4c8dad67.tar.xz mltk-24d4ebdce0a3c022c7ae7c90139235bb4c8dad67.zip |
[qemu] Add filtering/transformation of config files and VM management
Diffstat (limited to 'core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/App.java')
-rw-r--r-- | core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/App.java | 121 |
1 files changed, 121 insertions, 0 deletions
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 8a70be33..bf76ebf2 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 @@ -1,11 +1,38 @@ package org.openslx.runvirt.plugin.qemu; +import java.io.File; + import org.apache.log4j.BasicConfigurator; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; +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.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; /** * Run-virt QEMU plugin (command line tool) to finalize a Libvirt domain XML configuration. @@ -65,6 +92,100 @@ public class App // print command line arguments for debugging purposes App.printCmdLnArgs( cmdLn ); + // create connection to the QEMU hypervisor via Libvirt + LibvirtHypervisor hypervisor = null; + try { + hypervisor = new LibvirtHypervisorQemu( QemuSessionType.LOCAL_USER_SESSION ); + } catch ( LibvirtHypervisorException e ) { + LOGGER.error( "Failed to connect to the QEMU virtualizer (Libvirt daemon): " + e.getLocalizedMessage() ); + System.exit( 2 ); + } + + // read Libvirt XML domain configuration template + final String xmlInputFileName = cmdLn.getVmCfgInpFileName(); + Domain config = null; + try { + final File xmlInputFile = new File( xmlInputFileName ); + config = new Domain( xmlInputFile ); + } catch ( LibvirtXmlDocumentException | LibvirtXmlSerializationException | LibvirtXmlValidationException e ) { + LOGGER.error( "Failed to read VM input configuration file: " + e.getLocalizedMessage() ); + hypervisor.close(); + System.exit( 3 ); + } + + // create filter manager to finalize VM configuration + final FilterManager<Domain, CommandLineArgs> filterManager; + filterManager = new FilterManager<Domain, CommandLineArgs>( 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 + 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 ); + } + + // finalize Libvirt VM configuration template + try { + filterManager.filterAll(); + } catch ( FilterException e ) { + LOGGER.error( "Failed to finalize VM configuration file: " + e.getLocalizedMessage() ); + hypervisor.close(); + System.exit( 4 ); + } + + // write finalized configuration to file if output file is specified + final String xmlOutputFileName = cmdLn.getVmCfgOutFileName(); + if ( xmlOutputFileName != null && !xmlOutputFileName.isEmpty() ) { + try { + final File xmlOutputFile = new File( xmlOutputFileName ); + config.toXml( xmlOutputFile ); + } catch ( LibvirtXmlSerializationException e ) { + LOGGER.error( "Failed to write VM output configuration file: " + e.getLocalizedMessage() ); + hypervisor.close(); + System.exit( 5 ); + } + } + + // define QEMU VM from finalized configuration + LibvirtVirtualMachine vm = null; + try { + vm = hypervisor.registerVm( config ); + } catch ( LibvirtHypervisorException e ) { + LOGGER.error( "Failed to define VM from configuration file: " + e.getLocalizedMessage() ); + hypervisor.close(); + System.exit( 6 ); + } + + try { + vm.start(); + } catch ( LibvirtVirtualMachineException e ) { + LOGGER.error( "Failed to start defined VM: " + e.getLocalizedMessage() ); + try { + hypervisor.deregisterVm( vm ); + } catch ( LibvirtHypervisorException | LibvirtVirtualMachineException e1 ) { + LOGGER.error( "Failed to undefine VM: " + e.getLocalizedMessage() ); + } + hypervisor.close(); + System.exit( 7 ); + } + + // close connection and let VM be running + hypervisor.close(); + // return with successful exit code System.exit( 0 ); } |