2013-02-18 21:09:40 +00:00
|
|
|
# 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())
|
|
|
|
|
2013-02-27 06:12:11 +00:00
|
|
|
@property
|
|
|
|
def size(self):
|
|
|
|
return len(self.value)
|
|
|
|
|
2013-02-26 05:31:01 +00:00
|
|
|
|
2013-02-18 21:09:40 +00:00
|
|
|
class FakeBucket(object):
|
|
|
|
def __init__(self, name):
|
|
|
|
self.name = name
|
2013-02-18 22:17:19 +00:00
|
|
|
self.keys = {}
|
2013-02-18 21:09:40 +00:00
|
|
|
|
|
|
|
|
2013-02-18 21:31:42 +00:00
|
|
|
class S3Backend(BaseBackend):
|
2013-02-18 21:09:40 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
|
2013-02-18 22:31:15 +00:00
|
|
|
def get_all_buckets(self):
|
|
|
|
return self.buckets.values()
|
|
|
|
|
2013-02-18 21:09:40 +00:00
|
|
|
def get_bucket(self, bucket_name):
|
|
|
|
return self.buckets.get(bucket_name)
|
|
|
|
|
2013-02-18 22:17:19 +00:00
|
|
|
def delete_bucket(self, bucket_name):
|
|
|
|
bucket = self.buckets.get(bucket_name)
|
|
|
|
if bucket:
|
|
|
|
if bucket.keys:
|
|
|
|
# Can't delete a bucket with keys
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
return self.buckets.pop(bucket_name)
|
2013-02-19 02:22:03 +00:00
|
|
|
return None
|
2013-02-18 22:17:19 +00:00
|
|
|
|
2013-02-18 21:09:40 +00:00
|
|
|
def set_key(self, bucket_name, key_name, value):
|
|
|
|
bucket = self.buckets[bucket_name]
|
|
|
|
new_key = FakeKey(name=key_name, value=value)
|
2013-02-18 22:17:19 +00:00
|
|
|
bucket.keys[key_name] = new_key
|
2013-02-18 21:09:40 +00:00
|
|
|
|
|
|
|
return new_key
|
|
|
|
|
|
|
|
def get_key(self, bucket_name, key_name):
|
|
|
|
bucket = self.buckets[bucket_name]
|
2013-02-18 22:17:19 +00:00
|
|
|
return bucket.keys.get(key_name)
|
2013-02-18 21:09:40 +00:00
|
|
|
|
2013-02-27 06:12:11 +00:00
|
|
|
def prefix_query(self, bucket, prefix):
|
|
|
|
key_results = set()
|
|
|
|
folder_results = set()
|
|
|
|
if prefix:
|
|
|
|
for key_name, key in bucket.keys.iteritems():
|
|
|
|
if key_name.startswith(prefix):
|
|
|
|
if '/' in key_name.lstrip(prefix):
|
|
|
|
key_without_prefix = key_name.lstrip(prefix).split("/")[0]
|
|
|
|
folder_results.add("{}{}".format(prefix, key_without_prefix))
|
|
|
|
else:
|
|
|
|
key_results.add(key)
|
|
|
|
else:
|
|
|
|
for key_name, key in bucket.keys.iteritems():
|
|
|
|
if '/' in key_name:
|
|
|
|
folder_results.add(key_name.split("/")[0])
|
|
|
|
else:
|
|
|
|
key_results.add(key)
|
|
|
|
|
|
|
|
key_results = sorted(key_results, key=lambda key: key.name)
|
|
|
|
folder_results = [folder_name for folder_name in sorted(folder_results, key=lambda key: key)]
|
|
|
|
|
|
|
|
return key_results, folder_results
|
|
|
|
|
2013-02-18 22:17:19 +00:00
|
|
|
def delete_key(self, bucket_name, key_name):
|
|
|
|
bucket = self.buckets[bucket_name]
|
|
|
|
return bucket.keys.pop(key_name)
|
2013-02-18 21:09:40 +00:00
|
|
|
|
2013-02-20 04:29:46 +00:00
|
|
|
def copy_key(self, src_bucket_name, src_key_name, dest_bucket_name, dest_key_name):
|
|
|
|
src_bucket = self.buckets[src_bucket_name]
|
|
|
|
dest_bucket = self.buckets[dest_bucket_name]
|
|
|
|
dest_bucket.keys[dest_key_name] = src_bucket.keys[src_key_name]
|
2013-02-18 21:09:40 +00:00
|
|
|
|
2013-02-18 21:31:42 +00:00
|
|
|
s3_backend = S3Backend()
|