RENATの使い方の例（BIRDルータ編）

自分がRENATの開発者である。今回、ユーザの立場から、RENATの使い方を説明する 。
元々、RENATはネットワーク装置の検証の目的で作られた（参照資料）。今回、ソフトウェア・ルータを用い、renatの使い方を簡単に説明する。物理ルータや他のネットワーク装置へ対しての使い方は同じである。

仮想ルータはなんでもいいが、昔からBIRDを使おうと持っていたので、今回birdを使ってみる。

#環境
- osX Mojave
- docker desktop Version 2.0.0.3
- renat 0.1.14

# 概要
以下の流れで説明する

- renatとは
- ネットワークトポロジー
- renatのインストール
- birdルータのインストール
- シナリオ作成・実行
- 実行結果の確認
- まとめ

# RENATとは
詳細を省略するが、RENATは[Robotframework](https://robotframework.org)を拡張したネットワーク検証用のフレームワークである。簡単なテキストのシナリオを用い、ラボで検証する内容をほぼ再現でき、実際の現場、サービスで既に多く使われている。


## ネットワークトボロジー
作りたいトポロジーはとても簡単なもので、ソフトウェアルータ（bird）とrenatサーバが直結されるものである。

```
+-------+     +-------------+
| ルータ +-----+ renatサーバ  |
+-------+     +-------------+
```

## birdルータのインストール
今回、cloudRouter(fedora/bird)を試す。以下の手順で一つのルータを立ち上げる。

root権限でcontainerを開始する

```shell
$ docker run --privileged --publish-all=true cloudrouter/bird-fedora /sbin/init
```

設定を変更するため、containerへloginする

```shell
$ docker exec -it 22f73220b705 /bin/bash --login
```

telnet-serverを追加し、rootでloginできるようにする

```shell
$ rm -f /etc/yum.repos.d/cloudrouter.repo
$ yum install -y telnet-server
$ sed -i '/pam_securetty.so/d' /etc/pam.d/remote
$ systemctl start telnet.socket
```

このcontainerのIP(eth0)を確認する。この場合は、ルータのIPが `172.17.0.2` である。

```shell-session
[root@22f73220b705 etc]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
    link/tunnel6 :: brd ::
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
```

rootアカウントのパスワードを `system` へ変更する

```shell
$ echo "cloudrouter" | passwd root --stdin
```

BIRDを開始する

```shell
$ bird
```

#renatのインストール
以下のようにrenat環境を構築する。[RENAT(github)](https://github.com/bachng2017/RENAT)のサイトでインストール方法を書いてあるが、ためすだけならば、dockerのイメージは最もは早い方法である。

## dockerからインストール
[RENAT(docker)](https://cloud.docker.com/u/bachng/repository/docker/bachng/renat)の手順に従い、renatサーバを動かす（dockerhub.comから最新なイメージをダウンロードしてくる）

```shell

$ mkdir /opt/renat
$ docker run --rm -d --privileged -v /opt/renat:/opt/renat -p 80:80 -p 10022:22 --name renat bachng/renat:latest
```
ここで、renatサーバが動き始め、`http port 80` で実行結果が確認できるようになる。

# renat環境を調整

renatの設定ファイルは全て`$RENAT_PATH/config`のは以下で、以下ファイルである。なお、環境変数 `$RENAT_PATH`はデオフォルトで `/home/work/robot/renat`である。

- template.yaml: サポートしているplatformの情報（プロムプトなど）
- auth.yaml: 認証情報
- device.yaml: システムワイドの設備情報（主にIP情報）


元々、renatでは`Juniper`,`Cisco`などのNW装置をサポートしているが、birdのサポートは入っていない。以下のように、birdのサポートを追加する。

必要なのは、`template.yaml`ファイルにBIRDのサポートを追加するのみである。

```yaml
access-template:
    bird:
        access: telnet
        auth: plain-text
        profile: default
        prompt: ".*(>|#) "
        login-prompt: "login: "
        password-prompt: "Password: "
        init:
            - birdc
        finish:
            - quit
            - exit
    ssh-host:
...
```
ここで、ホストへのアクセスを`telnet`とし、ホストにログイン成功したら、`birdc`を呼び、birdのCLIに入る。また、認証は`plain-text`で、認証情報のプロフィルは`default`とする。

`auth.yaml`を編集し、BIRDルータの認証情報設定する。

```yaml

auth:
    plain-text:
        default:
            user: root
            pass: cloudrouter
        samurai:
...
```
ここでは、BIRDルータのパスワードは前節でbird containerのrootパスワードと同じにする


device管理ファイル`device.yaml`に `bird01` のルータを追加する。ここに追加されたdeviceはrenatサーバを共有したテストitemから利用できるようになる。

```yaml

device:
    # Cloudrouter
    bird01:
        type: bird
        description: a cloudrouter BIRD version
        ip: 172.17.0.2
    # Testers
...
```
ここで IPアドレスは、birdコンテナのIPアドレスである。

# シナリオ作成・実行
renatサーバへrobotユーザとしてログインする。デフォルトで `/home/robot/work` がワーキングフォルダーになる。

```shell
$ docker exec -it --user robot renat /bin/bash --login
```

まず、`~/work`は以下で、テストprojectを作成する。

```shell-session
[robot@9985510e9a87 work]$ cd /home/robot/work/
[robot@9985510e9a87 work]$ $RENAT_PATH/tools/project.sh renat-sample
created test project:  renat-sample
entered project folder:  renat-sample
use item.sh to create test case
[robot@9985510e9a87 work]$ cd ~/work/renat-sample
[robot@9985510e9a87 renat-sample]$
```

そして、batchモードでbird01というデバイスを含めたテストitemを作成する。

```shell-session
[robot@9985510e9a87 renat-sample]$ $RENAT_PATH/tools/item.sh -b -l -n bird01 test01


=== Created `test01` test item ===
Case scenario:     /home/robot/work/renat/tools/test01/main.robot
Case run file:     /home/robot/work/renat/tools/test01/run.sh
Local config file: /home/robot/work/renat/tools/test01/config/local.yaml
Tester config file:/home/robot/work/renat/tools/test01/config/
Check and change the `local.yaml` local config file if necessary
[robot@9985510e9a87 renat-sample]$
```

`test01`は以下にシナリオ・ファイル `main.robot` を以下のように編集する（既存のテンプレートは消しても良い）

```
 20
 21 *** Test Cases ***
 22 01. 基本的なコマンドの確認
 23     Router.Switch       bird01
 24     Router.Cmd          show status
 25     Router.Cmd          show memory
 26
```

まず、文法チェックを行う

```shell-session
[robot@9985510e9a87 test01]$ ./run.sh --dryrun
Current time:       Mon May  6 09:46:07 UTC 2019
Current RENAT path: /home/robot/work/renat

### Current folder is /home/robot/work/renat-sample/test01 ###
Run only once

Run: 001
Current local.yaml: /home/robot/work/renat-sample/test01/config/local.yaml
Loaded extra library `Hypervisor`
==============================================================================
test01 :: This is a sample test item
==============================================================================
01. 基本的なコマンドの確認                                            | PASS |
------------------------------------------------------------------------------
test01 :: This is a sample test item                                  | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Output:  /home/robot/work/renat-sample/test01/result/output.xml
Log:     /home/robot/work/renat-sample/test01/result/log.html
Report:  /home/robot/work/renat-sample/test01/result/report.html
```

全て`PASS`ならば、次に実際シナリオを実行する（`--dryrun`なしで）

```shell-session
### Current folder is /home/robot/work/renat-sample/test01 ###
Run only once

Run: 001
Current local.yaml: /home/robot/work/renat-sample/test01/config/local.yaml
Loaded extra library `Hypervisor`
==============================================================================
test01 :: This is a sample test item
==============================================================================
RENAT Ver:: RENAT 0.1.14
------------------------------------------------------------------------------
README:
Write you readme file here


------------------------------------------------------------------------------
00. Lab Setup
------------------------------------------------------------------------------
01. 基本的なコマンドの確認                                            | PASS |
------------------------------------------------------------------------------
99. Lab Teardown
------------------------------------------------------------------------------
test01 :: This is a sample test item                                  | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Output:  /home/robot/work/renat-sample/test01/result/output.xml
Log:     /home/robot/work/renat-sample/test01/result/log.html
Report:  /home/robot/work/renat-sample/test01/result/report.html
```


#実行結果の確認
前節でシナリオの実行が終わったら、dockerホストからのブラウザーでテストitemの結果を確認できる。renatの各ユーザの`work`フォルダーが `~<username>`へマッピングされる。今回、このurlで結果が確認できる `http://127.0.0.1/~robot/renat-sample/test01/result/log.html`

<img width="1021" alt="スクリーンショット 2019-05-06 18.51.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/fe55631f-5400-ebf2-4c45-67c53af3b9b5.png">

ここで、`+`のマークを選択すると、各ステップの詳細情報が見える。また、以下のurlで、書く装置の実行ログも確認できる
http://127.0.0.1/~robot/renat-sample/test01/result/bird01.log

<img width="434" alt="スクリーンショット 2019-05-06 18.54.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310585/3ced9021-2ac4-694f-02a3-8e6f14226640.png">


#まとめ
RENATを使い、birdルータの基本コマンドを確認テストitemの方法について簡単に説明した。シナリオを実行した例でしめしたように、ユーザがlogin/logoutやログ収集について一切気にせず、renatへ任せることができた。**ユーザが、検証したい内容を注目し、シナリオを書き、テストを実行することによって、従来の検証プロセスをより効率的に実現できるだろう。**

また、元々、birdをサポートしていないrenat対して、簡単にbirdのサポートを入れる方も説明した。今回、コンセプトを見せるため、テストの内容は基本のコマンドを確認するだけにしたが、renatを用い、他のNW装置、トラヒックジェネラータを含めた複雑なテスト・シナリオも作成、確認できる。また、今度別の記事を書きたいと思う。

ここでは簡単な使い方を説明したが、renatの詳細は以下のサイトへ。

#参考資料
- [RENAT(github)](https://github.com/bachng2017/RENAT)
- [RENAT(dockerhub)](https://cloud.docker.com/u/bachng/repository/docker/bachng/renat)
- [RobotFrameworkについて（英語）](https://robotframework.org)
- [RobotFrameworkのドキュメント（日本語）](https://robotframework-ja.readthedocs.io/ja/latest/)
- [Janog#41で紹介したrenat](https://www.janog.gr.jp/meeting/janog41/program/sp4renat)
- [How to configure CloudRouter containers as a Route Server](https://cloudrouter.atlassian.net/wiki/spaces/CPD/pages/1015911/How+to+Configure+CloudRouter+containers+as+a+Route+Server)