Cisco YANG SuiteによるYANGモジュールのブラウジング、RPCメッセージの作成

#初めに
構造や、依存関係など、なかなか理解しにくかったYANGを簡単にブラウジングしたり、NETCONFのRPCメッセージを簡単にビルドできるツールがDevNetで紹介されていたので、備忘録的に掲載しようと思います。

#Cisco YANG Suiteとは
Cisco YANG Suiteは、NETCONF、RESTCONF、gNMIなどのYANGプログラマブルインターフェイスを学習したり、検証するためのツールセットです。
グラフィカルインターフェイスでYANGモジュールの参照や、RPCペイロードメッセージを作成することができ、また、ストリーミングテレメトリ用のgRPCダイヤルアウトモデル駆動型テレメトリコレクターも含まれています。 ツール自体のユーザーインターフェイスはHTML5で更新され、Dockerコンテナーで柔軟にデプロイすることができます。

[- Cisco YANG Suite](https://developer.cisco.com/yangsuite/)

#環境
YANG SuiteはUbuntuへインストールし、対象デバイスはCML2上のCSR1000vを使用しました。

![topology.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834983/90c9960e-9321-d51e-7f3a-1f0489e96d5a.jpeg)

Ubuntu（20.04.1 LTS (Focal Fossa)）
csr1000v-mono-universalk9.17.03.02 (CML2)

#インストール要件と流れ
インストール要件や、手順は下記に詳しく掲載されています。
[- YANG Suite in GitHub](https://github.com/CiscoDevNet/yangsuite/)

__インストール要件__
YANG Suiteは、DockerコンテナーとしてDocker-composeでインストールするので、YANGSuiteを実行するシステムにDocker、DockerComposeをインストールする必要があります。
今回は、Docker、DockerComposeをインストールしたUbuntu（20.04.1 LTS (Focal Fossa)）を使用しました。

__インストールの流れ__
* YANG Suiteリポジトリのクローン
* `start_yang_suite.sh`の実行
> 以前に`start_yang_suite.sh`を実行済みの場合は`docker compose up`の実行

①YANG Suiteリポジトリのクローン

```shell
virl@api:~$ git clone https://github.com/CiscoDevNet/yangsuite
Cloning into 'yangsuite'...
remote: Enumerating objects: 764, done.
remote: Counting objects: 100% (764/764), done.
remote: Compressing objects: 100% (521/521), done.
remote: Total 764 (delta 302), reused 640 (delta 226), pack-reused 0
Receiving objects: 100% (764/764), 25.23 MiB | 2.37 MiB/s, done.
Resolving deltas: 100% (302/302), done.
```

②`start_yang_suite.sh`の実行

```shell
virl@api:~$ cd ./yangsuite/docker/
virl@api:~/yangsuite/docker$ sudo ./start_yang_suite.sh
Hello, please setup YANG Suite admin user.
username: cisco
password:
confirm password:
email: example@example.com

Setup test certificates? (y/n): y
################################################################
## Generating self-signed certificates...                     ##
##                                                            ##
## WARNING: Obtain certificates from a trusted authority!     ##
##                                                            ##
## NOTE: Some browsers may still reject these certificates!!  ##
################################################################

Generating a RSA private key
...+++++
.............+++++
writing new private key to 'nginx/nginx-self-signed.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:OSAKA
Locality Name (eg, city) []:OSAKA
Organization Name (eg, company) [Internet Widgits Pty Ltd]:EXAMPLE
Organizational Unit Name (eg, section) []:EXAMPLE
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:example@example.com
Certificates generated...
Building docker containers...
Building yangsuite
（以下省略）
```

> start_yang_suite.shは、ユーザー名、パスワード、電子メールアドレス、および証明書の詳細を設定するように要求してきます。

以下のようなログが出力されればインストール完了です。

```shell
yangsuite_1  | spawned uWSGI master process (pid: 35)
yangsuite_1  | spawned uWSGI worker 1 (pid: 39, cores: 1)
yangsuite_1  | spawned uWSGI worker 2 (pid: 40, cores: 1)
yangsuite_1  | spawned uWSGI worker 3 (pid: 41, cores: 1)
yangsuite_1  | spawned uWSGI worker 4 (pid: 42, cores: 1)
yangsuite_1  | spawned uWSGI worker 5 (pid: 43, cores: 1)
```

インストールしたOSのブラウザから、http://localhost　または、https://localhost:8443
へアクセスすれば__YANG Suite__を使用することができます。

> 外部デバイスからYANG Suiteへアクセスしたい場合は、インストールする前に、rootディレクトリにある`start_yang_suite.sh`、nginxディレクトリにある`nginx.conf`、yangsuiteディレクトリにある、`dockerfile`、`production.py`、の__'localhost'__の部分を__'dockerホストのIPアドレス　or　FQMN'__に書き代えます。
インストール時に要求される証明書の__「Common Name」__も__'dockerホストのIPアドレス or FQMN'__にすれば、外部から『https://{dockerホストのIPアドレス or FQMN}:8443』  でアクセスすることができます。

#YANG Suiteの設定
インストールが完了すれば、YANG Suiteで扱いたいデバイスの登録（Device profiles）、そのデバイスがサポートするYANGモデルの登録（YANG module repository）、そのYANGモデルからYANG Suiteで扱えるようにモジュールセットの作成（YANG module set）などを行います。

YANG Suiteの設定は下記に詳しく掲載されています。
[- YANG Suite Docs](https://developer.cisco.com/docs/yangsuite/)

####Device profilesの設定
"Setup" > "Device profiles"から、YANG Suiteでアクセスしたいデバイスを登録します。
ルータやスイッチ等のデバイスのホスト名や、IPアドレス、有効にするAPI(gNMI、NETCONF、RESTCONF)の詳細を設定します。
デバイスへのコネクティビティチェックも可能です。


![スクリーンショット 2021-09-30 14.27.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834983/d57b67e1-2217-d171-59c3-eb6bbc98de96.png)


![スクリーンショット 2021-09-30 14.28.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834983/2d8aef80-5933-0b35-4916-5fe23149cb95.png)


####YANG module repositoryの作成
"Setup" > "YANG files and repositories"から、それぞれのOSごとにリポジトリを作成します。
リポジトリはDevice profilesと関連付けられ、Device profilesに登録したデバイスのOSでサポートされているYANGモデルを登録します。


![スクリーンショット 2021-09-30 14.46.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834983/bc1ad3e0-1f1e-accb-bfd8-9f08946f8494.png)


####YANG module setの作成
 "Setup" > "YANG module sets"で、上で作成したYANG module repositoryからYANG module setを作成します。
リポジトリのYANGモジュール全てを指定してYANG module setを作成することもできますが、必要なモジュールとそのモジュールと依存関係のあるモジュールに絞って作成することもできます。YANG Suiteでモジュールをブラウジングするときや、NETCONFやRESTCONFでデバイスからステータスを引き出したり設定を変更したりするときは、このYANG module setsを指定して実行します。

![スクリーンショット 2021-09-30 14.56.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834983/9a7940e7-54c5-9cce-1b37-5107cafc7a9c.png)


#YANG Suiteの利用
"Device profiles"、"YANG files and repositories"、"YANG module sets"の設定が完了すれば、YANGモジュールのブラウジングや、デバイスへのAPIアクセスが可能になります。

YANG Suiteの利用方法は下記に詳しく掲載されています。
[- YANG Suite Docs](https://developer.cisco.com/docs/yangsuite/)

####ブラウジング
モジュール読み込んで直感的にわかりやすくツリー状に表示してくれます。便利なのは依存関係も解決して表示してくれるところです。
例えば、「ietf-interfaces」モジュールを読み込めば、拡張モジュールである「ietf-ip」モジュールも読み込んでツリーの中に表示してくれます。

![スクリーンショット 2021-10-01 14.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834983/a8f7f87d-c678-4781-6097-9ab2cde558d0.png)


####NETCONFアクセス
__NETCONF get-config RPC__
作成したYANG module setを指定すればそのモジュールがツリー状に表示されます。デバイスから引き出したい設定や、ステータスをチェックボックスで選択するだけでRPCメッセージをビルドすることができます。あとは、YANG Suiteがそれを対象デバイスに実行してくれるので、pythonの知識がなくても直感的にNETCONFでデバイスにアクセスし、情報を引き出すことができます。

![スクリーンショット 2021-10-01 15.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834983/70243b08-10da-fde1-b673-93099b661df4.png)

![スクリーンショット 2021-10-01 15.03.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834983/3522fa7b-3e4b-678a-d0d5-36d259f236d5.png)

__NETCONF edit-config RPC__
get-configと同じように、作成したYANG module setを指定すればそのモジュールがツリー状に表示されます。設定変更したleafの'Value'や'Operation'に設定値を入力すればRPCメッセージをビルドすることができます。あとはYANG Suiteがそれを対象デバイスに実行してくれるので、NETCONFで直感的にデバイスの設定変更が実現できます。

![スクリーンショット 2021-10-01 15.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834983/70efd8a8-91fe-c88e-4e7b-e388f1bea2ac.png)


#まとめ
デバイスがサポートするYANGモデルは、デバイスからダウンロードすることができます。pythonのncclientでもできますが、GUIはやっぱり簡単です。ブラウジングに関してはYANGモジュールを依存関係も解析した上でツリー状に表示してくれるので構造が直感的にわかります。API接続もYANGツリーから選択したり、leafにパラメータを記入したりするだけで、RPCメッセージが作成されるので、とても便利です。YANG SuiteでビルドされたRPCメッセージを、ncclientでの自動化に活用することもできるので、かなり使えるのではと感じました。

#参考リンク
[- Cisco YANG Suite](https://developer.cisco.com/yangsuite/)
[- YANG Suite in GitHub](https://github.com/CiscoDevNet/yangsuite/)
[- YANG Suite Docs](https://developer.cisco.com/docs/yangsuite/)