Ver Fonte

Direct event subscription in factory

almahmoud há 7 anos atrás
pai
commit
901b4b6fed

+ 27 - 0
cloudbridge/cloud/factory.py

@@ -4,6 +4,8 @@ import logging
 import pkgutil
 import pkgutil
 from collections import defaultdict
 from collections import defaultdict
 
 
+from pyeventsystem.interfaces import Middleware
+from pyeventsystem.middleware import AutoDiscoveredMiddleware
 from pyeventsystem.middleware import SimpleMiddlewareManager
 from pyeventsystem.middleware import SimpleMiddlewareManager
 
 
 from cloudbridge.cloud import providers
 from cloudbridge.cloud import providers
@@ -34,8 +36,33 @@ class ParentMiddlewareManager(SimpleMiddlewareManager):
         for constructor, args in self.middleware_constructors:
         for constructor, args in self.middleware_constructors:
             m = constructor(*args)
             m = constructor(*args)
             new_manager.add(m)
             new_manager.add(m)
+        for handler in self.get_subscribed_handlers():
+            new_handler = handler.__class__(handler.event_pattern,
+                                            handler.priority,
+                                            handler.callback)
+            new_manager.events.subscribe(new_handler)
         return new_manager
         return new_manager
 
 
+    # Removing install step from add. Since this manager is meant to create
+    # other managers rather than run. This will also simplify separating
+    # handlers added through middleware from those subscribed directly
+    def add(self, middleware):
+        if isinstance(middleware, Middleware):
+            m = middleware
+        else:
+            m = AutoDiscoveredMiddleware(middleware)
+        self.middleware_list.append(m)
+        return m
+
+    def get_subscribed_handlers(self):
+        handlers = []
+        # Todo: Expose this better in pyeventsystem library
+        event_dict = self.events._SimpleEventDispatcher__events
+        for key in event_dict.keys():
+            for handler in event_dict[key]:
+                handlers.append(handler)
+        return handlers
+
 
 
 class ProviderList(object):
 class ProviderList(object):
     AWS = 'aws'
     AWS = 'aws'

+ 2 - 1
cloudbridge/cloud/providers/openstack/provider.py

@@ -32,7 +32,8 @@ class OpenStackCloudProvider(BaseCloudProvider):
     PROVIDER_ID = 'openstack'
     PROVIDER_ID = 'openstack'
 
 
     def __init__(self, config, middleware_manager=[]):
     def __init__(self, config, middleware_manager=[]):
-        super(OpenStackCloudProvider, self).__init__(config, middleware_manager)
+        super(OpenStackCloudProvider, self).__init__(config,
+                                                     middleware_manager)
 
 
         # Initialize cloud connection fields
         # Initialize cloud connection fields
         self.username = self._get_config_value(
         self.username = self._get_config_value(

+ 20 - 0
test/test_cloud_factory.py

@@ -162,3 +162,23 @@ class CloudFactoryTestCase(unittest.TestCase):
         # This count should be independent of the previous one
         # This count should be independent of the previous one
         self.assertEqual(second_prov.networking.networks.get("anything"),
         self.assertEqual(second_prov.networking.networks.get("anything"),
                          start_count + increment)
                          start_count + increment)
+
+    def test_middleware_inherited_events(self):
+
+        class SomeDummyClass(object):
+
+            @intercept(event_pattern="*", priority=2499)
+            def return_goodbye(self, event_args, *args, **kwargs):
+                return "goodbye"
+
+        def return_hello(event_args, *args, **kwargs):
+            return "hello"
+
+        factory = CloudProviderFactory()
+        factory.middleware.add(SomeDummyClass())
+        factory.middleware.events.intercept("*", 2490, return_hello)
+        provider_name = cb_helpers.get_env("CB_TEST_PROVIDER", "aws")
+        prov = factory.create_provider(provider_name, {})
+        # Any dispatched event should be intercepted and return "hello" instead
+        self.assertEqual(prov.networking.networks.get("anything"),
+                         "hello")