Begin new storage-abstraction layer.
[cumulus.git] / python / cumulus / store / s3.py
diff --git a/python/cumulus/store/s3.py b/python/cumulus/store/s3.py
new file mode 100644 (file)
index 0000000..0453c21
--- /dev/null
@@ -0,0 +1,38 @@
+import os, sys, tempfile
+import boto
+from boto.s3.bucket import Bucket
+from boto.s3.key import Key
+
+import cumulus.store
+
+class S3Store(cumulus.store.Store):
+    def __init__(self, bucket, prefix):
+        self.conn = boto.connect_s3(is_secure=False)
+        self.bucket = self.conn.create_bucket(bucket)
+        while prefix.endswith("/"): prefix = prefix[:-1]
+        self.prefix = prefix
+
+    def _get_key(self, type, name):
+        k = Key(self.bucket)
+        k.key = "%s/%s/%s" % (self.prefix, type, name)
+        return k
+
+    def list(self, type):
+        prefix = "%s/%s/" % (self.prefix, type)
+        for i in self.bucket.list(prefix):
+            assert i.key.startswith(prefix)
+            yield i.key[len(prefix):]
+
+    def get(self, type, name):
+        fp = tempfile.TemporaryFile()
+        k = self._get_key(type, name)
+        k.get_file(fp)
+        fp.seek(0)
+        return fp
+
+    def put(self, type, name, fp):
+        k = self._get_key(type, name)
+        k.send_file(fp)
+
+    def delete(self, type, name):
+        self.bucket.delete_key("%s/%s/%s" % (self.prefix, type, name))