Module basic.py to create parent dirs of tmpdir if needed (#40201)
* Module basic.py to create parent dirs of tmpdir if needed * Added warning to dir creation * Assert if make_dirs was called or not in unit tests
This commit is contained in:
parent
5df370243d
commit
5c39c3b2d1
2 changed files with 37 additions and 2 deletions
|
@ -938,6 +938,14 @@ class AnsibleModule(object):
|
|||
# clean it up once finished.
|
||||
if self._tmpdir is None:
|
||||
basedir = os.path.expanduser(os.path.expandvars(self._remote_tmp))
|
||||
if not os.path.exists(basedir):
|
||||
self.warn("Module remote_tmp %s did not exist and was created "
|
||||
"with a mode of 0700, this may cause issues when "
|
||||
"running as another user. To avoid this, create the "
|
||||
"remote_tmp dir with the correct permissions "
|
||||
"manually" % basedir)
|
||||
os.makedirs(basedir, mode=0o700)
|
||||
|
||||
basefile = "ansible-moduletmp-%s-" % time.time()
|
||||
tmpdir = tempfile.mkdtemp(prefix=basefile, dir=basedir)
|
||||
if not self._keep_remote_files:
|
||||
|
|
|
@ -24,6 +24,7 @@ class TestAnsibleModuleTmpDir:
|
|||
"_ansible_remote_tmp": "/path/tmpdir",
|
||||
"_ansible_keep_remote_files": False,
|
||||
},
|
||||
True,
|
||||
"/path/to/dir"
|
||||
),
|
||||
(
|
||||
|
@ -32,6 +33,16 @@ class TestAnsibleModuleTmpDir:
|
|||
"_ansible_remote_tmp": "/path/tmpdir",
|
||||
"_ansible_keep_remote_files": False
|
||||
},
|
||||
False,
|
||||
"/path/tmpdir/ansible-moduletmp-42-"
|
||||
),
|
||||
(
|
||||
{
|
||||
"_ansible_tmpdir": None,
|
||||
"_ansible_remote_tmp": "/path/tmpdir",
|
||||
"_ansible_keep_remote_files": False
|
||||
},
|
||||
True,
|
||||
"/path/tmpdir/ansible-moduletmp-42-"
|
||||
),
|
||||
(
|
||||
|
@ -40,18 +51,31 @@ class TestAnsibleModuleTmpDir:
|
|||
"_ansible_remote_tmp": "$HOME/.test",
|
||||
"_ansible_keep_remote_files": False
|
||||
},
|
||||
False,
|
||||
os.path.join(os.environ['HOME'], ".test/ansible-moduletmp-42-")
|
||||
),
|
||||
)
|
||||
|
||||
# pylint bug: https://github.com/PyCQA/pylint/issues/511
|
||||
# pylint: disable=undefined-variable
|
||||
@pytest.mark.parametrize('stdin, expected', ((s, e) for s, e in DATA),
|
||||
@pytest.mark.parametrize('stdin, expected, stat_exists', ((s, e, t) for s, t, e in DATA),
|
||||
indirect=['stdin'])
|
||||
def test_tmpdir_property(self, am, monkeypatch, expected):
|
||||
def test_tmpdir_property(self, am, monkeypatch, expected, stat_exists):
|
||||
makedirs = {'called': False}
|
||||
|
||||
def mock_mkdtemp(prefix, dir):
|
||||
return os.path.join(dir, prefix)
|
||||
|
||||
def mock_makedirs(path, mode):
|
||||
makedirs['called'] = True
|
||||
expected = os.path.expanduser(os.path.expandvars(am._remote_tmp))
|
||||
assert path == expected
|
||||
assert mode == 0o700
|
||||
return
|
||||
|
||||
monkeypatch.setattr(tempfile, 'mkdtemp', mock_mkdtemp)
|
||||
monkeypatch.setattr(os.path, 'exists', lambda x: stat_exists)
|
||||
monkeypatch.setattr(os, 'makedirs', mock_makedirs)
|
||||
monkeypatch.setattr(shutil, 'rmtree', lambda x: None)
|
||||
|
||||
with patch('time.time', return_value=42):
|
||||
|
@ -60,3 +84,6 @@ class TestAnsibleModuleTmpDir:
|
|||
|
||||
# verify subsequent calls always produces the same tmpdir
|
||||
assert am.tmpdir == actual_tmpdir
|
||||
|
||||
if not stat_exists:
|
||||
assert makedirs['called']
|
||||
|
|
Loading…
Reference in a new issue