Explorar el Código

The GCS object store implementation

Ehsan Chiniforooshan hace 9 años
padre
commit
0e5e74ddb5

+ 3 - 2
cloudbridge/cloud/providers/gce/provider.py

@@ -21,6 +21,7 @@ from oauth2client.service_account import ServiceAccountCredentials
 from .services import GCEBlockStoreService
 from .services import GCEBlockStoreService
 from .services import GCEComputeService
 from .services import GCEComputeService
 from .services import GCENetworkService
 from .services import GCENetworkService
+from .services import GCSObjectStoreService
 from .services import GCESecurityService
 from .services import GCESecurityService
 
 
 
 
@@ -165,6 +166,7 @@ class GCECloudProvider(BaseCloudProvider):
         self._security = GCESecurityService(self)
         self._security = GCESecurityService(self)
         self._network = GCENetworkService(self)
         self._network = GCENetworkService(self)
         self._block_store = GCEBlockStoreService(self)
         self._block_store = GCEBlockStoreService(self)
+        self._object_store = GCSObjectStoreService(self)
 
 
         self._compute_resources = GCPResources(self.gce_compute)
         self._compute_resources = GCPResources(self.gce_compute)
         self._storage_resources = GCPResources(self.gcp_storage)
         self._storage_resources = GCPResources(self.gcp_storage)
@@ -187,8 +189,7 @@ class GCECloudProvider(BaseCloudProvider):
 
 
     @property
     @property
     def object_store(self):
     def object_store(self):
-        raise NotImplementedError(
-            "GCECloudProvider does not implement this service")
+        return self._object_store
 
 
     @property
     @property
     def gce_compute(self):
     def gce_compute(self):

+ 71 - 0
cloudbridge/cloud/providers/gce/services.py

@@ -1022,3 +1022,74 @@ class GCESnapshotService(BaseSnapshotService):
             return snapshots[0]
             return snapshots[0]
         else:
         else:
             return None
             return None
+
+
+class GCSObjectStoreService(BaseObjectStoreService):
+
+    def __init__(self, provider):
+        super(GCSObjectStoreService, self).__init__(provider)
+
+    def get(self, bucket_id):
+        """
+        Returns a bucket given its ID. Returns ``None`` if the bucket
+        does not exist or if the user does not have permission to access the
+        bucket.
+        """
+        try:
+            response = (self.provider
+                            .gcp_storage
+                            .buckets()
+                            .get(bucket=bucket_id)
+                            .execute())
+            if 'error' in response:
+                # response['error']['code'] is 404 if the bucket does not exist
+                # and 403 if the user does not have permission to access it.
+                return None
+            return GCSBucket(self.provider, response)
+        except:
+            return None
+
+    def find(self, name, limit=None, marker=None):
+        """
+        Searches in bucket names for a substring.
+        """
+        buckets = [bucket for bucket in self.list() if name in bucket.name]
+        return ClientPagedResultList(self.provider, buckets, limit=limit,
+                                     marker=marker)
+
+    def list(self, limit=None, marker=None):
+        """
+        List all containers.
+        """
+        try:
+            response = (self.provider
+                            .gcp_storage
+                            .buckets()
+                            .list(project=self.provider.project_name)
+                            .execute())
+            if 'error' in response or 'items' not in response:
+                return []
+            buckets = [GCSBucket(self.provider, bucket)
+                       for bucket in response['items']]
+            return ClientPagedResultList(self.provider, buckets,
+                                         limit=limit, marker=marker)
+        except:
+            return []
+
+    def create(self, name, location=None):
+        """
+        Create a new bucket and returns it. Returns None if creation fails.
+        """
+        try:
+            response = (self.provider
+                            .gcp_storage
+                            .buckets()
+                            .insert(project=self.provider.project_name,
+                                    name=name,
+                                    location=location if location else '')
+                            .execute())
+            if 'error' in response:
+                return None
+            return GCSBucket(self.provider, response)
+        except:
+            return None