refactor S3 exceptions to inherit from RESTError
This commit is contained in:
parent
7c719269be
commit
1460a5a3c7
@ -1,9 +1,40 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
from moto.core.exceptions import RESTError
|
||||||
|
|
||||||
|
|
||||||
class BucketAlreadyExists(Exception):
|
ERROR_WITH_BUCKET_NAME = """{% extends 'error' %}
|
||||||
|
{% block extra %}<BucketName>{{ bucket }}</BucketName>{% endblock %}
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class S3ClientError(RESTError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class MissingBucket(Exception):
|
class BucketError(S3ClientError):
|
||||||
pass
|
def __init__(self, *args, **kwargs):
|
||||||
|
kwargs.setdefault('template', 'bucket_error')
|
||||||
|
self.templates['bucket_error'] = ERROR_WITH_BUCKET_NAME
|
||||||
|
super(BucketError, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class BucketAlreadyExists(BucketError):
|
||||||
|
code = 409
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(BucketAlreadyExists, self).__init__(
|
||||||
|
"BucketAlreadyExists",
|
||||||
|
("The requested bucket name is not available. The bucket "
|
||||||
|
"namespace is shared by all users of the system. Please "
|
||||||
|
"select a different name and try again"),
|
||||||
|
*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class MissingBucket(BucketError):
|
||||||
|
code = 404
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(MissingBucket, self).__init__(
|
||||||
|
"NoSuchBucket",
|
||||||
|
"The specified bucket does not exist",
|
||||||
|
*args, **kwargs)
|
||||||
|
@ -191,7 +191,7 @@ class S3Backend(BaseBackend):
|
|||||||
|
|
||||||
def create_bucket(self, bucket_name, region_name):
|
def create_bucket(self, bucket_name, region_name):
|
||||||
if bucket_name in self.buckets:
|
if bucket_name in self.buckets:
|
||||||
raise BucketAlreadyExists()
|
raise BucketAlreadyExists(bucket=bucket_name)
|
||||||
new_bucket = FakeBucket(name=bucket_name, region_name=region_name)
|
new_bucket = FakeBucket(name=bucket_name, region_name=region_name)
|
||||||
self.buckets[bucket_name] = new_bucket
|
self.buckets[bucket_name] = new_bucket
|
||||||
return new_bucket
|
return new_bucket
|
||||||
@ -203,7 +203,7 @@ class S3Backend(BaseBackend):
|
|||||||
try:
|
try:
|
||||||
return self.buckets[bucket_name]
|
return self.buckets[bucket_name]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise MissingBucket()
|
raise MissingBucket(bucket=bucket_name)
|
||||||
|
|
||||||
def delete_bucket(self, bucket_name):
|
def delete_bucket(self, bucket_name):
|
||||||
bucket = self.get_bucket(bucket_name)
|
bucket = self.get_bucket(bucket_name)
|
||||||
|
@ -7,7 +7,7 @@ from six.moves.urllib.parse import parse_qs, urlparse
|
|||||||
|
|
||||||
from moto.core.responses import _TemplateEnvironmentMixin
|
from moto.core.responses import _TemplateEnvironmentMixin
|
||||||
|
|
||||||
from .exceptions import BucketAlreadyExists, MissingBucket
|
from .exceptions import BucketAlreadyExists, S3ClientError
|
||||||
from .models import s3_backend
|
from .models import s3_backend
|
||||||
from .utils import bucket_name_from_url, metadata_from_headers
|
from .utils import bucket_name_from_url, metadata_from_headers
|
||||||
from xml.dom import minidom
|
from xml.dom import minidom
|
||||||
@ -35,8 +35,8 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
def bucket_response(self, request, full_url, headers):
|
def bucket_response(self, request, full_url, headers):
|
||||||
try:
|
try:
|
||||||
response = self._bucket_response(request, full_url, headers)
|
response = self._bucket_response(request, full_url, headers)
|
||||||
except MissingBucket:
|
except S3ClientError as s3error:
|
||||||
return 404, headers, ""
|
response = s3error.code, headers, s3error.description
|
||||||
|
|
||||||
if isinstance(response, six.string_types):
|
if isinstance(response, six.string_types):
|
||||||
return 200, headers, response.encode("utf-8")
|
return 200, headers, response.encode("utf-8")
|
||||||
@ -72,12 +72,8 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
raise NotImplementedError("Method {0} has not been impelemented in the S3 backend yet".format(method))
|
raise NotImplementedError("Method {0} has not been impelemented in the S3 backend yet".format(method))
|
||||||
|
|
||||||
def _bucket_response_head(self, bucket_name, headers):
|
def _bucket_response_head(self, bucket_name, headers):
|
||||||
try:
|
self.backend.get_bucket(bucket_name)
|
||||||
self.backend.get_bucket(bucket_name)
|
return 200, headers, ""
|
||||||
except MissingBucket:
|
|
||||||
return 404, headers, ""
|
|
||||||
else:
|
|
||||||
return 200, headers, ""
|
|
||||||
|
|
||||||
def _bucket_response_get(self, bucket_name, querystring, headers):
|
def _bucket_response_get(self, bucket_name, querystring, headers):
|
||||||
if 'uploads' in querystring:
|
if 'uploads' in querystring:
|
||||||
@ -127,11 +123,7 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
is_truncated='false',
|
is_truncated='false',
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
bucket = self.backend.get_bucket(bucket_name)
|
||||||
bucket = self.backend.get_bucket(bucket_name)
|
|
||||||
except MissingBucket:
|
|
||||||
return 404, headers, ""
|
|
||||||
|
|
||||||
prefix = querystring.get('prefix', [None])[0]
|
prefix = querystring.get('prefix', [None])[0]
|
||||||
delimiter = querystring.get('delimiter', [None])[0]
|
delimiter = querystring.get('delimiter', [None])[0]
|
||||||
result_keys, result_folders = self.backend.prefix_query(bucket, prefix, delimiter)
|
result_keys, result_folders = self.backend.prefix_query(bucket, prefix, delimiter)
|
||||||
@ -161,17 +153,12 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
# us-east-1 has different behavior
|
# us-east-1 has different behavior
|
||||||
new_bucket = self.backend.get_bucket(bucket_name)
|
new_bucket = self.backend.get_bucket(bucket_name)
|
||||||
else:
|
else:
|
||||||
return 409, headers, ""
|
raise
|
||||||
template = self.response_template(S3_BUCKET_CREATE_RESPONSE)
|
template = self.response_template(S3_BUCKET_CREATE_RESPONSE)
|
||||||
return 200, headers, template.render(bucket=new_bucket)
|
return 200, headers, template.render(bucket=new_bucket)
|
||||||
|
|
||||||
def _bucket_response_delete(self, bucket_name, headers):
|
def _bucket_response_delete(self, bucket_name, headers):
|
||||||
try:
|
removed_bucket = self.backend.delete_bucket(bucket_name)
|
||||||
removed_bucket = self.backend.delete_bucket(bucket_name)
|
|
||||||
except MissingBucket:
|
|
||||||
# Non-existant bucket
|
|
||||||
template = self.response_template(S3_DELETE_NON_EXISTING_BUCKET)
|
|
||||||
return 404, headers, template.render(bucket_name=bucket_name)
|
|
||||||
|
|
||||||
if removed_bucket:
|
if removed_bucket:
|
||||||
# Bucket exists
|
# Bucket exists
|
||||||
@ -231,8 +218,8 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
def key_response(self, request, full_url, headers):
|
def key_response(self, request, full_url, headers):
|
||||||
try:
|
try:
|
||||||
response = self._key_response(request, full_url, headers)
|
response = self._key_response(request, full_url, headers)
|
||||||
except MissingBucket:
|
except S3ClientError as s3error:
|
||||||
return 404, headers, ""
|
response = s3error.code, headers, s3error.description
|
||||||
|
|
||||||
if isinstance(response, six.string_types):
|
if isinstance(response, six.string_types):
|
||||||
return 200, headers, response
|
return 200, headers, response
|
||||||
@ -461,14 +448,6 @@ S3_DELETE_BUCKET_SUCCESS = """<DeleteBucketResponse xmlns="http://s3.amazonaws.c
|
|||||||
</DeleteBucketResponse>
|
</DeleteBucketResponse>
|
||||||
</DeleteBucketResponse>"""
|
</DeleteBucketResponse>"""
|
||||||
|
|
||||||
S3_DELETE_NON_EXISTING_BUCKET = """<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Error><Code>NoSuchBucket</Code>
|
|
||||||
<Message>The specified bucket does not exist</Message>
|
|
||||||
<BucketName>{{ bucket_name }}</BucketName>
|
|
||||||
<RequestId>asdfasdfsadf</RequestId>
|
|
||||||
<HostId>asfasdfsfsafasdf</HostId>
|
|
||||||
</Error>"""
|
|
||||||
|
|
||||||
S3_DELETE_BUCKET_WITH_ITEMS_ERROR = """<?xml version="1.0" encoding="UTF-8"?>
|
S3_DELETE_BUCKET_WITH_ITEMS_ERROR = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Error><Code>BucketNotEmpty</Code>
|
<Error><Code>BucketNotEmpty</Code>
|
||||||
<Message>The bucket you tried to delete is not empty</Message>
|
<Message>The bucket you tried to delete is not empty</Message>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user