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を使っているので、ソースをいじればいろいろ拡張できそうです。