--
Reviewed-by: Paulo Vital <pvital(a)linux.vnet.ibm.com>
On Fri, 2014-08-29 at 16:49 -0300, Daniel Henrique Barboza wrote:
The method listDevices() has unexpected behavior in certain
situations and architectures. According the libvirt API,
listAllDevices() delivers more control over the results and
it does not present the same problems.
For those reasons, this commit changes all the occurences of
listDevices() to use listAllDevices() instead.
Signed-off-by: Daniel Henrique Barboza <danielhb(a)linux.vnet.ibm.com>
---
src/kimchi/model/host.py | 33 ++++++++++++++++++++++++---------
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/src/kimchi/model/host.py b/src/kimchi/model/host.py
index 39f45d8..553ad7c 100644
--- a/src/kimchi/model/host.py
+++ b/src/kimchi/model/host.py
@@ -18,6 +18,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
import grp
+import libvirt
import os
import time
import platform
@@ -277,31 +278,45 @@ class PartitionModel(object):
class DevicesModel(object):
def __init__(self, **kargs):
self.conn = kargs['conn']
+ self.cap_map = \
+ {'fc_host': libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_FC_HOST,
+ 'net': libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_NET,
+ 'pci': libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_PCI_DEV,
+ 'scsi': libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI,
+ 'scsi_host': libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_HOST,
+ 'storage': libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_STORAGE,
+ 'usb_device': libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_DEV,
+ 'usb':
+ libvirt.VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_INTERFACE}
def get_list(self, _cap=None):
+ if _cap == 'fc_host':
+ return self._get_devices_fc_host()
+ return self._get_devices_with_capability(_cap)
+
+ def _get_devices_with_capability(self, cap):
conn = self.conn.get()
- if _cap is None:
- dev_names = [name.name() for name in conn.listAllDevices(0)]
- elif _cap == 'fc_host':
- dev_names = self._get_devices_fc_host()
+ if cap is None:
+ cap_flag = 0
else:
- # Get devices with required capability
- dev_names = conn.listDevices(_cap, 0)
- return dev_names
+ cap_flag = self.cap_map.get(cap)
+ if cap_flag is None:
+ return []
+ return [name.name() for name in conn.listAllDevices(cap_flag)]
def _get_devices_fc_host(self):
conn = self.conn.get()
# Libvirt < 1.0.5 does not support fc_host capability
if not CapabilitiesModel().fc_host_support:
ret = []
- scsi_hosts = conn.listDevices('scsi_host', 0)
+ scsi_hosts = self._get_devices_with_capability('scsi_host')
for host in scsi_hosts:
xml = conn.nodeDeviceLookupByName(host).XMLDesc(0)
path = '/device/capability/capability/@type'
if 'fc_host' in xmlutils.xpath_get_text(xml, path):
ret.append(host)
return ret
- return conn.listDevices('fc_host', 0)
+ return self._get_devices_with_capability('fc_host')
class DeviceModel(object):