Ehsan Chiniforooshan 9 лет назад
Родитель
Сommit
4f5972c18f

+ 82 - 0
cloudbridge/cloud/providers/gce/resources.py

@@ -9,6 +9,8 @@ import uuid
 
 import cloudbridge as cb
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo
+from cloudbridge.cloud.base.resources import BaseBucket
+from cloudbridge.cloud.base.resources import BaseBucketObject
 from cloudbridge.cloud.base.resources import BaseFloatingIP
 from cloudbridge.cloud.base.resources import BaseInstance
 from cloudbridge.cloud.base.resources import BaseInstanceType
@@ -1689,3 +1691,83 @@ class GCESnapshot(BaseSnapshot):
                          .execute())
         return self._provider.block_store.volumes.get(
             operation.get('targetLink'))
+
+
+class GCSBucket(BaseBucket):
+
+    def __init__(self, provider, bucket):
+        super(GCSBucket, self).__init__(provider)
+        self._bucket = bucket
+
+    @property
+    def id(self):
+        return self._bucket['id']
+
+    @property
+    def name(self):
+        """
+        Get this bucket's name.
+        """
+        return self._bucket['name']
+
+    def get(self, name):
+        """
+        Retrieve a given object from this bucket.
+        """
+        try:
+            response = (self._provider
+                            .gcp_storage
+                            .objects()
+                            .get(bucket=self.name, object=name)
+                            .execute())
+            if 'error' in response:
+                return None
+            return GCSObject(self._provider, response)
+        except:
+            return None
+
+    def list(self, limit=None, marker=None, prefix=None):
+        """
+        List all objects within this bucket.
+        """
+        body = {}
+        if prefix:
+            body['prefix'] = prefix
+        try:
+            response = (self._provider
+                            .gcp_storage
+                            .objects()
+                            .list(bucket=self.name, body=body)
+                            .execute())
+            if 'error' in response or 'items' not in response:
+                return None
+            objects = [GCSObject(self._provider, obj)
+                       for obj in response['items']]
+            return ClientPagedResultList(self._provider, objects, limit=limit,
+                                         marker=marker)
+        except:
+            return []
+
+    def delete(self, delete_contents=False):
+        """
+        Delete this bucket.
+        """
+        (self._provider
+             .gcp_storage
+             .buckets()
+             .delete(bucket=self.name)
+             .execute())
+
+    def create_object(self, name):
+        try:
+            response = (self._provider
+                            .gcp_storage
+                            .objects()
+                            .insert(bucket=self.name, body={'name': name})
+                            .execute())
+            if 'error' in response:
+                return None
+            return GCSObject(self._provider, response)
+        except:
+            return None
+

+ 5 - 1
cloudbridge/cloud/providers/gce/services.py

@@ -40,6 +40,7 @@ from .resources import GCESecurityGroup
 from .resources import GCESnapshot
 from .resources import GCESubnet
 from .resources import GCEVolume
+from .resources import GCSBucket
 
 
 class GCESecurityService(BaseSecurityService):
@@ -1080,13 +1081,16 @@ class GCSObjectStoreService(BaseObjectStoreService):
         """
         Create a new bucket and returns it. Returns None if creation fails.
         """
+        body = {}
+        if location:
+            body['location'] = location
         try:
             response = (self.provider
                             .gcp_storage
                             .buckets()
                             .insert(project=self.provider.project_name,
                                     name=name,
-                                    location=location if location else '')
+                                    body=body)
                             .execute())
             if 'error' in response:
                 return None