Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Kazuya Suzuki committed Oct 4, 2012
0 parents commit 33ad313
Show file tree
Hide file tree
Showing 22 changed files with 881 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
source :rubygems
gem 'redcarpet'
gem 'showoff'
gem 'heroku'
47 changes: 47 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
GEM
remote: http://rubygems.org/
specs:
addressable (2.2.7)
blankslate (2.1.2.4)
bluecloth (2.2.0)
gli (1.5.1)
heroku (2.21.3)
launchy (>= 0.3.2)
netrc (~> 0.7.1)
rest-client (~> 1.6.1)
rubyzip
json (1.6.5)
launchy (2.0.5)
addressable (~> 2.2.6)
mime-types (1.17.2)
netrc (0.7.1)
nokogiri (1.5.2)
parslet (1.3.0)
blankslate (~> 2.0)
rack (1.4.1)
rack-protection (1.2.0)
rack
redcarpet (2.1.0)
rest-client (1.6.7)
mime-types (>= 1.16)
rubyzip (0.9.6.1)
showoff (0.7.0)
bluecloth
gli (>= 1.3.2)
json
nokogiri
parslet
sinatra
sinatra (1.3.2)
rack (~> 1.3, >= 1.3.6)
rack-protection (~> 1.2)
tilt (~> 1.3, >= 1.3.3)
tilt (1.3.3)

PLATFORMS
ruby

DEPENDENCIES
heroku
redcarpet
showoff
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Quick Start

git clone git://github.com/trema/tutorial.git
cd tutorial

# run the standard presentation
showoff serve

This will launch a local Sinatra server on port 9090. Open your browser to `localhost:9090`. On a Mac you can run:

open http://localhost:9090

Use arrow keys to navigate through the slides. Press '?' to see a help window with more key commands.


# Printing slides (PDF)

Try this: first `gem install pdfkit`, then visit

http://localhost:9090/pdf


# LICENSE
Copyright (c) 2012 Yasuhito Takamiya

Licensed under the GPL3 license
2 changes: 2 additions & 0 deletions config.ru
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require "showoff"
run ShowOff.new
84 changes: 84 additions & 0 deletions hello_switch/hello_switch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<!SLIDE>
# Task B: Hello Switch! ########################################################
## OpenFlow スイッチとコントローラを接続


<!SLIDE>
## "OpenFlow スイッチを持っていないけど、<br />どうすればいい?"


<!SLIDE small>
# 演習 : Hello Switch コントローラ ############################################

$ trema run hello-switch.rb -c hello-switch.conf
Password: xxxxxxxx # Enter your password here
Hello 0xabc! # Ctrl-c to quit

* <b>ソフトウェア版 OpenFlow スイッチ (dpid = 0xabc)</b> を起動し、コントローラと接続します
* コントローラは `"Hello 0xabc!"` と表示します
* ソフトウェア版 OpenFlow スイッチの起動は `hello-switch.conf` に定義します


<!SLIDE center>
![overview](hello_switch.png)


<!SLIDE small>
# hello-switch.conf ############################################################

@@@ ruby
#
# Add a switch with dpid == 0xabc
#
vswitch { dpid "0xabc" }
# or
vswitch { datapath_id "0xabc" }

* ソフトウェア版 OpenFlow スイッチが起動し、コントローラとのコネクションを確立します
* Trema は <b>Full-stack</b> の開発フレームワークです。ノート PC が一台あれば、物理スイッチを持っていなくても開発ができます


<!SLIDE small>
# `hello-switch.rb` ############################################################

@@@ ruby
class HelloSwitch < Controller
def switch_ready dpid
info "Hello #{ dpid.to_hex }!"
end
end

* `switch_ready` は、スイッチがコントローラに接続したときに呼ばれるハンドラです
* 引数の `dpid` には接続したスイッチの ID が格納されます
* `.to_hex` をつけることで `dpid` を 16 進数で表示します


<!SLIDE small>
# 演習: スイッチの追加 ####################################################

@@@ ruby
# hello-switch.conf
vswitch { dpid "0x1" }
vswitch { dpid "0x2" }
vswitch { dpid "0x3" }
...


$ trema run hello-switch.rb -c hello-switch.conf
???

* `hello-switch.conf` にスイッチを追加して `trema run` したとき、何が表示される?
* 注 : 各スイッチの dpid はユニークである必要があります


<!SLIDE small incremental transition=uncover>
# ここまでのサマリー ###############################################################

## Trema は "Post-Rails" なモダンなフレームワークです

<br />

* <i>書いたコードをすぐ動かせる</i>: `trema run`
* <i>Coding by Convention</i>: 分かりやすく名付けられた各種メソッド
* <i>Full-Stack</i>: ネットワーク DSL によるエミュレーション
* 便利なサブコマンド : `trema ruby`
Binary file added hello_switch/hello_switch.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
160 changes: 160 additions & 0 deletions hello_trema/hello_trema.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
<!SLIDE>
# Task A: Hello Trema! #########################################################


<!SLIDE commandline>
## 演習: "Hello Trema!" を実行 #############################################

### 以下のコマンドを入力し、Trema を実行します :

$ cd Tutorials/Trema
$ trema run hello-trema.rb
Hello Trema! # Ctrl-C to quit


<!SLIDE center>
![overview](hello_trema.png)


<!SLIDE small>
# 基本コマンド : `trema run` ###############################################

$ trema run [controller-file]

* 上記コマンドで、コントローラを実行します
* Ctrl-c で停止します
* `trema help run` でオプションリストを表示します


<!SLIDE small>
# 書いたコードをすぐ動かす #################################################################

* `trema run` コマンドで、書いたコントローラをすぐ実行できます
* 書いたコントローラを、即座にテストできます
* 短いサイクルで "コーディング、テスト、デバッグ" を繰り返す開発スタイルを実現できます


<!SLIDE small>
# Trema 上での コントローラの書き方 #############################################


<!SLIDE small>
# hello-trema.rb ###############################################################

@@@ ruby
class HelloController < Controller
def start
info "Hello Trema!"
end
end

* シンプルですが、これだけで完全なコントローラのコードになっています
* (ただし Hello Trema! と表示するだけのものです)


<!SLIDE small>
# コントローラクラス #############################################################

@@@ ruby
class HelloController < Controller
# ...
end

* すべてのコントローラは、クラスとして実装します (`class HelloController`)
* Trema クラスライブラリに用意されている `Controller` クラスのサブクラスとして実装します
* コントローラに必要なメソッドは、自動的に継承されます (flow-mod メッセージの送信等)


<!SLIDE small>
# イベントハンドラ ###############################################################

@@@ ruby
class MyController < Controller
def start # start-up event handler
# ...
end
def packet_in dpid, msg # Packet-in received handler
# ...
end

# ...
end

* イベントドリブン形式で、コントローラを記述します
* 各イベントハンドラを、インスタンスメソッドとして実装します


<!SLIDE small>
# イベントハンドラ (Floodlight の場合) #################################################

@@@ java
// Packet-in handling in Floodlight
public Command receive(IOFSwitch sw, ...) {
switch (msg.getType()) {
case PACKET_IN:
return this.handlePacketIn(sw, ...);
...
private Command handlePacketIn(IOFSwitch sw, ...) {
...

* Floodlight では、複雑なイベント振り分けを必要とします
* おまじないが多いため、コードの見通しが悪くなります


<!SLIDE small>
# イベントの振り分け ################################################################

@@@ ruby
# Packet-in handling in Trema
class MyController < Controller
def start # automatically called at startup
# ...
end
def packet_in dpid, msg # automatically caled when receiving a packet-in
# ...
end
end

* Trema はイベントの振り分けにリフレクションを使っています
* そのため、複雑になりがちなディスパッチやハンドラ登録を行う必要はありません


<!SLIDE small transition=uncover>
# コーディングのための工夫 #######################################################

* 簡潔なコードを書くための工夫
* e.g., "handler name" == "message name"
* イベントディスパッチのような、おまじないを不要に
* 楽しいプログラミングのために、お約束事やつまらない部分を削減


<!SLIDE small>
# 短く書く ################################################################

* コードの長さと生産性の間には強い相関関係
* e.g. Arc Programming Language [Paul Graham]
* コードを短くすることで、
* お約束コードを書く時間を最小にする
* バグ混入の可能性を少なくする

<br />

## Trema は、実行時の効率性よりも
## <b>プログラマーの生産性</b>に重きをおいています


<!SLIDE small>
# Logging API ##################################################################

@@@ ruby
class HelloController < Controller
def start
info "Hello Trema!" # outputs an info level message
end
end

* ロギングレベル毎に用意されたシンプルな API (debug, info, etc)
* `trema ruby` で、Logging API を含む API リファレンスを表示

Binary file added hello_trema/hello_trema.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions intermission/intermission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<!SLIDE>
# Intermission (10 minutes) ####################################################
42 changes: 42 additions & 0 deletions intro/intro.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<!SLIDE title-slide>
# 作ってわかる OpenFlow ########################################################
## Trema チュートリアル&ハンズオン

### 鈴木 一哉
### 高宮 安仁


<!SLIDE small>
# 本日のゴール #################################################################

## "トラフィックモニターつき L2 スイッチ" の実装

* Tutorial Kit: <https://github.com/trema/tutorial.files>
* "Hello World" から始め、5 つの段階を踏んで開発を行います
* Trema を使い OpenFlow コントローラの開発サイクルを体験します


<!SLIDE small incremental>
# Trema とは ################################################################

* Ruby と C 向けの OpenFlow コントローラ開発フレームワーク
* GPL2
* <http://github.com/trema/trema>
* "Post-Rails" 高い生産性を実現
* <i>書いたコードをすぐ動かせる</i>
* <i>よくある処理を短く書ける</i>
* <i>統合されたテスト環境</i>


<!SLIDE>
# Trema = ######################################################################
## OpenFlow コントローラ向けライブラリ
## (Ruby and C)
## +
## ネットワークエミュレータ
## +
## `trema` コマンド


<!SLIDE center>
![overview](overview.png)
Binary file added intro/overview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added learning_switch/dump_flows.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 33ad313

Please sign in to comment.