From 75a4825bf48ef332525f13fe935e410d61c8c6a0 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Mon, 16 Aug 2021 11:10:28 +0200 Subject: Add 'ramfb' option to Libvirt's mediated device representation --- .../openslx/libvirt/domain/device/HostdevMdev.java | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openslx/libvirt/domain/device/HostdevMdev.java b/src/main/java/org/openslx/libvirt/domain/device/HostdevMdev.java index d25a6eb..7f6bb81 100644 --- a/src/main/java/org/openslx/libvirt/domain/device/HostdevMdev.java +++ b/src/main/java/org/openslx/libvirt/domain/device/HostdevMdev.java @@ -49,6 +49,26 @@ public class HostdevMdev extends Hostdev implements HostdevAddressableSource getQemuCmdlnArguments() + { + final Document xmlDocument = this.getRootXmlNode().getXmlDocument(); + final ArrayList qemuCmdlnArgs = new ArrayList(); + + final NodeList qemuCmdlnNodes = xmlDocument.getElementsByTagNameNS( XMLNS_QEMU_NS_URI, "commandline" ); + if ( qemuCmdlnNodes.getLength() > 0 ) { + final Node qemuCmdlnNode = qemuCmdlnNodes.item( 0 ); + final NodeList qemuCmdlnArgNodes = qemuCmdlnNode.getChildNodes(); + for ( int i = 0; i < qemuCmdlnArgNodes.getLength(); i++ ) { + final Node qemuCmdlnArgNode = qemuCmdlnArgNodes.item( i ); + if ( qemuCmdlnArgNode.getNodeType() == Node.ELEMENT_NODE ) { + final Element qemuCmdlnArgElement = Element.class.cast( qemuCmdlnArgNode ); + final String value = qemuCmdlnArgElement.getAttribute( "value" ); + if ( value != null && !value.isEmpty() ) { + qemuCmdlnArgs.add( value ); + } + } + } + } + + return qemuCmdlnArgs; + } + /** * Adds a virtual machine device to the Libvirt domain XML document. * @@ -1344,6 +1387,39 @@ public class Domain extends LibvirtXmlDocument return Video.class.cast( this.addDevice( new Video() ) ); } + /** + * Adds an given value as QEMU command line argument to the Libvirt domain XML document. + * + * @param value QEMU command line argument value. + */ + public void addQemuCmdlnArgument( final String value ) + { + final Element rootElement = Element.class.cast( this.getRootXmlNode().getXmlBaseNode() ); + final Document xmlDocument = this.getRootXmlNode().getXmlDocument(); + final Element qemuCmdlnElement; + + final NodeList qemuCmdlnNodes = rootElement.getElementsByTagNameNS( XMLNS_QEMU_NS_URI, "commandline" ); + if ( qemuCmdlnNodes.getLength() < 1 ) { + // add missing namespace attribute + rootElement.setAttributeNS( XMLConstants.XMLNS_ATTRIBUTE_NS_URI, + XMLConstants.XMLNS_ATTRIBUTE + ":" + XMLNS_QEMU_NS_PREFIX, XMLNS_QEMU_NS_URI ); + // add missing element + qemuCmdlnElement = xmlDocument.createElementNS( XMLNS_QEMU_NS_URI, "commandline" ); + qemuCmdlnElement.setPrefix( XMLNS_QEMU_NS_PREFIX ); + rootElement.appendChild( qemuCmdlnElement ); + } else { + // use available element + final Node qemuCmdlnNode = qemuCmdlnNodes.item( 0 ); + assert ( qemuCmdlnNode.getNodeType() == Node.ELEMENT_NODE ); + qemuCmdlnElement = Element.class.cast( qemuCmdlnNode ); + } + + // append element with attribute + final Element qemuCmdlnArgElement = xmlDocument.createElementNS( XMLNS_QEMU_NS_URI, "arg" ); + qemuCmdlnArgElement.setAttribute( "value", value ); + qemuCmdlnElement.appendChild( qemuCmdlnArgElement ); + } + /** * Removes boot oder entries in the Libvirt domain XML document. */ diff --git a/src/test/java/org/openslx/libvirt/domain/DomainTest.java b/src/test/java/org/openslx/libvirt/domain/DomainTest.java index e1fb73b..c56759d 100644 --- a/src/test/java/org/openslx/libvirt/domain/DomainTest.java +++ b/src/test/java/org/openslx/libvirt/domain/DomainTest.java @@ -392,4 +392,25 @@ public class DomainTest Domain vm = this.newDomainInstance( "qemu-kvm_default-ubuntu-20-04-vm.xml" ); assertEquals( 1, vm.getVideoDevices().size() ); } + + @Test + @DisplayName( "Get all QEMU command line arguments from libvirt XML file" ) + public void testGetQemuCmdlnArguments() + { + Domain vm = this.newDomainInstance( "qemu-kvm_default-ubuntu-20-04-vm_qemu-cmdln.xml" ); + assertEquals( 2, vm.getQemuCmdlnArguments().size() ); + } + + @Test + @DisplayName( "Set QEMU command line arguments in libvirt XML file" ) + public void testAddQemuCmdlnArguments() + { + Domain vm = this.newDomainInstance( "qemu-kvm_default-ubuntu-20-04-vm.xml" ); + assertEquals( 0, vm.getQemuCmdlnArguments().size() ); + + vm.addQemuCmdlnArgument( "-set" ); + vm.addQemuCmdlnArgument( "device.hostdev0.x-igd-opregion=on" ); + + assertEquals( 2, vm.getQemuCmdlnArguments().size() ); + } } diff --git a/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_qemu-cmdln.xml b/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_qemu-cmdln.xml new file mode 100644 index 0000000..2670eac --- /dev/null +++ b/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_qemu-cmdln.xml @@ -0,0 +1,168 @@ + + ubuntu-20-04 + 8dc5433c-0228-49e4-b019-fa2b606aa544 + Ubuntu 20.04 + Ubuntu 20.04 desktop installation + + + + + + 4194304 + 4194304 + 2 + + hvm + + + + + + + + + + + + + + destroy + restart + destroy + + + + + + /usr/bin/qemu-system-x86_64 + + + + +
+ + + + + +
+ + + + +
+ + +
+ + + +
+ + + +
+ + + +
+ + +
+ + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + +
+ + +
+ + + + + + +
+ + + + + + + + + + + +
+ + + +
+ + +
+ + + + + + + + +
+ +