summaryrefslogtreecommitdiffstats
path: root/core/modules/qemu/runvirt-plugin-qemu/src/main/java/org/openslx/runvirt/plugin/qemu/App.java
diff options
context:
space:
mode:
authorManuel Bentele2021-03-25 11:25:18 +0100
committerManuel Bentele2021-03-25 11:25:18 +0100
commit24d4ebdce0a3c022c7ae7c90139235bb4c8dad67 (patch)
tree03435b204d0d3ccd0311c63bb3d2983faf404273 /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)
downloadmltk-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.java121
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 );
}