diff --git a/changelogs/fragments/file_modification_times_support_check_mode.yml b/changelogs/fragments/file_modification_times_support_check_mode.yml new file mode 100644 index 00000000000..64600655b83 --- /dev/null +++ b/changelogs/fragments/file_modification_times_support_check_mode.yml @@ -0,0 +1,2 @@ +bugfixes: + - ansible.builtin.file modification_time supports check_mode diff --git a/lib/ansible/modules/file.py b/lib/ansible/modules/file.py index 65b4e6c1eea..44963778583 100644 --- a/lib/ansible/modules/file.py +++ b/lib/ansible/modules/file.py @@ -469,7 +469,8 @@ def update_timestamp_for_file(path, mtime, atime, diff=None): set_time = (atime, mtime) - os.utime(b_path, set_time) + if not module.check_mode: + os.utime(b_path, set_time) if diff is not None: if 'before' not in diff: diff --git a/test/integration/targets/file/tasks/main.yml b/test/integration/targets/file/tasks/main.yml index db56bd2d44c..a74cbc289e5 100644 --- a/test/integration/targets/file/tasks/main.yml +++ b/test/integration/targets/file/tasks/main.yml @@ -52,6 +52,8 @@ - name: Test _diff_peek import_tasks: diff_peek.yml +- name: Test modification time + import_tasks: modification_time.yml # These tests need to be organized by state parameter into separate files later diff --git a/test/integration/targets/file/tasks/modification_time.yml b/test/integration/targets/file/tasks/modification_time.yml new file mode 100644 index 00000000000..daec03627cd --- /dev/null +++ b/test/integration/targets/file/tasks/modification_time.yml @@ -0,0 +1,70 @@ +# file module tests for dealing with modification_time + +- name: Initialize the test output dir + import_tasks: initialize.yml + +- name: Setup the modification time for the tests + set_fact: + modification_timestamp: "202202081414.00" + +- name: Get stat info for the file + stat: + path: "{{ output_file }}" + register: initial_file_stat + +- name: Set a modification time in check_mode + ansible.builtin.file: + path: "{{ output_file }}" + modification_time: "{{ modification_timestamp }}" + modification_time_format: "%Y%m%d%H%M.%S" + check_mode: true + register: file_change_check_mode + +- name: Re-stat the file + stat: + path: "{{ output_file }}" + register: check_mode_stat + +- name: Confirm check_mode did not change the file + assert: + that: + - initial_file_stat.stat.mtime == check_mode_stat.stat.mtime + # Ensure the changed flag was set + - file_change_check_mode.changed + # Ensure the diff is present + # Note: file diff always contains the path + - file_change_check_mode.diff.after | length > 1 + +- name: Set a modification time for real + ansible.builtin.file: + path: "{{ output_file }}" + modification_time: "{{ modification_timestamp }}" + modification_time_format: "%Y%m%d%H%M.%S" + register: file_change_no_check_mode + +- name: Stat of the file after the change + stat: + path: "{{ output_file }}" + register: change_stat + +- name: Confirm the modification time changed + assert: + that: + - initial_file_stat.stat.mtime != change_stat.stat.mtime + - file_change_no_check_mode.changed + # Note: file diff always contains the path + - file_change_no_check_mode.diff.after | length > 1 + +- name: Set a modification time a second time to confirm no changes or diffs + ansible.builtin.file: + path: "{{ output_file }}" + modification_time: "{{ modification_timestamp }}" + modification_time_format: "%Y%m%d%H%M.%S" + register: file_change_no_check_mode_second + +- name: Confirm no changes made registered + assert: + that: + - not file_change_no_check_mode_second.changed + # Note: file diff always contains the path + - file_change_no_check_mode_second.diff.after | length == 1