Fixes for mode=preserve (#39343)

* Fixes for mode=preserve

* Document mode=preserve for template and copy
* Make mode=preserve work with remote_src for copy
* Make mode=preserve work for template
* Integration tests for copy & template mode=preserve

Fixes #39279

* Changed mode option in win_copy to hidden option as it doesn't reflect copy mode
This commit is contained in:
Toshio Kuratomi 2018-04-26 07:14:37 -07:00 committed by GitHub
parent 33f358383a
commit 83c1cba511
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 104 additions and 11 deletions

View file

@ -19,6 +19,7 @@ __metaclass__ = type
import os
import shutil
import stat
import tempfile
from ansible import constants as C
@ -105,6 +106,10 @@ class ActionModule(ActionBase):
except AnsibleError as e:
raise AnsibleActionFail(to_text(e))
mode = self._task.args.get('mode', None)
if mode == 'preserve':
mode = '0%03o' % stat.S_IMODE(os.stat(source).st_mode)
# Get vault decrypted tmp file
try:
tmp_source = self._loader.get_real_file(source)
@ -157,6 +162,9 @@ class ActionModule(ActionBase):
self._loader.cleanup_tmp_file(tmp_source)
new_task = self._task.copy()
# mode is either the mode from task.args or the mode of the source file if the task.args
# mode == 'preserve'
new_task.args['mode'] = mode
new_task.args.pop('newline_sequence', None)
new_task.args.pop('block_start_string', None)
new_task.args.pop('block_end_string', None)

View file

@ -275,7 +275,7 @@ class ActionModule(ActionBase):
dest=dest,
src=tmp_src,
original_basename=source_rel,
mode="single"
_copy_mode="single"
)
)
copy_args.pop('content', None)
@ -317,7 +317,7 @@ class ActionModule(ActionBase):
dict(
src=tmp_src,
dest=dest,
mode="explode"
_copy_mode="explode"
)
)
copy_args.pop('content', None)
@ -380,7 +380,7 @@ class ActionModule(ActionBase):
new_module_args = self._task.args.copy()
new_module_args.update(
dict(
mode="remote",
_copy_mode="remote",
dest=dest,
src=source,
force=force
@ -467,7 +467,7 @@ class ActionModule(ActionBase):
query_args = self._task.args.copy()
query_args.update(
dict(
mode="query",
_copy_mode="query",
dest=check_dest,
force=force,
files=source_files['files'],