[virt-tools-list] [PATCH V3 1/2] Add comparison function for NodeDevice.
Lin Ma
lma at suse.com
Thu Sep 4 06:49:12 UTC 2014
PCIDevice and USBDevice include respective comparison logic.
Signed-off-by: Lin Ma <lma at suse.com>
---
virtinst/nodedev.py | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/virtinst/nodedev.py b/virtinst/nodedev.py
index 17524dc..39ccc0f 100644
--- a/virtinst/nodedev.py
+++ b/virtinst/nodedev.py
@@ -121,6 +121,68 @@ class NodeDevice(XMLBuilder):
"""
return self.name
+ @staticmethod
+ def compare_to_nodedev(vmmconn, new_nodedev):
+ def intify(val, do_hex=False):
+ try:
+ if do_hex:
+ return int(val or '0x00', 16)
+ else:
+ return int(val)
+ except:
+ return -1
+
+ def attrVal(node, attr):
+ if not hasattr(node, attr):
+ return None
+ return getattr(node, attr)
+
+ ret = []
+ conn = vmmconn.get_backend()
+ vms = conn.fetch_all_guests()
+ cls = _typeToDeviceClass(new_nodedev.device_type)
+ for vm in vms:
+ for hostdev in vm.get_devices("hostdev"):
+ devtype = hostdev.type
+ found_dev = None
+ vid = pid = None
+ bus = device = domain = slot = func = None
+ if devtype == "usb":
+ devtype = "usb_device"
+ vid = hostdev.vendor or -1
+ pid = hostdev.product or -1
+ bus = intify(hostdev.bus)
+ device = intify(hostdev.device)
+ elif devtype == "pci":
+ domain = intify(hostdev.domain, True)
+ bus = intify(hostdev.bus, True)
+ slot = intify(hostdev.slot, True)
+ func = intify(hostdev.function, True)
+
+ devs = vmmconn.get_nodedevs(devtype, None)
+ for dev in devs:
+ if ((attrVal(dev, "product_id") == pid or pid == -1) and
+ (attrVal(dev, "vendor_id") == vid or vid == -1) and
+ (attrVal(dev, "bus") == bus or bus == -1) and
+ (attrVal(dev, "device") == device or device == -1)):
+ found_dev = dev
+ else:
+ dev_id = intify(attrVal(dev, "device"))
+ bus_id = intify(attrVal(dev, "bus"))
+ dom_id = intify(attrVal(dev, "domain"))
+ func_id = intify(attrVal(dev, "function"))
+ slot_id = intify(attrVal(dev, "slot"))
+ if ((dev_id == device and bus_id == bus) or
+ (dom_id == domain and func_id == func and
+ bus_id == bus and slot_id == slot)):
+ found_dev = dev
+ if found_dev:
+ break
+ if found_dev:
+ if new_nodedev.device_type == found_dev.device_type:
+ if cls.compare_to_nodedev(new_nodedev, found_dev):
+ ret.append(vm.name)
+ return ret
class SystemDevice(NodeDevice):
hw_vendor = XMLProperty("./capability/hardware/vendor")
@@ -176,6 +238,14 @@ class PCIDevice(NodeDevice):
return "%s %s %s" % (devstr, self.vendor_name, self.product_name)
+ @staticmethod
+ def compare_to_nodedev(new_nodedev, found_dev):
+ if new_nodedev.domain == found_dev.domain and \
+ new_nodedev.bus == found_dev.bus and \
+ new_nodedev.slot == found_dev.slot and \
+ new_nodedev.function == found_dev.function:
+ return True
+
class USBDevice(NodeDevice):
bus = XMLProperty("./capability/bus")
@@ -192,6 +262,14 @@ class USBDevice(NodeDevice):
str(self.product_name))
return desc
+ @staticmethod
+ def compare_to_nodedev(new_nodedev, found_dev):
+ if new_nodedev.device == found_dev.device and \
+ new_nodedev.bus == found_dev.bus and \
+ new_nodedev.vendor_id == found_dev.vendor_id and \
+ new_nodedev.product_id == found_dev.product_id:
+ return True
+
class StorageDevice(NodeDevice):
block = XMLProperty("./capability/block")
--
1.8.4
More information about the virt-tools-list
mailing list