Skip to content
yasuhito edited this page Apr 18, 2011 · 1 revision

Hello trema!

それではさっそくチュートリアルの定番、"Hello trema!" から始めましょう! 画面に "Hello trema!" メッセージを出力する Trema アプリケーションのソースコードは次のようになります:

class HelloController < Controller
  def start
    info "Hello trema!"
  end
end

このプログラムは Trema を使った最も簡単なプログラムであると同時に、すべての Trema アプリケーションに共通する最低限のテンプレートになっています。驚くべきことにたったの 5 行しかありません!

それでは、それぞれの部分について簡単に説明していきましょう。

Controller クラスの継承

すべての Trema アプリケーションは Controller クラスを継承します。Controller クラスにはいろいろなメソッドが予約/定義されており、必要な初期化などを裏でやってくれます。

たとえば start メソッドを定義しておくと、起動時に自動的に呼ばれます。

  def start
    info "Hello trema!"
  end

メッセージの出力

info() は Trema 標準のメッセージ出力関数の一つです。たとえば次のようにして使います。

  info( "Hello trema!" );

この例は引数として指定されたメッセージ "Hello trema!" を画面やログファイルに適切なフォーマットで出力します。

メッセージ出力関数は、重要度の順に次の 6 種類があります。メッセージレベルの設定やメッセージの出力先の設定については後のチュートリアルで説明します。

  • critical()
  • error()
  • warn()
  • notice()
  • info()
  • debug()

実行

さっそく実行してみましょう。すべての Trema アプリケーションは trema run コマンドで実行することができます。

% ./trema run hello_trema.rb
Hello trema!  # Ctrl-c で停止

いかがでしょうか? Trema のアプリケーションはとても簡単に書けることがわかったと思います。

スイッチを接続してみる

ここまでで Trema アプリケーションのひながたができました。今度はこれを元にして、OpenFlow スイッチを実際に接続し、スイッチのユニーク ID (Datapath unique ID, datapath_id とも呼ばれる) を出力するアプリケーションを書いてみましょう。スイッチのユニーク ID がわかれば、スイッチを実際に制御できるようになります。

仮想 OpenFlow スイッチ

ちょっと待ってください。私は OpenFlow 対応スイッチを持っていませんが大丈夫でしょうか?

心配いりません。Trema の最も強力な機能の一つとして仮想ネットワーク機能があります。これは仮想スイッチや仮想ホスト同士を接続した仮想的なネットワークトポロジ上でアプリケーションを実行する機能です。これによって、プログラマは実際に OpenFlow スイッチなどのハードウェアを準備しなくとも Trema の世界だけで開発やテストを完結できます。さらにすばらしいことに、こうして作ったアプリケーションは実際のハードウェア上でもそのまま動作します! それではこの機能を使って仮想スイッチを 1 つ作ってみましょう。

仮想スイッチを定義する

仮想スイッチを起動するには、次の内容の設定ファイルを trema コマンドと同じディレクトリに trema.conf として保存します。定義した仮想スイッチは trema run 実行時に自動的に起動します。

vswitch {
  datapath_id "0xabc"
}

datapath_id は 64 ビットの任意の 16 進数を指定できます。適当な値を選んでください。

スイッチ接続イベントの捕捉

Trema は OpenFlow スイッチと接続が完了すると switch_ready イベントを発生します。そこで、スイッチが接続したことを知るには switch_ready ハンドラメソッドを定義し、switch_ready イベントを捕捉すればよいことになります。

class HelloController < Controller
  def switch_ready datapath_id
    info "Hello %#x from #{ ARGV[ 0 ] }!" % datapath_id
  end
end

ハンドラ switch_ready の中では得られた datapath_idinfo() で表示しています。

実行

それではさっそく実行してみましょう。手順はさきほどとまったく同じです。 実行する前に、さきほどの設定ファイルが trema.conf として trema コマンドと同じディレクトリにあることを確認してください。

% ./trema run hello_trema.rb
Hello 0xabc from hello_trema.rb!  # Ctrl-c で停止

無事、仮想スイッチの datapath_id が表示されました。後のチュートリアルではこの datapath_id を使って実際にスイッチに対していろいろな操作をしてみましょう。

まとめ

このチュートリアルではすべての Trema アプリケーションのテンプレートとなる "Hello trema!" アプリケーションを書きました。また、これを改造して OpenFlow 対応スイッチの datapath_id を取得できるようにしました。学んだことは次の 6 つです。

  • すべての Trema アプリは Controller クラスを継承
  • info() でメッセージを出力
  • trema.conf 内の vswitch で仮想スイッチを定義
  • switch_ready() メソッドで switch_ready イベントに対するハンドラを定義