Skip to content
Permalink
Browse files
ansible: avoid roundtrip in copy action due to fixup_perms2().
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 084c0ac06513196d6524add5ce4021b156d06f19
@@ -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
@@ -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()

@@ -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
@@ -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.