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
This commit is contained in:
Gorka Eguileor 2017-06-29 13:41:13 +02:00
parent 32ab0d1670
commit d310e06caf
2 changed files with 12 additions and 32 deletions

View File

@ -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,

View File

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