Ryu Topology Viewer On Docker
RyuにOpenflow switchのトポロジを表示できる機能を試してみた。
ソースに書いてあるとおりのコマンドを実行すると「アドレスを既に使ってます」というエラーがでる。
#ryu run --observe-links /usr/local/src/ryu/ryu/app/gui_topology/gui_topology.py (...中略...) instantiating app ryu/app/gui_topology/gui_topology.py of GUIServerApp hub: uncaught exception: Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/ryu/lib/hub.py", line 52, in _launch func(*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/ryu/controller/controller.py", line 70, in __call__ self.server_loop() File "/usr/local/lib/python2.7/dist-packages/ryu/controller/controller.py", line 93, in server_loop datapath_connection_factory) File "/usr/local/lib/python2.7/dist-packages/ryu/lib/hub.py", line 108, in __init__ self.server = eventlet.listen(listen_info) File "/usr/local/lib/python2.7/dist-packages/eventlet/convenience.py", line 39, in listen sock.bind(addr) File "/usr/lib/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) error: [Errno 98] Address already in use (297) wsgi starting up on http://0.0.0.0:8080/
そこで、GUIトポロジ用にコントローラ(ryu2)のコンテナを別に立てました。
(ryu2をdocker runさせるときに-p 8080:8080でポートフォーワードのオプションをつける)
Web server for viz +-------------+ +-------------+ | ryu | | ryu2 | | (Container) | | (Container) | +-------------+ +-------------+ eth1 | 192.168.100.100/24 eth1 | 192.168.200.100/24 | | | br3 br4 | -+------------+- -+------------+- | | | eth4| 192.168.200.200/24 192.168.100.200/24 |eth3 | +-------------+ | lagopus | eth2 br2 | (Container) |--------------------+ +-------------+ 169.254.0.200/24 | | eth1 | | 169.254.0.100/24 eth1 | 169.254.0.2/24 | +-------------+ | | server2 | | | (Container) | | +-------------+ | +-------------+ | | server1 | | | (Container) | | +-------------+ | eth1 | 169.254.0.1/24 -+-----------+- br1
Dockerで同じブリッジにできない&ルーティングが面倒だったので、
別セグ、別ブリッジにて新しいコントローラのコンテナを立てる。
構成に合わせてlagopusの設定ファイルも編集する。
# vim /usr/local/etc/lagopus/lagopus.conf interface { ethernet { eth1; eth2; } } bridge-domains { br3 { port { eth1; eth2; } controller { 192.168.100.100; } } br4 { controller { 192.168.200.100; } } }
ryu2で下記のコマンドを実行して、lagopusを再起動(killしてlagopusコマンド実行)する。
#PYTHONPATH=. ryu run --observe-links ryu/app/gui_topology/gui_topology.py
lagoshでコントローラがふたつになっているか確認。
# lagosh f9e9b97c595f> show controller 192.168.100.100 Controller 192.168.100.100 Datapath ID: 000000003777c04e Connection status: Connected f9e9b97c595f> show controller 192.168.200.100 Controller 192.168.200.100 Datapath ID: 000000002066009b Connection status: Connected f9e9b97c595f>
描画でD3.jsを使っているので、ソースをいじればいろいろ拡張できそうです。