mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
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.
|
# clean it up once finished.
|
||||||
if self._tmpdir is None:
|
if self._tmpdir is None:
|
||||||
basedir = os.path.expanduser(os.path.expandvars(self._remote_tmp))
|
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()
|
basefile = "ansible-moduletmp-%s-" % time.time()
|
||||||
tmpdir = tempfile.mkdtemp(prefix=basefile, dir=basedir)
|
tmpdir = tempfile.mkdtemp(prefix=basefile, dir=basedir)
|
||||||
if not self._keep_remote_files:
|
if not self._keep_remote_files:
|
||||||
|
|
|
@ -24,6 +24,7 @@ class TestAnsibleModuleTmpDir:
|
||||||
"_ansible_remote_tmp": "/path/tmpdir",
|
"_ansible_remote_tmp": "/path/tmpdir",
|
||||||
"_ansible_keep_remote_files": False,
|
"_ansible_keep_remote_files": False,
|
||||||
},
|
},
|
||||||
|
True,
|
||||||
"/path/to/dir"
|
"/path/to/dir"
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
@ -32,6 +33,16 @@ class TestAnsibleModuleTmpDir:
|
||||||
"_ansible_remote_tmp": "/path/tmpdir",
|
"_ansible_remote_tmp": "/path/tmpdir",
|
||||||
"_ansible_keep_remote_files": False
|
"_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-"
|
"/path/tmpdir/ansible-moduletmp-42-"
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
@ -40,18 +51,31 @@ class TestAnsibleModuleTmpDir:
|
||||||
"_ansible_remote_tmp": "$HOME/.test",
|
"_ansible_remote_tmp": "$HOME/.test",
|
||||||
"_ansible_keep_remote_files": False
|
"_ansible_keep_remote_files": False
|
||||||
},
|
},
|
||||||
|
False,
|
||||||
os.path.join(os.environ['HOME'], ".test/ansible-moduletmp-42-")
|
os.path.join(os.environ['HOME'], ".test/ansible-moduletmp-42-")
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
# pylint bug: https://github.com/PyCQA/pylint/issues/511
|
# pylint bug: https://github.com/PyCQA/pylint/issues/511
|
||||||
# pylint: disable=undefined-variable
|
# 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'])
|
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):
|
def mock_mkdtemp(prefix, dir):
|
||||||
return os.path.join(dir, prefix)
|
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(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)
|
monkeypatch.setattr(shutil, 'rmtree', lambda x: None)
|
||||||
|
|
||||||
with patch('time.time', return_value=42):
|
with patch('time.time', return_value=42):
|
||||||
|
@ -60,3 +84,6 @@ class TestAnsibleModuleTmpDir:
|
||||||
|
|
||||||
# verify subsequent calls always produces the same tmpdir
|
# verify subsequent calls always produces the same tmpdir
|
||||||
assert am.tmpdir == actual_tmpdir
|
assert am.tmpdir == actual_tmpdir
|
||||||
|
|
||||||
|
if not stat_exists:
|
||||||
|
assert makedirs['called']
|
||||||
|
|
Loading…
Reference in a new issue