From a306c5617fd1d4e09739655fa7070a300dac2b13 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 27 Mar 2025 14:10:08 +0100 Subject: [libvirt] Make sure VMs have at least 5 spicevmc usb ports --- .../libvirt/domain/device/ControllerUsb.java | 9 +++ .../org/openslx/libvirt/domain/device/Device.java | 62 ++++++++++++++------- .../openslx/libvirt/domain/device/RedirDevice.java | 13 ++--- .../VirtualizationConfigurationQemu.java | 65 +++++++++++++++++++++- ...gurationLogicDozModServerToStatelessClient.java | 2 + 5 files changed, 120 insertions(+), 31 deletions(-) (limited to 'src/main') diff --git a/src/main/java/org/openslx/libvirt/domain/device/ControllerUsb.java b/src/main/java/org/openslx/libvirt/domain/device/ControllerUsb.java index 1798027..1be42e5 100644 --- a/src/main/java/org/openslx/libvirt/domain/device/ControllerUsb.java +++ b/src/main/java/org/openslx/libvirt/domain/device/ControllerUsb.java @@ -1,6 +1,7 @@ package org.openslx.libvirt.domain.device; import org.openslx.libvirt.xml.LibvirtXmlNode; +import org.openslx.util.Util; /** * A USB controller device node in a Libvirt domain XML document. @@ -136,4 +137,12 @@ public class ControllerUsb extends Controller return null; } } + + /** + * Get number of ports this controller provides. + */ + public int getPortCount() + { + return Util.parseInt( this.getXmlElementAttributeValue( "ports" ), -1 ); + } } 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 d743522..f391663 100644 --- a/src/main/java/org/openslx/libvirt/domain/device/Device.java +++ b/src/main/java/org/openslx/libvirt/domain/device/Device.java @@ -1,5 +1,6 @@ package org.openslx.libvirt.domain.device; +import org.apache.commons.lang3.NotImplementedException; import org.openslx.libvirt.xml.LibvirtXmlNode; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -48,7 +49,7 @@ public class Device extends LibvirtXmlNode implements HostdevAddressableTarget= 0 && port > 0 && bus < busPort.length && port < busPort[bus].length ) { + busPort[bus][port] = 1; + } + } + if ( devs >= MIN_USB_REDIR_DEVS ) + return; + for ( ControllerUsb c : vmConfig.getUsbControllerDevices() ) { + int bus = c.getIndex(); + if ( bus < 0 || bus >= busPort.length ) + continue; + int ports = c.getPortCount(); + for ( int port = 1; port < ports; ++port ) { + if ( busPort[bus][port] == 0 ) { + // Free port on this controller, use + RedirDevice dev = (RedirDevice)vmConfig.addDevice( new RedirDevice() ); + dev.setSrcType( SrcType.SPICEVMC ); + dev.setBusType( BusType.USB ); + dev.setUsbTarget( new HostdevUsbDeviceAddress( bus, port ) ); + if ( ++devs >= MIN_USB_REDIR_DEVS ) + return; // Enough + } + } + } + } + /** * Parses Libvirt domain XML configuration to initialize QEMU metadata. */ @@ -832,7 +891,7 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration @Override public void transformNonPersistent() throws VirtualizationConfigurationException { - // NOT implemented yet + this.preconfigureUsb( false ); } @Override @@ -914,7 +973,7 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration // attach any new USB devices. ArrayList list = vmConfig.getRedirectDevices(); for (RedirDevice dev : list ) { - if ( dev.getBus() == BusType.USB ) { + if ( dev.getDeviceBusType() == BusType.USB ) { dev.remove(); } } diff --git a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java index 2d3e861..8703769 100644 --- a/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java +++ b/src/main/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClient.java @@ -73,6 +73,8 @@ public class ConfigurationLogicDozModServerToStatelessClient this.validateInputs( config, args ); // apply settings to run virtualized system in a stateless manner + // call this one early on as methods further down might customize + // remove things we do here... try { config.transformNonPersistent(); } catch ( VirtualizationConfigurationException e ) { -- cgit v1.2.3-55-g7522