Lagopus で ofctl
Lagopusでovs-ofctlみたいなことしたいってことで,Ryuのofctl-rest.pyを利用したofctl_scriptというbashスクリプトを書いた (hibitomo/ofctl_script · GitHub)
※ 他のOpenFlow1.3 Switchでも動きます。
ofctl_scriptを使うことで以下の事ができる
- flow, group, meterの表示、表示項目の変更 (show_flow)
- flow, group, meterのルール追加/削除 (add_flow/del_flow)
- show_flowの結果をファイルにダンプし,そのダンプファイルを利用したflow, group, meterの追加/削除
ofctl_scriptは,OpenFlowコントローラのRyuのofctl_rest.pyを利用する. ofctl_rest.pyはREST APIでovs-ofctlのような事ができる便利なアプリケーションである.すごく便利なんだけど、curlコマンドとかURL覚えるのがめんどくさい。その点、ofctl_scriptはflowのadd, delete, showだけに特化しているので簡単。デバッグ用途にどうぞ。
$ ./show_flow $ ./add_flow '{"table_id":0,"priority":110,"actions":["OUTPUT:1"],"match":{"dl_dst":"00:00:00:01:02:03/ff:ff:ff:ff:ff:ff","in_port":2}}' $ ./del_flow '{"table_id":0,"priority":110,"actions":["OUTPUT:1"],"match":{"dl_dst":"00:00:00:01:02:03/ff:ff:ff:ff:ff:ff","in_port":2}}'
フローを表現するjsonはofctl_rest.pyのjsonと同じです。 詳しくはドキュメントを確認してください( ryu.app.ofctl_rest — Ryu 3.17 documentation )
install
sudo apt-get install jq
- ソースコード取得
$ git clone git://github.com/hibitomo/ofctl_script $ git clone git://github.com/osrg/ryu.git
setup
Ryu を動かす。とりあえず、ryuにあるofctl_rest.pyが動いていればOK。 あとは好きなOpenFlow1.3なスイッチとつなげてください.
$ cd ryu $ ryu-manager [your Ryu application] ryu/app/ofctl_rest.py
使い方
設定確認
ofctl_scriptが接続に行くデフォルトのdpidとurlがofctl.confに記述されている。 接続したいRyu, Switchが一台ならばここにその設定を書いておく。
$ cd ofctl_script $ head ofctl.conf -n 2 dpid=1 url=127.0.0.1:8080
複数台あるときなど、コマンド個別にコントローラのURL、スイッチのdpidを指定したい場合、-u
、 -d
を使うことができる。
$ ./show_flow -d 1 -u 127.0.0.1:8080
接続したOpenFlowSwitchのdpid確認スクリプトも用意してある。check_dpidでRyuに接続しているスイッチのdpidが確認できる。確認後、dpidを設定してもよい。
$ cd ofctl_script $ ./check_dpid [1]
show_flow
show_flowでフローを確認できる。また表示したフローをファイルに保存することができる。このダンプファイルは、そのままファイルの追加・削除に使えるため、フローの再現やテストにも利用できる.
$ ./show_flow $ ./show_flow > [dump file]
show_flowが表示する内容は、ofctl.confに設定されている。好きにコメントアウトをつけはずしするとよい。
add_flow
add_flowでフローを追加できる。
$ ./add_flow '{"table_id":0,"priority":110,"actions":["OUTPUT:1"],"match":{"dl_dst":"00:00:00:01:02:03/ff:ff:ff:ff:ff:ff","in_port":2}}' $ ./add_flow -t group '{"type":"ALL","group_id":4,"buckets":[{"actions":["OUTPUT:1"]}]}' # group_table $ ./add_flow -t meter '{"meter_id":1,"flags":["KBPS"],"bands":[{"type":"DROP","rate":1000}]}' # meter_table
show_flowでダンプしておいたフロー情報を元にフローを追加することができる。table_idを含んだフローをshow_flowで表示させ、ダンプしておいた方がよい。ダンプしたファイルを編集すれば、任意の複数フローをコマンド一発で追加できる。
$ ./add_flow < flow_dump
Tips: アプリケーションインテグレーションテスト
- アプリケーション毎にフローのファイルを用意しておくとインテグレーションした場合のテストを行うことができる。
$ ./add_flow < flow_dump_appA $ ./add_flow < flow_dump_appB $ ### Your flow integration test ###
del_flow
del_flowでフローが消せる。
$ ./del_flow '{"table_id":0,"priority":110,"actions":["OUTPUT:1"],"match":{"dl_dst":"00:00:00:01:02:03/ff:ff:ff:ff:ff:ff","in_port":2}}' $ ./del_flow -t group '{"type":"ALL","group_id":4,"buckets":[{"actions":["OUTPUT:1"]}]}' # group_table $ ./del_flow -t meter '{"meter_id":1,"flags":["KBPS"],"bands":[{"type":"DROP","rate":1000}]}' # meter_table
show_flowでダンプしておいたフロー情報を元にフローを削除することができる。table_idを含んだフローをshow_flowで表示させ、ダンプしておいた方がよい。ダンプしたファイルを編集すれば、任意の複数フローをコマンド一発で削除できる。
$ ./del_flow < flow_dump
Tips: フロー全消し
$ ./show_flow | ./del_flow