From 389e933d304433828177ab3c79f11af194c02406 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Wed, 8 May 2013 11:37:05 -0700 Subject: [PATCH] add the feature to get all events Signed-off-by: FUJITA Tomonori --- ryu/base/app_manager.py | 27 +++++++++++++++++++++++---- ryu/controller/handler.py | 9 +++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/ryu/base/app_manager.py b/ryu/base/app_manager.py index 173e35c7..1219cdaf 100644 --- a/ryu/base/app_manager.py +++ b/ryu/base/app_manager.py @@ -58,7 +58,9 @@ class RyuApp(object): super(RyuApp, self).__init__() self.name = self.__class__.__name__ self.event_handlers = {} + self.all_events_handlers = [] self.observers = {} + self.observers_all = [] self.threads = [] self.events = hub.Queue(128) self.replies = hub.Queue() @@ -67,15 +69,22 @@ class RyuApp(object): def register_handler(self, ev_cls, handler): assert callable(handler) - self.event_handlers.setdefault(ev_cls, []) - self.event_handlers[ev_cls].append(handler) + if ev_cls is None: + self.all_events_handlers.append(handler) + else: + self.event_handlers.setdefault(ev_cls, []) + self.event_handlers[ev_cls].append(handler) def register_observer(self, ev_cls, name, states=None): states = states or [] self.observers.setdefault(ev_cls, {})[name] = states + def register_observer_all(self, name): + self.observers_all.append(name) + def get_handlers(self, ev): - return self.event_handlers.get(ev.__class__, []) + handlers = self.event_handlers.get(ev.__class__, []) + return set(self.all_events_handlers) | set(handlers) def get_observers(self, ev, state): observers = [] @@ -118,7 +127,9 @@ class RyuApp(object): (self.name, name, ev.__class__.__name__)) def send_event_to_observers(self, ev, state=None): - for observer in self.get_observers(ev, state): + observers = set(self.get_observers(ev, state)) + observers |= set(self.observers_all) + for observer in observers: self.send_event(observer, ev) def reply_to_request(self, req, rep): @@ -220,6 +231,14 @@ class AppManager(object): brick.register_observer(m.ev_cls, i.name, m.dispatchers) + for _k, m in inspect.getmembers(i, inspect.ismethod): + if not hasattr(m, 'observer_all'): + continue + name = m.observer_all + if name in SERVICE_BRICKS: + brick = SERVICE_BRICKS[name] + brick.register_observer_all(i.name) + for brick, i in SERVICE_BRICKS.items(): LOG.debug("BRICK %s" % brick) for ev_cls, list in i.observers.items(): diff --git a/ryu/controller/handler.py b/ryu/controller/handler.py index ba45b0dc..e2e54103 100644 --- a/ryu/controller/handler.py +++ b/ryu/controller/handler.py @@ -46,6 +46,13 @@ def set_ev_handler(ev_cls, dispatchers=None): return _set_ev_cls_dec +def observe_all_events(source): + def _set_ev_cls_dec(handler): + handler.observer_all = source + return handler + return _set_ev_cls_dec + + def _is_ev_cls(meth): return hasattr(meth, 'ev_cls') @@ -63,3 +70,5 @@ def register_instance(i): # LOG.debug('instance %s k %s m %s', i, _k, m) if _is_ev_cls(m): i.register_handler(m.ev_cls, m) + elif hasattr(m, 'observer_all'): + i.register_handler(None, m)