basic ec2 and s3 working
This commit is contained in:
parent
6a060dfd7e
commit
77d6df6531
33 changed files with 561 additions and 1 deletions
2
moto/s3/__init__.py
Normal file
2
moto/s3/__init__.py
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
from .models import s3_backend
|
||||
mock_s3 = s3_backend.decorator
|
||||
BIN
moto/s3/__init__.pyc
Normal file
BIN
moto/s3/__init__.pyc
Normal file
Binary file not shown.
57
moto/s3/models.py
Normal file
57
moto/s3/models.py
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
# from boto.s3.bucket import Bucket
|
||||
# from boto.s3.key import Key
|
||||
import md5
|
||||
|
||||
from moto.core import BaseBackend
|
||||
|
||||
|
||||
class FakeKey(object):
|
||||
def __init__(self, name, value):
|
||||
self.name = name
|
||||
self.value = value
|
||||
|
||||
@property
|
||||
def etag(self):
|
||||
value_md5 = md5.new()
|
||||
value_md5.update(self.value)
|
||||
return '"{0}"'.format(value_md5.hexdigest())
|
||||
|
||||
class FakeBucket(object):
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.keys = []
|
||||
|
||||
|
||||
class MockS3(BaseBackend):
|
||||
base_url = "https://(.+).s3.amazonaws.com"
|
||||
|
||||
def __init__(self):
|
||||
self.buckets = {}
|
||||
|
||||
def create_bucket(self, bucket_name):
|
||||
new_bucket = FakeBucket(name=bucket_name)
|
||||
self.buckets[bucket_name] = new_bucket
|
||||
return new_bucket
|
||||
|
||||
def get_bucket(self, bucket_name):
|
||||
return self.buckets.get(bucket_name)
|
||||
|
||||
def set_key(self, bucket_name, key_name, value):
|
||||
bucket = self.buckets[bucket_name]
|
||||
new_key = FakeKey(name=key_name, value=value)
|
||||
bucket.keys.append(new_key)
|
||||
|
||||
return new_key
|
||||
|
||||
def get_key(self, bucket_name, key_name):
|
||||
bucket = self.buckets[bucket_name]
|
||||
found_key = None
|
||||
for key in bucket.keys:
|
||||
if key.name == key_name:
|
||||
found_key = key
|
||||
break
|
||||
|
||||
return found_key
|
||||
|
||||
|
||||
s3_backend = MockS3()
|
||||
BIN
moto/s3/models.pyc
Normal file
BIN
moto/s3/models.pyc
Normal file
Binary file not shown.
72
moto/s3/responses.py
Normal file
72
moto/s3/responses.py
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
from jinja2 import Template
|
||||
|
||||
from .models import s3_backend
|
||||
|
||||
def bucket_response(uri, body, headers):
|
||||
hostname = uri.hostname
|
||||
bucket_name = hostname.replace(".s3.amazonaws.com", "")
|
||||
|
||||
if uri.method == 'GET':
|
||||
bucket = s3_backend.get_bucket(bucket_name)
|
||||
if bucket:
|
||||
template = Template(S3_BUCKET_GET_RESPONSE)
|
||||
return template.render(bucket=bucket)
|
||||
else:
|
||||
return "", dict(status=404)
|
||||
else:
|
||||
new_bucket = s3_backend.create_bucket(bucket_name)
|
||||
template = Template(S3_BUCKET_CREATE_RESPONSE)
|
||||
return template.render(bucket=new_bucket)
|
||||
|
||||
|
||||
def key_response(uri_info, body, headers):
|
||||
|
||||
key_name = uri_info.path.lstrip('/')
|
||||
hostname = uri_info.hostname
|
||||
bucket_name = hostname.replace(".s3.amazonaws.com", "")
|
||||
|
||||
if uri_info.method == 'GET':
|
||||
key = s3_backend.get_key(bucket_name, key_name)
|
||||
if key:
|
||||
return key.value
|
||||
else:
|
||||
return "", dict(status=404)
|
||||
|
||||
if uri_info.method == 'PUT':
|
||||
if body:
|
||||
new_key = s3_backend.set_key(bucket_name, key_name, body)
|
||||
return S3_OBJECT_RESPONSE, dict(etag=new_key.etag)
|
||||
key = s3_backend.get_key(bucket_name, key_name)
|
||||
if key:
|
||||
return "", dict(etag=key.etag)
|
||||
else:
|
||||
return ""
|
||||
elif uri_info.method == 'HEAD':
|
||||
key = s3_backend.get_key(bucket_name, key_name)
|
||||
return S3_OBJECT_RESPONSE, dict(etag=key.etag)
|
||||
else:
|
||||
import pdb;pdb.set_trace()
|
||||
|
||||
|
||||
S3_BUCKET_GET_RESPONSE = """<ListBucket xmlns="http://doc.s3.amazonaws.com/2006-03-01">\
|
||||
<Bucket>{{ bucket.name }}</Bucket>\
|
||||
<Prefix>notes/</Prefix>\
|
||||
<Delimiter>/</Delimiter>\
|
||||
<MaxKeys>1000</MaxKeys>\
|
||||
<AWSAccessKeyId>AKIAIOSFODNN7EXAMPLE</AWSAccessKeyId>\
|
||||
<Timestamp>2006-03-01T12:00:00.183Z</Timestamp>\
|
||||
<Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>\
|
||||
</ListBucket>"""
|
||||
|
||||
S3_BUCKET_CREATE_RESPONSE = """<CreateBucketResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
|
||||
<CreateBucketResponse>
|
||||
<Bucket>{{ bucket.name }}</Bucket>
|
||||
</CreateBucketResponse>
|
||||
</CreateBucketResponse>"""
|
||||
|
||||
S3_OBJECT_RESPONSE = """<PutObjectResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
|
||||
<PutObjectResponse>
|
||||
<ETag>"asdlfkdalsjfsalfkjsadlfjsdjkk"</ETag>
|
||||
<LastModified>2006-03-01T12:00:00.183Z</LastModified>
|
||||
</PutObjectResponse>
|
||||
</PutObjectResponse>"""
|
||||
BIN
moto/s3/responses.pyc
Normal file
BIN
moto/s3/responses.pyc
Normal file
Binary file not shown.
6
moto/s3/urls.py
Normal file
6
moto/s3/urls.py
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
from .responses import bucket_response, key_response
|
||||
|
||||
urls = {
|
||||
'/$': bucket_response,
|
||||
'/(.+)': key_response,
|
||||
}
|
||||
BIN
moto/s3/urls.pyc
Normal file
BIN
moto/s3/urls.pyc
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue