m = _("\nCommand: %(cmd)s\nExit code: %(code)s\nStdout: %(stdout)r\n"
"Stderr: %(stderr)r") % {'cmd': cmd, 'code': obj.returncode,
'stdout': _stdout, 'stderr': _stderr}
- LOG.debug(m)
- if obj.returncode and check_exit_code:
- raise RuntimeError(m)
+ if obj.returncode:
+ LOG.error(m)
+ if check_exit_code:
+ raise RuntimeError(m)
+ else:
+ LOG.debug(m)
finally:
# NOTE(termie): this appears to be necessary to let the subprocess
# call clean something up in between calls, without
from neutron.tests import base
+class FakeCreateProcess(object):
+ class FakeStdin(object):
+ def close(self):
+ pass
+
+ def __init__(self, returncode):
+ self.returncode = returncode
+ self.stdin = self.FakeStdin()
+
+ def communicate(self, process_input=None):
+ return '', ''
+
+
class AgentUtilsExecuteTest(base.BaseTestCase):
def setUp(self):
super(AgentUtilsExecuteTest, self).setUp()
addl_env={'foo': 'bar'})
self.assertEqual(result, expected)
+ def test_return_code_log_error_raise_runtime(self):
+ with mock.patch.object(utils, 'create_process') as create_process:
+ create_process.return_value = FakeCreateProcess(1), 'ls'
+ with mock.patch.object(utils, 'LOG') as log:
+ self.assertRaises(RuntimeError, utils.execute,
+ ['ls'])
+ self.assertTrue(log.error.called)
+
+ def test_return_code_log_error_no_raise_runtime(self):
+ with mock.patch.object(utils, 'create_process') as create_process:
+ create_process.return_value = FakeCreateProcess(1), 'ls'
+ with mock.patch.object(utils, 'LOG') as log:
+ utils.execute(['ls'], check_exit_code=False)
+ self.assertTrue(log.error.called)
+
+ def test_return_code_log_debug(self):
+ with mock.patch.object(utils, 'create_process') as create_process:
+ create_process.return_value = FakeCreateProcess(0), 'ls'
+ with mock.patch.object(utils, 'LOG') as log:
+ utils.execute(['ls'])
+ self.assertTrue(log.debug.called)
+
class AgentUtilsGetInterfaceMAC(base.BaseTestCase):
def test_get_interface_mac(self):