From 0877322403e7a122706abe4a2bcf39653675d352 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Mon, 16 Aug 2021 11:11:37 +0200 Subject: Add Libvirt support for QEMU command line options --- .../java/org/openslx/libvirt/domain/Domain.java | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) (limited to 'src/main/java/org/openslx/libvirt') diff --git a/src/main/java/org/openslx/libvirt/domain/Domain.java b/src/main/java/org/openslx/libvirt/domain/Domain.java index 7d49f14..d6f9a8f 100644 --- a/src/main/java/org/openslx/libvirt/domain/Domain.java +++ b/src/main/java/org/openslx/libvirt/domain/Domain.java @@ -8,6 +8,8 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; +import javax.xml.XMLConstants; + import org.openslx.libvirt.domain.device.Device; import org.openslx.libvirt.domain.device.Controller; import org.openslx.libvirt.domain.device.ControllerFloppy; @@ -42,6 +44,8 @@ import org.openslx.libvirt.xml.LibvirtXmlNode; import org.openslx.libvirt.xml.LibvirtXmlResources; import org.openslx.libvirt.xml.LibvirtXmlSerializationException; import org.openslx.libvirt.xml.LibvirtXmlValidationException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; @@ -56,6 +60,16 @@ import org.xml.sax.InputSource; */ public class Domain extends LibvirtXmlDocument { + /** + * XML namespace URI for QEMU command line elements in the Libvirt domain XML document. + */ + private static final String XMLNS_QEMU_NS_URI = "http://libvirt.org/schemas/domain/qemu/1.0"; + + /** + * XML namespace prefix for QEMU command line elements in the Libvirt domain XML document. + */ + private static final String XMLNS_QEMU_NS_PREFIX = "qemu"; + /** * Creates Libvirt domain XML document from {@link String} providing Libvirt domain XML content. * @@ -1051,6 +1065,35 @@ public class Domain extends LibvirtXmlDocument return Domain.filterDevices( Video.class, this.getDevices() ); } + /** + * Returns the values of QEMU command line arguments from the Libvirt domain XML document. + * + * @return values of QEMU command line arguments from the Libvirt domain XML document. + */ + public ArrayList 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. */ -- cgit v1.2.3-55-g7522