ラベル Trema の投稿を表示しています。 すべての投稿を表示
ラベル Trema の投稿を表示しています。 すべての投稿を表示

2013年11月16日土曜日

VagrantとChefSoloでTremaEdge環境をつくる

最近、OpenFlow徹底入門を読んでいます。再びOpenFlowでいろいろやってみたいと感じています。
この本ではOpenFlowコントローラとしてFloodlightを使用しています。今までOpenFlowコントローラは、主にTremaを勉強してきましたが、いろいろなコントローラを触りながら、OpenFlowの本質を知るのもいいなかなと思っています。
ただ、そのための環境を作成するのは、(webに情報があるとは言え)やはり時間がかかります。また、local PCのリソース(主にdisk容量)を消費するので、どこかのタイミングで、ある環境を削除する判断をしなければなりません。(今までそのような経験をしてきたので、PC購入の際にはdisk容量を多めにするようにしています)
VagrantとChefSoloを使えば、サーバ環境をファイルで管理できる、個々の環境imageを保持する必要がなくなります。よって、diskの使用率を低減することができます。
今後、検証環境を作成する際には、VagrantとChefSoloで作成し、githubで保存していきたいと思います。

今回やること

今回は、trema-edgeの環境を作成してみたいと思います。 trema-edgeはtremaのOpenFlow1.3版で、OpenFlow1.0はサポートしていません。今のところ、tremaとtrema-edgeは別のものです。
また、tremaはRuby1.8環境で動作するのですが、Ruby1.8の開発は終了しています。それに対して、trema-edgeはRuby2.0環境で動作します。詳しくは下記。

設定ファイル

まず今回作成した設定ファイルをgithubに保存しましたので、ご参照ください。
github vagrant-trema-edge

設定のポイント

install手順はgithubのREDAMEに従っています。
手順は難しくありませんが、今回は、rubyのバージョン管理にrvmを使いましたので、rvmの設定のポイントを記載します。

Berksfileの設定

cookbookとしてrvmを登録します。rvm用のcookbookはいくつか存在しますが、今回使用したものが安定しているようでした。
$ vi Berksfile
site :opscode
cookbook 'apt'
cookbook 'rvm', github: 'fnichol/chef-rvm'
cookbook 'myapp', path: './site-cookbooks/myapp'

Vagrantfileの設定

chef.add_recipeとして下記の2行を追加し、chef.jsonでrubyのバージョン指定と、gemsの指定を行います。
$ vi Vagrantfile
-snip-
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
chef.add_recipe "apt"
chef.add_recipe "rvm::system"
chef.add_recipe "rvm::vagrant"
chef.add_recipe "myapp"

chef.json = {
  "rvm" => {
    "default_ruby" => "ruby-2.0.0",
    "global_gems" => [
      {"name" => "bundler"},
      {"name" => "rake"}
    ]
  }
}
-snip-

Recipeの設定

今回、cookbookでrvmをinstallしているので、rvm_shellリソースが使えるようになっています。rvm_shellでrvmに依存する部分の記載を行います。
また、githubからtrema-edgeのrepositoryを取得するのはgitリソースを使用します。
$ vi site-cookbooks/myapp/recipes/default.rb
git "/home/vagrant/trema-edge" do
  repository "git://github.com/trema/trema-edge.git"
  reference "master"
  action :checkout
  user "vagrant"
  group "vagrant"
end

rvm_shell "install trema-edge" do
  ruby_string 'ruby-2.0.0'
  cwd "/home/vagrant/trema-edge"
  code <<-EOC
    bundle install
    rake
  EOC
end

bash ".bashrc" do
  not_if "which trema"
  code <<-EOC
    echo 'PATH="$HOME/trema-edge/bin:$PATH"' >> /home/vagrant/.bashrc
  EOC
end

まとめ

  • 今回、trema-edgeの環境設定をVagrantとChefSoloで行いました。
  • 設定のポイントとしては、今回はrvmを使用し、ruby2.0.0を指定しています。
  • trema-edge自体は、これから触ってみたいと思います。

このエントリーをはてなブックマークに追加

2013年1月5日土曜日

昨年の振り返りと、今年の目標

昨年に続き今年も。まずは振り返りから。

できたこと

  • iPhoneアプリの作成
    開発環境としてTitanium Mobileを利用(言語はjavascript)
    iTunes appstoregithubで公開
    ※appstoreでreviewいただけたのは本当にうれしかった。Titanium Mobileが安定したら、また開発再開したいと思います。
  • ビジネス会計2級合格
    会計知識0から始めて3級合格。そして、2回目の挑戦で2級合格。
  • OpenFlowコントローラ:Tremaとの出会い
    ちょうどTrema本の執筆の噂を聞いたので、文言の間違いやサンプルコードの動作確認などに参加しました。初めてのオブジェクト指向型言語で、最初は少し戸惑いましたが、Trema本にはRubyに関する簡単な説明もあるので、なんとか進める事ができました。
    書籍中「協力者」として、名前を記載いただきました。
    今まで簡単なスクリプトぐらいしか書く事がなく、Perlで対応していましたが、やっとRubyを使う機会を得ることができました。
  • HerokuとRuby on Railsでサイト作成
    Trema本でRubyに触れる機会を得たので、もう1つ気になっていた「Ruby on Rails」にも挑戦してみました。そして、PaaSであるHerokuを利用し、サイト構築してみました。サイトはこちら
    技術要素としては他に、O/R mapperの「ActiveRecord」や、CSSフレームワークの「Twitter Bootstrap」のRails版も利用しました。
  • ブログ
    この1年で、月間PV数が約2倍になりました。
    「ブログは継続が重要」を実感しました。

できなかったこと

  • 日頃の体力作り
    昨年後半から、朝のウォーキングが続かなくなった。
  • ビッグデータ関連の取り組み
    Hadoop、機械学習などを想定していたが、具体的な課題がないと、表面的な学習だけで終わり、継続できない。

で、

今年の目標

  • Tremaのアプリ作成
  • OpenStack, CloudStackのplugin作成
    Tremaの学習のoutputとして、何か作成してみたいなと。結局、OpenFlowで何ができるのか、何をしたいのか。。。
    できれば、plugin的なものもできればいいなと。OpenStackなど、CloudStack以外からも学ぶところは多いなと。
  • Railsを利用したサイト構築
    Railを通じて、今風のサイト構築の勘所を学習したいなと。

今年もよろしくお願いいたします。
このエントリーをはてなブックマークに追加

2012年9月10日月曜日

OpenFlow Tremaのサンプルプログラム作りに挑戦

前回から少し間が空きましたが、この間TremaとRubyの勉強を(少し)していました。
今回はTremaを使ってOpenFlowスイッチの統計情報を表示するサンプルプログラム作りに挑戦します。
作成し終わってから、似たようなサンプルがあることに気づきましたが、スルーします。

環境準備

下記サイトを参考にinstallします。
https://github.com/trema/trema/blob/develop/README.md

下記のサンプルコードも同時に、src/examples/にinstallされます。
https://github.com/trema/trema/tree/develop/src/examples


install完了したら、上述のlink先のtutorialや下記のTrema編の情報をみながら、実際にサンプルコードを触りながら、動作を確認していきます。Tremaはイベント駆動型で、最初は少し戸惑いました。
http://gihyo.jp/dev/serial/01/openflow_sd

サンプル

今回はOpenFlowスイッチの統計情報を収集するサンプルを作成します。
ネットワーク機器を運用していると、何かと統計情報を参照することが多いので、Tremaで、どのような情報を収集できるのか気になります。

tremaに付属しているサンプル「traffic_monitor」を元に、機能追加する形で実装します。

Trema APIはこちらにreferenceがありますが多すぎるので、まずは、こちらに記載のものから少しずつ試すのがいいと思います。
今回は、下記の2つのrequest messageをOpenFlowコントローラからOpenFlowスイッチに送出し、その結果を対応するevent handlerで待ち受けます。

<メッセージ>
Trema::FeaturesRequest
Trema::PortStatsRequest

<Event Handler>
features_reply(datapath_id, message)
stats_reply(datapath_id, message)

下記はコード抜粋です。
 class TrafficMonitor < Controller
 ---snip---
  def switch_ready datapath_id
    @datapath_id = datapath_id
    send_message datapath_id, FeaturesRequest.new
    send_message datapath_id, PortStatsRequest.new
  end
  def features_reply datapath_id, message
    puts "---------"
    p message.datapath_id
    p message.transaction_id
    p message.n_buffers
    p message.n_tables
    p message.capabilities
    p message.actions
    puts "==="
    p message.ports
  end
  def stats_reply datapath_id, message
    p message.flags
    p message.transaction_id
    p message.type
    puts message.stats
  end
 ---snip---
OpenFlowスイッチと接続時(switch_ready)、OpenFlowコントローラからOpenFlowスイッチに対して、FeaturesRequestとPortStatsRequestメッセージを送出しています。その後、OpenFlowスイッチからのそれぞれの応答(FeaturesReplyとPortStatsReply)を受け取ります。それぞれの応答を受け取るためのEvent Handler、はfeature_replyとstats_replyです。

出力結果は下記の通りです。
とりあえず、featuresとportstatsのreply messageを取得できていることがわかります。
$ cd trema/src/examples/test/
$ ls
fdb.rb  readme  traffic-monitor.rb  traffic_monitor.conf
$ ~/trema/trema run traffic-monitor.rb -c traffic_monitor.conf
##### features_reply結果 #####
---------
2748
174194689
256
1
135
4095
===
[#<Trema::Port:0xb734bc5c @peer=0, @name="trema0-0", @state=0, @supported=0, @config=0, @hw_addr=#<Trema::Mac:0xb734bc84 @string="3a:91:53:f7:8e:b7", @value=64395853401783>, @advertised=0, @number=2, @curr=192>, #<Trema::Port:0xb734b7e8 @peer=0, @name="vsw_0xabc", @state=1, @supported=0, @config=1, @hw_addr=#<Trema::Mac:0xb734b84c @string="e2:4d:c0:65:dc:2a", @value=248823568260138>, @advertised=0, @number=65534, @curr=130>, #<Trema::Port:0xb734b16c @peer=0, @name="trema1-0", @state=0, @supported=0, @config=0, @hw_addr=#<Trema::Mac:0xb734b310 @string="8a:75:10:17:c2:1c", @value=152235385799196>, @advertised=0, @number=1, @curr=192>]
###### stats_reply(PortsStatsReply)結果 #####
0
174194690
4
#<Trema::PortStatsReply:0xb73499e8>
collisions: 0
port_no: 2
rx_bytes: 0
rx_crc_err: 0
rx_dropped: 0
rx_errors: 0
rx_frame_err: 0
rx_over_err: 0
rx_packets: 0
tx_bytes: 0
tx_dropped: 0
tx_errors: 0
tx_packets: 0
#<Trema::PortStatsReply:0xb734922c>
collisions: 0
port_no: 65534
rx_bytes: 0
rx_crc_err: 0
rx_dropped: 0
rx_errors: 0
rx_frame_err: 0
rx_over_err: 0
rx_packets: 0
tx_bytes: 0
tx_dropped: 0
tx_errors: 0
tx_packets: 0
#<Trema::PortStatsReply:0xb734850c>
collisions: 0
port_no: 1
rx_bytes: 0
rx_crc_err: 0
rx_dropped: 0
rx_errors: 0
rx_frame_err: 0
rx_over_err: 0
rx_packets: 0
tx_bytes: 0
tx_dropped: 0
tx_errors: 0
tx_packets: 0


サンプルプログラム全体はgithubに置いてあります。
https://github.com/snumano/trema_stats

ハマりポイント

  • Trema情報少ない
    v0.2.5なので、現状では仕方ないですね。上述のサイトのtutorialやサンプルを参考に、必要なAPI documentを読んでいきます。
  • どのEvent Handlerを使えばいいか分かりづらい。
    上記のサンプルでは2種類のメッセージに対応するEvent Handlerを使っていますが、stats_replyで複数のメッセージ(*StatsRequets)に対応するReplyのEventを待ち受けするようです。
    ここのmessageのOb jectの説明をみてやっと理解できました。
  • バグや実装漏れ、ドキュメント間違い
    上述のstats_replyの動作について、実際の動作とDocumentに差異があり、悩んでいたのですが、結局古いTremaバージョンの不具合だったようで、最新バージョンにすることで解消しました。(常に最新バージョンにするようにしたほうがいいですね)
    また、ドキュメントにも小さな記載間違いなどがあるので、都度、確認するようにしています。間違いなど見つけたら、Issue Trackerに記載するようにしています。

引き続き、Tremaのサンプル作りに挑戦したいと思います。次はFlow情報系かな。。。

<追記>
・2012/9/10 出力結果追記
このエントリーをはてなブックマークに追加