add the feature to get all events

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
FUJITA Tomonori 2013-05-08 11:37:05 -07:00
parent 11f8ab87a0
commit 389e933d30
2 changed files with 32 additions and 4 deletions

View File

@ -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():

View File

@ -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)