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

BucketService with events across providers

almahmoud 7 лет назад
Родитель
Сommit
2baba964f0

+ 23 - 47
cloudbridge/cloud/base/services.py

@@ -5,7 +5,6 @@ import logging
 
 import cloudbridge.cloud.base.helpers as cb_helpers
 from cloudbridge.cloud.base.events import execute
-from cloudbridge.cloud.base.middleware import observe
 from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseNetwork
 from cloudbridge.cloud.base.resources import BaseRouter
@@ -44,6 +43,7 @@ class BaseCloudService(CloudService):
     STANDARD_EVENT_PRIORITY = 2500
 
     def __init__(self, provider):
+        self._service_event_pattern = provider.PROVIDER_ID
         self._provider = provider
         # discover and register all middleware
         provider.middleware.add(self)
@@ -70,6 +70,23 @@ class BaseCloudService(CloudService):
         event_pattern = self._generate_event_pattern(func_name)
         self.provider.events.execute(event_pattern, priority, callback)
 
+    def emit_function(self, sender, func_name, *args, **kwargs):
+        """
+        Emits the event corresponding to the given function name for the
+        current service
+
+        :type sender: CloudService
+        :param sender: The CloudBridge Service object sending the emit signal
+        :type func_name: str
+        :param func_name: The name of the function to be emitted. e.g.: 'get'
+        :type args: CloudService
+
+        :return:  The return value resulting from the handler chain invocations
+        """
+        full_event_name = self._generate_event_pattern(func_name)
+        return self._provider.events.emit(sender, full_event_name,
+                                          *args, **kwargs)
+
 
 class BaseSecurityService(SecurityService, BaseCloudService):
 
@@ -156,48 +173,9 @@ class BaseBucketService(
         super(BaseBucketService, self).__init__(provider)
         self._service_event_pattern += ".buckets"
 
-    @observe(event_pattern="provider.storage.buckets.get", priority=2000)
-    def _pre_log_get(self, event_args, bucket_id):
-        log.debug("Getting {} bucket with the id: {}".format(
-            self.provider.name, bucket_id))
-
-    @observe(event_pattern="provider.storage.buckets.get", priority=3000)
-    def _post_log_get(self, event_args, bucket_id):
-        log.debug("Returned bucket obj: {}".format(event_args.get('result')))
-
-    @observe(event_pattern="provider.storage.buckets.find", priority=2000)
-    def _pre_log_find(self, *args, **kwargs):
-        log.debug("Finding {} buckets with the following arguments: {}"
-                  .format(self.provider.name, kwargs))
-
-    @observe(event_pattern="provider.storage.buckets.find", priority=3000)
-    def _post_log_find(self, event_args, *args, **kwargs):
-        log.debug("Returned bucket obj: {}".format(event_args.get('result')))
-
-    def _list_pre_log(self, limit, marker):
-        message = "Listing {} buckets".format(self.provider.name)
-        if limit:
-            message += " with limit: {}".format(limit)
-        if marker:
-            message += " with marker: {}".format(marker)
-        log.debug(message)
-
-    def _list_post_log(self, callback_result, limit, marker):
-        log.debug("Returned bucket objects: {}".format(callback_result))
-
-    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, callback_result, name, location):
-        log.debug("Returned bucket object: {}".format(callback_result))
-
     # Generic find will be used for providers where we have not implemented
     # provider-specific querying for find method
-    @execute(event_pattern="provider.storage.buckets.find",
+    @execute(event_pattern="*.storage.buckets.find",
              priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
     def _find(self, **kwargs):
         obj_list = self
@@ -218,28 +196,26 @@ class BaseBucketService(
         Returns a bucket given its ID. Returns ``None`` if the bucket
         does not exist.
         """
-        return self.emit(self, "provider.storage.buckets.get", bucket_id)
+        return self.emit_function(self, "get", bucket_id)
 
     def find(self, **kwargs):
         """
         Returns a list of buckets filtered by the given keyword arguments.
         """
-        return self.emit(self, "provider.storage.buckets.find", **kwargs)
+        return self.emit_function(self, "find", **kwargs)
 
     def list(self, limit=None, marker=None):
         """
         List all buckets.
         """
-        return self.emit(self, "provider.storage.buckets.list",
-                         limit=limit, marker=marker)
+        return self.emit_function(self, "list", limit=limit, marker=marker)
 
     def create(self, name, location=None):
         """
         Create a new bucket.
         """
         BaseBucket.assert_valid_resource_name(name)
-        return self.emit(self, "provider.storage.buckets.create",
-                         name, location=location)
+        return self.emit_function(self, "create", name, location=location)
 
 
 class BaseBucketObjectService(

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

@@ -309,7 +309,7 @@ class AWSBucketService(BaseBucketService):
                                  cb_resource=AWSBucket,
                                  boto_collection_name='buckets')
 
-    @execute(event_pattern="provider.storage.buckets.get",
+    @execute(event_pattern="aws.storage.buckets.get",
              priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _get(self, bucket_id):
         """
@@ -339,12 +339,12 @@ class AWSBucketService(BaseBucketService):
         # For all other responses, it's assumed that the bucket does not exist.
         return None
 
-    @execute(event_pattern="provider.storage.buckets.list",
+    @execute(event_pattern="aws.storage.buckets.list",
              priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _list(self, limit, marker):
         return self.svc.list(limit=limit, marker=marker)
 
-    @execute(event_pattern="provider.storage.buckets.create",
+    @execute(event_pattern="aws.storage.buckets.create",
              priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _create(self, name, location):
         AWSBucket.assert_valid_resource_name(name)

+ 7 - 0
cloudbridge/cloud/providers/azure/services.py

@@ -8,6 +8,7 @@ from azure.mgmt.compute.models import DiskCreateOption
 from msrestazure.azure_exceptions import CloudError
 
 import cloudbridge.cloud.base.helpers as cb_helpers
+from cloudbridge.cloud.base.events import execute
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ServerPagedResultList
 from cloudbridge.cloud.base.services import BaseBucketObjectService
@@ -395,6 +396,8 @@ class AzureBucketService(BaseBucketService):
     def __init__(self, provider):
         super(AzureBucketService, self).__init__(provider)
 
+    @execute(event_pattern="azure.storage.buckets.get",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _get(self, bucket_id):
         """
         Returns a bucket given its ID. Returns ``None`` if the bucket
@@ -407,12 +410,16 @@ class AzureBucketService(BaseBucketService):
             log.exception(error)
             return None
 
+    @execute(event_pattern="azure.storage.buckets.list",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _list(self, limit, marker):
         buckets = [AzureBucket(self.provider, bucket)
                    for bucket in self.provider.azure_client.list_containers()]
         return ClientPagedResultList(self.provider, buckets,
                                      limit=limit, marker=marker)
 
+    @execute(event_pattern="azure.storage.buckets.create",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _create(self, name, location=None):
         """
         Create a new bucket.

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

@@ -8,6 +8,7 @@ import googleapiclient
 
 import cloudbridge as cb
 from cloudbridge.cloud.base import helpers as cb_helpers
+from cloudbridge.cloud.base.events import execute
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ServerPagedResultList
 from cloudbridge.cloud.base.services import BaseBucketService
@@ -1130,7 +1131,9 @@ class GCSBucketService(BaseBucketService):
     def __init__(self, provider):
         super(GCSBucketService, self).__init__(provider)
 
-    def get(self, bucket_id):
+    @execute(event_pattern="gce.storage.buckets.get",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    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
@@ -1139,7 +1142,9 @@ class GCSBucketService(BaseBucketService):
         bucket = self.provider.get_resource('buckets', bucket_id)
         return GCSBucket(self.provider, bucket) if bucket else None
 
-    def find(self, name, limit=None, marker=None):
+    @execute(event_pattern="gce.storage.buckets.find",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    def _find(self, name, limit=None, marker=None):
         """
         Searches in bucket names for a substring.
         """
@@ -1147,7 +1152,9 @@ class GCSBucketService(BaseBucketService):
         return ClientPagedResultList(self.provider, buckets, limit=limit,
                                      marker=marker)
 
-    def list(self, limit=None, marker=None):
+    @execute(event_pattern="gce.storage.buckets.list",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         """
         List all containers.
         """
@@ -1169,7 +1176,9 @@ class GCSBucketService(BaseBucketService):
                                      response.get('nextPageToken'),
                                      False, data=buckets)
 
-    def create(self, name, location=None):
+    @execute(event_pattern="gce.storage.buckets.create",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    def _create(self, name, location=None):
         GCSBucket.assert_valid_resource_name(name)
         body = {'name': name}
         if location:

+ 9 - 0
cloudbridge/cloud/providers/openstack/services.py

@@ -15,6 +15,7 @@ from openstack.exceptions import ResourceNotFound
 from swiftclient import ClientException as SwiftClientException
 
 import cloudbridge.cloud.base.helpers as cb_helpers
+from cloudbridge.cloud.base.events import execute
 from cloudbridge.cloud.base.resources import BaseLaunchConfig
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.services import BaseBucketObjectService
@@ -410,6 +411,8 @@ class OpenStackBucketService(BaseBucketService):
     def __init__(self, provider):
         super(OpenStackBucketService, self).__init__(provider)
 
+    @execute(event_pattern="openstack.storage.buckets.get",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _get(self, bucket_id):
         """
         Returns a bucket given its ID. Returns ``None`` if the bucket
@@ -425,6 +428,8 @@ class OpenStackBucketService(BaseBucketService):
             log.debug("Bucket %s was not found.", bucket_id)
             return None
 
+    @execute(event_pattern="openstack.storage.buckets.find",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _find(self, **kwargs):
         name = kwargs.pop('name', None)
 
@@ -438,6 +443,8 @@ class OpenStackBucketService(BaseBucketService):
                       if name in c.get("name")]
         return oshelpers.to_server_paged_list(self.provider, cb_buckets)
 
+    @execute(event_pattern="openstack.storage.buckets.list",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _list(self, limit, marker):
         _, container_list = self.provider.swift.get_account(
             limit=oshelpers.os_result_limit(self.provider, limit),
@@ -446,6 +453,8 @@ class OpenStackBucketService(BaseBucketService):
                       for c in container_list]
         return oshelpers.to_server_paged_list(self.provider, cb_buckets, limit)
 
+    @execute(event_pattern="openstack.storage.buckets.create",
+             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _create(self, name, location):
         OpenStackBucket.assert_valid_resource_name(name)
         location = location or self.provider.region_name