Take a remote md5sum before a file transfer to decide whether to transfer the file or not.

Allows for efficient transfer of large files.  Templates do not sample first because they are small.
This commit is contained in:
Michael DeHaan 2012-07-07 09:10:18 -04:00
parent 9cefd8f04f
commit d8999800d1

View file

@ -430,16 +430,26 @@ class Runner(object):
break
if not found:
results=dict(failed=True, msg="could not find src in first_available_file list")
return ReturnData(host=conn.host, is_error=True, results=results)
return ReturnData(host=conn.host, results=results)
if self.module_vars is not None:
inject.update(self.module_vars)
source = utils.template(source, inject, self.setup_cache)
source = utils.path_dwim(self.basedir, source)
local_md5 = utils.local_md5(source)
if local_md5 is None:
result=dict(failed=True, msg="could not find src=%s" % source)
return ReturnData(host=conn.host, result=result)
remote_md5 = self._remote_md5(conn, tmp, dest)
exec_rc = None
if local_md5 != remote_md5:
# transfer the file to a remote tmp location
tmp_src = tmp + source.split('/')[-1]
conn.put_file(utils.path_dwim(self.basedir, source), tmp_src)
conn.put_file(source, tmp_src)
# install the copy module
self.module_name = 'copy'
@ -448,6 +458,10 @@ class Runner(object):
# run the copy module
args = "src=%s dest=%s" % (tmp_src, dest)
exec_rc = self._execute_module(conn, tmp, module, args)
else:
# no need to transfer the file, already correct md5
result = dict(changed=False, md5sum=remote_md5, transferred=False)
exec_rc = ReturnData(host=conn.host, result=result)
if exec_rc.is_successful():
return self._chain_file_module(conn, tmp, exec_rc, options)