diff --git a/os_brick/initiator/linuxscsi.py b/os_brick/initiator/linuxscsi.py index 221ef4372..a79962eaa 100644 --- a/os_brick/initiator/linuxscsi.py +++ b/os_brick/initiator/linuxscsi.py @@ -157,8 +157,13 @@ class LinuxSCSI(executor.Executor): try: if execute is None: execute = priv_rootwrap.execute - execute('multipathd', 'show', 'status', - run_as_root=True, root_helper=root_helper) + cmd = ('multipathd', 'show', 'status') + out, _err = execute(*cmd, run_as_root=True, + root_helper=root_helper) + # There was a bug in multipathd where it didn't return an error + # 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}) diff --git a/os_brick/tests/initiator/test_connector.py b/os_brick/tests/initiator/test_connector.py index 8ef29b574..c90d00f66 100644 --- a/os_brick/tests/initiator/test_connector.py +++ b/os_brick/tests/initiator/test_connector.py @@ -89,7 +89,7 @@ class ConnectorUtilsTestCase(test_base.TestCase): def test_brick_get_connector_properties(self): self._test_brick_get_connector_properties(False, False, False) - @mock.patch.object(priv_rootwrap, 'execute') + @mock.patch.object(priv_rootwrap, 'execute', return_value=('', '')) def test_brick_get_connector_properties_multipath(self, mock_execute): self._test_brick_get_connector_properties(True, True, True) mock_execute.assert_called_once_with('multipathd', 'show', 'status', @@ -149,7 +149,7 @@ class ConnectorTestCase(test_base.TestCase): def test_get_connector_properties(self): with mock.patch.object(priv_rootwrap, 'execute') as mock_exec: - mock_exec.return_value = True + mock_exec.return_value = ('', '') multipath = True enforce_multipath = True props = base.BaseLinuxConnector.get_connector_properties( diff --git a/os_brick/tests/initiator/test_linuxscsi.py b/os_brick/tests/initiator/test_linuxscsi.py index 96ab0da3f..9f02a7239 100644 --- a/os_brick/tests/initiator/test_linuxscsi.py +++ b/os_brick/tests/initiator/test_linuxscsi.py @@ -19,6 +19,7 @@ import time import ddt import mock +from oslo_concurrency import processutils as putils from oslo_log import log as logging from os_brick import exception @@ -829,12 +830,20 @@ loop0 0""" expected = 13 self.assertEqual(expected, result) - @mock.patch('os_brick.privileged.rootwrap') - def test_is_multipath_running_default_executor(self, mock_rootwrap): - self.assertTrue( - linuxscsi.LinuxSCSI.is_multipath_running( - False, None, mock_rootwrap.execute)) - mock_rootwrap.execute.assert_called_once_with( + @mock.patch('os_brick.privileged.rootwrap.execute', return_value=('', '')) + def test_is_multipath_running_default_executor(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('os_brick.privileged.rootwrap.execute') + def test_is_multipath_running_failure_exit_code_0(self, mock_exec): + 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.patch('glob.glob')