Просмотр исходного кода

BucketService fully refactored

almahmoud 7 лет назад
Родитель
Сommit
12b78a4a19

+ 30 - 0
cloudbridge/cloud/base/services.py

@@ -4,6 +4,7 @@ Base implementation for services available through a provider
 import logging
 
 import cloudbridge.cloud.base.helpers as cb_helpers
+from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseNetwork
 from cloudbridge.cloud.base.resources import BaseRouter
 from cloudbridge.cloud.base.resources import BaseSubnet
@@ -110,6 +111,7 @@ class BaseBucketService(
         self._init_get()
         self._init_find()
         self._init_list()
+        self._init_create()
 
     @property
     def service_event_name(self):
@@ -203,6 +205,34 @@ class BaseBucketService(
         return self.provider.events.emit(event_name, limit=limit,
                                          marker=marker)
 
+    def _create_pre_log(self, name, location):
+        message = "Creating {} bucket with name {}".format(
+            self.provider.name, name)
+        if location:
+            message += " in location: {}".format(location)
+        log.debug(message)
+
+    def _create_post_log(self, result, name, location):
+        log.debug("Returned bucket object: {}".format(result))
+
+    def _init_create(self):
+        event_name = ".".join((self.service_event_name, "create"))
+        self.provider.events.subscribe(event_name, 20000,
+                                       self._create_pre_log)
+        self.provider.events.subscribe(event_name, 20500,
+                                       self._create,
+                                       self._create_post_log)
+
+    def create(self, name, location=None):
+        """
+        Create a new bucket.
+        """
+        event_name = ".".join((self.service_event_name, "create"))
+        BaseBucket.assert_valid_resource_name(name)
+        location = location or self.provider.region_name
+        return self.provider.events.emit(event_name, name=name,
+                                         location=location)
+
 
 class BaseComputeService(ComputeService, BaseCloudService):
 

+ 1 - 1
cloudbridge/cloud/interfaces/exceptions.py

@@ -100,4 +100,4 @@ class NoHandlerException(CloudBridgeBaseException):
     Thrown when a timeout or errors occurs waiting for an object does not reach
     the expected state within a specified time limit.
     """
-    pass
+    pass

+ 3 - 7
cloudbridge/cloud/providers/aws/services.py

@@ -330,11 +330,7 @@ class AWSBucketService(BaseBucketService):
     def _list(self, limit, marker):
         return self.svc.list(limit=limit, marker=marker)
 
-    def create(self, name, location=None):
-        log.debug("Creating AWS Bucket with the params "
-                  "[name: %s, location: %s]", name, location)
-        AWSBucket.assert_valid_resource_name(name)
-        loc_constraint = location or self.provider.region_name
+    def _create(self, name, location):
         # Due to an API issue in S3, specifying us-east-1 as a
         # LocationConstraint results in an InvalidLocationConstraint.
         # Therefore, it must be special-cased and omitted altogether.
@@ -342,7 +338,7 @@ class AWSBucketService(BaseBucketService):
         # In addition, us-east-1 also behaves differently when it comes
         # to raising duplicate resource exceptions, so perform a manual
         # check
-        if loc_constraint == 'us-east-1':
+        if location == 'us-east-1':
             try:
                 # check whether bucket already exists
                 self.provider.s3_conn.meta.client.head_bucket(Bucket=name)
@@ -356,7 +352,7 @@ class AWSBucketService(BaseBucketService):
             try:
                 return self.svc.create('create_bucket', Bucket=name,
                                        CreateBucketConfiguration={
-                                           'LocationConstraint': loc_constraint
+                                           'LocationConstraint': location
                                         })
             except ClientError as e:
                 if e.response['Error']['Code'] == "BucketAlreadyOwnedByYou":

+ 1 - 2
cloudbridge/cloud/providers/azure/services.py

@@ -397,11 +397,10 @@ class AzureBucketService(BaseBucketService):
         return ClientPagedResultList(self.provider, buckets,
                                      limit=limit, marker=marker)
 
-    def create(self, name, location=None):
+    def _create(self, name, location=None):
         """
         Create a new bucket.
         """
-        AzureBucket.assert_valid_resource_name(name)
         bucket = self.provider.azure_client.create_container(name)
         return AzureBucket(self.provider, bucket)
 

+ 1 - 6
cloudbridge/cloud/providers/openstack/services.py

@@ -447,12 +447,7 @@ class OpenStackBucketService(BaseBucketService):
                       for c in container_list]
         return oshelpers.to_server_paged_list(self.provider, cb_buckets, limit)
 
-    def create(self, name, location=None):
-        """
-        Create a new bucket.
-        """
-        log.debug("Creating a new OpenStack Bucket with the name: %s", name)
-        OpenStackBucket.assert_valid_resource_name(name)
+    def _create(self, name, location):
         try:
             self.provider.swift.head_container(name)
             raise DuplicateResourceException(