From 62ef8dfbe02c2d6e8a7729530391409645002612 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Tue, 21 Jan 2014 17:27:50 +0700 Subject: [PATCH] [s3] Compatibility with fakes3. --- library/cloud/s3 | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/library/cloud/s3 b/library/cloud/s3 index 5d2c97baf39..948ddcf58b7 100644 --- a/library/cloud/s3 +++ b/library/cloud/s3 @@ -68,7 +68,7 @@ options: aliases: [] s3_url: description: - - S3 URL endpoint. If not specified then the S3_URL environment variable is used, if that variable is defined. + - S3 URL endpoint. If not specified then the S3_URL environment variable is used, if that variable is defined. Ansible tries to guess if fakes3 (https://github.com/jubos/fake-s3) or Eucalyptus Walrus (https://github.com/eucalyptus/eucalyptus/wiki/Walrus) is used and configure connection accordingly. Current heuristic is: everything with scheme fakes3:// is fakes3, everything else not ending with amazonaws.com is Walrus. default: null aliases: [ S3_URL ] aws_secret_key: @@ -238,6 +238,13 @@ def get_download_url(module, s3, bucket, obj, expiry, changed=True): except s3.provider.storage_response_error, e: module.fail_json(msg= str(e)) +def is_fakes3(s3_url): + """ Return True if s3_url has scheme fakes3:// """ + if s3_url is not None: + return urlparse.urlparse(s3_url).scheme == 'fakes3' + else: + return False + def is_walrus(s3_url): """ Return True if it's Walrus endpoint, not S3 @@ -283,8 +290,22 @@ def main(): if not s3_url and 'S3_URL' in os.environ: s3_url = os.environ['S3_URL'] - # If we have an S3_URL env var set, this is likely to be Walrus, so change connection method - if is_walrus(s3_url): + # Look at s3_url and tweak connection settings + # if connecting to Walrus or fakes3 + if is_fakes3(s3_url): + try: + fakes3 = urlparse.urlparse(s3_url) + from boto.s3.connection import OrdinaryCallingFormat + s3 = boto.connect_s3( + aws_access_key, + aws_secret_key, + is_secure=False, + host=fakes3.hostname, + port=fakes3.port, + calling_format=OrdinaryCallingFormat()) + except boto.exception.NoAuthHandlerFound, e: + module.fail_json(msg = str(e)) + elif is_walrus(s3_url): try: walrus = urlparse.urlparse(s3_url).hostname s3 = boto.connect_walrus(walrus, aws_access_key, aws_secret_key)