Sliceable Switch を使う (その2)
Sliceable Switch のスライス設定は、前節で紹介したようにコマンドで行うこともできますが、REST ベースの API で行うこともできます。今回はこの REST API を使った設定方法を、試しながら紹介していきたいと思います。
まずは、コマンド設定と REST API 経由での設定との関係を理解するために、各モジュール間の関係についてすこし説明します。図に示すように、スライスの設定は、slice.db という名前の sqlite3 のデータベースに格納されています。sliceable_switch モジュールはこのデータベースから、スライス設定を取得しています。先ほど紹介した slice コマンドを実行すると、スライスの設定がこのデータベースに書き込まれます。
Sliceable Switch の REST API は、Apache 上で動作する CGI で実現しています。HTTP クライアントからアクセスすると、config.cgi が呼び出され、パースした結果を slice.db へと書き込みます。
準備
REST API を使用するためには、少し準備が必要です。まずは必要なモジュールのインストールを行いましょう。
% sudo apt-get install sqlite3 libdbi-perl libdbd-sqlite3-perl % sudo apt-get install apache2-mpm-prefork libjson-perl
次に Apache の設定を行います。必要な設定ファイル等は同梱されていますので、以下の手順を実施してください。
% cd apps/sliceable_switch
% sudo cp apache/sliceable_switch /etc/apache2/sites-available
% sudo a2enmod rewrite actions
% sudo a2ensite sliceable_switch
次に、Sliceable Switch が参照するデータベースと、CGI 経由でデータベースに書き込むためのスクリプト群を用意し、適切なディレクトリに配置します。そして最後に Apache の再起動を行います。
% ./create_tables.sh A filter entry is added successfully. % sudo mkdir -p /home/sliceable_switch/script % sudo mkdir /home/sliceable_switch/db % sudo cp Slice.pm Filter.pm config.cgi /home/sliceable_switch/script % sudo cp *.db /home/sliceable_switch/db % sudo chown -R www-data.www-data /home/sliceable_switch % sudo /etc/init.d/apache2 reload
これで設定は終了です。最後に 各ファイルが適切に配置されていることを確認してください。
% ls /home/sliceable_switch/*
/home/sliceable_switch/db:
filter.db slice.db
/home/sliceable_switch/script:
Filter.pm Slice.pm config.cgi
REST API を使ってみる
まず、スライスを作ってみましょう。slice1 という ID のスライスを作る場合には、JSON 形式のファイル (slice.json) を用意します。
{ "id" : "slice1", "description" : "Trema-team network" }
この JSON 形式のファイルを、/networks という URI に POST メソッドで送ることで、スライスを作ることができます。
httpc というテスト用の HTTP クライアントが ./test/rest_if/ のディレクトリ配下に用意されていますので、これを用います。今回の設定では Apache の待ち受けポートは 8888 になっていますので、以下のように実行してみましょう。
% ./test/rest_if/httpc POST http://127.0.0.1:8888/networks ./slice.json Status: 202 Accepted Content: {"id":"slice1","description":"Trema-team network"}
成功すれば、上記のように表示されるはずです。
次に、MAC アドレスをスライスに対応させてみましょう。JSON 形式で、割り当てる MAC アドレスを指定したファイルを用意します(attachment.json)。
{ "id" : "attach0", "mac" : "01:00:00:00:00:01" }
スライスに MAC アドレスを割り当てる際に使用する URI は、/networks/<スライスID>/attachments です。以下のように attachment.json を slice1 に割り当てます。
% ./test/rest_if/httpc POST http://127.0.0.1:8888/networks/slice1/attachments attachment.json Status: 202 Accepted
今度は、ポートをスライスに割り当てる方法を見ていきましょう。これまでと同様に、JSON 形式で、割り当てるポートに関する情報を記載したファイルを用意します(port.json)。ここでは、データパス ID が 0xe0 である OpenFlow スイッチの 33 番目のポートを指定しています。このポートからパケットを出す際に VLAN tag を付与したい場合には vid のパラメータにその値を設定します。VLAN tag の設定が不要の場合には、この例のように 65535 としてください。
{ "id" : "port0", "datapath_id" : "0xe0", "port" : 33, "vid" : 65535 }
このとき使用する URI は /networks/<スライスID>/ports になります。以下のようにして、port.json で指定したポートを slice1 というスライスにを割り当てます。
% ./test/rest_if/httpc POST http://127.0.0.1:8888/networks/slice1/ports ./port.json Status: 202 Accepted
これまでの設定がきちんと行われているかを確認してみましょう。/networks/<スライスID> に GET メソッドでアクセスすることで、スライスに関する情報を取得できます。slice1 に関する情報を取得してみましょう。
% ./test/rest_if/httpc GET http://127.0.0.1:8888/networks/slice1 Status: 200 OK Content: { "bindings" : [ { "type" : 2, "id" : "attach0", "mac" : "01:00:00:00:00:01" }, { "vid" : 65535, "datapath_id" : "224", "type" : 1, "id" : "port0", "port" : 33 } ], "description" : "Trema-team network" }
この出力結果は見やすいようにインデント表示にしていますが、実際には改行なしで表示されます。先に設定した内容が、きちんと反映されているかの確認ができます。
おわりに
今回は Sliceable Switch の REST API 設定を試しながら、紹介を行いました。もし、試してみて動かないところや、間違っているところを見つけたら、ぜひコメント等でご指摘ください。
次回は、補足的に、今回説明できなかったことの解説を行います。