summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fontein <felix@fontein.de>2021-06-14 17:38:47 +0200
committerGitHub <noreply@github.com>2021-06-14 10:38:47 -0500
commit25ac5059752f22b7e9faf1c212e5005b82838f87 (patch)
tree4e761a772a27dc2e17a16dc50180c6df483d4cc0
parent93de61a8dab85309fa0e5b2015e25995662af468 (diff)
downloadansible-25ac5059752f22b7e9faf1c212e5005b82838f87.tar.gz
Basic: don't call lstat when check_mode (#64279) (#74883)
While mode is specified in check_mode, don't call lstat. Since file may not present. Fixes: #61185 (cherry picked from commit 7099657dd7279ef2989d601251f46e7407a86fa6) Co-authored-by: Logistic Bot <logistic-bot@protonmail.com>
-rw-r--r--changelogs/fragments/61185-basic.py-fix-check_mode.yaml2
-rw-r--r--lib/ansible/module_utils/basic.py3
-rw-r--r--test/units/module_utils/basic/test_set_mode_if_different.py7
3 files changed, 11 insertions, 1 deletions
diff --git a/changelogs/fragments/61185-basic.py-fix-check_mode.yaml b/changelogs/fragments/61185-basic.py-fix-check_mode.yaml
new file mode 100644
index 0000000000..b05c689b2f
--- /dev/null
+++ b/changelogs/fragments/61185-basic.py-fix-check_mode.yaml
@@ -0,0 +1,2 @@
+bugfixes:
+- AnsibleModule.set_mode_if_different - don't check file existence when check_mode is activated (https://github.com/ansible/ansible/issues/61185).
diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py
index cd2a055334..3810dc22a3 100644
--- a/lib/ansible/module_utils/basic.py
+++ b/lib/ansible/module_utils/basic.py
@@ -882,11 +882,12 @@ class AnsibleModule(object):
b_path = to_bytes(path, errors='surrogate_or_strict')
if expand:
b_path = os.path.expanduser(os.path.expandvars(b_path))
- path_stat = os.lstat(b_path)
if self.check_file_absent_if_check_mode(b_path):
return True
+ path_stat = os.lstat(b_path)
+
if not isinstance(mode, int):
try:
mode = int(mode, 8)
diff --git a/test/units/module_utils/basic/test_set_mode_if_different.py b/test/units/module_utils/basic/test_set_mode_if_different.py
index 93fe2467f1..5fec331c2e 100644
--- a/test/units/module_utils/basic/test_set_mode_if_different.py
+++ b/test/units/module_utils/basic/test_set_mode_if_different.py
@@ -100,6 +100,13 @@ def test_mode_unchanged_when_already_0660(am, mock_stats, mocker, mode, check_mo
assert not m_lchmod.called
+@pytest.mark.parametrize('mode, stdin', product(SYNONYMS_0660, ({},)), indirect=['stdin'])
+def test_mode_changed_to_0660_check_mode_no_file(am, mocker, mode):
+ am.check_mode = True
+ mocker.patch('os.path.exists', return_value=False)
+ assert am.set_mode_if_different('/path/to/file', mode, False)
+
+
@pytest.mark.parametrize('check_mode, stdin',
product((True, False), ({},)),
indirect=['stdin'])