[virt-tools-list] [PATCH v2 2/2] addhardware: use bus, device to distingush usb products

Cole Robinson crobinso at redhat.com
Fri Apr 26 19:56:00 UTC 2013


On 04/23/2013 09:30 AM, Guannan Ren wrote:
> When the usb device being attached is unique, the
> vendorId and productId is being used in XML.
> When there are multiple usb devices with same vendorId
> and productId in the host device list, the bus and device
> number is being used to attach the device.
> ---
>  tests/nodedev-xml/devxml/usbdev1.xml |  1 +
>  virtManager/addhardware.py           | 40 ++++++++++++++++++++++++++++++++++--
>  virtinst/VirtualHostDevice.py        |  5 ++---
>  3 files changed, 41 insertions(+), 5 deletions(-)
> 
> diff --git a/tests/nodedev-xml/devxml/usbdev1.xml b/tests/nodedev-xml/devxml/usbdev1.xml
> index 96d5ed8..cf0b50a 100644
> --- a/tests/nodedev-xml/devxml/usbdev1.xml
> +++ b/tests/nodedev-xml/devxml/usbdev1.xml
> @@ -2,5 +2,6 @@
>        <source>
>          <vendor id='0x0781'/>
>          <product id='0x5151'/>
> +        <address bus='1' device='4'/>
>        </source>
>      </hostdev>
> diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py
> index af36560..95d56cd 100644
> --- a/virtManager/addhardware.py
> +++ b/virtManager/addhardware.py
> @@ -281,7 +281,7 @@ class vmmAddHardware(vmmGObjectUI):
>          # Host device list
>          # model = [ Description, nodedev name ]
>          host_dev = self.widget("host-device")
> -        host_dev_model = Gtk.ListStore(str, str)
> +        host_dev_model = Gtk.ListStore(str, str, str)
>          host_dev.set_model(host_dev_model)
>  
>          host_col = Gtk.TreeViewColumn()
> @@ -577,7 +577,7 @@ class vmmAddHardware(vmmGObjectUI):
>                  if dev.name == subdev.parent:
>                      prettyname = dev.pretty_name(subdev)
>  
> -            model.append([prettyname, dev.name])
> +            model.append([prettyname, dev.name, devtype])
>  
>          if len(model) == 0:
>              model.append([_("No Devices Available"), None])
> @@ -1400,6 +1400,21 @@ class vmmAddHardware(vmmGObjectUI):
>          except Exception, e:
>              return self.err.val_err(_("Sound device parameter error"), e)
>  
> +    def get_nodedev_numbers(self, devtype, vendor, product):
> +        count = 0
> +        devs = self.conn.get_nodedevs(devtype, None)
> +
> +        for dev in devs:
> +            if vendor == dev.vendor_id and \
> +                product == dev.product_id:
> +                count += 1
> +
> +        logging.debug("There are %d node devices with "
> +                      "vendorId: %s, productId: %s",
> +                       count, vendor, product)
> +
> +        return count
> +
>      def validate_page_hostdev(self):
>          ret = self.get_config_host_device_info()
>          nodedev_name = ret and ret[1] or None
> @@ -1415,6 +1430,27 @@ class vmmAddHardware(vmmGObjectUI):
>          except Exception, e:
>              return self.err.val_err(_("Host device parameter error"), e)
>  
> +        devtype = ret[2]
> +        if devtype == "usb_device":
> +            vendor = self._dev.vendor
> +            product = self._dev.product
> +            count = self.get_nodedev_numbers(devtype, vendor, product)
> +            if count > 1:
> +                self._dev.vendor = None
> +                self._dev.product = None
> +                return
> +
> +            if count == 1:
> +                self._dev.bus = None
> +                self._dev.device = None
> +                return
> +
> +            if not count:
> +                raise RuntimeError(_("Could not find USB device "
> +                                     "(vendorId: %s, productId: %s) "
> +                                     % (vendor, product)))
> +
> +
>      def validate_page_char(self):
>          chartype = self.get_char_type()
>          modebox = self.widget("char-mode")
> diff --git a/virtinst/VirtualHostDevice.py b/virtinst/VirtualHostDevice.py
> index f5740d0..ee38242 100644
> --- a/virtinst/VirtualHostDevice.py
> +++ b/virtinst/VirtualHostDevice.py
> @@ -215,9 +215,8 @@ class VirtualHostDeviceUSB(VirtualHostDevice):
>          self.vendor = nodedev.vendor_id
>          self.product = nodedev.product_id
>  
> -        if not (self.vendor or self.product):
> -            self.bus = nodedev.bus
> -            self.device = nodedev.device
> +        self.bus = nodedev.bus
> +        self.device = nodedev.device
>  
>      def _get_source_xml(self):
>          xml = ""
> 

Doing this bit unconditionally in virtinst, then undoing the bus/addr bits in
virt-manager is not a good idea, since now virt-install is still 'broken' in
this way. We want to avoid setting bus/addr unless it's the only option to
make things work (duplicate devices).

You could do the duplicate check before creating the HostDevice, then passdown
an option like is_dup to device_from_node

- Cole




More information about the virt-tools-list mailing list