فهرست منبع

Merge pull request #178 from CloudVE/middleware-alex

Middleware
Nuwan Goonasekera 7 سال پیش
والد
کامیت
480b806991

+ 3 - 3
cloudbridge/cloud/base/events.py

@@ -32,7 +32,7 @@ def observe(event_pattern, priority):
     return deco
     return deco
 
 
 
 
-def execute(event_pattern, priority):
+def implement(event_pattern, priority):
     def deco(f):
     def deco(f):
         # Mark function as having an event_handler so we can discover it
         # Mark function as having an event_handler so we can discover it
         # The callback cannot be set to f as it is not bound yet and will be
         # The callback cannot be set to f as it is not bound yet and will be
@@ -207,12 +207,12 @@ class SimpleEventDispatcher(EventDispatcher):
         self.subscribe(handler)
         self.subscribe(handler)
         return handler
         return handler
 
 
-    def execute(self, event_pattern, priority, callback):
+    def implement(self, event_pattern, priority, callback):
         handler = ExecutingEventHandler(event_pattern, priority, callback)
         handler = ExecutingEventHandler(event_pattern, priority, callback)
         self.subscribe(handler)
         self.subscribe(handler)
         return handler
         return handler
 
 
-    def emit(self, sender, event, *args, **kwargs):
+    def dispatch(self, sender, event, *args, **kwargs):
         handlers = self.get_handlers_for_event(event)
         handlers = self.get_handlers_for_event(event)
 
 
         if handlers:
         if handlers:

+ 16 - 7
cloudbridge/cloud/base/middleware.py

@@ -1,11 +1,12 @@
-import inspect
 import logging
 import logging
 import sys
 import sys
+from inspect import ismethod
 
 
 import six
 import six
 
 
 from ..base.events import intercept
 from ..base.events import intercept
 from ..base.events import observe
 from ..base.events import observe
+from ..interfaces.events import EventHandler
 from ..interfaces.exceptions import CloudBridgeBaseException
 from ..interfaces.exceptions import CloudBridgeBaseException
 from ..interfaces.middleware import Middleware
 from ..interfaces.middleware import Middleware
 from ..interfaces.middleware import MiddlewareManager
 from ..interfaces.middleware import MiddlewareManager
@@ -37,6 +38,7 @@ class BaseMiddleware(Middleware):
 
 
     def __init__(self):
     def __init__(self):
         self.event_handlers = []
         self.event_handlers = []
+        self.events = None
 
 
     def install(self, event_manager):
     def install(self, event_manager):
         self.events = event_manager
         self.events = event_manager
@@ -53,12 +55,19 @@ class BaseMiddleware(Middleware):
 
 
     def discover_handlers(self, class_or_obj):
     def discover_handlers(self, class_or_obj):
         discovered_handlers = []
         discovered_handlers = []
-        for _, func in inspect.getmembers(class_or_obj, inspect.ismethod):
-            handler = getattr(func, "__event_handler", None)
-            if handler:
-                # Set the properly bound method as the callback
-                handler.callback = func
-                discovered_handlers.append(handler)
+        for key in dir(class_or_obj):
+            try:
+                func = getattr(class_or_obj, key)
+            # Properties can sometimes cause various exceptions (e.g. during
+            # auth failure testing)
+            except Exception:
+                continue
+            if ismethod(func):
+                handler = getattr(func, "__event_handler", None)
+                if handler and isinstance(handler, EventHandler):
+                    # Set the properly bound method as the callback
+                    handler.callback = func
+                    discovered_handlers.append(handler)
         return discovered_handlers
         return discovered_handlers
 
 
     def uninstall(self):
     def uninstall(self):

+ 8 - 0
cloudbridge/cloud/base/resources.py

@@ -752,6 +752,14 @@ class BaseBucket(BaseCloudResource, Bucket):
                 # check from most to least likely mutables
                 # check from most to least likely mutables
                 self.name == other.name)
                 self.name == other.name)
 
 
+    def delete(self):
+        """
+        Delete this bucket.
+        """
+        self._provider.storage.buckets.delete(self.id)
+
+    # TODO: Discuss creating `create_object` method, or change docs
+
 
 
 class BaseBucketContainer(BasePageableObjectMixin, BucketContainer):
 class BaseBucketContainer(BasePageableObjectMixin, BucketContainer):
 
 

+ 84 - 83
cloudbridge/cloud/base/services.py

@@ -4,8 +4,7 @@ Base implementation for services available through a provider
 import logging
 import logging
 
 
 import cloudbridge.cloud.base.helpers as cb_helpers
 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.events import implement
 from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseNetwork
 from cloudbridge.cloud.base.resources import BaseNetwork
 from cloudbridge.cloud.base.resources import BaseRouter
 from cloudbridge.cloud.base.resources import BaseRouter
@@ -44,6 +43,7 @@ class BaseCloudService(CloudService):
     STANDARD_EVENT_PRIORITY = 2500
     STANDARD_EVENT_PRIORITY = 2500
 
 
     def __init__(self, provider):
     def __init__(self, provider):
+        self._service_event_pattern = "provider"
         self._provider = provider
         self._provider = provider
         # discover and register all middleware
         # discover and register all middleware
         provider.middleware.add(self)
         provider.middleware.add(self)
@@ -52,8 +52,8 @@ class BaseCloudService(CloudService):
     def provider(self):
     def provider(self):
         return self._provider
         return self._provider
 
 
-    def emit(self, sender, event, *args, **kwargs):
-        return self._provider.events.emit(sender, event, *args, **kwargs)
+    def dispatch(self, sender, event, *args, **kwargs):
+        return self._provider.events.dispatch(sender, event, *args, **kwargs)
 
 
     def _generate_event_pattern(self, func_name):
     def _generate_event_pattern(self, func_name):
         return ".".join((self._service_event_pattern, func_name))
         return ".".join((self._service_event_pattern, func_name))
@@ -66,24 +66,40 @@ class BaseCloudService(CloudService):
         event_pattern = self._generate_event_pattern(func_name)
         event_pattern = self._generate_event_pattern(func_name)
         self.provider.events.intercept(event_pattern, priority, callback)
         self.provider.events.intercept(event_pattern, priority, callback)
 
 
-    def execute_function(self, func_name, priority, callback):
+    def implement_function(self, func_name, priority, callback):
         event_pattern = self._generate_event_pattern(func_name)
         event_pattern = self._generate_event_pattern(func_name)
-        self.provider.events.execute(event_pattern, priority, callback)
+        self.provider.events.implement(event_pattern, priority, callback)
+
+    def dispatch_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.dispatch(sender, full_event_name,
+                                              *args, **kwargs)
 
 
 
 
 class BaseSecurityService(SecurityService, BaseCloudService):
 class BaseSecurityService(SecurityService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseSecurityService, self).__init__(provider)
         super(BaseSecurityService, self).__init__(provider)
-        self._service_event_pattern += ".security"
 
 
 
 
 class BaseKeyPairService(
 class BaseKeyPairService(
-        BasePageableObjectMixin, KeyPairService, BaseSecurityService):
+        BasePageableObjectMixin, KeyPairService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseKeyPairService, self).__init__(provider)
         super(BaseKeyPairService, self).__init__(provider)
-        self._service_event_pattern += ".key_pairs"
+        self._service_event_pattern += ".security.key_pairs"
 
 
     def delete(self, key_pair_id):
     def delete(self, key_pair_id):
         """
         """
@@ -105,11 +121,11 @@ class BaseKeyPairService(
 
 
 
 
 class BaseVMFirewallService(
 class BaseVMFirewallService(
-        BasePageableObjectMixin, VMFirewallService, BaseSecurityService):
+        BasePageableObjectMixin, VMFirewallService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseVMFirewallService, self).__init__(provider)
         super(BaseVMFirewallService, self).__init__(provider)
-        self._service_event_pattern += ".vm_firewalls"
+        self._service_event_pattern += ".security.vm_firewalls"
 
 
     def find(self, **kwargs):
     def find(self, **kwargs):
         obj_list = self
         obj_list = self
@@ -130,75 +146,35 @@ class BaseStorageService(StorageService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseStorageService, self).__init__(provider)
         super(BaseStorageService, self).__init__(provider)
-        self._service_event_pattern += ".storage"
 
 
 
 
 class BaseVolumeService(
 class BaseVolumeService(
-        BasePageableObjectMixin, VolumeService, BaseStorageService):
+        BasePageableObjectMixin, VolumeService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseVolumeService, self).__init__(provider)
         super(BaseVolumeService, self).__init__(provider)
-        self._service_event_pattern += ".volumes"
+        self._service_event_pattern += ".storage.volumes"
 
 
 
 
 class BaseSnapshotService(
 class BaseSnapshotService(
-        BasePageableObjectMixin, SnapshotService, BaseStorageService):
+        BasePageableObjectMixin, SnapshotService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseSnapshotService, self).__init__(provider)
         super(BaseSnapshotService, self).__init__(provider)
-        self._service_event_pattern += ".snapshots"
+        self._service_event_pattern += ".storage.snapshots"
 
 
 
 
 class BaseBucketService(
 class BaseBucketService(
-        BasePageableObjectMixin, BucketService, BaseStorageService):
+        BasePageableObjectMixin, BucketService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseBucketService, self).__init__(provider)
         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))
+        self._service_event_pattern += ".storage.buckets"
 
 
     # Generic find will be used for providers where we have not implemented
     # Generic find will be used for providers where we have not implemented
     # provider-specific querying for find method
     # provider-specific querying for find method
-    @execute(event_pattern="provider.storage.buckets.find",
-             priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
+    @implement(event_pattern="*.storage.buckets.find",
+               priority=BaseCloudService.STANDARD_EVENT_PRIORITY)
     def _find(self, **kwargs):
     def _find(self, **kwargs):
         obj_list = self
         obj_list = self
         filters = ['name']
         filters = ['name']
@@ -217,39 +193,66 @@ class BaseBucketService(
         """
         """
         Returns a bucket given its ID. Returns ``None`` if the bucket
         Returns a bucket given its ID. Returns ``None`` if the bucket
         does not exist.
         does not exist.
+
+        :type bucket_id: str
+        :param bucket_id: The id of the desired bucket.
+
+        :rtype: ``Bucket``
+        :return:  ``None`` is returned if the bucket does not exist, and
+                  the bucket's provider-specific CloudBridge object is
+                  returned if the bucket is found.
         """
         """
-        return self.emit(self, "provider.storage.buckets.get", bucket_id)
+        return self.dispatch(self, "provider.storage.buckets.get", bucket_id)
 
 
     def find(self, **kwargs):
     def find(self, **kwargs):
         """
         """
         Returns a list of buckets filtered by the given keyword arguments.
         Returns a list of buckets filtered by the given keyword arguments.
+        Accepted search arguments are: 'name'
         """
         """
-        return self.emit(self, "provider.storage.buckets.find", **kwargs)
+        return self.dispatch(self, "provider.storage.buckets.find", **kwargs)
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         """
         """
         List all buckets.
         List all buckets.
         """
         """
-        return self.emit(self, "provider.storage.buckets.list",
-                         limit=limit, marker=marker)
+        return self.dispatch(self, "provider.storage.buckets.list",
+                             limit=limit, marker=marker)
 
 
     def create(self, name, location=None):
     def create(self, name, location=None):
         """
         """
         Create a new bucket.
         Create a new bucket.
+
+        :type name: str
+        :param name: The name of the bucket to be created. Note that names
+                     must be unique, and are unchangeable.
+
+        :rtype: ``Bucket``
+        :return:  The created bucket's provider-specific CloudBridge object.
         """
         """
         BaseBucket.assert_valid_resource_name(name)
         BaseBucket.assert_valid_resource_name(name)
-        return self.emit(self, "provider.storage.buckets.create",
-                         name, location=location)
+        return self.dispatch(self, "provider.storage.buckets.create",
+                             name, location=location)
+
+    def delete(self, bucket_id):
+        """
+        Delete an existing bucket.
+
+        :type bucket_id: str
+        :param bucket_id: The ID of the bucket to be deleted.
+        """
+        return self.dispatch(self, "provider.storage.buckets.delete",
+                             bucket_id)
 
 
 
 
 class BaseBucketObjectService(
 class BaseBucketObjectService(
-        BasePageableObjectMixin, BucketObjectService, BaseStorageService):
+        BasePageableObjectMixin, BucketObjectService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseBucketObjectService, self).__init__(provider)
         super(BaseBucketObjectService, self).__init__(provider)
-        self._service_event_pattern += ".bucket_objects"
+        self._service_event_pattern += ".storage.bucket_objects"
         self._bucket = None
         self._bucket = None
 
 
+    # Default bucket needs to be set in order for the service to be iterable
     def set_bucket(self, bucket):
     def set_bucket(self, bucket):
         bucket = bucket if isinstance(bucket, BaseBucket) \
         bucket = bucket if isinstance(bucket, BaseBucket) \
                  else self.provider.storage.buckets.get(bucket)
                  else self.provider.storage.buckets.get(bucket)
@@ -280,31 +283,30 @@ class BaseComputeService(ComputeService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseComputeService, self).__init__(provider)
         super(BaseComputeService, self).__init__(provider)
-        self._service_event_pattern += ".compute"
 
 
 
 
 class BaseImageService(
 class BaseImageService(
-        BasePageableObjectMixin, ImageService, BaseComputeService):
+        BasePageableObjectMixin, ImageService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseImageService, self).__init__(provider)
         super(BaseImageService, self).__init__(provider)
-        self._service_event_pattern += ".images"
+        self._service_event_pattern += ".compute.images"
 
 
 
 
 class BaseInstanceService(
 class BaseInstanceService(
-        BasePageableObjectMixin, InstanceService, BaseComputeService):
+        BasePageableObjectMixin, InstanceService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseInstanceService, self).__init__(provider)
         super(BaseInstanceService, self).__init__(provider)
-        self._service_event_pattern += ".instances"
+        self._service_event_pattern += ".compute.instances"
 
 
 
 
 class BaseVMTypeService(
 class BaseVMTypeService(
-        BasePageableObjectMixin, VMTypeService, BaseComputeService):
+        BasePageableObjectMixin, VMTypeService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseVMTypeService, self).__init__(provider)
         super(BaseVMTypeService, self).__init__(provider)
-        self._service_event_pattern += ".vm_types"
+        self._service_event_pattern += ".compute.vm_types"
 
 
     def get(self, vm_type_id):
     def get(self, vm_type_id):
         vm_type = (t for t in self if t.id == vm_type_id)
         vm_type = (t for t in self if t.id == vm_type_id)
@@ -318,11 +320,11 @@ class BaseVMTypeService(
 
 
 
 
 class BaseRegionService(
 class BaseRegionService(
-        BasePageableObjectMixin, RegionService, BaseComputeService):
+        BasePageableObjectMixin, RegionService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseRegionService, self).__init__(provider)
         super(BaseRegionService, self).__init__(provider)
-        self._service_event_pattern += ".regions"
+        self._service_event_pattern += ".compute.regions"
 
 
     def find(self, **kwargs):
     def find(self, **kwargs):
         obj_list = self
         obj_list = self
@@ -335,15 +337,14 @@ class BaseNetworkingService(NetworkingService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseNetworkingService, self).__init__(provider)
         super(BaseNetworkingService, self).__init__(provider)
-        self._service_event_pattern += ".networking"
 
 
 
 
 class BaseNetworkService(
 class BaseNetworkService(
-        BasePageableObjectMixin, NetworkService, BaseNetworkingService):
+        BasePageableObjectMixin, NetworkService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseNetworkService, self).__init__(provider)
         super(BaseNetworkService, self).__init__(provider)
-        self._service_event_pattern += ".networks"
+        self._service_event_pattern += ".networking.networks"
 
 
     @property
     @property
     def subnets(self):
     def subnets(self):
@@ -370,11 +371,11 @@ class BaseNetworkService(
 
 
 
 
 class BaseSubnetService(
 class BaseSubnetService(
-        BasePageableObjectMixin, SubnetService, BaseNetworkingService):
+        BasePageableObjectMixin, SubnetService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseSubnetService, self).__init__(provider)
         super(BaseSubnetService, self).__init__(provider)
-        self._service_event_pattern += ".subnets"
+        self._service_event_pattern += ".networking.subnets"
 
 
     def find(self, **kwargs):
     def find(self, **kwargs):
         obj_list = self
         obj_list = self
@@ -396,11 +397,11 @@ class BaseSubnetService(
 
 
 
 
 class BaseRouterService(
 class BaseRouterService(
-        BasePageableObjectMixin, RouterService, BaseNetworkingService):
+        BasePageableObjectMixin, RouterService, BaseCloudService):
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseRouterService, self).__init__(provider)
         super(BaseRouterService, self).__init__(provider)
-        self._service_event_pattern += ".routers"
+        self._service_event_pattern += ".networking.routers"
 
 
     def delete(self, router):
     def delete(self, router):
         if isinstance(router, Router):
         if isinstance(router, Router):

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

@@ -93,7 +93,7 @@ class EventDispatcher(object):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def emit(self, sender, event, *args, **kwargs):
+    def dispatch(self, sender, event, *args, **kwargs):
         """
         """
         Raises an event, which will trigger all handlers that are registered
         Raises an event, which will trigger all handlers that are registered
         for this event. The return value of the emit function is the return
         for this event. The return value of the emit function is the return

+ 0 - 3
cloudbridge/cloud/providers/aws/resources.py

@@ -888,9 +888,6 @@ class AWSBucket(BaseBucket):
     def objects(self):
     def objects(self):
         return self._object_container
         return self._object_container
 
 
-    def delete(self, delete_contents=False):
-        self._bucket.delete()
-
 
 
 class AWSBucketContainer(BaseBucketContainer):
 class AWSBucketContainer(BaseBucketContainer):
 
 

+ 19 - 8
cloudbridge/cloud/providers/aws/services.py

@@ -10,7 +10,7 @@ import cachetools
 import requests
 import requests
 
 
 import cloudbridge.cloud.base.helpers as cb_helpers
 import cloudbridge.cloud.base.helpers as cb_helpers
-from cloudbridge.cloud.base.events import execute
+from cloudbridge.cloud.base.events import implement
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.services import BaseBucketObjectService
 from cloudbridge.cloud.base.services import BaseBucketObjectService
 from cloudbridge.cloud.base.services import BaseBucketService
 from cloudbridge.cloud.base.services import BaseBucketService
@@ -309,8 +309,8 @@ class AWSBucketService(BaseBucketService):
                                  cb_resource=AWSBucket,
                                  cb_resource=AWSBucket,
                                  boto_collection_name='buckets')
                                  boto_collection_name='buckets')
 
 
-    @execute(event_pattern="provider.storage.buckets.get",
-             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @implement(event_pattern="provider.storage.buckets.get",
+               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _get(self, bucket_id):
     def _get(self, bucket_id):
         """
         """
         Returns a bucket given its ID. Returns ``None`` if the bucket
         Returns a bucket given its ID. Returns ``None`` if the bucket
@@ -339,13 +339,13 @@ class AWSBucketService(BaseBucketService):
         # For all other responses, it's assumed that the bucket does not exist.
         # For all other responses, it's assumed that the bucket does not exist.
         return None
         return None
 
 
-    @execute(event_pattern="provider.storage.buckets.list",
-             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @implement(event_pattern="provider.storage.buckets.list",
+               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _list(self, limit, marker):
     def _list(self, limit, marker):
         return self.svc.list(limit=limit, marker=marker)
         return self.svc.list(limit=limit, marker=marker)
 
 
-    @execute(event_pattern="provider.storage.buckets.create",
-             priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    @implement(event_pattern="provider.storage.buckets.create",
+               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
     def _create(self, name, location):
     def _create(self, name, location):
         AWSBucket.assert_valid_resource_name(name)
         AWSBucket.assert_valid_resource_name(name)
         location = location or self.provider.region_name
         location = location or self.provider.region_name
@@ -379,9 +379,19 @@ class AWSBucketService(BaseBucketService):
                 else:
                 else:
                     raise
                     raise
 
 
+    @implement(event_pattern="provider.storage.buckets.delete",
+               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, bucket_id):
+        bucket = self._get(bucket_id)
+        if bucket:
+            bucket._bucket.delete()
+
 
 
 class AWSBucketObjectService(BaseBucketObjectService):
 class AWSBucketObjectService(BaseBucketObjectService):
 
 
+    def __init__(self, provider):
+        super(AWSBucketObjectService, self).__init__(provider)
+
     def get(self, bucket, object_id):
     def get(self, bucket, object_id):
         try:
         try:
             # pylint:disable=protected-access
             # pylint:disable=protected-access
@@ -404,7 +414,8 @@ class AWSBucketObjectService(BaseBucketObjectService):
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
     def find(self, bucket, **kwargs):
     def find(self, bucket, **kwargs):
-        obj_list = bucket._bucket.objects.all()
+        obj_list = [AWSBucketObject(self.provider, o)
+                    for o in bucket._bucket.objects.all()]
         filters = ['name']
         filters = ['name']
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         return ClientPagedResultList(self.provider, list(matches),
         return ClientPagedResultList(self.provider, list(matches),

+ 0 - 6
cloudbridge/cloud/providers/azure/resources.py

@@ -358,12 +358,6 @@ class AzureBucket(BaseBucket):
         """
         """
         return self._bucket.name
         return self._bucket.name
 
 
-    def delete(self, delete_contents=True):
-        """
-        Delete this bucket.
-        """
-        self._provider.azure_client.delete_container(self.name)
-
     def exists(self, name):
     def exists(self, name):
         """
         """
         Determine if an object with given name exists in this bucket.
         Determine if an object with given name exists in this bucket.

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

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

+ 10 - 80
cloudbridge/cloud/providers/gce/resources.py

@@ -16,7 +16,6 @@ from collections import namedtuple
 import googleapiclient
 import googleapiclient
 
 
 import cloudbridge as cb
 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 BaseAttachmentInfo
 from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseBucketContainer
 from cloudbridge.cloud.base.resources import BaseBucketContainer
@@ -2150,8 +2149,11 @@ class GCSObject(BaseBucketObject):
             data = data.encode()
             data = data.encode()
         media_body = googleapiclient.http.MediaIoBaseUpload(
         media_body = googleapiclient.http.MediaIoBaseUpload(
                 io.BytesIO(data), mimetype='plain/text')
                 io.BytesIO(data), mimetype='plain/text')
-        response = self._bucket.create_object_with_media_body(self.name,
-                                                              media_body)
+        response = (self._provider
+                        .storage.bucket_objects
+                        ._create_object_with_media_body(self._bucket,
+                                                        self.name,
+                                                        media_body))
         if response:
         if response:
             self._obj = response
             self._obj = response
 
 
@@ -2162,8 +2164,11 @@ class GCSObject(BaseBucketObject):
         with open(path, 'rb') as f:
         with open(path, 'rb') as f:
             media_body = googleapiclient.http.MediaIoBaseUpload(
             media_body = googleapiclient.http.MediaIoBaseUpload(
                     f, 'application/octet-stream')
                     f, 'application/octet-stream')
-            response = self._bucket.create_object_with_media_body(self.name,
-                                                                  media_body)
+            response = (self._provider
+                        .storage.bucket_objects
+                        ._create_object_with_media_body(self._bucket,
+                                                        self.name,
+                                                        media_body))
             if response:
             if response:
                 self._obj = response
                 self._obj = response
 
 
@@ -2201,47 +2206,6 @@ class GCSBucketContainer(BaseBucketContainer):
     def __init__(self, provider, bucket):
     def __init__(self, provider, bucket):
         super(GCSBucketContainer, self).__init__(provider, bucket)
         super(GCSBucketContainer, self).__init__(provider, bucket)
 
 
-    def get(self, name):
-        """
-        Retrieve a given object from this bucket.
-        """
-        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):
-        """
-        List all objects within this bucket.
-        """
-        max_result = limit if limit is not None and limit < 500 else 500
-        response = (self._provider
-                        .gcs_storage
-                        .objects()
-                        .list(bucket=self.bucket.name,
-                              prefix=prefix if prefix else '',
-                              maxResults=max_result,
-                              pageToken=marker)
-                        .execute())
-        objects = []
-        for obj in response.get('items', []):
-            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))
-        return ServerPagedResultList('nextPageToken' in response,
-                                     response.get('nextPageToken'),
-                                     False, data=objects)
-
-    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):
 class GCSBucket(BaseBucket):
 
 
@@ -2265,40 +2229,6 @@ class GCSBucket(BaseBucket):
     def objects(self):
     def objects(self):
         return self._object_container
         return self._object_container
 
 
-    def delete(self, delete_contents=False):
-        """
-        Delete this bucket.
-        """
-        (self._provider
-             .gcs_storage
-             .buckets()
-             .delete(bucket=self.name)
-             .execute())
-        # GCS has a rate limit of 1 operation per 2 seconds for bucket
-        # creation/deletion: https://cloud.google.com/storage/quotas.  Throttle
-        # here to avoid future failures.
-        time.sleep(2)
-
-    def create_object(self, name):
-        """
-        Create an empty plain text object.
-        """
-        response = self.create_object_with_media_body(
-            name,
-            googleapiclient.http.MediaIoBaseUpload(
-                    io.BytesIO(b''), mimetype='plain/text'))
-        return GCSObject(self._provider, self, response) if response else None
-
-    def create_object_with_media_body(self, name, media_body):
-        response = (self._provider
-                        .gcs_storage
-                        .objects()
-                        .insert(bucket=self.name,
-                                body={'name': name},
-                                media_body=media_body)
-                        .execute())
-        return response
-
 
 
 class GCELaunchConfig(BaseLaunchConfig):
 class GCELaunchConfig(BaseLaunchConfig):
 
 

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

@@ -1,3 +1,4 @@
+import io
 import ipaddress
 import ipaddress
 import json
 import json
 import logging
 import logging
@@ -8,8 +9,10 @@ import googleapiclient
 
 
 import cloudbridge as cb
 import cloudbridge as cb
 from cloudbridge.cloud.base import helpers as cb_helpers
 from cloudbridge.cloud.base import helpers as cb_helpers
+from cloudbridge.cloud.base.events import implement
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ServerPagedResultList
 from cloudbridge.cloud.base.resources import ServerPagedResultList
+from cloudbridge.cloud.base.services import BaseBucketObjectService
 from cloudbridge.cloud.base.services import BaseBucketService
 from cloudbridge.cloud.base.services import BaseBucketService
 from cloudbridge.cloud.base.services import BaseComputeService
 from cloudbridge.cloud.base.services import BaseComputeService
 from cloudbridge.cloud.base.services import BaseImageService
 from cloudbridge.cloud.base.services import BaseImageService
@@ -46,6 +49,7 @@ from .resources import GCEVMFirewall
 from .resources import GCEVMType
 from .resources import GCEVMType
 from .resources import GCEVolume
 from .resources import GCEVolume
 from .resources import GCSBucket
 from .resources import GCSBucket
+from .resources import GCSObject
 
 
 log = logging.getLogger(__name__)
 log = logging.getLogger(__name__)
 
 
@@ -919,6 +923,7 @@ class GCPStorageService(BaseStorageService):
         self._volume_svc = GCEVolumeService(self.provider)
         self._volume_svc = GCEVolumeService(self.provider)
         self._snapshot_svc = GCESnapshotService(self.provider)
         self._snapshot_svc = GCESnapshotService(self.provider)
         self._bucket_svc = GCSBucketService(self.provider)
         self._bucket_svc = GCSBucketService(self.provider)
+        self._bucket_obj_svc = GCSBucketObjectService(self.provider)
 
 
     @property
     @property
     def volumes(self):
     def volumes(self):
@@ -932,6 +937,10 @@ class GCPStorageService(BaseStorageService):
     def buckets(self):
     def buckets(self):
         return self._bucket_svc
         return self._bucket_svc
 
 
+    @property
+    def bucket_objects(self):
+        return self._bucket_obj_svc
+
 
 
 class GCEVolumeService(BaseVolumeService):
 class GCEVolumeService(BaseVolumeService):
 
 
@@ -1130,7 +1139,9 @@ class GCSBucketService(BaseBucketService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(GCSBucketService, self).__init__(provider)
         super(GCSBucketService, self).__init__(provider)
 
 
-    def get(self, bucket_id):
+    @implement(event_pattern="provider.storage.buckets.get",
+               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    def _get(self, bucket_id):
         """
         """
         Returns a bucket given its ID. Returns ``None`` if the bucket
         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
         does not exist or if the user does not have permission to access the
@@ -1139,7 +1150,9 @@ class GCSBucketService(BaseBucketService):
         bucket = self.provider.get_resource('buckets', bucket_id)
         bucket = self.provider.get_resource('buckets', bucket_id)
         return GCSBucket(self.provider, bucket) if bucket else None
         return GCSBucket(self.provider, bucket) if bucket else None
 
 
-    def find(self, name, limit=None, marker=None):
+    @implement(event_pattern="provider.storage.buckets.find",
+               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    def _find(self, name, limit=None, marker=None):
         """
         """
         Searches in bucket names for a substring.
         Searches in bucket names for a substring.
         """
         """
@@ -1147,7 +1160,9 @@ class GCSBucketService(BaseBucketService):
         return ClientPagedResultList(self.provider, buckets, limit=limit,
         return ClientPagedResultList(self.provider, buckets, limit=limit,
                                      marker=marker)
                                      marker=marker)
 
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.storage.buckets.list",
+               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         """
         """
         List all containers.
         List all containers.
         """
         """
@@ -1169,7 +1184,9 @@ class GCSBucketService(BaseBucketService):
                                      response.get('nextPageToken'),
                                      response.get('nextPageToken'),
                                      False, data=buckets)
                                      False, data=buckets)
 
 
-    def create(self, name, location=None):
+    @implement(event_pattern="provider.storage.buckets.create",
+               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    def _create(self, name, location=None):
         GCSBucket.assert_valid_resource_name(name)
         GCSBucket.assert_valid_resource_name(name)
         body = {'name': name}
         body = {'name': name}
         if location:
         if location:
@@ -1193,3 +1210,97 @@ class GCSBucketService(BaseBucketService):
                     'Bucket already exists with name {0}'.format(name))
                     'Bucket already exists with name {0}'.format(name))
             else:
             else:
                 raise
                 raise
+
+    @implement(event_pattern="provider.storage.buckets.delete",
+               priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, bucket_id):
+        """
+        Delete this bucket.
+        """
+        # GCE uses name rather than URL to identify resources
+        name = (self._provider._storage_resources
+                    .parse_url(bucket_id)
+                    .parameters.get("bucket"))
+        (self._provider
+             .gcs_storage
+             .buckets()
+             .delete(bucket=name)
+             .execute())
+        # GCS has a rate limit of 1 operation per 2 seconds for bucket
+        # creation/deletion: https://cloud.google.com/storage/quotas. Throttle
+        # here to avoid future failures.
+        time.sleep(2)
+
+
+class GCSBucketObjectService(BaseBucketObjectService):
+
+    def __init__(self, provider):
+        super(GCSBucketObjectService, self).__init__(provider)
+
+    def get(self, bucket, name):
+        """
+        Retrieve a given object from this bucket.
+        """
+        obj = self.provider.get_resource('objects', name,
+                                         bucket=bucket.name)
+        return GCSObject(self.provider, bucket, obj) if obj else None
+
+    def list(self, bucket, limit=None, marker=None, prefix=None):
+        """
+        List all objects within this bucket.
+        """
+        max_result = limit if limit is not None and limit < 500 else 500
+        response = (self.provider
+                        .gcs_storage
+                        .objects()
+                        .list(bucket=bucket.name,
+                              prefix=prefix if prefix else '',
+                              maxResults=max_result,
+                              pageToken=marker)
+                        .execute())
+        objects = []
+        for obj in response.get('items', []):
+            objects.append(GCSObject(self.provider, bucket, obj))
+        if len(objects) > max_result:
+            cb.log.warning('Expected at most %d results; got %d',
+                           max_result, len(objects))
+        return ServerPagedResultList('nextPageToken' in response,
+                                     response.get('nextPageToken'),
+                                     False, data=objects)
+
+    def find(self, bucket, **kwargs):
+        master_list = []
+        obj_list = self.list(bucket=bucket, limit=500)
+        if obj_list.supports_server_paging:
+            master_list.extend(obj_list)
+            while obj_list.is_truncated:
+                obj_list = self.list(marker=obj_list.marker,
+                                     **kwargs)
+                master_list.extend(obj_list)
+        else:
+            master_list.extend(obj_list.data)
+
+        filters = ['name']
+        matches = cb_helpers.generic_find(filters, kwargs, obj_list)
+        return ClientPagedResultList(self._provider, list(matches),
+                                     limit=None, marker=None)
+
+    def _create_object_with_media_body(self, bucket, name, media_body):
+        response = (self.provider
+                    .gcs_storage
+                    .objects()
+                    .insert(bucket=bucket.name,
+                            body={'name': name},
+                            media_body=media_body)
+                    .execute())
+        return response
+
+    def create(self, bucket, name):
+        response = self._create_object_with_media_body(
+                            bucket,
+                            name,
+                            googleapiclient.http.MediaIoBaseUpload(
+                                io.BytesIO(b''), mimetype='plain/text'))
+        return GCSObject(self._provider,
+                         bucket,
+                         response) if response else None

+ 0 - 3
cloudbridge/cloud/providers/openstack/resources.py

@@ -1517,9 +1517,6 @@ class OpenStackBucket(BaseBucket):
     def objects(self):
     def objects(self):
         return self._object_container
         return self._object_container
 
 
-    def delete(self, delete_contents=False):
-        self._provider.swift.delete_container(self.name)
-
 
 
 class OpenStackBucketContainer(BaseBucketContainer):
 class OpenStackBucketContainer(BaseBucketContainer):
 
 

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

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

+ 0 - 7
test/test_block_store_service.py

@@ -21,13 +21,6 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.volumes', 'storage.volumes'])
     @helpers.skipIfNoService(['storage.volumes', 'storage.volumes'])
     def test_storage_services_event_pattern(self):
     def test_storage_services_event_pattern(self):
-        self.assertEqual(self.provider.storage._service_event_pattern,
-                         "provider.storage",
-                         "Event pattern for {} service should be '{}', "
-                         "but found '{}'.".format("storage",
-                                                  "provider.storage",
-                                                  self.provider.storage.
-                                                  _service_event_pattern))
         self.assertEqual(
         self.assertEqual(
             self.provider.storage.volumes._service_event_pattern,
             self.provider.storage.volumes._service_event_pattern,
             "provider.storage.volumes",
             "provider.storage.volumes",

+ 0 - 7
test/test_compute_service.py

@@ -22,13 +22,6 @@ class CloudComputeServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['compute.instances'])
     @helpers.skipIfNoService(['compute.instances'])
     def test_storage_services_event_pattern(self):
     def test_storage_services_event_pattern(self):
-        self.assertEqual(self.provider.compute._service_event_pattern,
-                         "provider.compute",
-                         "Event pattern for {} service should be '{}', "
-                         "but found '{}'.".format("compute",
-                                                  "provider.compute",
-                                                  self.provider.compute.
-                                                  _service_event_pattern))
         self.assertEqual(
         self.assertEqual(
             self.provider.compute.instances._service_event_pattern,
             self.provider.compute.instances._service_event_pattern,
             "provider.compute.instances",
             "provider.compute.instances",

+ 22 - 22
test/test_event_system.py

@@ -9,7 +9,7 @@ class EventSystemTestCase(unittest.TestCase):
 
 
     def test_emit_event_no_handlers(self):
     def test_emit_event_no_handlers(self):
         dispatcher = SimpleEventDispatcher()
         dispatcher = SimpleEventDispatcher()
-        result = dispatcher.emit(self, "event.hello.world")
+        result = dispatcher.dispatch(self, "event.hello.world")
         self.assertIsNone(result, "Result should be none as there are no"
         self.assertIsNone(result, "Result should be none as there are no"
                           "registered handlers")
                           "registered handlers")
 
 
@@ -30,8 +30,8 @@ class EventSystemTestCase(unittest.TestCase):
         handler = dispatcher.observe(event_pattern=EVENT_NAME, priority=1000,
         handler = dispatcher.observe(event_pattern=EVENT_NAME, priority=1000,
                                      callback=my_callback)
                                      callback=my_callback)
         self.assertIsInstance(handler, EventHandler)
         self.assertIsInstance(handler, EventHandler)
-        result = dispatcher.emit(self, EVENT_NAME, 'first_pos_arg',
-                                 a_keyword_arg='another_thing')
+        result = dispatcher.dispatch(self, EVENT_NAME, 'first_pos_arg',
+                                     a_keyword_arg='another_thing')
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "obs", "callback should have been invoked"
             callback_tracker[0], "obs", "callback should have been invoked"
             "once and contain value `obs` but tracker value is {0}".format(
             "once and contain value `obs` but tracker value is {0}".format(
@@ -57,8 +57,8 @@ class EventSystemTestCase(unittest.TestCase):
         handler = dispatcher.intercept(event_pattern=EVENT_NAME, priority=1000,
         handler = dispatcher.intercept(event_pattern=EVENT_NAME, priority=1000,
                                        callback=my_callback)
                                        callback=my_callback)
         self.assertIsInstance(handler, EventHandler)
         self.assertIsInstance(handler, EventHandler)
-        result = dispatcher.emit(self, EVENT_NAME, 'first_pos_arg',
-                                 a_keyword_arg='another_thing')
+        result = dispatcher.dispatch(self, EVENT_NAME, 'first_pos_arg',
+                                     a_keyword_arg='another_thing')
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "intcpt", "callback should have been invoked"
             callback_tracker[0], "intcpt", "callback should have been invoked"
             "once and contain value `intcpt` but tracker value is {0}".format(
             "once and contain value `intcpt` but tracker value is {0}".format(
@@ -92,8 +92,8 @@ class EventSystemTestCase(unittest.TestCase):
         dispatcher = SimpleEventDispatcher()
         dispatcher = SimpleEventDispatcher()
         dispatcher.observe(EVENT_NAME, 1000, my_callback_obs)
         dispatcher.observe(EVENT_NAME, 1000, my_callback_obs)
         dispatcher.intercept(EVENT_NAME, 1001, my_callback_intcpt)
         dispatcher.intercept(EVENT_NAME, 1001, my_callback_intcpt)
-        result = dispatcher.emit(self, EVENT_NAME, 'first_pos_arg',
-                                 a_keyword_arg='another_thing')
+        result = dispatcher.dispatch(self, EVENT_NAME, 'first_pos_arg',
+                                     a_keyword_arg='another_thing')
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "obs_intcpt_", "callback was not invoked in "
             callback_tracker[0], "obs_intcpt_", "callback was not invoked in "
             "expected order. Should have been obs_intcpt_ but is {0}".format(
             "expected order. Should have been obs_intcpt_ but is {0}".format(
@@ -136,8 +136,8 @@ class EventSystemTestCase(unittest.TestCase):
         # register priorities out of order to test that too
         # register priorities out of order to test that too
         dispatcher.observe(EVENT_NAME, 1001, my_callback_obs)
         dispatcher.observe(EVENT_NAME, 1001, my_callback_obs)
         dispatcher.intercept(EVENT_NAME, 1000, my_callback_intcpt)
         dispatcher.intercept(EVENT_NAME, 1000, my_callback_intcpt)
-        result = dispatcher.emit(self, EVENT_NAME, 'first_pos_arg',
-                                 a_keyword_arg='another_thing')
+        result = dispatcher.dispatch(self, EVENT_NAME, 'first_pos_arg',
+                                     a_keyword_arg='another_thing')
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "intcpt_obs_", "callback was not invoked in "
             callback_tracker[0], "intcpt_obs_", "callback was not invoked in "
             "expected order. Should have been intcpt_obs_ but is {0}".format(
             "expected order. Should have been intcpt_obs_ but is {0}".format(
@@ -170,7 +170,7 @@ class EventSystemTestCase(unittest.TestCase):
         dispatcher = SimpleEventDispatcher()
         dispatcher = SimpleEventDispatcher()
         dispatcher.intercept(EVENT_NAME, 2000, my_callback_intcpt1)
         dispatcher.intercept(EVENT_NAME, 2000, my_callback_intcpt1)
         dispatcher.intercept(EVENT_NAME, 2020, my_callback_intcpt2)
         dispatcher.intercept(EVENT_NAME, 2020, my_callback_intcpt2)
-        result = dispatcher.emit(self, EVENT_NAME)
+        result = dispatcher.dispatch(self, EVENT_NAME)
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "intcpt1_intcpt2_", "callback was not invoked"
             callback_tracker[0], "intcpt1_intcpt2_", "callback was not invoked"
             " in expected order. Should have been intcpt1_intcpt2_ but is"
             " in expected order. Should have been intcpt1_intcpt2_ but is"
@@ -187,7 +187,7 @@ class EventSystemTestCase(unittest.TestCase):
         dispatcher.intercept("event.hello.world", 1000, my_callback)
         dispatcher.intercept("event.hello.world", 1000, my_callback)
         dispatcher.intercept("event.hello.world", 1000, my_callback)
         dispatcher.intercept("event.hello.world", 1000, my_callback)
         with self.assertRaises(HandlerException):
         with self.assertRaises(HandlerException):
-            dispatcher.emit(self, "event.hello.world")
+            dispatcher.dispatch(self, "event.hello.world")
 
 
     def test_subscribe_event_duplicate_wildcard_priority(self):
     def test_subscribe_event_duplicate_wildcard_priority(self):
 
 
@@ -198,7 +198,7 @@ class EventSystemTestCase(unittest.TestCase):
         dispatcher.intercept("event.hello.world", 1000, my_callback)
         dispatcher.intercept("event.hello.world", 1000, my_callback)
         dispatcher.intercept("event.hello.*", 1000, my_callback)
         dispatcher.intercept("event.hello.*", 1000, my_callback)
         with self.assertRaises(HandlerException):
         with self.assertRaises(HandlerException):
-            dispatcher.emit(self, "event.hello.world")
+            dispatcher.dispatch(self, "event.hello.world")
 
 
     def test_subscribe_event_duplicate_wildcard_priority_allowed(self):
     def test_subscribe_event_duplicate_wildcard_priority_allowed(self):
         # duplicate priorities for different wildcard namespaces allowed
         # duplicate priorities for different wildcard namespaces allowed
@@ -209,7 +209,7 @@ class EventSystemTestCase(unittest.TestCase):
         dispatcher.intercept("event.hello.world", 1000, my_callback)
         dispatcher.intercept("event.hello.world", 1000, my_callback)
         dispatcher.intercept("someevent.hello.*", 1000, my_callback)
         dispatcher.intercept("someevent.hello.*", 1000, my_callback)
         # emit should work fine in this case with no exceptions
         # emit should work fine in this case with no exceptions
-        dispatcher.emit(self, "event.hello.world")
+        dispatcher.dispatch(self, "event.hello.world")
 
 
     def test_subscribe_multiple_events(self):
     def test_subscribe_multiple_events(self):
         EVENT_NAME = "event.hello.world"
         EVENT_NAME = "event.hello.world"
@@ -241,7 +241,7 @@ class EventSystemTestCase(unittest.TestCase):
         # register to a different event with the same priority
         # register to a different event with the same priority
         dispatcher.observe("event.hello.anotherworld", 2000, my_callback2)
         dispatcher.observe("event.hello.anotherworld", 2000, my_callback2)
         dispatcher.intercept("event.hello.anotherworld", 2020, my_callback3)
         dispatcher.intercept("event.hello.anotherworld", 2020, my_callback3)
-        result = dispatcher.emit(self, EVENT_NAME)
+        result = dispatcher.dispatch(self, EVENT_NAME)
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "event1_", "only `event.hello.world` handlers"
             callback_tracker[0], "event1_", "only `event.hello.world` handlers"
             " should have been  triggered but received {0}".format(
             " should have been  triggered but received {0}".format(
@@ -249,7 +249,7 @@ class EventSystemTestCase(unittest.TestCase):
         self.assertEqual(result, None, "Result should be `helloworld` "
         self.assertEqual(result, None, "Result should be `helloworld` "
                          "as this is the expected return value from the chain")
                          "as this is the expected return value from the chain")
 
 
-        result = dispatcher.emit(self, "event.hello.anotherworld")
+        result = dispatcher.dispatch(self, "event.hello.anotherworld")
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "event1_event2_event3_", "only handlers for"
             callback_tracker[0], "event1_event2_event3_", "only handlers for"
             "  event `event.hello.anotherworld` should have been  triggered"
             "  event `event.hello.anotherworld` should have been  triggered"
@@ -288,7 +288,7 @@ class EventSystemTestCase(unittest.TestCase):
         dispatcher.intercept("event.*.world", 2020, my_callback4)
         dispatcher.intercept("event.*.world", 2020, my_callback4)
         dispatcher.intercept("someevent.hello.there", 2030, my_callback3)
         dispatcher.intercept("someevent.hello.there", 2030, my_callback3)
         # emit a series of events
         # emit a series of events
-        result = dispatcher.emit(self, "event.hello.there")
+        result = dispatcher.dispatch(self, "event.hello.there")
 
 
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "event1_event2_event3_event4_",
             callback_tracker[0], "event1_event2_event3_event4_",
@@ -296,7 +296,7 @@ class EventSystemTestCase(unittest.TestCase):
                 callback_tracker[0]))
                 callback_tracker[0]))
         self.assertEqual(result, "hellosomeotherworld")
         self.assertEqual(result, "hellosomeotherworld")
 
 
-        result = dispatcher.emit(self, "event.test.hello.world")
+        result = dispatcher.dispatch(self, "event.test.hello.world")
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "event1_event2_event3_event4_event1_event4_",
             callback_tracker[0], "event1_event2_event3_event4_event1_event4_",
             "Event handlers executed in unexpected order {0}".format(
             "Event handlers executed in unexpected order {0}".format(
@@ -322,9 +322,9 @@ class EventSystemTestCase(unittest.TestCase):
 
 
         dispatcher = SimpleEventDispatcher()
         dispatcher = SimpleEventDispatcher()
         dispatcher.intercept("event.hello.world", 1000, my_callback1)
         dispatcher.intercept("event.hello.world", 1000, my_callback1)
-        dispatcher.emit(self, "event.hello.world")
+        dispatcher.dispatch(self, "event.hello.world")
         dispatcher.intercept("event.hello.*", 1001, my_callback2)
         dispatcher.intercept("event.hello.*", 1001, my_callback2)
-        result = dispatcher.emit(self, "event.hello.world")
+        result = dispatcher.dispatch(self, "event.hello.world")
 
 
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "event1_event1_event2_",
             callback_tracker[0], "event1_event1_event2_",
@@ -351,7 +351,7 @@ class EventSystemTestCase(unittest.TestCase):
 
 
         dispatcher = SimpleEventDispatcher()
         dispatcher = SimpleEventDispatcher()
         hndlr1 = dispatcher.intercept(EVENT_NAME, 1000, my_callback1)
         hndlr1 = dispatcher.intercept(EVENT_NAME, 1000, my_callback1)
-        dispatcher.emit(self, EVENT_NAME)
+        dispatcher.dispatch(self, EVENT_NAME)
         hndlr2 = dispatcher.intercept("event.hello.*", 1001, my_callback2)
         hndlr2 = dispatcher.intercept("event.hello.*", 1001, my_callback2)
         # Both handlers should be registered
         # Both handlers should be registered
         self.assertListEqual(
         self.assertListEqual(
@@ -366,7 +366,7 @@ class EventSystemTestCase(unittest.TestCase):
             [handler.callback for handler in
             [handler.callback for handler in
              dispatcher.get_handlers_for_event(EVENT_NAME)])
              dispatcher.get_handlers_for_event(EVENT_NAME)])
 
 
-        result = dispatcher.emit(self, EVENT_NAME)
+        result = dispatcher.dispatch(self, EVENT_NAME)
 
 
         self.assertEqual(
         self.assertEqual(
             callback_tracker[0], "event1_event2_",
             callback_tracker[0], "event1_event2_",
@@ -375,5 +375,5 @@ class EventSystemTestCase(unittest.TestCase):
         self.assertEqual(result, "some")
         self.assertEqual(result, "some")
 
 
         hndlr2.unsubscribe()
         hndlr2.unsubscribe()
-        result = dispatcher.emit(self, "event.hello.world")
+        result = dispatcher.dispatch(self, "event.hello.world")
         self.assertEqual(result, None)
         self.assertEqual(result, None)

+ 4 - 4
test/test_middleware_system.py

@@ -62,8 +62,8 @@ class MiddlewareSystemTestCase(unittest.TestCase):
         manager = SimpleMiddlewareManager(dispatcher)
         manager = SimpleMiddlewareManager(dispatcher)
         middleware = DummyMiddleWare()
         middleware = DummyMiddleWare()
         manager.add(middleware)
         manager.add(middleware)
-        dispatcher.emit(self, EVENT_NAME, 'first_pos_arg',
-                        a_keyword_arg='something')
+        dispatcher.dispatch(self, EVENT_NAME, 'first_pos_arg',
+                            a_keyword_arg='something')
 
 
         self.assertEqual(middleware.invocation_order, "intercept_observe")
         self.assertEqual(middleware.invocation_order, "intercept_observe")
         self.assertListEqual(
         self.assertListEqual(
@@ -106,7 +106,7 @@ class MiddlewareSystemTestCase(unittest.TestCase):
         middleware2 = DummyMiddleWare2()
         middleware2 = DummyMiddleWare2()
         manager.add(middleware1)
         manager.add(middleware1)
         manager.add(middleware2)
         manager.add(middleware2)
-        dispatcher.emit(self, EVENT_NAME)
+        dispatcher.dispatch(self, EVENT_NAME)
 
 
         # Callbacks in both middleware classes should be registered
         # Callbacks in both middleware classes should be registered
         self.assertListEqual(
         self.assertListEqual(
@@ -157,7 +157,7 @@ class MiddlewareSystemTestCase(unittest.TestCase):
         manager = SimpleMiddlewareManager(dispatcher)
         manager = SimpleMiddlewareManager(dispatcher)
         some_obj = SomeDummyClass()
         some_obj = SomeDummyClass()
         middleware = manager.add(some_obj)
         middleware = manager.add(some_obj)
-        dispatcher.emit(self, EVENT_NAME)
+        dispatcher.dispatch(self, EVENT_NAME)
 
 
         # Middleware should be discovered even if class containing interceptors
         # Middleware should be discovered even if class containing interceptors
         # doesn't inherit from Middleware
         # doesn't inherit from Middleware

+ 0 - 7
test/test_network_service.py

@@ -20,13 +20,6 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
                               'networking.networks',
                               'networking.networks',
                               'networking.routers'])
                               'networking.routers'])
     def test_storage_services_event_pattern(self):
     def test_storage_services_event_pattern(self):
-        self.assertEqual(self.provider.networking._service_event_pattern,
-                         "provider.networking",
-                         "Event pattern for {} service should be '{}', "
-                         "but found '{}'.".format("networking",
-                                                  "provider.networking",
-                                                  self.provider.networking.
-                                                  _service_event_pattern))
         self.assertEqual(
         self.assertEqual(
             self.provider.networking.networks._service_event_pattern,
             self.provider.networking.networks._service_event_pattern,
             "provider.networking.networks",
             "provider.networking.networks",

+ 0 - 7
test/test_object_store_service.py

@@ -23,13 +23,6 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['storage.bucket_objects', 'storage.buckets'])
     @helpers.skipIfNoService(['storage.bucket_objects', 'storage.buckets'])
     def test_storage_services_event_pattern(self):
     def test_storage_services_event_pattern(self):
-        self.assertEqual(self.provider.storage._service_event_pattern,
-                         "provider.storage",
-                         "Event pattern for {} service should be '{}', "
-                         "but found '{}'.".format("storage",
-                                                  "provider.storage",
-                                                  self.provider.storage.
-                                                  _service_event_pattern))
         self.assertEqual(
         self.assertEqual(
             self.provider.storage.buckets._service_event_pattern,
             self.provider.storage.buckets._service_event_pattern,
             "provider.storage.buckets",
             "provider.storage.buckets",

+ 0 - 7
test/test_security_service.py

@@ -17,13 +17,6 @@ class CloudSecurityServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['security.vm_firewalls'])
     @helpers.skipIfNoService(['security.vm_firewalls'])
     def test_storage_services_event_pattern(self):
     def test_storage_services_event_pattern(self):
-        self.assertEqual(self.provider.security._service_event_pattern,
-                         "provider.security",
-                         "Event pattern for {} service should be '{}', "
-                         "but found '{}'.".format("security",
-                                                  "provider.security",
-                                                  self.provider.security.
-                                                  _service_event_pattern))
         self.assertEqual(
         self.assertEqual(
             self.provider.security.key_pairs.
             self.provider.security.key_pairs.
             _service_event_pattern,
             _service_event_pattern,