salt/tests/integration/modules/cmdmod.py

251 lines
8.0 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
# Import python libs
from __future__ import absolute_import
2012-03-27 23:05:38 +00:00
import os
import sys
import tempfile
2013-03-03 06:55:19 +00:00
# Import Salt Testing libs
from salttesting import skipIf
2014-05-20 09:53:47 +00:00
from salttesting.helpers import ensure_in_syspath, skip_if_binaries_missing
from salttesting.mock import NO_MOCK, NO_MOCK_REASON, Mock, patch
ensure_in_syspath('../../')
# Import salt libs
import integration
import salt.utils
AVAILABLE_PYTHON_EXECUTABLE = salt.utils.which_bin([
'python',
'python2',
'python2.6',
'python2.7'
])
2012-03-27 23:05:38 +00:00
@skipIf(NO_MOCK, NO_MOCK_REASON)
2012-03-27 23:05:38 +00:00
class CMDModuleTest(integration.ModuleCase):
'''
Validate the cmd module
'''
def test_run(self):
'''
cmd.run
'''
2013-08-10 18:14:10 +00:00
shell = os.environ.get('SHELL')
if shell is None:
# Failed to get the SHELL var, don't run
2013-08-10 18:50:31 +00:00
self.skipTest('Unable to get the SHELL environment variable')
2012-03-27 23:05:38 +00:00
self.assertTrue(self.run_function('cmd.run', ['echo $SHELL']))
self.assertEqual(
2013-03-21 22:22:29 +00:00
self.run_function('cmd.run',
['echo $SHELL',
2015-02-23 22:04:43 +00:00
'shell={0}'.format(shell)],
python_shell=True).rstrip(), shell)
self.assertEqual(self.run_function('cmd.run',
['ls / | grep etc'],
python_shell=True), 'etc')
self.assertEqual(self.run_function('cmd.run',
['echo {{grains.id}} | awk "{print $1}"'],
template='jinja',
python_shell=True), 'minion')
self.assertEqual(self.run_function('cmd.run',
['grep f'],
stdin='one\ntwo\nthree\nfour\nfive\n'), 'four\nfive')
self.assertEqual(self.run_function('cmd.run',
['echo "a=b" | sed -e s/=/:/g'],
python_shell=True), 'a:b')
2012-03-27 23:05:38 +00:00
@patch('pwd.getpwnam')
@patch('subprocess.Popen')
2013-12-14 00:40:34 +00:00
def test_os_environment_remains_intact(self,
popen_mock,
getpwnam_mock):
2013-03-03 06:55:19 +00:00
'''
2013-03-21 22:22:29 +00:00
Make sure the OS environment is not tainted after running a command
that specifies runas.
2013-03-03 06:55:19 +00:00
'''
environment = os.environ.copy()
popen_mock.return_value = Mock(
communicate=lambda *args, **kwags: ['{}', None],
pid=lambda: 1,
retcode=0
)
2013-03-03 06:55:19 +00:00
from salt.modules import cmdmod
2013-03-03 06:55:19 +00:00
cmdmod.__grains__ = {'os': 'darwin'}
2014-09-04 08:23:59 +00:00
if sys.platform.startswith(('freebsd', 'openbsd')):
shell = '/bin/sh'
else:
shell = '/bin/bash'
2013-03-21 22:22:29 +00:00
try:
cmdmod._run('ls',
2013-03-21 22:22:29 +00:00
cwd=tempfile.gettempdir(),
runas='foobar',
shell=shell)
2013-03-21 22:15:26 +00:00
2013-03-21 22:22:29 +00:00
environment2 = os.environ.copy()
2013-03-21 22:15:26 +00:00
2013-10-24 09:42:52 +00:00
self.assertEqual(environment, environment2)
2013-03-21 22:15:26 +00:00
2013-03-21 22:22:29 +00:00
getpwnam_mock.assert_called_with('foobar')
finally:
delattr(cmdmod, '__grains__')
2013-03-03 06:55:19 +00:00
2012-03-27 23:05:38 +00:00
def test_stdout(self):
'''
cmd.run_stdout
'''
2013-03-21 22:22:29 +00:00
self.assertEqual(self.run_function('cmd.run_stdout',
['echo "cheese"']).rstrip(),
'cheese')
2012-03-27 23:05:38 +00:00
def test_stderr(self):
'''
cmd.run_stderr
'''
2014-09-04 08:23:59 +00:00
if sys.platform.startswith(('freebsd', 'openbsd')):
shell = '/bin/sh'
else:
shell = '/bin/bash'
2013-03-21 22:22:29 +00:00
self.assertEqual(self.run_function('cmd.run_stderr',
['echo "cheese" 1>&2',
2014-12-23 20:02:56 +00:00
'shell={0}'.format(shell)], python_shell=True
).rstrip(),
2013-03-21 22:22:29 +00:00
'cheese')
2012-03-27 23:05:38 +00:00
def test_run_all(self):
'''
cmd.run_all
'''
from six import string_types
2014-09-04 08:23:59 +00:00
if sys.platform.startswith(('freebsd', 'openbsd')):
shell = '/bin/sh'
else:
shell = '/bin/bash'
ret = self.run_function('cmd.run_all', ['echo "cheese" 1>&2',
2014-12-23 20:02:56 +00:00
'shell={0}'.format(shell)], python_shell=True)
2012-03-27 23:05:38 +00:00
self.assertTrue('pid' in ret)
self.assertTrue('retcode' in ret)
self.assertTrue('stdout' in ret)
self.assertTrue('stderr' in ret)
self.assertTrue(isinstance(ret.get('pid'), int))
self.assertTrue(isinstance(ret.get('retcode'), int))
2012-06-04 22:40:34 +00:00
self.assertTrue(isinstance(ret.get('stdout'), string_types))
self.assertTrue(isinstance(ret.get('stderr'), string_types))
self.assertEqual(ret.get('stderr').rstrip(), 'cheese')
2012-03-27 23:05:38 +00:00
def test_retcode(self):
'''
cmd.retcode
'''
2014-12-23 20:02:56 +00:00
self.assertEqual(self.run_function('cmd.retcode', ['exit 0'], python_shell=True), 0)
self.assertEqual(self.run_function('cmd.retcode', ['exit 1'], python_shell=True), 1)
2012-03-27 23:05:38 +00:00
@skip_if_binaries_missing(['which'])
2012-03-27 23:05:38 +00:00
def test_which(self):
'''
cmd.which
'''
2013-03-21 22:22:29 +00:00
self.assertEqual(self.run_function('cmd.which', ['cat']).rstrip(),
self.run_function('cmd.run', ['which cat']).rstrip())
2012-03-27 23:05:38 +00:00
def test_has_exec(self):
'''
cmd.has_exec
'''
self.assertTrue(self.run_function('cmd.has_exec',
[AVAILABLE_PYTHON_EXECUTABLE]))
2013-03-21 22:22:29 +00:00
self.assertFalse(self.run_function('cmd.has_exec',
['alllfsdfnwieulrrh9123857ygf']))
2012-03-27 23:05:38 +00:00
def test_exec_code(self):
'''
cmd.exec_code
'''
code = '''
import sys
sys.stdout.write('cheese')
'''
2013-03-21 22:22:29 +00:00
self.assertEqual(self.run_function('cmd.exec_code',
[AVAILABLE_PYTHON_EXECUTABLE,
code]).rstrip(),
2013-03-21 22:22:29 +00:00
'cheese')
def test_quotes(self):
'''
cmd.run with quoted command
'''
cmd = '''echo 'SELECT * FROM foo WHERE bar="baz"' '''
expected_result = 'SELECT * FROM foo WHERE bar="baz"'
result = self.run_function('cmd.run_stdout', [cmd]).strip()
self.assertEqual(result, expected_result)
2013-04-30 17:32:21 +00:00
@skipIf(os.geteuid() != 0, 'you must be root to run this test')
def test_quotes_runas(self):
'''
cmd.run with quoted command
'''
cmd = '''echo 'SELECT * FROM foo WHERE bar="baz"' '''
expected_result = 'SELECT * FROM foo WHERE bar="baz"'
try:
2013-03-21 22:22:29 +00:00
runas = os.getlogin()
except: # pylint: disable=W0702
# On some distros (notably Gentoo) os.getlogin() fails
import pwd
2013-03-21 22:22:29 +00:00
runas = pwd.getpwuid(os.getuid())[0]
result = self.run_function('cmd.run_stdout', [cmd],
runas=runas).strip()
self.assertEqual(result, expected_result)
def test_timeout(self):
'''
cmd.run trigger timeout
'''
2015-01-04 04:44:09 +00:00
out = self.run_function('cmd.run', ['sleep 2 && echo hello', 'timeout=1'])
2014-12-23 20:02:56 +00:00
self.assertTrue(
'Timed out' in self.run_function(
2014-12-23 20:02:56 +00:00
'cmd.run', ['sleep 2 && echo hello', 'timeout=1'], python_shell=True))
def test_timeout_success(self):
'''
cmd.run sufficient timeout to succeed
'''
self.assertTrue(
'hello' == self.run_function(
2014-12-23 20:02:56 +00:00
'cmd.run', ['sleep 1 && echo hello', 'timeout=2'], python_shell=True))
def test_run_cwd_doesnt_exist_issue_7154(self):
'''
2013-09-11 03:03:35 +00:00
cmd.run should fail and raise
salt.exceptions.CommandExecutionError if the cwd dir does not
exist
'''
from salt.exceptions import CommandExecutionError
import salt.modules.cmdmod as cmdmod
cmd = 'echo OHAI'
cwd = '/path/to/nowhere'
try:
cmdmod.run_all(cmd, cwd=cwd)
except CommandExecutionError:
pass
else:
raise RuntimeError
if __name__ == '__main__':
from integration import run_tests
run_tests(CMDModuleTest)