Skip to content

Commit

Permalink
Fix for check_mode in archive (ansible#26788)
Browse files Browse the repository at this point in the history
Fix adds check_mode fix for archive module. Also,
adds unit tests for archive module

Fixes: ansible#26750

Signed-off-by: Abhijeet Kasurde <[email protected]>
  • Loading branch information
Akasurde authored and jctanner committed Jul 14, 2017
1 parent 8333a8b commit 156b29b
Show file tree
Hide file tree
Showing 6 changed files with 237 additions and 2 deletions.
5 changes: 3 additions & 2 deletions lib/ansible/modules/files/archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ def main():
module.fail_json(dest=dest, msg='Error deleting some source files: ' + str(e), files=errors)

# Rudimentary check: If size changed then file changed. Not perfect, but easy.
if os.path.getsize(dest) != size:
if not check_mode and os.path.getsize(dest) != size:
changed = True

if len(successes) and state != 'incomplete':
Expand Down Expand Up @@ -405,7 +405,8 @@ def main():
params['path'] = dest
file_args = module.load_file_common_arguments(params)

changed = module.set_fs_attributes_if_different(file_args, changed)
if not check_mode:
changed = module.set_fs_attributes_if_different(file_args, changed)

module.exit_json(archived=successes, dest=dest, changed=changed, state=state, arcroot=arcroot, missing=missing, expanded_paths=expanded_paths)

Expand Down
2 changes: 2 additions & 0 deletions test/integration/targets/archive/aliases
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
needs/root
posix/ci/group2
1 change: 1 addition & 0 deletions test/integration/targets/archive/files/bar.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
bar.txt
1 change: 1 addition & 0 deletions test/integration/targets/archive/files/foo.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
foo.txt
2 changes: 2 additions & 0 deletions test/integration/targets/archive/meta/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
dependencies:
- prepare_tests
228 changes: 228 additions & 0 deletions test/integration/targets/archive/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
# Test code for the archive module.
# (c) 2017, Abhijeet Kasurde <[email protected]>

# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
# Make sure we start fresh

- name: Ensure zip is present to create test archive (yum)
yum: name=zip state=latest
when: ansible_pkg_mgr == 'yum'

- name: Ensure zip is present to create test archive (apt)
apt: name=zip state=latest
when: ansible_pkg_mgr == 'apt'

- name: prep our file
copy: src={{ item }} dest={{output_dir}}/{{ item }}
with_items:
- foo.txt
- bar.txt

- name: archive using gz
archive:
path: "{{ output_dir }}/*.txt"
dest: "{{ output_dir }}/archive_01.gz"
format: gz
register: archive_gz_result_01

- debug: msg="{{ archive_gz_result_01 }}"

- name: verify that the files archived
file: path={{output_dir}}/archive_01.gz state=file

- name: check if gz file exists
assert:
that:
- "{{ archive_gz_result_01.changed }}"
- "{{ 'archived' in archive_gz_result_01 }}"
- "{{ archive_gz_result_01['archived'] | length }} == 2"

- name: archive using zip
archive:
path: "{{ output_dir }}/*.txt"
dest: "{{ output_dir }}/archive_01.zip"
format: zip
register: archive_zip_result_01

- debug: msg="{{ archive_zip_result_01 }}"

- name: verify that the files archived
file: path={{output_dir}}/archive_01.zip state=file

- name: check if zip file exists
assert:
that:
- "{{ archive_zip_result_01.changed }}"
- "{{ 'archived' in archive_zip_result_01 }}"
- "{{ archive_zip_result_01['archived'] | length }} == 2"

- name: archive using bz2
archive:
path: "{{ output_dir }}/*.txt"
dest: "{{ output_dir }}/archive_01.bz2"
format: bz2
register: archive_bz2_result_01

- debug: msg="{{ archive_bz2_result_01 }}"

- name: verify that the files archived
file: path={{output_dir}}/archive_01.bz2 state=file

- name: check if zip file exists
assert:
that:
- "{{ archive_bz2_result_01.changed }}"
- "{{ 'archived' in archive_bz2_result_01 }}"
- "{{ archive_bz2_result_01['archived'] | length }} == 2"

- name: archive and set mode to 0600
archive:
path: "{{ output_dir }}/*.txt"
dest: "{{ output_dir }}/archive_02.gz"
format: gz
mode: "u+rwX,g-rwx,o-rwx"
register: archive_bz2_result_02

- name: Test that the file modes were changed
stat:
path: "{{ output_dir }}/archive_02.gz"
register: archive_02_gz_stat

- debug: msg="{{ archive_02_gz_stat}}"

- name: Test that the file modes were changed
assert:
that:
- "archive_02_gz_stat.changed == False "
- "archive_02_gz_stat.stat.mode == '0600'"
- "'archived' in archive_bz2_result_02"
- "{{ archive_bz2_result_02['archived']| length}} == 2"

- name: remove our gz
file: path="{{ output_dir }}/archive_02.gz" state=absent


- name: archive and set mode to 0600
archive:
path: "{{ output_dir }}/*.txt"
dest: "{{ output_dir }}/archive_02.zip"
format: zip
mode: "u+rwX,g-rwx,o-rwx"
register: archive_zip_result_02

- name: Test that the file modes were changed
stat:
path: "{{ output_dir }}/archive_02.zip"
register: archive_02_zip_stat

- name: Test that the file modes were changed
assert:
that:
- "archive_02_zip_stat.changed == False"
- "archive_02_zip_stat.stat.mode == '0600'"
- "'archived' in archive_zip_result_02"
- "{{ archive_zip_result_02['archived']| length}} == 2"

- name: remove our zip
file: path="{{ output_dir }}/archive_02.zip" state=absent


- name: archive and set mode to 0600
archive:
path: "{{ output_dir }}/*.txt"
dest: "{{ output_dir }}/archive_02.bz2"
format: bz2
mode: "u+rwX,g-rwx,o-rwx"
register: archive_bz2_result_02

- name: Test that the file modes were changed
stat:
path: "{{ output_dir }}/archive_02.bz2"
register: archive_02_bz2_stat

- name: Test that the file modes were changed
assert:
that:
- "archive_02_bz2_stat.changed == False"
- "archive_02_bz2_stat.stat.mode == '0600'"
- "'archived' in archive_bz2_result_02"
- "{{ archive_bz2_result_02['archived']| length}} == 2"

- name: remove our bz2
file: path="{{ output_dir }}/archive_02.bz2" state=absent

- name: test that gz archive that contains non-ascii filenames
archive:
path: "{{ output_dir }}/*.txt"
dest: "{{ output_dir }}/test-archive-nonascii-くらとみ.tar.gz"
format: gz
register: nonascii_result_0

- name: Check that file is really there
stat:
path: "{{ output_dir }}/test-archive-nonascii-くらとみ.tar.gz"
register: nonascii_stat0

- name: Assert that nonascii tests succeeded
assert:
that:
- "nonascii_result_0.changed == true"
- "nonascii_stat0.stat.exists == true"

- name: remove nonascii test
file: path="{{ output_dir }}/test-archive-nonascii-くらとみ.tar.gz" state=absent

- name: test that bz2 archive that contains non-ascii filenames
archive:
path: "{{ output_dir }}/*.txt"
dest: "{{ output_dir }}/test-archive-nonascii-くらとみ.bz2"
format: bz2
register: nonascii_result_1

- name: Check that file is really there
stat:
path: "{{ output_dir }}/test-archive-nonascii-くらとみ.bz2"
register: nonascii_stat_1

- name: Assert that nonascii tests succeeded
assert:
that:
- "nonascii_result_1.changed == true"
- "nonascii_stat_1.stat.exists == true"

- name: remove nonascii test
file: path="{{ output_dir }}/test-archive-nonascii-くらとみ.bz2" state=absent

- name: test that zip archive that contains non-ascii filenames
archive:
path: "{{ output_dir }}/*.txt"
dest: "{{ output_dir }}/test-archive-nonascii-くらとみ.zip"
format: zip
register: nonascii_result_2

- name: Check that file is really there
stat:
path: "{{ output_dir }}/test-archive-nonascii-くらとみ.zip"
register: nonascii_stat_2

- name: Assert that nonascii tests succeeded
assert:
that:
- "nonascii_result_2.changed == true"
- "nonascii_stat_2.stat.exists == true"

- name: remove nonascii test
file: path="{{ output_dir }}/test-archive-nonascii-くらとみ.zip" state=absent

0 comments on commit 156b29b

Please sign in to comment.