2013年9月13日金曜日

Tremaを試す ~switch monitor~

こんにちは、鯵王です。

今回もrubyの説明を交えてプログラムの動きを追ってみます。

今回はサンプルプログラムの中から、SwitchMonitorを見てみます。
ソースはexamplesの中のswitch_monitorの中にあります。

以下はサンプルコードの中からプログラム部分を抜粋したものです。
行頭の数字は行番号です。

(switch-monitor.rb)
 1  class SwitchMonitor < Controller
 2    periodic_timer_event :show_switches, 10
 3
 4
 5    def start
 6      @switches = []
 7    end
 8
 9
10    def switch_ready datapath_id
11      @switches << datapath_id.to_hex
12      info "Switch #{ datapath_id.to_hex } is UP"
13    end
14
15
16    def switch_disconnected datapath_id
17      @switches -= [ datapath_id.to_hex ]
18      info "Switch #{ datapath_id.to_hex } is DOWN"
19    end
20
21
22    private
23
24
25    def show_switches
26      info "All switches = " + @switches.sort.join( ", " )
27    end
28  end

このプログラムがやっているのは以下の2つです
・スイッチが起動したらUP、停止したらDOWNと出力する
・定期的に、起動しているスイッチを一覧で表示する

では順番に見ていきます。

1行目
SwitchMonitorクラスを定義しています。
2行目
periodic_timer_eventはタイマーで定期的に決められた処理を実行します。
ここでは10秒おきにshow_switchesメソッドを実行します。
後ろに書かれた「:show_switches」が実行するメソッド名です。ちなみに、先頭に「:」が付いている文字列をシンボルといいます。
引数をシンボルで記述しているため、periodic_timer_eventに「show_switches」という文字列が渡されると考えてください。
行末の10が実行する間隔です。
5行目
startメソッドを定義しています。startはコントローラ起動時に自動で実行されるメソッドです。
6行目
@switchesは変数名、[]は空の配列を定義しています。
先頭の「@」は、この変数がインスタンス変数であることを示しています。
インスタンス変数はこのクラス全体で利用できる変数です。
10行目
今回も登場したswitch_readyメソッドです。
OpenFlowコントローラとスイッチの接続が完了すると実行されます、
11行目
ここでは起動したスイッチのdatapath_idを16進数に変換し、その値を6行目で作成した@switches配列に追加しています。
「<<」は配列に値を追加する時に使用します。
12行目
infoで起動したスイッチのdatapath_idを出力します。
記号「#{ }」については、infoの後の「"」で囲まれた文字は文字列として出力されますが、この「#{」と「}」の間に変数名を記述すると変数の中の値を出力します。
16行目
switch_disconnectedメソッドはスイッチとコントローラの接続が切れた時に実行されます。今回はスイッチの停止=切断として記述します。
17行目
スイッチが停止した際、停止したスイッチのdatapath_idを6行目に書かれた@switches配列から取り除いています。
「-=」は配列から指定した値を取り除く時に使用します。
18行目
infoで停止したスイッチのdatapath_idを出力しています。
プログラムの書き方は12行目と同様です。
22行目
privateはメソッドの有効範囲を示すものです。
privateより下に書かれたメソッドはクラスの外から参照することができません。
25~27行目
show_switchesメソッドは起動しているスイッチを一覧で出力するメソッドです。
「All switches = 」に続き、@switches配列に格納された変数を並べ替えて「,」で結合し、infoメソッドで出力します。
sortとjoinはRubyが標準で用意しているメソッドです。

続いて仮想環境の定義ファイルです。

(switch-monitor.conf)
1  vswitch { datapath_id 0x1 }
2  vswitch { datapath_id 0x2 }
3  vswitch { datapath_id 0x3 }

1~3行目
今回はスイッチが3台あるだけの構成です。

では、以下のコマンドで実行してみます。

trema run ./switch-monitor.rb -c ./switch-monitor.conf

以下のように表示されたでしょうか?

$ trema run ./switch-monitor.rb -c ./switch-monitor.conf
Switch 0x3 is UP
Switch 0x1 is UP
Switch 0x2 is UP
All switches = 0x1, 0x2, 0x3
All switches = 0x1, 0x2, 0x3

次に、スイッチを一つ停止します。
別の端末を起動し、以下のコマンドを実行します。

trema kill 0x1

以下のように「Swtich 0x1 is DOWN」と表示されます。

$ trema kill 0x1
All switches = 0x1, 0x2, 0x3
Switch 0x1 is DOWN
All switches = 0x2, 0x3

今度は停止したスイッチを起動してみます。

trema up 0x1

以下のように「Switch 0x1 is UP」と表示されます。

$ trema up 0x1
All switches = 0x2, 0x3
Switch 0x1 is UP
All switches = 0x1, 0x2, 0x3

今回は以上になります。

0 件のコメント:

コメントを投稿