From 23e40d20ad86739d244119e879f55b6809fb96a7 Mon Sep 17 00:00:00 2001 From: Lee Yarwood Date: Thu, 22 Oct 2015 14:34:54 +0100 Subject: [PATCH] Parse FCoE sysfs device paths FCoE devices have slightly different sysfs device paths to FC devices : /sys/devices/pci0000:20/0000:20:03.0/0000:21:00.2/net/ens2f2/ctlr_2/ host3/fc_host/host3 As with FC devices we want the domain:bus:device.function of the device. For FCoE devices this is listed prior to `net`. Change-Id: I2e46af1679982964c0d90289bcf1a1fc702fcb15 --- os_brick/initiator/connector.py | 22 ++++++++-------------- os_brick/tests/initiator/test_connector.py | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/os_brick/initiator/connector.py b/os_brick/initiator/connector.py index 8542207ba..8e79d70e8 100644 --- a/os_brick/initiator/connector.py +++ b/os_brick/initiator/connector.py @@ -1322,24 +1322,18 @@ class FibreChannelConnector(InitiatorConnector): def _get_pci_num(self, hba): # NOTE(walter-boring) - # device path is in format of + # device path is in format of (FC and FCoE) : # /sys/devices/pci0000:00/0000:00:03.0/0000:05:00.3/host2/fc_host/host2 - # sometimes an extra entry exists before the host2 value - # we always want the value prior to the host2 value - pci_num = None + # /sys/devices/pci0000:20/0000:20:03.0/0000:21:00.2/net/ens2f2/ctlr_2 + # /host3/fc_host/host3 + # we always want the value prior to the host or net value if hba is not None: if "device_path" in hba: - index = 0 device_path = hba['device_path'].split('/') - for value in device_path: - if value.startswith('host'): - break - index = index + 1 - - if index > 0: - pci_num = device_path[index - 1] - - return pci_num + for index, value in enumerate(device_path): + if value.startswith('net') or value.startswith('host'): + return device_path[index - 1] + return None class FibreChannelConnectorS390X(FibreChannelConnector): diff --git a/os_brick/tests/initiator/test_connector.py b/os_brick/tests/initiator/test_connector.py index 039e227d9..adb30470c 100644 --- a/os_brick/tests/initiator/test_connector.py +++ b/os_brick/tests/initiator/test_connector.py @@ -1114,6 +1114,23 @@ class FibreChannelConnectorTestCase(ConnectorTestCase): expected = "/dev/disk/by-path" self.assertEqual(expected, search_path) + def test_get_pci_num(self): + hba = {'device_path': "/sys/devices/pci0000:00/0000:00:03.0" + "/0000:05:00.3/host2/fc_host/host2"} + pci_num = self.connector._get_pci_num(hba) + self.assertEqual("0000:05:00.3", pci_num) + + hba = {'device_path': "/sys/devices/pci0000:00/0000:00:03.0" + "/0000:05:00.3/0000:06:00.6/host2/fc_host/host2"} + pci_num = self.connector._get_pci_num(hba) + self.assertEqual("0000:06:00.6", pci_num) + + hba = {'device_path': "/sys/devices/pci0000:20/0000:20:03.0" + "/0000:21:00.2/net/ens2f2/ctlr_2/host3" + "/fc_host/host3"} + pci_num = self.connector._get_pci_num(hba) + self.assertEqual("0000:21:00.2", pci_num) + @mock.patch.object(os.path, 'exists', return_value=True) @mock.patch.object(linuxfc.LinuxFibreChannel, 'get_fc_hbas') @mock.patch.object(linuxfc.LinuxFibreChannel, 'get_fc_hbas_info')