linuxscsi: Only raise and log multipathd errors when required

Logging and then ignoring multipathd errors when it isn't enforced is
confusing to operators investigating attach or detach issues.

Change-Id: Ib234e585da5644d87fcf1ef6bcb95f2871dc6b32
(cherry picked from commit bdfe6b43cb)
(cherry picked from commit d09dc9e51c)
(cherry picked from commit ffe0cbfc93)
(cherry picked from commit 892583b388)
This commit is contained in:
Lee Yarwood 2021-07-01 11:04:30 +01:00 committed by Alan Bishop
parent 55dd987319
commit 458bfadc7f
2 changed files with 44 additions and 5 deletions

View File

@ -205,13 +205,13 @@ class LinuxSCSI(executor.Executor):
# code and just printed the error message in stdout.
if out and out.startswith('error receiving packet'):
raise putils.ProcessExecutionError('', out, 1, cmd, None)
except putils.ProcessExecutionError as err:
LOG.error('multipathd is not running: exit code %(err)s',
{'err': err.exit_code})
if enforce_multipath:
LOG.error('multipathd is not running: exit code %(err)s',
{'err': err.exit_code})
raise
return False
return True
def get_dm_name(self, dm):

View File

@ -913,20 +913,59 @@ loop0 0"""
self.assertEqual(expected, result)
@mock.patch('os_brick.privileged.rootwrap.execute', return_value=('', ''))
def test_is_multipath_running_default_executor(self, mock_exec):
def test_is_multipath_running(self, mock_exec):
res = linuxscsi.LinuxSCSI.is_multipath_running(False, None, mock_exec)
self.assertTrue(res)
mock_exec.assert_called_once_with(
'multipathd', 'show', 'status', run_as_root=True, root_helper=None)
@mock.patch.object(linuxscsi, 'LOG')
@mock.patch('os_brick.privileged.rootwrap.execute')
def test_is_multipath_running_failure_exit_code_0(self, mock_exec):
def test_is_multipath_running_failure(
self, mock_exec, mock_log
):
mock_exec.side_effect = putils.ProcessExecutionError()
self.assertRaises(putils.ProcessExecutionError,
linuxscsi.LinuxSCSI.is_multipath_running,
True, None, mock_exec)
mock_log.error.assert_called_once()
@mock.patch.object(linuxscsi, 'LOG')
@mock.patch('os_brick.privileged.rootwrap.execute')
def test_is_multipath_running_failure_exit_code_0(
self, mock_exec, mock_log
):
mock_exec.return_value = ('error receiving packet', '')
self.assertRaises(putils.ProcessExecutionError,
linuxscsi.LinuxSCSI.is_multipath_running,
True, None, mock_exec)
mock_exec.assert_called_once_with(
'multipathd', 'show', 'status', run_as_root=True, root_helper=None)
mock_log.error.assert_called_once()
@mock.patch.object(linuxscsi, 'LOG')
@mock.patch('os_brick.privileged.rootwrap.execute')
def test_is_multipath_running_failure_not_enforcing_multipath(
self, mock_exec, mock_log
):
mock_exec.side_effect = putils.ProcessExecutionError()
res = linuxscsi.LinuxSCSI.is_multipath_running(False, None, mock_exec)
mock_exec.assert_called_once_with(
'multipathd', 'show', 'status', run_as_root=True, root_helper=None)
self.assertFalse(res)
mock_log.error.assert_not_called()
@mock.patch.object(linuxscsi, 'LOG')
@mock.patch('os_brick.privileged.rootwrap.execute')
def test_is_multipath_running_failure_not_enforcing_exit_code_0(
self, mock_exec, mock_log
):
mock_exec.return_value = ('error receiving packet', '')
res = linuxscsi.LinuxSCSI.is_multipath_running(False, None, mock_exec)
mock_exec.assert_called_once_with(
'multipathd', 'show', 'status', run_as_root=True, root_helper=None)
self.assertFalse(res)
mock_log.error.assert_not_called()
@mock.patch('six.moves.builtins.open')
def test_get_sysfs_wwn_mpath(self, open_mock):