SnapRoute / FlexSwitch on Vagrant インストールメモ

## SnapRoute 概要

Appleの巨大データセンター内で、Apple Store, iTunes, Siri, Map 等々のトラフィックをハンドルするために内製されていた、WhiteBox Switch上で動作する L2/L3 Network Stack が "SnapRoute" として独立、オープンソースとして公開された。なお、SnapRouteが企業名、FlexSwitchが製品名、OpenSnapRouteがオープンソースとしての名前？と思われる。

動作環境：（Source Codeから推定）

* 対応ASIC
    * Broadcom Trident II
    * Mellanox Spectrum Ethernet Switch IC
* 対応WhiteBoxスイッチ
    * Celestica Redstone XP (48x10Gbps + 6x40Gbps)
    * Accton AS5712-54X (48x10Gbps + 6x40Gbps)
    * OCP Facebook Wedge (16x40Gbps)
    * Mellanox SN2700 (32x100Gbps)

> Cavium, Barefoot もドキュメントに記載されているため、将来対応予定と予想

Source Codeやドキュメントの場所：

* SnapRoute
    * http://www.snaproute.com/
* Source Code
    * モジュール毎にレポジトリを分けて公開
    * https://github.com/OpenSnaproute
* ドキュメント
    * https://opensnaproute.github.io/docs/

## インストール環境

* Windows 10
* VirtualBox for Windows
* Vagrant for Windows

> Hyper-V が有効になっている場合、VirtualBox で VT-x を使う事ができず、vagrant up した時にエラーとなり起動できません。必ず無効にしてある事を確認してから作業を進めてください。

## インストール手順

1. VirtualBox のインストール
    * https://www.virtualbox.org/
2. Vagrant のインストール
    * https://www.vagrantup.com/downloads.html
    * 参考：Qiita: http://qiita.com/hidekuro/items/fc12344d36d996198e96
    * 参考：osdn magazine: https://osdn.jp/magazine/15/02/13/200000
3. Vagrant.exe へのパスを環境変数に設定（必要に応じて）
    * `C:\HashiCorp\Vagrant\bin`
4. 作業フォルダを作成（任意の場所）
    * `c:/Workspace/vagrant/srBox/`
5. FlexSwitchのファイルを保存
    * https://github.com/OpenSnaproute/vagrantFlexSwitch
    * Vagrantfile
    * snaproute.box
        * Git LFS を使っているため、`git lfs pull`が必要。
        * 参考：http://www.slideshare.net/hibiki443/git-git-lfs-60951449
6. vagrant box の追加および起動
    * vagrant box add SnapRoute112 snaproute.box
    * vagrant up
7. ssh でログイン（Tera Termで試しました）
    * Host: localhost, Port: 2222
    * UserID/Password = vagrant/vagrant

## 動作確認
### インターフェースの確認
SSHでログイン後 `ip a` で確認すると、eth0 / eth1 の２つのインターフェースが確認できます。

```
vagrant@vagrant-ubuntu-trusty-64:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:8f:dc:e2 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe8f:dce2/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:93:ad brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.9/24 brd 192.168.10.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 2408:82:3fff:9b6:a00:27ff:fe98:93ad/64 scope global dynamic
       valid_lft 2591886sec preferred_lft 604686sec
    inet6 fe80::a00:27ff:fe98:93ad/64 scope link
       valid_lft forever preferred_lft forever
4: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
    link/ether 8e:61:00:a9:32:5e brd ff:ff:ff:ff:ff:ff
```

### 利用可能なREST APIの表示
`http://<vagrant-box-ip-addr>:8080/api-docs/` で利用可能なAPIが表示されます。
例： `http://192.168.10.9:8080/api-docs/`
![20160703-snaproute-02.PNG](https://qiita-image-store.s3.amazonaws.com/0/93467/55e43c89-a80a-6ce2-a22b-1ef9ee063bfc.png)

### REST APIの利用

* サンプル：Loopback Intefaceの追加・確認

```
$ curl -H "Content-Type: application/json" -d '{"Name":"lo1", "Type":"Loopback"}' \
> http://localhost:8080/public/v1/config/LogicalIntf
{"ObjectId":"d34c77af-d9cd-48c0-7bf6-5c46acb77290","Error":""}

$ curl -H "Content-Type: application/json" \
> 'http://localhost:8080/public/v1/config/LogicalIntfs' | python -m json.tool
{
    "CurrentMarker": 0,
    "MoreExist": false,
    "NextMarker": 0,
    "ObjCount": 1,
    "Objects": [
        {
            "Object": {
                "Name": "lo1",
                "Type": "Loopback"
            },
            "ObjectId": "d34c77af-d9cd-48c0-7bf6-5c46acb77290"
        }
    ]
}
```

* サンプル：System Statusの取得

```
$ curl -X GET -H "Content-Type: application/json" "http://localhost:8080/public/v1/state/SystemStatus" | python -m json.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3160    0  3160    0     0   105k      0 --:--:-- --:--:-- --:--:--  106k
{
    "Object": {
        "FlexDaemons": [
            {
                "Enable": true,
                "KeepAlive": "Received 2 keepalives",
                "Name": "fMgrd",
                "Reason": "None",
                "RestartCount": 0,
                "RestartReason": "",
                "RestartTime": "",
                "StartTime": "2016-07-03 12:09:43.574148537 +0000 UTC",
                "State": "up"
            },
            {
                "Enable": true,
                "KeepAlive": "Received 2 keepalives",
                "Name": "confd",
                "Reason": "None",
                "RestartCount": 0,
                "RestartReason": "",
                "RestartTime": "",
                "StartTime": "2016-07-03 12:09:44.27881753 +0000 UTC",
                "State": "up"
            },
 ... 省略 ...
            {
                "Enable": true,
                "KeepAlive": "Received 2 keepalives",
                "Name": "asicd",
                "Reason": "None",
                "RestartCount": 0,
                "RestartReason": "",
                "RestartTime": "",
                "StartTime": "2016-07-03 12:09:43.27777507 +0000 UTC",
                "State": "up"
            }
        ],
        "Name": "vagrant-ubuntu-trusty-64",
        "NumActionCalls": "Total 0 Success 0",
        "NumCreateCalls": "Total 6 Success 3",
        "NumDeleteCalls": "Total 0 Success 0",
        "NumGetCalls": "Total 39 Success 21",
        "NumUpdateCalls": "Total 0 Success 0",
        "Ready": true,
        "Reason": "None",
        "UpTime": "2h50m30.840160721s"
    },
    "ObjectId": ""
}
```


## 参考リンク

* 英語）Founder CEO の Jason Forrester による BLOG：http://www.snaproute.com/our-story/
* 英語）紹介記事：http://www.recode.net/2016/6/21/11981416/apple-snaproute-project-mcqueen

以上