mirror of
https://github.com/faucetsdn/ryu.git
synced 2026-05-08 13:56:09 +02:00
add the feature to get all events
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
11f8ab87a0
commit
389e933d30
@ -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():
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user