summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenno Joy <benno@ansible.com>2015-05-14 09:03:50 +0530
committerBenno Joy <benno@ansible.com>2015-05-14 09:03:50 +0530
commited62de6d3c0d08811c7c58f3a2567d6b716ec700 (patch)
tree0e180320bc079538dfafcb949a2b3310c2fba1bf
parent74351490f77ba42ee6d29640a7ac5e9adeaaa7ad (diff)
downloadansible-modules-core-ed62de6d3c0d08811c7c58f3a2567d6b716ec700.tar.gz
Fixes issue 1197 for s3 module, where the file gets downloaded even if checksums match
-rw-r--r--cloud/amazon/s3.py32
1 files changed, 20 insertions, 12 deletions
diff --git a/cloud/amazon/s3.py b/cloud/amazon/s3.py
index 54288ad8..fddf3698 100644
--- a/cloud/amazon/s3.py
+++ b/cloud/amazon/s3.py
@@ -50,9 +50,9 @@ options:
version_added: "1.3"
overwrite:
description:
- - Force overwrite either locally on the filesystem or remotely with the object/key. Used with PUT and GET operations.
+ - Force overwrite either locally on the filesystem or remotely with the object/key. Used with PUT and GET operations. Starting with (v2.0) the valid values for this parameter are (always, never, different) and boolean is still accepted for backward compatibility, If the value set to (different) the file would be uploaded/downloaded only if the checksums are different.
required: false
- default: true
+ default: always
version_added: "1.2"
mode:
description:
@@ -105,6 +105,9 @@ EXAMPLES = '''
# Delete a bucket and all contents
- s3: bucket=mybucket mode=delete
+
+# GET an object but dont download if the file checksums match
+- s3: bucket=mybucket object=/my/desired/key.txt dest=/usr/local/myfile.txt mode=get overwrite=different
'''
import os
@@ -120,7 +123,6 @@ try:
except ImportError:
HAS_BOTO = False
-
def key_check(module, s3, bucket, obj):
try:
bucket = s3.lookup(bucket)
@@ -273,8 +275,8 @@ def main():
mode = dict(choices=['get', 'put', 'delete', 'create', 'geturl', 'getstr'], required=True),
expiry = dict(default=600, aliases=['expiration']),
s3_url = dict(aliases=['S3_URL']),
- overwrite = dict(aliases=['force'], default=True, type='bool'),
- metadata = dict(type='dict'),
+ overwrite = dict(aliases=['force'], default='always'),
+ metadata = dict(type='dict'),
),
)
module = AnsibleModule(argument_spec=argument_spec)
@@ -293,6 +295,12 @@ def main():
overwrite = module.params.get('overwrite')
metadata = module.params.get('metadata')
+ if overwrite not in ['always', 'never', 'different']:
+ if module.boolean(overwrite):
+ overwrite = 'always'
+ else:
+ overwrite='never'
+
region, ec2_url, aws_connect_kwargs = get_aws_connection_info(module)
if region in ('us-east-1', '', None):
@@ -363,23 +371,23 @@ def main():
md5_local = hashlib.md5(open(dest, 'rb').read()).hexdigest()
if md5_local == md5_remote:
sum_matches = True
- if overwrite is True:
+ if overwrite == 'always':
download_s3file(module, s3, bucket, obj, dest)
else:
- module.exit_json(msg="Local and remote object are identical, ignoring. Use overwrite parameter to force.", changed=False)
+ module.exit_json(msg="Local and remote object are identical, ignoring. Use overwrite=always parameter to force.", changed=False)
else:
sum_matches = False
- if overwrite is True:
+ if overwrite in ('always', 'different'):
download_s3file(module, s3, bucket, obj, dest)
else:
module.exit_json(msg="WARNING: Checksums do not match. Use overwrite parameter to force download.")
# Firstly, if key_matches is TRUE and overwrite is not enabled, we EXIT with a helpful message.
- if sum_matches is True and overwrite is False:
+ if sum_matches is True and overwrite == 'never':
module.exit_json(msg="Local and remote object are identical, ignoring. Use overwrite parameter to force.", changed=False)
# At this point explicitly define the overwrite condition.
- if sum_matches is True and pathrtn is True and overwrite is True:
+ if sum_matches is True and pathrtn is True and overwrite == 'always':
download_s3file(module, s3, bucket, obj, dest)
# If sum does not match but the destination exists, we
@@ -407,13 +415,13 @@ def main():
md5_local = hashlib.md5(open(src, 'rb').read()).hexdigest()
if md5_local == md5_remote:
sum_matches = True
- if overwrite is True:
+ if overwrite == 'always':
upload_s3file(module, s3, bucket, obj, src, expiry, metadata)
else:
get_download_url(module, s3, bucket, obj, expiry, changed=False)
else:
sum_matches = False
- if overwrite is True:
+ if overwrite in ('always', 'different'):
upload_s3file(module, s3, bucket, obj, src, expiry, metadata)
else:
module.exit_json(msg="WARNING: Checksums do not match. Use overwrite parameter to force upload.")