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

  • 必要パッケージインストール.Ryuはすでにインストール済とする。LagopusはUbuntu推奨だし、環境はUbuntuです。
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

Reference