basic ec2 and s3 working

This commit is contained in:
Steve Pulec 2013-02-18 16:09:40 -05:00
commit 77d6df6531
33 changed files with 561 additions and 1 deletions

2
moto/s3/__init__.py Normal file
View file

@ -0,0 +1,2 @@
from .models import s3_backend
mock_s3 = s3_backend.decorator

BIN
moto/s3/__init__.pyc Normal file

Binary file not shown.

57
moto/s3/models.py Normal file
View 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

Binary file not shown.

72
moto/s3/responses.py Normal file
View 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>&quot;asdlfkdalsjfsalfkjsadlfjsdjkk&quot;</ETag>
<LastModified>2006-03-01T12:00:00.183Z</LastModified>
</PutObjectResponse>
</PutObjectResponse>"""

BIN
moto/s3/responses.pyc Normal file

Binary file not shown.

6
moto/s3/urls.py Normal file
View file

@ -0,0 +1,6 @@
from .responses import bucket_response, key_response
urls = {
'/$': bucket_response,
'/(.+)': key_response,
}

BIN
moto/s3/urls.pyc Normal file

Binary file not shown.