はじめに
Netsim を使って NSO の試験を行うときに、Netsim デバイスにあらかじめコンフィグやオペレーショナルデータを設定しておきたいことがあります。
ncs-netsim cli-c <device-name> コマンドを使って Netsim デバイスにログインしてコンフィグを設定していくことはできますが、この方法には以下のような問題があります。
- インタラクティブな操作になるのでテストの自動化が面倒
- オペレーショナルデータが投入できない
この記事では、ncs_cmd コマンドを使って OS の CLI から Netsim デバイスにコンフィグやオペレーショナルデータを投入する方法を紹介します。
事前準備
この例では、以下のシンプルなYANGファイルから作成した NETCONF NED を使って Netsim デバイスを起動し、そのデバイスに対してデータを投入していきます。
router.yang
$ cat yang/router.yang
module router {
namespace "http://example.com/router";
prefix r;
container system {
leaf hostname {
type string;
}
uses routes;
}
grouping routes {
list route {
key "dest nexthop";
leaf dest {
type string;
}
leaf mask {
type string;
}
leaf nexthop {
type string;
}
}
}
}
router-stat.yang
$ cat yang/router-stat.yang
module router-stat {
namespace "http://example.com/router-stat";
prefix s;
container stats {
config false;
list interface {
key name;
leaf name {
type string;
}
leaf status {
type enumeration {
enum "up";
enum "down";
}
}
}
}
}
(1) NETCONF NEDの作成、ディレクトリ構成の確認
$ ls yang
router-stat.yang router.yang
$
$ ncs-make-package --netconf-ned yang/ router
$
$ tree router/
router/
├── netsim
│ ├── Makefile
│ ├── confd.conf.netsim
│ └── start.sh
├── package-meta-data.xml
└── src
├── Makefile
├── java
│ ├── build.xml
│ └── src
│ └── com
│ └── example
│ └── router
│ └── namespaces
└── yang
├── router-stat.yang
└── router.yang
9 directories, 8 files
(2) confd.conf.netsim の編集
ncs_cmd コマンドでコンフィグを投入するためには、running-config へのアクセスを Read-Write に設定しておく必要があります。
$ vim router/netsim/confd.conf.netsim
編集前
<datastores>
( snip )
<running>
<access>writable-through-candidate</access>
</running>
</datastores>
編集後
<datastores>
( snip )
<running>
<access>read-write</access>
</running>
</datastores>
(3) NETCONF NEDのコンパイル
$ make -C router/src
mkdir -p ncsc-out
mkdir -p ../load-dir
( snip )
BUILD SUCCESSFUL
(4) Netsim デバイスの作成と起動
ここでは、Netsim デバイスを 2台起動しています。
$ ncs-netsim create-network router 2 R
DEVICE R0 CREATED
DEVICE R1 CREATED
$ ncs-netsim start
DEVICE R0 OK STARTED
DEVICE R1 OK STARTED
(5) Netsim デバイスのポート番号の確認
各デバイスが複数のポートをリッスンしているのが確認できます。
以降の説明では R0 の IPC(5010) を使ってコンフィグ、オペレーショナルデータを投入し、NETCONF(12022)を使って投入したデータを確認していきます。
$ ncs-netsim list
ncs-netsim list for /Users/user1/netsim
name=R0 netconf=12022 snmp=11022 ipc=5010 cli=10022 dir=/Users/user1/netsim/R/R0
name=R1 netconf=12023 snmp=11023 ipc=5011 cli=10023 dir=/Users/user1/netsim/R/R1
オペレーショナルデータの投入
データの投入
ncs_cmd コマンドの -p オプションで R0 の IPCポート(5010) を指定しています。
オペレーショナルデータを投入する場合は -oc オプションを指定し、
リストエントリを作成する場合は create コマンドを、
リーフに値をセットする場合は、set コマンドを使います。
この例では、/stats/interface{Ethernet0} を作成してその status を "up" に設定しています。
$ ncs_cmd -p 5010 -oc 'create /stats/interface{Ethernet0}'
$ ncs_cmd -p 5010 -oc 'set /stats/interface{Ethernet0}/status up'
投入したデータの確認
netconf-console を使って Netsim の NETCONF API (12022) に get コマンドを発行しています。
$ netconf-console --host localhost --port 12022 -u admin -p admin --get --xpath /stats
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
<data>
<stats xmlns="http://example.com/router-stat">
<interface>
<name>Ethernet0</name>
<status>up</status>
</interface>
</stats>
</data>
</rpc-reply>
コンフィグデータ
データの投入
コンフィグデータを投入する場合は -c オプションを指定し、リストエントリを作成する場合は mcreate コマンドを、リーフに値をセットする場合は、mset コマンドを使います。
この例では、/system/route{192.168.1.0 10.0.0.1} を作成して mask を "255.255.255.0" に設定しています。
リストキーの指定方法と、mset に続くパスがダブルクォーテーションで囲まれている点に注意してください。router.yang の /system/route のようにリストのキーが複数のリーフで構成されている場合は、中括弧( curly braces )のなかで各キーをスペースで区切って指定し、パスをクォーテーションで囲む必要があります。
$ ncs_cmd -p 5010 -c 'mcreate "/system/route{192.168.1.0 10.0.0.1}"'
$ ncs_cmd -p 5010 -c 'mset "/system/route{192.168.1.0 10.0.0.1}/mask" 255.255.255.0'
投入したデータの確認
$ netconf-console --host localhost --port 12022 -u admin -p admin --get --xpath /system
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
<data>
<system xmlns="http://example.com/router">
<hostname>R0</hostname>
<route>
<dest>192.168.1.0</dest>
<nexthop>10.0.0.1</nexthop>
<mask>255.255.255.0</mask>
</route>
</system>
</data>
</rpc-reply>
同一トランザクションで複数の設定を投入する
以下の例のように ncs_cmd の引数としてセミコロンで区切られた複数のコマンドを渡すことで、ひとつのトランザクションの中に複数の設定を含めることができます。
$ ncs_cmd -p 5010 -c 'mcreate "/system/route{192.168.1.0 10.0.0.1}"; mset "/system/route{192.168.1.0 10.0.0.1}/mask" 255.255.255.0'
データの削除
del, mdel コマンドを使うことで、Netsim デバイスからデータを削除することができます。
$ ncs_cmd -p 5010 -c 'mdel "/system/route{192.168.1.0 10.0.0.1}"'