summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ryu/base/app_manager.py22
-rw-r--r--ryu/controller/controller.py4
2 files changed, 16 insertions, 10 deletions
diff --git a/ryu/base/app_manager.py b/ryu/base/app_manager.py
index 1a2567e2..d977b409 100644
--- a/ryu/base/app_manager.py
+++ b/ryu/base/app_manager.py
@@ -69,15 +69,20 @@ class RyuApp(object):
self.event_handlers.setdefault(ev_cls, [])
self.event_handlers[ev_cls].append(handler)
- def register_observer(self, ev_cls, name):
- self.observers.setdefault(ev_cls, [])
- self.observers[ev_cls].append(name)
+ def register_observer(self, ev_cls, name, states=None):
+ states = states or []
+ self.observers.setdefault(ev_cls, {})[name] = states
def get_handlers(self, ev):
return self.event_handlers.get(ev.__class__, [])
- def get_observers(self, ev):
- return self.observers.get(ev.__class__, [])
+ def get_observers(self, ev, state):
+ observers = []
+ for k, v in self.observers.get(ev.__class__, {}).iteritems():
+ if not state or not v or state in v:
+ observers.append(k)
+
+ return observers
def _event_loop(self):
while True:
@@ -98,8 +103,8 @@ class RyuApp(object):
LOG.debug("EVENT LOST %s->%s %s" %
(self.name, name, ev.__class__.__name__))
- def send_event_to_observers(self, ev):
- for observer in self.get_observers(ev):
+ def send_event_to_observers(self, ev, state=None):
+ for observer in self.get_observers(ev, state):
self.send_event(observer, ev)
def close(self):
@@ -184,7 +189,8 @@ class AppManager(object):
name = m.observer.split('.')[-1]
if name in SERVICE_BRICKS:
brick = SERVICE_BRICKS[name]
- brick.register_observer(m.ev_cls, i.name)
+ brick.register_observer(m.ev_cls, i.name,
+ m.dispatchers)
# allow RyuApp and Event class are in different module
if hasattr(m, 'ev_cls'):
diff --git a/ryu/controller/controller.py b/ryu/controller/controller.py
index da59ab9d..bf53f7ed 100644
--- a/ryu/controller/controller.py
+++ b/ryu/controller/controller.py
@@ -141,7 +141,7 @@ class Datapath(object):
self.state = state
ev = ofp_event.EventOFPStateChange(self)
ev.state = state
- self.ofp_brick.send_event_to_observers(ev)
+ self.ofp_brick.send_event_to_observers(ev, state)
def set_version(self, version):
assert version in self.supported_ofp_version
@@ -175,7 +175,7 @@ class Datapath(object):
if self.state in handler.dispatchers:
handler(ev)
- self.ofp_brick.send_event_to_observers(ev)
+ self.ofp_brick.send_event_to_observers(ev, self.state)
buf = buf[required_len:]
required_len = ofproto_common.OFP_HEADER_SIZE