Return error if cwd directory does not exist (#72390)
* Return warning or error if cwd directory does not exist, in AnsibleModule.run_command()
This commit is contained in:
parent
01d207a3e3
commit
5654de6fce
3 changed files with 25 additions and 9 deletions
2
changelogs/fragments/run-command-cwd.yml
Normal file
2
changelogs/fragments/run-command-cwd.yml
Normal file
|
@ -0,0 +1,2 @@
|
|||
bugfixes:
|
||||
- AnsibleModule - added arg ``ignore_invalid_cwd`` to ``AnsibleModule.run_command()``, to control its behaviour when ``cwd`` is invalid. (https://github.com/ansible/ansible/pull/72390)
|
|
@ -2521,7 +2521,7 @@ class AnsibleModule(object):
|
|||
|
||||
def run_command(self, args, check_rc=False, close_fds=True, executable=None, data=None, binary_data=False, path_prefix=None, cwd=None,
|
||||
use_unsafe_shell=False, prompt_regex=None, environ_update=None, umask=None, encoding='utf-8', errors='surrogate_or_strict',
|
||||
expand_user_and_vars=True, pass_fds=None, before_communicate_callback=None):
|
||||
expand_user_and_vars=True, pass_fds=None, before_communicate_callback=None, ignore_invalid_cwd=True):
|
||||
'''
|
||||
Execute a command, returns rc, stdout, and stderr.
|
||||
|
||||
|
@ -2572,6 +2572,9 @@ class AnsibleModule(object):
|
|||
after ``Popen`` object will be created
|
||||
but before communicating to the process.
|
||||
(``Popen`` object will be passed to callback as a first argument)
|
||||
:kw ignore_invalid_cwd: This flag indicates whether an invalid ``cwd``
|
||||
(non-existent or not a directory) should be ignored or should raise
|
||||
an exception.
|
||||
:returns: A 3-tuple of return code (integer), stdout (native string),
|
||||
and stderr (native string). On python2, stdout and stderr are both
|
||||
byte strings. On python3, stdout and stderr are text strings converted
|
||||
|
@ -2685,14 +2688,17 @@ class AnsibleModule(object):
|
|||
prev_dir = os.getcwd()
|
||||
|
||||
# make sure we're in the right working directory
|
||||
if cwd and os.path.isdir(cwd):
|
||||
cwd = to_bytes(os.path.abspath(os.path.expanduser(cwd)), errors='surrogate_or_strict')
|
||||
kwargs['cwd'] = cwd
|
||||
try:
|
||||
os.chdir(cwd)
|
||||
except (OSError, IOError) as e:
|
||||
self.fail_json(rc=e.errno, msg="Could not open %s, %s" % (cwd, to_native(e)),
|
||||
exception=traceback.format_exc())
|
||||
if cwd:
|
||||
if os.path.isdir(cwd):
|
||||
cwd = to_bytes(os.path.abspath(os.path.expanduser(cwd)), errors='surrogate_or_strict')
|
||||
kwargs['cwd'] = cwd
|
||||
try:
|
||||
os.chdir(cwd)
|
||||
except (OSError, IOError) as e:
|
||||
self.fail_json(rc=e.errno, msg="Could not chdir to %s, %s" % (cwd, to_native(e)),
|
||||
exception=traceback.format_exc())
|
||||
elif not ignore_invalid_cwd:
|
||||
self.fail_json(msg="Provided cwd is not a valid directory: %s" % cwd)
|
||||
|
||||
old_umask = None
|
||||
if umask:
|
||||
|
|
|
@ -180,6 +180,14 @@ class TestRunCommandCwd:
|
|||
rc_am.run_command('/bin/ls', cwd='/not-a-dir')
|
||||
assert rc_am._os.chdir.mock_calls == [mocker.call('/old'), ]
|
||||
|
||||
@pytest.mark.parametrize('stdin', [{}], indirect=['stdin'])
|
||||
def test_cwd_not_a_dir_noignore(self, rc_am):
|
||||
rc_am._os.getcwd.return_value = '/old'
|
||||
rc_am._os.path.isdir.side_effect = lambda d: d != '/not-a-dir'
|
||||
with pytest.raises(SystemExit):
|
||||
rc_am.run_command('/bin/ls', cwd='/not-a-dir', ignore_invalid_cwd=False)
|
||||
assert rc_am.fail_json.called
|
||||
|
||||
|
||||
class TestRunCommandPrompt:
|
||||
@pytest.mark.parametrize('stdin', [{}], indirect=['stdin'])
|
||||
|
|
Loading…
Reference in a new issue