From 87055995b992efe655b31120bbb7d8d806d849b9 Mon Sep 17 00:00:00 2001
From: Lorin Hochstein <lorin@nimbisservices.com>
Date: Wed, 16 Oct 2013 13:19:01 -0400
Subject: [PATCH] s3: better check for walrus

Check for Walrus endpoint by looking to see if the endpoint is not AWS.

This fixes a bug where the user specifies an AWS endpoint via S3_URL,
but the code interprets it as Walrus and then fails.
---
 cloud/s3 | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/cloud/s3 b/cloud/s3
index b535bb354d9..36ddd6ef800 100644
--- a/cloud/s3
+++ b/cloud/s3
@@ -238,6 +238,16 @@ 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_walrus(s3_url):
+    """ Return True if it's Walrus endpoint, not S3
+
+    We assume anything other than *.amazonaws.com is Walrus"""
+    if s3_url is not None:
+        o = urlparse.urlparse(s3_url)
+        return not o.hostname.endswith('amazonaws.com')
+    else:
+        return False
+
 def main():
     module = AnsibleModule(
         argument_spec = dict(
@@ -286,7 +296,7 @@ def main():
             aws_access_key = os.environ['EC2_ACCESS_KEY']
 
     # If we have an S3_URL env var set, this is likely to be Walrus, so change connection method
-    if 'S3_URL' in os.environ:
+    if is_walrus(s3_url):
         try:
             walrus = urlparse.urlparse(s3_url).hostname
             s3 = boto.connect_walrus(walrus, aws_access_key, aws_secret_key)