Skip to content

Commit

Permalink
ansible: avoid roundtrip in copy action due to fixup_perms2().
Browse files Browse the repository at this point in the history
On top of existing temporary files work, this reduces the number of
roundtrips required for "copy" and "template" actions from 6 to 3.
  • Loading branch information
dw committed Aug 20, 2018
1 parent e18396d commit 084c0ac
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 3 deletions.
7 changes: 6 additions & 1 deletion ansible_mitogen/mixins.py
Expand Up @@ -216,6 +216,11 @@ def _transfer_data(self, remote_path, data):
self._connection.put_data(remote_path, data)
return remote_path

#: Actions listed here cause :func:`_fixup_perms2` to avoid a needless
#: roundtrip, as they modify file modes separately afterwards. This is due
#: to the method prototype having a default of `execute=True`.
FIXUP_PERMS_RED_HERRING = set(['copy'])

def _fixup_perms2(self, remote_paths, remote_user=None, execute=True):
"""
Mitogen always executes ActionBase helper methods in the context of the
Expand All @@ -224,7 +229,7 @@ def _fixup_perms2(self, remote_paths, remote_user=None, execute=True):
"""
LOG.debug('_fixup_perms2(%r, remote_user=%r, execute=%r)',
remote_paths, remote_user, execute)
if execute:
if execute and self._load_name not in self.FIXUP_PERMS_RED_HERRING:
return self._remote_chmod(remote_paths, mode='u+x')
return self.COMMAND_RESULT.copy()

Expand Down
5 changes: 3 additions & 2 deletions tests/ansible/integration/action/all.yml
@@ -1,5 +1,6 @@
- import_playbook: remote_file_exists.yml
- import_playbook: remote_expand_user.yml
- import_playbook: fixup_perms2__copy.yml
- import_playbook: low_level_execute_command.yml
- import_playbook: make_tmp_path.yml
- import_playbook: remote_expand_user.yml
- import_playbook: remote_file_exists.yml
- import_playbook: transfer_data.yml
104 changes: 104 additions & 0 deletions tests/ansible/integration/action/fixup_perms2__copy.yml
@@ -0,0 +1,104 @@
# Verify action plugins still set file modes correctly even though
# fixup_perms2() avoids setting execute bit despite being asked to.

- name: integration/action/fixup_perms2__copy.yml
hosts: test-targets
any_errors_fatal: true
tasks:
- name: Get default remote file mode
shell: python -c 'import os; print("%04o" % (int("0666", 8) & ~os.umask(0)))'
register: py_umask

- name: Set default file mode
set_fact:
mode: "{{py_umask.stdout}}"

#
# copy module (no mode).
#

- name: "Copy files (no mode)"
copy:
content: ""
dest: /tmp/copy-no-mode

- stat: path=/tmp/copy-no-mode
register: out
- assert:
that:
- out.stat.mode == mode

#
# copy module (explicit mode).
#

- name: "Copy files from content: arg"
copy:
content: ""
mode: 0400
dest: /tmp/copy-with-mode

- stat: path=/tmp/copy-with-mode
register: out
- assert:
that:
- out.stat.mode == "0400"

#
# copy module (existing disk files, no mode).
#

- file:
path: /tmp/weird-mode
state: absent

- name: Create local test file.
connection: local
copy:
content: "weird mode"
dest: "/tmp/weird-mode"
mode: "1462"

- copy:
src: "/tmp/weird-mode"
dest: "/tmp/weird-mode"

- stat:
path: "/tmp/weird-mode"
register: out
- assert:
that:
- out.stat.mode == mode

#
# copy module (existing disk files, preserve mode).
#

- copy:
src: "/tmp/weird-mode"
dest: "/tmp/weird-mode"
mode: preserve

- stat:
path: "/tmp/weird-mode"
register: out
- assert:
that:
- out.stat.mode == "1462"

#
# copy module (existing disk files, explicit mode).
#

- copy:
src: "/tmp/weird-mode"
dest: "/tmp/weird-mode"
mode: "1461"

- stat:
path: "/tmp/weird-mode"
register: out

- assert:
that:
- out.stat.mode == "1461"

0 comments on commit 084c0ac

Please sign in to comment.