controller/network: fix key error

This patch fixes key error exception.
The switch may connect to the controller before network creation API call.

> Traceback (most recent call last):
>   File "/usr/lib/pymodules/python2.7/gevent/greenlet.py", line 390, in run
>     result = self._run(*self.args, **self.kwargs)
>   File "/ryubin/ryu/controller/controller.py", line 237, in datapath_connection_factory
>     datapath.serve()
>   File "/ryubin/ryu/controller/controller.py", line 184, in serve
>     self._recv_loop()
>   File "/ryubin/ryu/controller/controller.py", line 63, in deactivate
>     method(self)
>   File "/ryubin/ryu/controller/controller.py", line 136, in _recv_loop
>     self.ev_q.queue(ofp_event.ofp_msg_to_ev(msg))
>   File "/ryubin/ryu/controller/dispatcher.py", line 106, in queue
>     self._dispatcher(ev)
>   File "/ryubin/ryu/controller/dispatcher.py", line 170, in __call__
>     self.dispatch(ev)
>   File "/ryubin/ryu/controller/dispatcher.py", line 187, in dispatch
>     handled = self._dispatch(ev, self.events.get(ev.__class__, []))
>   File "/ryubin/ryu/controller/dispatcher.py", line 178, in _dispatch
>     ret = h(ev)
>   File "/ryubin/ryu/app/simple_isolation.py", line 45, in switch_features_handler
>     self.nw.add_datapath(ev.msg)
>   File "/ryubin/ryu/controller/network.py", line 137, in add_datapath
>     self.port_added(datapath, port_no)
>   File "/ryubin/ryu/controller/network.py", line 144, in port_added
>     dp = self.dpids[datapath.id]
> KeyError: None

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
Isaku Yamahata 2012-03-07 20:53:26 +09:00 committed by FUJITA Tomonori
parent bd73873882
commit 828f58b2a7

View File

@ -28,6 +28,9 @@ class Network(object):
self.networks = {}
self.dpids = {}
def _dpids_setdefault(self, dpid):
return self.dpids.setdefault(dpid, {})
def _check_nw_id_unknown(self, network_id):
if network_id == self.nw_id_unknown:
raise NetworkAlreadyExist(network_id=network_id)
@ -80,7 +83,7 @@ class Network(object):
except KeyError:
raise NetworkNotFound(network_id=network_id)
self.dpids.setdefault(dpid, {})
self._dpids_setdefault(dpid)
self.dpids[dpid][port] = network_id
def create_port(self, network_id, dpid, port):
@ -132,7 +135,7 @@ class Network(object):
datapath = ofp_switch_features.datapath
dpid = ofp_switch_features.datapath_id
ports = ofp_switch_features.ports
self.dpids.setdefault(dpid, {})
self._dpids_setdefault(dpid)
for port_no in ports:
self.port_added(datapath, port_no)
@ -141,7 +144,7 @@ class Network(object):
# skip fake output ports
return
dp = self.dpids[datapath.id]
dp = self._dpids_setdefault(datapath.id)
dp.setdefault(port_no, self.nw_id_unknown)
def port_deleted(self, dpid, port_no):