YANG ExplorerでYANGモデルに慣れる

YANG Explorerというオープンソースのアプリケーションを試してみた記録。YANGブラウザ、RPC（Remote Procedure Call）の生成、実行などNetconf/YANGまわりの確認やテスト、ちょっと人に見せるデモに使えるかも。ソースとマニュアルは以下にあり。
https://github.com/CiscoDevNet/yang-explorer

#主な機能

- YANGモデルファイルのローカルからYANG Explorerへのアップロード
- YANGモデル対応装置（Netconfサーバ、つまりルータやスイッチなど）からYANG Explorerへのダウンロード
- YANGモデルファイルをコンパイルして見やすく表示（Pyangみたいなデータモデルツリー）
- 装置（Netconfサーバ）に対してRPCを実行（Read/Write）
- RPCの生成、保存
- Pythonスクリプトの生成、保存
- YANGモデルの依存グラフの生成
- Restconfは実験段階

#インストール

[Readme](https://github.com/CiscoDevNet/yang-explorer)そのままなので簡単。私の場合はラボに余ってた古いUbuntuに入れたらスムーズに入った。

```
pip install --upgrade pip
sudo apt-get install python-virtualenv
sudo apt-get install graphviz
sudo apt-get install libxml2-dev libxslt1-dev python-dev zlib1g-dev
git clone https://github.com/CiscoDevNet/yang-explorer.git
cd yang-explorer
bash setup.sh
```

YangExplorer.htmlにアドレスとポート番号を追記するのを忘れないように（インストールをlocalhost以外に行う場合）。

```bash
cd <install-root>/yang-explorer/server/static
vi YangExplorer.html 
+     flashvars.host = '<ip-address>';
+     flashvars.port = '8088';
```

（参考）私の環境。

```bash
kikuta@ubuntu1:~$ cat /etc/os-release | grep VERSION
VERSION="14.04.5 LTS, Trusty Tahr"
VERSION_ID="14.04"
```

start.shを実行し、ターミナル上げておけばOK。

```
kikuta@ubuntu1:/home/kikuta/yang-explorer# ls
default-models  env.sh   README.md         server    start.sh  YangExplorer
docs            LICENSE  requirements.txt  setup.sh  v
kikuta@ubuntu1:/home/kikuta/yang-explorer# ./start.sh

Activating virtualenv ..
Starting YangExplorer server ..
Use http://10.71.154.119:8088/static/YangExplorer.html

Performing system checks...

System check identified no issues (0 silenced).
March 27, 2017 - 02:21:55
Django version 1.8.3, using settings 'server.settings'
Starting development server at http://10.71.154.119:8088/
Quit the server with CONTROL-C.
```

ブラウザでhttp://host:8088/ にアクセスすると、以下が表示される。

![SS 2017-03-26 16.29.10.png](https://qiita-image-store.s3.amazonaws.com/0/157325/f6526fa1-e6e9-fa7c-9fc1-3a226d8b4101.png "SS 2017-03-26 16.29.10.png")

Create device profile、またはAdminから、接続対象のデバイス情報を登録しておくと、プロファイルから選択できるようになる。
![SS 2017-03-27 23.18.18.png](https://qiita-image-store.s3.amazonaws.com/0/157325/bcbc565c-893a-a017-18c0-af30574b8416.png "SS 2017-03-27 23.18.18.png")

#YANGモデルのダウンロード
インストール時には、ietf-interfaceしか入っていないため、登録したCSR1000Vから取得（ファイルをローカルからアップロードしても良い）。真ん中のタブから「Manage Models」を選択し、デバイスタブから設定済みのプロファイルを選択すると、以下のように装置のYANGモジュールを確認でき、チェックしてSync。
![SS 2017-03-26 16.32.24.png](https://qiita-image-store.s3.amazonaws.com/0/157325/bdaf1961-6536-dcca-df29-1d74a7b99bd6.png "SS 2017-03-26 16.32.24.png")

一気にやろうとするとFailしたので、必要分をちょっとずつ。
![SS 2017-03-26 17.04.53.png](https://qiita-image-store.s3.amazonaws.com/0/157325/3e229397-8776-c73e-076d-d57510f2ca11.png "SS 2017-03-26 17.04.53.png")

選んだモジュールに依存する関連モジュールも自動的に補完される。あとは必要に応じてチェックし、Subscribeボタンをポチ。左ペインからYANGモジュールをクリッククリックしていけるようになる。右端ペインでそれぞれの意味を確認。

![SS 2017-03-27 23.35.24.png](https://qiita-image-store.s3.amazonaws.com/0/157325/51a71aea-53ae-8d7b-201c-f770837f46fb.png "SS 2017-03-27 23.35.24.png")



#参考：pyang
[こちら](https://github.com/YangModels/yang)から落としてきたYANGモジュールをPyangでツリー表示したところ。これはこれで十分わかりやすい。

```
sudo pip install pyang
```

```bash:
~ $pyang -f tree ietf-interfaces\@2014-05-08.yang 
module: ietf-interfaces
    +--rw interfaces
    |  +--rw interface* [name]
    |     +--rw name                        string
    |     +--rw description?                string
    |     +--rw type                        identityref
    |     +--rw enabled?                    boolean
    |     +--rw link-up-down-trap-enable?   enumeration {if-mib}?
    +--ro interfaces-state
       +--ro interface* [name]
          +--ro name               string
          +--ro type               identityref
          +--ro admin-status       enumeration {if-mib}?
          +--ro oper-status        enumeration
          +--ro last-change?       yang:date-and-time
          +--ro if-index           int32 {if-mib}?
          +--ro phys-address?      yang:phys-address
          +--ro higher-layer-if*   interface-state-ref
          +--ro lower-layer-if*    interface-state-ref
          +--ro speed?             yang:gauge64
          +--ro statistics
             +--ro discontinuity-time    yang:date-and-time
             +--ro in-octets?            yang:counter64
             +--ro in-unicast-pkts?      yang:counter64
             +--ro in-broadcast-pkts?    yang:counter64
             +--ro in-multicast-pkts?    yang:counter64
             +--ro in-discards?          yang:counter32
             +--ro in-errors?            yang:counter32
             +--ro in-unknown-protos?    yang:counter32
             +--ro out-octets?           yang:counter64
             +--ro out-unicast-pkts?     yang:counter64
             +--ro out-broadcast-pkts?   yang:counter64
             +--ro out-multicast-pkts?   yang:counter64
             +--ro out-discards?         yang:counter32
             +--ro out-errors?           yang:counter32
```

#読み込み（Read）
まずはお決まりのcapability取得。
![SS 2017-03-27 23.38.16.png](https://qiita-image-store.s3.amazonaws.com/0/157325/bb4fe35b-b02f-a731-8f4f-c9aa8a8eb645.png "SS 2017-03-27 23.38.16.png")

ルーティングインスタンスを取得するRPCを生成して...
![SS 2017-03-27 23.41.36.png](https://qiita-image-store.s3.amazonaws.com/0/157325/3c5a1b2d-8962-9a07-b314-c2457297b263.png "SS 2017-03-27 23.41.36.png")

Runで取得。真ん中下部のウインドウにリターンが更新。
![SS 2017-03-27 23.41.59.png](https://qiita-image-store.s3.amazonaws.com/0/157325/d5d5ee8b-a9bf-1d64-a586-ac84f2a69c61.png "SS 2017-03-27 23.41.59.png")

RPCではなくPythonスクリプトも生成してくれるらしい（Python2.7だけど）。
![SS 2017-03-27 23.47.49.png](https://qiita-image-store.s3.amazonaws.com/0/157325/1132c705-f4a9-d014-82ee-70c5829bcce6.png "SS 2017-03-27 23.47.49.png")



#設定（Write）
空っぽのインターフェースを設定して起動させてみる。

```Cisco:CSR1000V
CSR-2#sh run int gi 2
Building configuration...

Current configuration : 107 bytes
!
interface GigabitEthernet2
 no ip address
 shutdown
 negotiation auto
 no mop enabled
 no mop sysid
end
```

左ペインのパラメータを入力して、下部のConfigにチェック。真ん中ペインのRPCボタンをクリックすると、以下のようにRPCを生成。そしてRun。
![SS 2017-03-27 23.52.22.png](https://qiita-image-store.s3.amazonaws.com/0/157325/d96248ee-7b83-102e-7ef6-80a67a60fcdf.png "SS 2017-03-27 23.52.22.png")

RPCリプライはOKがリターン。
![SS 2017-03-27 23.54.45.png](https://qiita-image-store.s3.amazonaws.com/0/157325/8441c225-0c9d-4f01-5fa1-74f9fca2869d.png "SS 2017-03-27 23.54.45.png")

CSR1000Vにも設定が行われていることを確認。

```Cisco:CSR1000V
CSR-2#sh run int gi 2
Building configuration...

Current configuration : 150 bytes
!
interface GigabitEthernet2
 description Set-by-YangExplr
 ip address 192.168.2.1 255.255.255.0
 negotiation auto
 no mop enabled
 no mop sysid
end
```



#YANGモデルの依存グラフ
Manage Deviceから適当にSyncしたYANGモジュールだが、真ん中下部の右端のGraphボタンをクリックすると、YANGモジュールの依存関係を表すグラフが表示される。
![SS 2017-03-27 23.58.17.png](https://qiita-image-store.s3.amazonaws.com/0/157325/9adf6fd4-466f-41f7-1c62-60db9f7f145d.png "SS 2017-03-27 23.58.17.png")

細かくYANGモジュールを読む前に、ざっと全体を理解するには便利そうです。

![SS 2017-03-28 0.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/157325/732a6cba-4de5-9423-e3fc-461f87c2c362.png "SS 2017-03-28 0.01.45.png")