Accept ISCSI_ERR_NO_OBJS_FOUND from iscsiadm

iscsiadm exits with code 21 (ISCSI_ERR_NO_OBJS_FOUND) when no nodes
exist. We must accept this as an empty result when attempting to get
node startup info, instead of producing a ProcessExecutionError.

Change-Id: I55f4b3b075bd7779e96777dee64bf577c45fddf1
Closes-Bug: 1756206
(cherry picked from commit 296887a59e)
This commit is contained in:
iain MacDonnell 2018-03-20 14:20:18 -07:00
parent 8aeabbda1c
commit 9287b2816d
2 changed files with 18 additions and 1 deletions

View File

@ -1102,9 +1102,12 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector):
return (out, err) return (out, err)
def _get_node_startup_values(self, connection_properties): def _get_node_startup_values(self, connection_properties):
# Exit code 21 (ISCSI_ERR_NO_OBJS_FOUND) occurs when no nodes
# exist - must consider this an empty (successful) result.
out, __ = self._run_iscsiadm_bare( out, __ = self._run_iscsiadm_bare(
['-m', 'node', '--op', 'show', '-p', ['-m', 'node', '--op', 'show', '-p',
connection_properties['target_portal']]) or "" connection_properties['target_portal']],
check_exit_code=(0, 21)) or ""
node_values = out.strip() node_values = out.strip()
node_values = node_values.split("\n") node_values = node_values.split("\n")
iqn = None iqn = None

View File

@ -1496,6 +1496,20 @@ Setting up iSCSI targets: unused
iqn3: node_startup3} iqn3: node_startup3}
self.assertEqual(node_startups, expected_node_startups) self.assertEqual(node_startups, expected_node_startups)
@mock.patch.object(iscsi.ISCSIConnector, '_execute')
def test_get_node_startup_values_no_nodes(self, exec_mock):
connection_properties = {'target_portal': 'ip1:port1'}
no_nodes_output = ''
no_nodes_err = 'iscsiadm: No records found\n'
exec_mock.return_value = (no_nodes_output, no_nodes_err)
res = self.connector._get_node_startup_values(connection_properties)
self.assertEqual({}, res)
exec_mock.assert_called_once_with(
'iscsiadm', '-m', 'node', '--op', 'show', '-p',
connection_properties['target_portal'],
root_helper=self.connector._root_helper, run_as_root=True,
check_exit_code=(0, 21))
@mock.patch.object(iscsi.ISCSIConnector, '_get_node_startup_values') @mock.patch.object(iscsi.ISCSIConnector, '_get_node_startup_values')
@mock.patch.object(iscsi.ISCSIConnector, '_iscsiadm_update') @mock.patch.object(iscsi.ISCSIConnector, '_iscsiadm_update')
def test_recover_node_startup_values(self, iscsiadm_update_mock, def test_recover_node_startup_values(self, iscsiadm_update_mock,