Explorar o código

Implement GCSBucketContainer

Ehsan Chiniforooshan %!s(int64=8) %!d(string=hai) anos
pai
achega
8d55ad944f

+ 13 - 26
cloudbridge/cloud/providers/gce/provider.py

@@ -2,7 +2,6 @@
 Provider implementation based on google-api-python-client library
 for GCE.
 """
-import copy
 import json
 import logging
 import os
@@ -61,13 +60,9 @@ class GCPResourceUrl(object):
 
 class GCPResources(object):
 
-    def __init__(self, connection, project_name, region_name, default_zone):
+    def __init__(self, connection, **kwargs):
         self._connection = connection
-        self._parameter_defaults = {
-            'project': project_name,
-            'region': region_name,
-            'zone': default_zone,
-        }
+        self._parameter_defaults = kwargs
 
         # Resource descriptions are already pulled into the internal
         # _resourceDesc field of the connection.
@@ -168,8 +163,7 @@ class GCPResources(object):
                 out.parameters[parameter] = m.group(index + 1)
             return out
 
-    def get_resource_url_with_default(self, resource, url_or_name,
-                                      project=None, region=None, zone=None):
+    def get_resource_url_with_default(self, resource, url_or_name, **kwargs):
         """
         Build a GCPResourceUrl from a service's name and resource url or name.
         If the url_or_name is a valid GCP resource URL, then we build the
@@ -185,13 +179,8 @@ class GCPResources(object):
             cb.log.warning('Unknown resource: %s', resource)
             return None
 
-        parameter_defaults = copy.copy(self._parameter_defaults)
-        if project:
-            parameter_defaults['project'] = project
-        if region:
-            parameter_defaults['region'] = region
-        if zone:
-            parameter_defaults['zone'] = zone
+        parameter_defaults = self._parameter_defaults.copy()
+        parameter_defaults.update(kwargs)
 
         parsed_url = GCPResourceUrl(resource, self._connection)
         for key in self._resources[resource]['parameters']:
@@ -247,12 +236,11 @@ class GCECloudProvider(BaseCloudProvider):
         self._networking = GCENetworkingService(self)
         self._storage = GCPStorageService(self)
 
-        self._compute_resources = GCPResources(
-            self.gce_compute, self.project_name, self.region_name,
-            self.default_zone)
-        self._storage_resources = GCPResources(
-            self.gcs_storage, self.project_name, self.region_name,
-            self.default_zone)
+        self._compute_resources = GCPResources(self.gce_compute,
+                                               project=self.project_name,
+                                               region=self.region_name,
+                                               zone=self.default_zone)
+        self._storage_resources = GCPResources(self.gcs_storage)
 
     @property
     def compute(self):
@@ -320,13 +308,12 @@ class GCECloudProvider(BaseCloudProvider):
         out = self._compute_resources.parse_url(url)
         return out if out else self._storage_resources.parse_url(url)
 
-    def get_resource(self, resource, url_or_name, project=None, region=None,
-                     zone=None):
+    def get_resource(self, resource, url_or_name, **kwargs):
         resource_url = (
             self._compute_resources.get_resource_url_with_default(
-                resource, url_or_name, project, region, zone) or
+                resource, url_or_name, **kwargs) or
             self._storage_resources.get_resource_url_with_default(
-                resource, url_or_name, project, region, zone))
+                resource, url_or_name, **kwargs))
         if resource_url is None:
             return None
         try:

+ 39 - 19
cloudbridge/cloud/providers/gce/resources.py

@@ -9,8 +9,10 @@ import math
 import uuid
 
 import cloudbridge as cb
+import cloudbridge.cloud.base.helpers as cb_helpers
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo
 from cloudbridge.cloud.base.resources import BaseBucket
+from cloudbridge.cloud.base.resources import BaseBucketContainer
 from cloudbridge.cloud.base.resources import BaseBucketObject
 from cloudbridge.cloud.base.resources import BaseFloatingIP
 from cloudbridge.cloud.base.resources import BaseFloatingIPContainer
@@ -1587,7 +1589,7 @@ class GCESubnet(BaseSubnet):
     def state(self):
         if 'status' in self._subnet and self._subnet['status'] == 'UNKNOWN':
             return SubnetState.UNKNOWN
-        return SubnetState.AVAILABEL
+        return SubnetState.AVAILABLE
 
     def refresh(self):
         self._subnet = self._provider.get_resource('subnetworks', self.id)
@@ -1947,29 +1949,18 @@ class GCSObject(BaseBucketObject):
         return self._obj['mediaLink']
 
 
-class GCSBucket(BaseBucket):
+class GCSBucketContainer(BaseBucketContainer):
 
     def __init__(self, provider, bucket):
-        super(GCSBucket, self).__init__(provider)
-        self._bucket = bucket
-
-    @property
-    def id(self):
-        return self._bucket['selfLink']
-
-    @property
-    def name(self):
-        """
-        Get this bucket's name.
-        """
-        return self._bucket['name']
+        super(GCSBucketContainer, self).__init__(provider, bucket)
 
     def get(self, name):
         """
         Retrieve a given object from this bucket.
         """
-        obj = self._provider.get_resource('objects', name)
-        return GCSObject(self._provider, self, obj) if obj else None
+        obj = self._provider.get_resource('objects', name,
+                                          bucket=self.bucket.name)
+        return GCSObject(self._provider, self.bucket, obj) if obj else None
 
     def list(self, limit=None, marker=None, prefix=None):
         """
@@ -1980,7 +1971,7 @@ class GCSBucket(BaseBucket):
             response = (self._provider
                             .gcp_storage
                             .objects()
-                            .list(bucket=self.name,
+                            .list(bucket=self.bucket.name,
                                   prefix=prefix if prefix else '',
                                   maxResults=max_result,
                                   pageToken=marker)
@@ -1989,7 +1980,7 @@ class GCSBucket(BaseBucket):
                 return ServerPagedResultList(False, None, False, data=[])
             objects = []
             for obj in response.get('items', []):
-                objects.append(GCSObject(self._provider, self, obj))
+                objects.append(GCSObject(self._provider, self.bucket, obj))
             if len(objects) > max_result:
                 cb.log.warning('Expected at most %d results; got %d',
                                max_result, len(objects))
@@ -2000,6 +1991,35 @@ class GCSBucket(BaseBucket):
             cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
             return ServerPagedResultList(False, None, False, data=[])
 
+    def find(self, **kwargs):
+        obj_list = self.list()
+        filters = ['name']
+        matches = cb_helpers.generic_find(filters, kwargs, obj_list)
+        return ClientPagedResultList(self._provider, list(matches),
+                                     limit=None, marker=None)
+
+    def create(self, name):
+        return self.bucket.create_object(name)
+
+
+class GCSBucket(BaseBucket):
+
+    def __init__(self, provider, bucket):
+        super(GCSBucket, self).__init__(provider)
+        self._bucket = bucket
+        self._object_container = GCSBucketContainer(provider, self)
+
+    @property
+    def id(self):
+        return self._bucket['selfLink']
+
+    @property
+    def name(self):
+        """
+        Get this bucket's name.
+        """
+        return self._bucket['name']
+
     def delete(self, delete_contents=False):
         """
         Delete this bucket.

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

@@ -893,13 +893,12 @@ class GCESubnetService(BaseSubnetService):
                                     region=region,
                                     body=body)
                             .execute())
-            self.provider.wait_for_operation(response, region=region)
             if 'error' in response:
+                cb.log.warning('Error while creating a subnet: %s',
+                               response['error'])
                 return None
-            subnets = self.list(network, zone)
-            for subnet in subnets:
-                if subnet.id == response['targetId']:
-                    return subnet
+            self.provider.wait_for_operation(response, region=region)
+            return self.get(name)
         except googleapiclient.errors.HttpError as http_error:
             cb.log.warning('googleapiclient.errors.HttpError: %s', http_error)
             return None