1 import os, sys, tempfile
3 from boto.s3.bucket import Bucket
4 from boto.s3.key import Key
8 class S3Store(cumulus.store.Store):
9 def __init__(self, url, **kw):
10 (bucket, prefix) = self.path.lstrip("/").split("/", 1)
11 self.conn = boto.connect_s3(is_secure=False)
12 self.bucket = self.conn.create_bucket(bucket)
13 self.prefix = prefix.rstrip ("/")
16 def _get_key(self, type, name):
18 k.key = "%s/%s/%s" % (self.prefix, type, name)
22 prefix = "%s/" % (self.prefix,)
23 for i in self.bucket.list(prefix):
24 assert i.key.startswith(prefix)
25 self.scan_cache[i.key] = i
28 prefix = "%s/%s/" % (self.prefix, type)
29 for i in self.bucket.list(prefix):
30 assert i.key.startswith(prefix)
31 yield i.key[len(prefix):]
33 def get(self, type, name):
34 fp = tempfile.TemporaryFile()
35 k = self._get_key(type, name)
40 def put(self, type, name, fp):
41 k = self._get_key(type, name)
42 k.set_contents_from_file(fp)
44 def delete(self, type, name):
45 self.bucket.delete_key("%s/%s/%s" % (self.prefix, type, name))
47 def stat(self, type, name):
48 path = "%s/%s/%s" % (self.prefix, type, name)
49 if path in self.scan_cache:
50 k = self.scan_cache[path]
52 k = self.bucket.get_key(path)
54 raise cumulus.store.NotFoundError
56 return {'size': int(k.size)}