[PATCH] model.host: changing listDevices() to listAllDevices()

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@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): -- 1.8.3.1

-- Reviewed-by: Paulo Vital <pvital@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@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):
participants (3)
-
Aline Manera
-
Daniel Henrique Barboza
-
Paulo Ricardo Paz Vital