summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2023-06-26 12:19:05 +0200
committerSimon Rettberg2023-06-26 12:19:05 +0200
commit41126d5da4a87320407885cf2a5eedc1c828dfaa (patch)
treeb8e041a9c1985510b98447185555081215e925e0
parent[thrift] Ignore yet another socket exception (diff)
downloadmaster-sync-shared-41126d5da4a87320407885cf2a5eedc1c828dfaa.tar.gz
master-sync-shared-41126d5da4a87320407885cf2a5eedc1c828dfaa.tar.xz
master-sync-shared-41126d5da4a87320407885cf2a5eedc1c828dfaa.zip
[libvirt] Allow setting PCI address on Device level
Devices like video and disk can be PCI Devices and thus have an <address> tag that defines where on the PCI bus it sits. Move the according helper functions for getting/setting this address from HostDevPci up to Device.
-rw-r--r--src/main/java/org/openslx/libvirt/domain/device/Device.java59
-rw-r--r--src/main/java/org/openslx/libvirt/domain/device/HostdevAddressableTarget.java4
-rw-r--r--src/main/java/org/openslx/libvirt/domain/device/HostdevPci.java59
-rw-r--r--src/main/java/org/openslx/libvirt/domain/device/HostdevUsb.java4
4 files changed, 70 insertions, 56 deletions
diff --git a/src/main/java/org/openslx/libvirt/domain/device/Device.java b/src/main/java/org/openslx/libvirt/domain/device/Device.java
index 1e0e031..31a54ca 100644
--- a/src/main/java/org/openslx/libvirt/domain/device/Device.java
+++ b/src/main/java/org/openslx/libvirt/domain/device/Device.java
@@ -11,7 +11,7 @@ import org.w3c.dom.Node;
* @author Manuel Bentele
* @version 1.0
*/
-public class Device extends LibvirtXmlNode
+public class Device extends LibvirtXmlNode implements HostdevAddressableTarget<HostdevPciDeviceAddress>
{
/**
* Creates an empty virtual machine device.
@@ -171,6 +171,63 @@ public class Device extends LibvirtXmlNode
}
/**
+ * Sets the PCI device address for an XML address element selected by a XPath expression.
+ *
+ * @param expression XPath expression to select the XML address element.
+ * @param address PCI device address for the selected XML address element.
+ */
+ protected void setPciAddress( final String expression, final HostdevPciDeviceAddress address )
+ {
+ final String pciDomain = HostdevUtils.appendHexPrefix( address.getPciDomainAsString() );
+ final String pciBus = HostdevUtils.appendHexPrefix( address.getPciBusAsString() );
+ final String pciDevice = HostdevUtils.appendHexPrefix( address.getPciDeviceAsString() );
+ final String pciFunction = HostdevUtils.appendHexPrefix( address.getPciFunctionAsString() );
+
+ this.setXmlElementAttributeValue( expression, "domain", pciDomain );
+ this.setXmlElementAttributeValue( expression, "bus", pciBus );
+ this.setXmlElementAttributeValue( expression, "slot", pciDevice );
+ this.setXmlElementAttributeValue( expression, "function", pciFunction );
+ }
+
+ /**
+ * Returns the PCI device address from an address XML element selected by a XPath expression.
+ *
+ * @param expression XPath expression to select the XML address element.
+ * @return PCI device address from the selected XML address element.
+ */
+ protected HostdevPciDeviceAddress getPciAddress( final String expression )
+ {
+ String pciDomain = this.getXmlElementAttributeValue( expression, "domain" );
+ String pciBus = this.getXmlElementAttributeValue( expression, "bus" );
+ String pciDevice = this.getXmlElementAttributeValue( expression, "slot" );
+ String pciFunction = this.getXmlElementAttributeValue( expression, "function" );
+
+ pciDomain = HostdevUtils.removeHexPrefix( pciDomain );
+ pciBus = HostdevUtils.removeHexPrefix( pciBus );
+ pciDevice = HostdevUtils.removeHexPrefix( pciDevice );
+ pciFunction = HostdevUtils.removeHexPrefix( pciFunction );
+
+ return HostdevPciDeviceAddress.valueOf( pciDomain + ":" + pciBus + ":" + pciDevice + "." + pciFunction );
+ }
+
+ /**
+ * Returns this devices PCI bus address, or null if it doesn't have an explicit one
+ * set, or if the address type isn't PCI.
+ */
+ public HostdevPciDeviceAddress getPciTarget()
+ {
+ if ( !"pci".equals( this.getXmlElementAttributeValue( "address", "type" ) ) )
+ return null;
+ return this.getPciAddress( "address" );
+ }
+
+ public void setPciTarget( HostdevPciDeviceAddress address )
+ {
+ this.setPciAddress( "address", address );
+ this.setXmlElementAttributeValue( "address", "type", "pci" );
+ }
+
+ /**
* Type of virtual machine devices.
*
* @author Manuel Bentele
diff --git a/src/main/java/org/openslx/libvirt/domain/device/HostdevAddressableTarget.java b/src/main/java/org/openslx/libvirt/domain/device/HostdevAddressableTarget.java
index 8a6f9a1..ca06065 100644
--- a/src/main/java/org/openslx/libvirt/domain/device/HostdevAddressableTarget.java
+++ b/src/main/java/org/openslx/libvirt/domain/device/HostdevAddressableTarget.java
@@ -15,12 +15,12 @@ public abstract interface HostdevAddressableTarget<T>
*
* @return target of the target device (in the virtual machine).
*/
- public T getTarget();
+ public T getPciTarget();
/**
* Sets the target for the target device (in the virtual machine).
*
* @param target target for the target device (in the virtual machine).
*/
- public void setTarget( T target );
+ public void setPciTarget( T target );
}
diff --git a/src/main/java/org/openslx/libvirt/domain/device/HostdevPci.java b/src/main/java/org/openslx/libvirt/domain/device/HostdevPci.java
index d2be2d6..1351f26 100644
--- a/src/main/java/org/openslx/libvirt/domain/device/HostdevPci.java
+++ b/src/main/java/org/openslx/libvirt/domain/device/HostdevPci.java
@@ -8,8 +8,7 @@ import org.openslx.libvirt.xml.LibvirtXmlNode;
* @author Manuel Bentele
* @version 1.0
*/
-public class HostdevPci extends Hostdev implements HostdevAddressableSource<HostdevPciDeviceAddress>,
- HostdevAddressableTarget<HostdevPciDeviceAddress>
+public class HostdevPci extends Hostdev implements HostdevAddressableSource<HostdevPciDeviceAddress>
{
/**
* Creates an empty hostdev PCI device.
@@ -29,46 +28,6 @@ public class HostdevPci extends Hostdev implements HostdevAddressableSource<Host
super( xmlNode );
}
- /**
- * Returns the PCI device address from an address XML element selected by a XPath expression.
- *
- * @param expression XPath expression to select the XML address element.
- * @return PCI device address from the selected XML address element.
- */
- private HostdevPciDeviceAddress getPciAddress( final String expression )
- {
- String pciDomain = this.getXmlElementAttributeValue( expression, "domain" );
- String pciBus = this.getXmlElementAttributeValue( expression, "bus" );
- String pciDevice = this.getXmlElementAttributeValue( expression, "slot" );
- String pciFunction = this.getXmlElementAttributeValue( expression, "function" );
-
- pciDomain = HostdevUtils.removeHexPrefix( pciDomain );
- pciBus = HostdevUtils.removeHexPrefix( pciBus );
- pciDevice = HostdevUtils.removeHexPrefix( pciDevice );
- pciFunction = HostdevUtils.removeHexPrefix( pciFunction );
-
- return HostdevPciDeviceAddress.valueOf( pciDomain + ":" + pciBus + ":" + pciDevice + "." + pciFunction );
- }
-
- /**
- * Sets the PCI device address for an XML address element selected by a XPath expression.
- *
- * @param expression XPath expression to select the XML address element.
- * @param address PCI device address for the selected XML address element.
- */
- private void setPciAddress( final String expression, final HostdevPciDeviceAddress address )
- {
- final String pciDomain = HostdevUtils.appendHexPrefix( address.getPciDomainAsString() );
- final String pciBus = HostdevUtils.appendHexPrefix( address.getPciBusAsString() );
- final String pciDevice = HostdevUtils.appendHexPrefix( address.getPciDeviceAsString() );
- final String pciFunction = HostdevUtils.appendHexPrefix( address.getPciFunctionAsString() );
-
- this.setXmlElementAttributeValue( expression, "domain", pciDomain );
- this.setXmlElementAttributeValue( expression, "bus", pciBus );
- this.setXmlElementAttributeValue( expression, "slot", pciDevice );
- this.setXmlElementAttributeValue( expression, "function", pciFunction );
- }
-
@Override
public HostdevPciDeviceAddress getSource()
{
@@ -81,16 +40,14 @@ public class HostdevPci extends Hostdev implements HostdevAddressableSource<Host
this.setPciAddress( "source/address", address );
}
- @Override
- public HostdevPciDeviceAddress getTarget()
- {
- return this.getPciAddress( "address" );
- }
-
- @Override
- public void setTarget( HostdevPciDeviceAddress address )
+ /**
+ * Set multifunction mode.
+ *
+ * If enabled, the device is said to have multiple functions.
+ */
+ public void setMultifunction( boolean on )
{
- this.setPciAddress( "address", address );
+ this.setXmlElementAttributeValueOnOff( "address", "multifunction", on );
}
/**
diff --git a/src/main/java/org/openslx/libvirt/domain/device/HostdevUsb.java b/src/main/java/org/openslx/libvirt/domain/device/HostdevUsb.java
index a9d7f89..b5332af 100644
--- a/src/main/java/org/openslx/libvirt/domain/device/HostdevUsb.java
+++ b/src/main/java/org/openslx/libvirt/domain/device/HostdevUsb.java
@@ -52,7 +52,7 @@ public class HostdevUsb extends Hostdev implements HostdevAddressableSource<Host
}
@Override
- public HostdevUsbDeviceAddress getTarget()
+ public HostdevUsbDeviceAddress getPciTarget()
{
final String usbBus = this.getXmlElementAttributeValue( "address", "bus" );
final String usbPort = this.getXmlElementAttributeValue( "address", "port" );
@@ -61,7 +61,7 @@ public class HostdevUsb extends Hostdev implements HostdevAddressableSource<Host
}
@Override
- public void setTarget( HostdevUsbDeviceAddress address )
+ public void setPciTarget( HostdevUsbDeviceAddress address )
{
this.setXmlElementAttributeValue( "address", "bus", Integer.toString( address.getUsbBus() ) );
this.setXmlElementAttributeValue( "address", "port", Integer.toString( address.getUsbPort() ) );