今日も秋田で IoT

旧 Trema 日記

Sliceable Switch を使う (その2)

Sliceable Switch のスライス設定は、前節で紹介したようにコマンドで行うこともできますが、REST ベースの API で行うこともできます。今回はこの REST API を使った設定方法を、試しながら紹介していきたいと思います。
f:id:kazuya_ax:20120713183033p:image:w250
まずは、コマンド設定と 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 設定を試しながら、紹介を行いました。もし、試してみて動かないところや、間違っているところを見つけたら、ぜひコメント等でご指摘ください。
次回は、補足的に、今回説明できなかったことの解説を行います。