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

Seperate initialization record

almahmoud 7 лет назад
Родитель
Сommit
32c48765c8

+ 18 - 2
cloudbridge/cloud/base/provider.py

@@ -11,7 +11,7 @@ except ImportError:  # Python 2
 import six
 import six
 
 
 from cloudbridge.cloud.interfaces import CloudProvider
 from cloudbridge.cloud.interfaces import CloudProvider
-from cloudbridge.cloud.interfaces.exceptions import NoHandlerException
+from cloudbridge.cloud.interfaces.exceptions import HandlerException
 from cloudbridge.cloud.interfaces.exceptions import ProviderConnectionException
 from cloudbridge.cloud.interfaces.exceptions import ProviderConnectionException
 from cloudbridge.cloud.interfaces.provider import HandlerType
 from cloudbridge.cloud.interfaces.provider import HandlerType
 from cloudbridge.cloud.interfaces.resources import Configuration
 from cloudbridge.cloud.interfaces.resources import Configuration
@@ -84,10 +84,17 @@ class BaseConfiguration(Configuration):
 class EventDispatcher(object):
 class EventDispatcher(object):
     def __init__(self):
     def __init__(self):
         self.__events = {}
         self.__events = {}
+        self.__initialized = {}
 
 
     def get_handlers(self, event_name):
     def get_handlers(self, event_name):
         return self.__events.get(event_name)
         return self.__events.get(event_name)
 
 
+    def check_initialized(self, event_name):
+        return self.__initialized.get(event_name) or False
+
+    def mark_initialized(self, event_name):
+        self.__initialized[event_name] = True
+
     def subscribe(self, event_name, priority, callback, result_callback=False):
     def subscribe(self, event_name, priority, callback, result_callback=False):
         """
         """
         Subscribe a handler by event name to the dispatcher.
         Subscribe a handler by event name to the dispatcher.
@@ -131,12 +138,21 @@ class EventDispatcher(object):
 
 
         def priority_sort(handler_list):
         def priority_sort(handler_list):
             handler_list.sort(key=lambda x: x[0])
             handler_list.sort(key=lambda x: x[0])
+            # Make sure all priorities are unique
+            prev_prio = None
+            for (priority, handler) in handler_list:
+                if priority == prev_prio:
+                    message = "Event '{}' has multiple subscribed handlers " \
+                              "at priority '{}'. Each priority must only " \
+                              "have a single corresponding handler."\
+                        .format(event_name, priority)
+                    raise HandlerException(message)
             return handler_list
             return handler_list
 
 
         if not self.__events.get(event_name):
         if not self.__events.get(event_name):
             message = "Event '{}' has no subscribed handlers.".\
             message = "Event '{}' has no subscribed handlers.".\
                 format(event_name)
                 format(event_name)
-            raise NoHandlerException(message)
+            raise HandlerException(message)
 
 
         prev_handler = None
         prev_handler = None
         first_handler = None
         first_handler = None

+ 8 - 4
cloudbridge/cloud/base/services.py

@@ -127,6 +127,7 @@ class BaseBucketService(
         self.provider.events.subscribe(event_name, 21000,
         self.provider.events.subscribe(event_name, 21000,
                                        _get_post_log,
                                        _get_post_log,
                                        result_callback=True)
                                        result_callback=True)
+        self.provider.events.mark_initialized(event_name)
 
 
     def get(self, bucket_id):
     def get(self, bucket_id):
         """
         """
@@ -134,7 +135,7 @@ class BaseBucketService(
         does not exist.
         does not exist.
         """
         """
         event_name = self.get_event_name("get")
         event_name = self.get_event_name("get")
-        if not self.provider.events.get_handlers(event_name):
+        if not self.provider.events.check_initialized(event_name):
             self._init_get()
             self._init_get()
         return self.provider.events.interceptable_call(event_name,
         return self.provider.events.interceptable_call(event_name,
                                                        priority=20500,
                                                        priority=20500,
@@ -156,6 +157,7 @@ class BaseBucketService(
         self.provider.events.subscribe(event_name, 21000,
         self.provider.events.subscribe(event_name, 21000,
                                        _find_post_log,
                                        _find_post_log,
                                        result_callback=True)
                                        result_callback=True)
+        self.provider.events.mark_initialized(event_name)
 
 
     # 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
@@ -178,7 +180,7 @@ class BaseBucketService(
         Returns a list of buckets filtered by the given keyword arguments.
         Returns a list of buckets filtered by the given keyword arguments.
         """
         """
         event_name = self.get_event_name("find")
         event_name = self.get_event_name("find")
-        if not self.provider.events.get_handlers(event_name):
+        if not self.provider.events.check_initialized(event_name):
             self._init_find()
             self._init_find()
         return self.provider.events.interceptable_call(event_name,
         return self.provider.events.interceptable_call(event_name,
                                                        priority=20500,
                                                        priority=20500,
@@ -204,13 +206,14 @@ class BaseBucketService(
         self.provider.events.subscribe(event_name, 21000,
         self.provider.events.subscribe(event_name, 21000,
                                        _list_post_log,
                                        _list_post_log,
                                        result_callback=True)
                                        result_callback=True)
+        self.provider.events.mark_initialized(event_name)
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         """
         """
         List all buckets.
         List all buckets.
         """
         """
         event_name = self.get_event_name("list")
         event_name = self.get_event_name("list")
-        if not self.provider.events.get_handlers(event_name):
+        if not self.provider.events.check_initialized(event_name):
             self._init_list()
             self._init_list()
         return self.provider.events.interceptable_call(event_name,
         return self.provider.events.interceptable_call(event_name,
                                                        priority=20500,
                                                        priority=20500,
@@ -236,13 +239,14 @@ class BaseBucketService(
         self.provider.events.subscribe(event_name, 21000,
         self.provider.events.subscribe(event_name, 21000,
                                        _create_post_log,
                                        _create_post_log,
                                        result_callback=True)
                                        result_callback=True)
+        self.provider.events.mark_initialized(event_name)
 
 
     def create(self, name, location=None):
     def create(self, name, location=None):
         """
         """
         Create a new bucket.
         Create a new bucket.
         """
         """
         event_name = self.get_event_name("create")
         event_name = self.get_event_name("create")
-        if not self.provider.events.get_handlers(event_name):
+        if not self.provider.events.check_initialized(event_name):
             self._init_create()
             self._init_create()
         BaseBucket.assert_valid_resource_name(name)
         BaseBucket.assert_valid_resource_name(name)
         location = location or self.provider.region_name
         location = location or self.provider.region_name

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

@@ -94,7 +94,7 @@ class DuplicateResourceException(CloudBridgeBaseException):
     pass
     pass
 
 
 
 
-class NoHandlerException(CloudBridgeBaseException):
+class HandlerException(CloudBridgeBaseException):
     """
     """
     Marker interface for object wait exceptions.
     Marker interface for object wait exceptions.
     Thrown when a timeout or errors occurs waiting for an object does not reach
     Thrown when a timeout or errors occurs waiting for an object does not reach