From be37c2e040e2d77c443dbd709f253ab9a35f721c Mon Sep 17 00:00:00 2001 From: Gorka Eguileor Date: Thu, 29 Jun 2017 13:59:04 +0200 Subject: [PATCH] Fix iSCSI cleanup fix on discovery backends On Change-Id Iada5d4fbeb07aeaf3afb953a289b6b89778c382c we tried to fix an issue with the multipath detach of backends that used discovery on attach, but contrary to the commit message and the docstrings it didn't look for ip,port in the discoverydb but ip:port instead, which meant that it would never find what it was looking for. This patch fixes that fix to make it search for the right regex. TrivialFix Closes-Bug: #1699061 Change-Id: Ibfa1a78a555e984c662f668677451f5a3ed55602 --- os_brick/initiator/connectors/iscsi.py | 12 ++++++--- .../tests/initiator/connectors/test_iscsi.py | 26 ++++++++++++------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/os_brick/initiator/connectors/iscsi.py b/os_brick/initiator/connectors/iscsi.py index 0af7efee1..817bd0994 100644 --- a/os_brick/initiator/connectors/iscsi.py +++ b/os_brick/initiator/connectors/iscsi.py @@ -342,12 +342,18 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector): :type connection_properties: dict :returns: list of tuples of (ip, iqn, lun) """ + ip, port = connection_properties['target_portal'].rsplit(':', 1) + # NOTE(geguileo): I don't know if IPv6 will be reported with [] + # or not, so we'll make them optional. + ip = ip.replace('[', '\[?').replace(']', '\]?') out = self._run_iscsiadm_bare(['-m', 'discoverydb', '-o', 'show', '-P', 1])[0] or "" - regex = ('^SENDTARGETS:\n.*?^DiscoveryAddress: ' + - connection_properties['target_portal'] + - '.*?\n(.*?)^(?:DiscoveryAddress|iSNS):.*') + regex = ''.join(('^SENDTARGETS:\n.*?^DiscoveryAddress: ', + ip, ',', port, + '.*?\n(.*?)^(?:DiscoveryAddress|iSNS):.*')) + LOG.debug('Regex to get portals from discoverydb: %s', regex) + info = re.search(regex, out, re.DOTALL | re.MULTILINE) ips = [] diff --git a/os_brick/tests/initiator/connectors/test_iscsi.py b/os_brick/tests/initiator/connectors/test_iscsi.py index 6dd15de0c..a07a734b9 100644 --- a/os_brick/tests/initiator/connectors/test_iscsi.py +++ b/os_brick/tests/initiator/connectors/test_iscsi.py @@ -539,17 +539,20 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): @mock.patch.object(iscsi.ISCSIConnector, '_run_iscsiadm_bare') def test_get_discoverydb_portals(self, is_iser, iscsiadm_mock, transport_mock): - params = {'iqn1': self.SINGLE_CON_PROPS['target_iqn'], - 'iqn2': 'iqn.2004-04.com.qnap:ts-831x:iscsi.cinder-2017.9ef', - 'ip1': self.SINGLE_CON_PROPS['target_portal'], - 'ip2': '192.168.1.3:3260', - 'transport': 'iser' if is_iser else 'default', - 'other_transport': 'default' if is_iser else 'iser'} + params = { + 'iqn1': self.SINGLE_CON_PROPS['target_iqn'], + 'iqn2': 'iqn.2004-04.com.qnap:ts-831x:iscsi.cinder-2017.9ef', + 'addr': self.SINGLE_CON_PROPS['target_portal'].replace(':', ','), + 'ip1': self.SINGLE_CON_PROPS['target_portal'], + 'ip2': '192.168.1.3:3260', + 'transport': 'iser' if is_iser else 'default', + 'other_transport': 'default' if is_iser else 'iser', + } iscsiadm_mock.return_value = ( 'SENDTARGETS:\n' 'DiscoveryAddress: 192.168.1.33,3260\n' - 'DiscoveryAddress: %(ip1)s\n' + 'DiscoveryAddress: %(addr)s\n' 'Target: %(iqn1)s\n' ' Portal: %(ip2)s,1\n' ' Iface Name: %(transport)s\n' @@ -613,12 +616,15 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): def test_get_discoverydb_portals_error_is_present(self, iscsiadm_mock, transport_mock): """DiscoveryAddress is present but wrong iterface.""" - params = {'iqn': self.SINGLE_CON_PROPS['target_iqn'], - 'ip': self.SINGLE_CON_PROPS['target_portal']} + params = { + 'iqn': self.SINGLE_CON_PROPS['target_iqn'], + 'addr': self.SINGLE_CON_PROPS['target_portal'].replace(':', ','), + 'ip': self.SINGLE_CON_PROPS['target_portal'], + } iscsiadm_mock.return_value = ( 'SENDTARGETS:\n' 'DiscoveryAddress: 192.168.1.33,3260\n' - 'DiscoveryAddress: %(ip)s\n' + 'DiscoveryAddress: %(addr)s\n' 'Target: %(iqn)s\n' ' Portal: %(ip)s,1\n' ' Iface Name: iser\n'