浏览代码

HUE-4707 [aws] Enable non-US region support for AWS S3

Jenny Kim 9 年之前
父节点
当前提交
f3eab39
共有 3 个文件被更改,包括 14 次插入3 次删除
  1. 7 1
      desktop/libs/aws/src/aws/client.py
  2. 4 0
      desktop/libs/aws/src/aws/conf.py
  3. 3 2
      desktop/libs/aws/src/aws/s3/s3fs.py

+ 7 - 1
desktop/libs/aws/src/aws/client.py

@@ -18,6 +18,8 @@ from __future__ import absolute_import
 import boto
 import boto.s3
 
+from aws.conf import get_default_region
+
 
 HTTP_SOCKET_TIMEOUT_S = 60
 
@@ -26,7 +28,7 @@ class Client(object):
   def __init__(self, aws_access_key_id=None, aws_secret_access_key=None, region=None, timeout=HTTP_SOCKET_TIMEOUT_S):
     self._access_key_id = aws_access_key_id
     self._secret_access_key = aws_secret_access_key
-    self._region = region
+    self._region = region.lower() if region else get_default_region()
     self._timeout = timeout
 
     boto.config.add_section('Boto')
@@ -47,6 +49,10 @@ class Client(object):
       region=conf.REGION.get()
     )
 
+  @property
+  def region(self):
+    return self._region
+
   def get_s3_connection(self):
     connection = boto.s3.connect_to_region(self._region,
                                            aws_access_key_id=self._access_key_id,

+ 4 - 0
desktop/libs/aws/src/aws/conf.py

@@ -40,6 +40,10 @@ def get_default_secret_key():
   return secret_access_key_script or get_s3a_secret_key()
 
 
+def get_default_region():
+  return AWS_ACCOUNTS['default'].REGION.get()
+
+
 AWS_ACCOUNTS = UnspecifiedConfigSection(
   'aws_accounts',
   help='One entry for each AWS account',

+ 3 - 2
desktop/libs/aws/src/aws/s3/s3fs.py

@@ -30,6 +30,7 @@ from boto.s3.prefix import Prefix
 from django.utils.translation import ugettext as _
 
 from aws import s3
+from aws.conf import get_default_region
 from aws.s3 import normpath, s3file, translate_s3_error, S3A_ROOT
 from aws.s3.s3stat import S3Stat
 
@@ -69,11 +70,11 @@ class S3FileSystem(object):
       name = name.lower()
       bucket = self._get_bucket(name)
     except S3ResponseError, e:
-      if e.status == 403:
+      if e.status == 403 or e.status == 301:
         raise S3FileSystemException(_('User is not authorized to access bucket named "%s". '
           'If you are attempting to create a bucket, this bucket name is already reserved.') % name)
       elif e.status == 404:
-        bucket = self._s3_connection.create_bucket(name)
+        bucket = self._s3_connection.create_bucket(name, location=get_default_region())
         self._bucket_cache[name] = bucket
       else:
         raise S3FileSystemException(e.message)