Merge remote-tracking branch 'origin/master' into ImproveTemplatePerformance
Conflicts: moto/s3/responses.py
This commit is contained in:
commit
7ce83082ca
9 changed files with 129 additions and 20 deletions
|
|
@ -160,12 +160,17 @@ class FakeMultipart(object):
|
|||
|
||||
class FakeBucket(object):
|
||||
|
||||
def __init__(self, name):
|
||||
def __init__(self, name, region_name):
|
||||
self.name = name
|
||||
self.region_name = region_name
|
||||
self.keys = _VersionedKeyStore()
|
||||
self.multiparts = {}
|
||||
self.versioning_status = None
|
||||
|
||||
@property
|
||||
def location(self):
|
||||
return self.region_name
|
||||
|
||||
@property
|
||||
def is_versioned(self):
|
||||
return self.versioning_status == 'Enabled'
|
||||
|
|
@ -184,10 +189,10 @@ class S3Backend(BaseBackend):
|
|||
def __init__(self):
|
||||
self.buckets = {}
|
||||
|
||||
def create_bucket(self, bucket_name):
|
||||
def create_bucket(self, bucket_name, region_name):
|
||||
if bucket_name in self.buckets:
|
||||
raise BucketAlreadyExists()
|
||||
new_bucket = FakeBucket(name=bucket_name)
|
||||
new_bucket = FakeBucket(name=bucket_name, region_name=region_name)
|
||||
self.buckets[bucket_name] = new_bucket
|
||||
return new_bucket
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@ from .models import s3_backend
|
|||
from .utils import bucket_name_from_url, metadata_from_headers
|
||||
from xml.dom import minidom
|
||||
|
||||
REGION_URL_REGEX = r'\.s3-(.+?)\.amazonaws\.com'
|
||||
DEFAULT_REGION_NAME = 'us-east-1'
|
||||
|
||||
|
||||
def parse_key_name(pth):
|
||||
return pth.lstrip("/")
|
||||
|
|
@ -45,6 +48,10 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||
parsed_url = urlparse(full_url)
|
||||
querystring = parse_qs(parsed_url.query, keep_blank_values=True)
|
||||
method = request.method
|
||||
region_name = DEFAULT_REGION_NAME
|
||||
region_match = re.search(REGION_URL_REGEX, full_url)
|
||||
if region_match:
|
||||
region_name = region_match.groups()[0]
|
||||
|
||||
bucket_name = self.bucket_name_from_url(full_url)
|
||||
if not bucket_name:
|
||||
|
|
@ -56,7 +63,7 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||
elif method == 'GET':
|
||||
return self._bucket_response_get(bucket_name, querystring, headers)
|
||||
elif method == 'PUT':
|
||||
return self._bucket_response_put(request, bucket_name, querystring, headers)
|
||||
return self._bucket_response_put(request, region_name, bucket_name, querystring, headers)
|
||||
elif method == 'DELETE':
|
||||
return self._bucket_response_delete(bucket_name, headers)
|
||||
elif method == 'POST':
|
||||
|
|
@ -82,6 +89,10 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||
return 200, headers, template.render(
|
||||
bucket_name=bucket_name,
|
||||
uploads=multiparts)
|
||||
elif 'location' in querystring:
|
||||
bucket = self.backend.get_bucket(bucket_name)
|
||||
template = Template(S3_BUCKET_LOCATION)
|
||||
return 200, headers, template.render(location=bucket.location)
|
||||
elif 'versioning' in querystring:
|
||||
versioning = self.backend.get_bucket_versioning(bucket_name)
|
||||
template = self.response_template(S3_BUCKET_GET_VERSIONING)
|
||||
|
|
@ -130,7 +141,7 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||
result_folders=result_folders
|
||||
)
|
||||
|
||||
def _bucket_response_put(self, request, bucket_name, querystring, headers):
|
||||
def _bucket_response_put(self, request, region_name, bucket_name, querystring, headers):
|
||||
if 'versioning' in querystring:
|
||||
ver = re.search('<Status>([A-Za-z]+)</Status>', request.body.decode('utf-8'))
|
||||
if ver:
|
||||
|
|
@ -141,9 +152,13 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||
return 404, headers, ""
|
||||
else:
|
||||
try:
|
||||
new_bucket = self.backend.create_bucket(bucket_name)
|
||||
new_bucket = self.backend.create_bucket(bucket_name, region_name)
|
||||
except BucketAlreadyExists:
|
||||
return 409, headers, ""
|
||||
if region_name == DEFAULT_REGION_NAME:
|
||||
# us-east-1 has different behavior
|
||||
new_bucket = self.backend.get_bucket(bucket_name)
|
||||
else:
|
||||
return 409, headers, ""
|
||||
template = self.response_template(S3_BUCKET_CREATE_RESPONSE)
|
||||
return 200, headers, template.render(bucket=new_bucket)
|
||||
|
||||
|
|
@ -459,6 +474,9 @@ S3_DELETE_BUCKET_WITH_ITEMS_ERROR = """<?xml version="1.0" encoding="UTF-8"?>
|
|||
<HostId>sdfgdsfgdsfgdfsdsfgdfs</HostId>
|
||||
</Error>"""
|
||||
|
||||
S3_BUCKET_LOCATION = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<LocationConstraint xmlns="http://s3.amazonaws.com/doc/2006-03-01/">{{ location }}</LocationConstraint>"""
|
||||
|
||||
S3_BUCKET_VERSIONING = """
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import six
|
|||
from six.moves.urllib.parse import urlparse, unquote
|
||||
import sys
|
||||
|
||||
bucket_name_regex = re.compile("(.+).s3.amazonaws.com")
|
||||
bucket_name_regex = re.compile("(.+).s3(.*).amazonaws.com")
|
||||
|
||||
|
||||
def bucket_name_from_url(url):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue