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