Add basics of S# website configuration. Closes #442.
This commit is contained in:
parent
0061eb77d7
commit
18d63a6cfe
@ -244,6 +244,7 @@ class FakeBucket(object):
|
|||||||
self.versioning_status = None
|
self.versioning_status = None
|
||||||
self.rules = []
|
self.rules = []
|
||||||
self.policy = None
|
self.policy = None
|
||||||
|
self.website_configuration = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def location(self):
|
def location(self):
|
||||||
@ -272,6 +273,9 @@ class FakeBucket(object):
|
|||||||
def delete_lifecycle(self):
|
def delete_lifecycle(self):
|
||||||
self.rules = []
|
self.rules = []
|
||||||
|
|
||||||
|
def set_website_configuration(self, website_configuration):
|
||||||
|
self.website_configuration = website_configuration
|
||||||
|
|
||||||
def get_cfn_attribute(self, attribute_name):
|
def get_cfn_attribute(self, attribute_name):
|
||||||
from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
|
from moto.cloudformation.exceptions import UnformattedGetAttTemplateException
|
||||||
if attribute_name == 'DomainName':
|
if attribute_name == 'DomainName':
|
||||||
@ -343,6 +347,14 @@ class S3Backend(BaseBackend):
|
|||||||
bucket = self.get_bucket(bucket_name)
|
bucket = self.get_bucket(bucket_name)
|
||||||
bucket.set_lifecycle(rules)
|
bucket.set_lifecycle(rules)
|
||||||
|
|
||||||
|
def set_bucket_website_configuration(self, bucket_name, website_configuration):
|
||||||
|
bucket = self.get_bucket(bucket_name)
|
||||||
|
bucket.set_website_configuration(website_configuration)
|
||||||
|
|
||||||
|
def get_bucket_website_configuration(self, bucket_name):
|
||||||
|
bucket = self.get_bucket(bucket_name)
|
||||||
|
return bucket.website_configuration
|
||||||
|
|
||||||
def set_key(self, bucket_name, key_name, value, storage=None, etag=None):
|
def set_key(self, bucket_name, key_name, value, storage=None, etag=None):
|
||||||
key_name = clean_key_name(key_name)
|
key_name = clean_key_name(key_name)
|
||||||
|
|
||||||
|
@ -102,29 +102,32 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
prefix = querystring.get('prefix', [None])[0]
|
prefix = querystring.get('prefix', [None])[0]
|
||||||
multiparts = [upload for upload in multiparts if upload.key_name.startswith(prefix)]
|
multiparts = [upload for upload in multiparts if upload.key_name.startswith(prefix)]
|
||||||
template = self.response_template(S3_ALL_MULTIPARTS)
|
template = self.response_template(S3_ALL_MULTIPARTS)
|
||||||
return 200, headers, template.render(
|
return template.render(
|
||||||
bucket_name=bucket_name,
|
bucket_name=bucket_name,
|
||||||
uploads=multiparts)
|
uploads=multiparts)
|
||||||
elif 'location' in querystring:
|
elif 'location' in querystring:
|
||||||
bucket = self.backend.get_bucket(bucket_name)
|
bucket = self.backend.get_bucket(bucket_name)
|
||||||
template = self.response_template(S3_BUCKET_LOCATION)
|
template = self.response_template(S3_BUCKET_LOCATION)
|
||||||
return 200, headers, template.render(location=bucket.location)
|
return template.render(location=bucket.location)
|
||||||
elif 'lifecycle' in querystring:
|
elif 'lifecycle' in querystring:
|
||||||
bucket = self.backend.get_bucket(bucket_name)
|
bucket = self.backend.get_bucket(bucket_name)
|
||||||
if not bucket.rules:
|
if not bucket.rules:
|
||||||
return 404, headers, "NoSuchLifecycleConfiguration"
|
return 404, headers, "NoSuchLifecycleConfiguration"
|
||||||
template = self.response_template(S3_BUCKET_LIFECYCLE_CONFIGURATION)
|
template = self.response_template(S3_BUCKET_LIFECYCLE_CONFIGURATION)
|
||||||
return 200, headers, template.render(rules=bucket.rules)
|
return template.render(rules=bucket.rules)
|
||||||
elif 'versioning' in querystring:
|
elif 'versioning' in querystring:
|
||||||
versioning = self.backend.get_bucket_versioning(bucket_name)
|
versioning = self.backend.get_bucket_versioning(bucket_name)
|
||||||
template = self.response_template(S3_BUCKET_GET_VERSIONING)
|
template = self.response_template(S3_BUCKET_GET_VERSIONING)
|
||||||
return 200, headers, template.render(status=versioning)
|
return template.render(status=versioning)
|
||||||
elif 'policy' in querystring:
|
elif 'policy' in querystring:
|
||||||
policy = self.backend.get_bucket_policy(bucket_name)
|
policy = self.backend.get_bucket_policy(bucket_name)
|
||||||
if not policy:
|
if not policy:
|
||||||
template = self.response_template(S3_NO_POLICY)
|
template = self.response_template(S3_NO_POLICY)
|
||||||
return 404, headers, template.render(bucket_name=bucket_name)
|
return 404, headers, template.render(bucket_name=bucket_name)
|
||||||
return 200, headers, policy
|
return 200, headers, policy
|
||||||
|
elif 'website' in querystring:
|
||||||
|
website_configuration = self.backend.get_bucket_website_configuration(bucket_name)
|
||||||
|
return website_configuration
|
||||||
elif 'versions' in querystring:
|
elif 'versions' in querystring:
|
||||||
delimiter = querystring.get('delimiter', [None])[0]
|
delimiter = querystring.get('delimiter', [None])[0]
|
||||||
encoding_type = querystring.get('encoding-type', [None])[0]
|
encoding_type = querystring.get('encoding-type', [None])[0]
|
||||||
@ -184,6 +187,9 @@ class ResponseObject(_TemplateEnvironmentMixin):
|
|||||||
elif 'policy' in querystring:
|
elif 'policy' in querystring:
|
||||||
self.backend.set_bucket_policy(bucket_name, body)
|
self.backend.set_bucket_policy(bucket_name, body)
|
||||||
return 'True'
|
return 'True'
|
||||||
|
elif 'website' in querystring:
|
||||||
|
self.backend.set_bucket_website_configuration(bucket_name, body)
|
||||||
|
return ""
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
new_bucket = self.backend.create_bucket(bucket_name, region_name)
|
new_bucket = self.backend.create_bucket(bucket_name, region_name)
|
||||||
|
@ -945,5 +945,33 @@ def test_boto3_head_object():
|
|||||||
|
|
||||||
s3.Object('blah', 'hello.txt').meta.client.head_object(Bucket='blah', Key='hello.txt')
|
s3.Object('blah', 'hello.txt').meta.client.head_object(Bucket='blah', Key='hello.txt')
|
||||||
|
|
||||||
with assert_raises(ClientError) as err:
|
with assert_raises(ClientError):
|
||||||
s3.Object('blah', 'hello2.txt').meta.client.head_object(Bucket='blah', Key='hello_bad.txt')
|
s3.Object('blah', 'hello2.txt').meta.client.head_object(Bucket='blah', Key='hello_bad.txt')
|
||||||
|
|
||||||
|
|
||||||
|
TEST_XML = """\
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ns0:WebsiteConfiguration xmlns:ns0="http://s3.amazonaws.com/doc/2006-03-01/">
|
||||||
|
<ns0:IndexDocument>
|
||||||
|
<ns0:Suffix>index.html</ns0:Suffix>
|
||||||
|
</ns0:IndexDocument>
|
||||||
|
<ns0:RoutingRules>
|
||||||
|
<ns0:RoutingRule>
|
||||||
|
<ns0:Condition>
|
||||||
|
<ns0:KeyPrefixEquals>test/testing</ns0:KeyPrefixEquals>
|
||||||
|
</ns0:Condition>
|
||||||
|
<ns0:Redirect>
|
||||||
|
<ns0:ReplaceKeyWith>test.txt</ns0:ReplaceKeyWith>
|
||||||
|
</ns0:Redirect>
|
||||||
|
</ns0:RoutingRule>
|
||||||
|
</ns0:RoutingRules>
|
||||||
|
</ns0:WebsiteConfiguration>
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@mock_s3
|
||||||
|
def test_website_configuration_xml():
|
||||||
|
conn = boto.connect_s3()
|
||||||
|
bucket = conn.create_bucket('test-bucket')
|
||||||
|
bucket.set_website_configuration_xml(TEST_XML)
|
||||||
|
bucket.get_website_configuration_xml().should.equal(TEST_XML)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user