From d310e06caffe9e36f5d1c31b290bb07b4983ddd5 Mon Sep 17 00:00:00 2001 From: Gorka Eguileor Date: Thu, 29 Jun 2017 13:41:13 +0200 Subject: [PATCH] Fix manual scan for discovery type backends When we added open-iscsi manual scan support we made it so that it wouldn't modify the scan mode of already existing nodes, and this is a problem for backends that use discovery, since the discovery will add the nodes with the default automatic scan mode. This patch makes sure that we always try to change the mode to manual scans and only reports scans to be automatic if the initiator doesn't support this feature. TrivialFix Change-Id: Id9e2f539d5273a20038399d9af6017652a4f987f --- os_brick/initiator/connectors/iscsi.py | 12 +++---- .../tests/initiator/connectors/test_iscsi.py | 32 ++++--------------- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/os_brick/initiator/connectors/iscsi.py b/os_brick/initiator/connectors/iscsi.py index 0af7efee1..7017d1f05 100644 --- a/os_brick/initiator/connectors/iscsi.py +++ b/os_brick/initiator/connectors/iscsi.py @@ -948,13 +948,11 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector): self._run_iscsiadm(connection_properties, ('--interface', self._get_transport(), '--op', 'new')) - # Try to set the scan mode to manual - res = self._iscsiadm_update(connection_properties, - 'node.session.scan', 'manual', - check_exit_code=False) - manual_scan = not res[1] - else: - manual_scan = 'node.session.scan = manual' in out + # Try to set the scan mode to manual + res = self._iscsiadm_update(connection_properties, + 'node.session.scan', 'manual', + check_exit_code=False) + manual_scan = not res[1] if connection_properties.get('auth_method'): self._iscsiadm_update(connection_properties, diff --git a/os_brick/tests/initiator/connectors/test_iscsi.py b/os_brick/tests/initiator/connectors/test_iscsi.py index 6dd15de0c..413586211 100644 --- a/os_brick/tests/initiator/connectors/test_iscsi.py +++ b/os_brick/tests/initiator/connectors/test_iscsi.py @@ -979,11 +979,12 @@ Setting up iSCSI targets: unused con_props.update(auth_method='CHAP', auth_username='user', auth_password='pwd') res = self.connector._connect_to_iscsi_portal(con_props) - # False refers to "manual scans", so we have automatic iscsi scans - self.assertEqual((session, False), res) + # False refers to "manual scans", so we have manual iscsi scans + self.assertEqual((session, True), res) prefix = 'iscsiadm -m node -T tgt1 -p ip1:port1' expected_cmds = [ prefix, + prefix + ' --op update -n node.session.scan -v manual', prefix + ' --op update -n node.session.auth.authmethod -v CHAP', prefix + ' --op update -n node.session.auth.username -v user', prefix + ' --op update -n node.session.auth.password -v pwd', @@ -991,36 +992,17 @@ Setting up iSCSI targets: unused self.assertListEqual(expected_cmds, self.cmds) get_sessions_mock.assert_called_once_with() - @ddt.data('auto', 'manual') - @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_sessions_full') - def test_connect_to_iscsi_portal_manual_scan_feature(self, manual_scan, - get_sessions_mock): - """Node and session already exists and iscsi supports manual scans.""" - session = 'session2' - get_sessions_mock.return_value = [('tcp:', session, 'ip1:port1', - '-1', 'tgt1')] - con_props = self.CON_PROPS.copy() - node_props = ('node.startup = automatic\nnode.session.scan = ' + - manual_scan) - with mock.patch.object(self.connector, '_execute') as exec_mock: - exec_mock.side_effect = [(node_props, None)] - res = self.connector._connect_to_iscsi_portal(con_props) - # False refers to "manual scans", so we have automatic iscsi scans - self.assertEqual((session, manual_scan == 'manual'), res) - - actual_cmds = [' '.join(args[0]) for args in exec_mock.call_args_list] - self.assertListEqual(['iscsiadm -m node -T tgt1 -p ip1:port1'], - actual_cmds) - get_sessions_mock.assert_called_once_with() - @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_sessions_full') def test_connect_to_iscsi_portal_fail_login(self, get_sessions_mock): get_sessions_mock.return_value = [] with mock.patch.object(self.connector, '_execute') as exec_mock: - exec_mock.side_effect = [('', None), putils.ProcessExecutionError] + exec_mock.side_effect = [('', None), ('', None), + putils.ProcessExecutionError] res = self.connector._connect_to_iscsi_portal(self.CON_PROPS) self.assertEqual((None, None), res) expected_cmds = ['iscsiadm -m node -T tgt1 -p ip1:port1', + 'iscsiadm -m node -T tgt1 -p ip1:port1 ' + '--op update -n node.session.scan -v manual', 'iscsiadm -m node -T tgt1 -p ip1:port1 --login'] actual_cmds = [' '.join(args[0]) for args in exec_mock.call_args_list] self.assertListEqual(expected_cmds, actual_cmds)