概要
このドキュメントではテンプレートを使用したサービスの作成方法を紹介します。
例として作成するサービスは IOS デバイスに loopback インタフェースを作成するだけの簡単なものです。
1. サービススケルトンの作成
NSO がインストールされた Linux の CLI で ncs-make-package コマンドを使用して、テンプレートベースのサービススケルトンを作成します。サービス名は loopback とします。
サービススケルトンはサービス作成に必要となる一連のディレクトリ・ファイルを集めたサービスパッケージの雛型のようなものです。
$ ncs-make-package --service-skeleton template-based loopback $ tree loopback/ loopback/ |-- load-dir |-- package-meta-data.xml |-- src | |-- Makefile | |-- java | | `-- src | | `-- com | | `-- example | | `-- loopback | | `-- namespaces | `-- yang | `-- loopback.yang |-- templates | `-- loopback-template.xml `-- test |-- Makefile `-- internal |-- Makefile `-- lux |-- Makefile `-- basic |-- Makefile `-- run.lux |
2. サンプルコンフィグの作成
サービスを使ってデバイスに設定するコンフィグを、 NSO の CLI から手動で設定して XML で表示します。この XML は以降の手順でテンプレートファイルを作成するために使用します。
admin@ncs(config)# devices device ios0 config ios:interface Loopback 1 admin@ncs(config-if)# ip address 10.0.0.1 255.255.255.255 admin@ncs(config-if)# admin@ncs(config-if)# top admin@ncs(config)# admin@ncs(config)# commit dry-run outformat xml result-xml <devices xmlns="http://tail-f.com/ns/ncs"> <device> <name>ios0</name> <config> <interface xmlns="urn:ios"> <Loopback> <name>1</name> <ip> <address> <primary> <address>10.0.0.1</address> <mask>255.255.255.255</mask> </primary> </address> </ip> </Loopback> </interface> </config> </device> </devices>
admin@ncs(config)# abort |
3. サービステンプレート(XMLファイル)の作成
loopback/templates 配下にあるテンプレートファイルを編集していきます。
loopback-template.xml 編集前
$ cat loopback/templates/loopback-template.xml <config-template xmlns="http://tail-f.com/ns/config/1.0" servicepoint="loopback"> <devices xmlns="http://tail-f.com/ns/ncs"> <device> <!-- Select the devices from some data structure in the service model. In this skeleton the devices are specified in a leaf-list. Select all devices in that leaf-list: --> <name>{/device}</name> <config> <!-- Add device-specific parameters here. In this skeleton the service has a leaf "dummy"; use that to set something on the device e.g.: <ip-address-on-device>{/dummy}</ip-address-on-device> --> </config> </device> </devices> </config-template> |
<config>...</config> の間に手順2で作成したXMLをペーストします。
loopback サービスを使って設定する値を {変数名} で置き換えます。
この例ではループバックインタフェース名を {loopback-intf}、
IPアドレスを {ip-address} に置き換えています。サブネットマスクは一律 255.255.255.255 にすることとし、変数化していません。
loopback-template.xml 編集後
<config-template xmlns="http://tail-f.com/ns/config/1.0" servicepoint="loopback"> <devices xmlns="http://tail-f.com/ns/ncs"> <device> <!-- Select the devices from some data structure in the service model. In this skeleton the devices are specified in a leaf-list. Select all devices in that leaf-list: --> <name>{/device}</name> <config> <interface xmlns="urn:ios"> <Loopback> <name>{loopback-intf}</name> <ip> <address> <primary> <address>{ip-address}</address> <mask>255.255.255.255</mask> </primary> </address> </ip> </Loopback> </interface> </config> </device> </devices> </config-template> |
4. サービスモデル(YANGファイル)の作成
loopback/src/yang 配下にあるサービスモデルを編集していきます。
loopback.yang 編集前
$ cat loopback/src/yang/loopback.yang module loopback { namespace "http://com/example/loopback"; prefix loopback; import ietf-inet-types { prefix inet; } import tailf-ncs { prefix ncs; } augment /ncs:services { list loopback { key name; uses ncs:service-data; ncs:servicepoint "loopback"; leaf name { type string; } // may replace this with other ways of refering to the devices. leaf-list device { type leafref { path "/ncs:devices/ncs:device/ncs:name"; } } // replace with your own stuff here leaf dummy { type inet:ipv4-address; } } } } |
loopback.yang 編集後
module loopback { namespace "http://com/example/loopback"; prefix loopback; import ietf-inet-types { prefix inet; } import tailf-ncs { prefix ncs; } import tailf-common { prefix tailf; } augment /ncs:services { list loopback { key servicename; unique "device loopback-intf"; unique "ip-address"; uses ncs:service-data; ncs:servicepoint "loopback"; leaf servicename { tailf:info "Service Instance Name"; type string; } leaf device { tailf:info "Router name"; mandatory true; type leafref { path "/ncs:devices/ncs:device/ncs:name"; } } leaf loopback-intf { tailf:info "Loopback Interface Number from 100 to 199"; mandatory true; type uint32 { range "100..199"; } } leaf ip-address { tailf:info "Valid IP range from 10.100.x.x to 10.199.x.x"; mandatory true; type inet:ipv4-address { pattern "10\.1[0-9][0-9]\.[0-9]+\.[0-9]+"; } } } } } |
5. コンパイル、サービスのデプロイ
Makefile が配置されている loopback/src ディレクトリに移動して make をコマンドを実行し、サービスコードをコンパイルします。
$ cd loopback/src/ $ make /home/hkakehas/ncs/bin/ncsc `ls loopback-ann.yang > /dev/null 2>&1 && echo "-a loopback-ann.yang"` \ --yangpath yang -c -o ../load-dir/loopback.fxs yang/loopback.yang |
作成したサービスのディレクトリへのリンクを、NSO のランタイムディレクトリの packages ディレクトリ配下に作成します。
$ ln -s ~/loopback ncs-run/packages/ |
最後に NSO の CLI から package reload コマンドを実行して、作成したパッケージを NSO にロードします。
$ ncs_cli -u admin -C admin connected from ..... admin@ncs# packages reload >>> System upgrade is starting. >>> Sessions in configure mode must exit to operational mode. >>> No configuration changes can be performed until upgrade has completed. >>> System upgrade has completed successfully. reload-result { package cisco-ios result true } reload-result { package loopback result true } |
動作確認
admin@ncs(config)# services loopback 1 Value for 'device' [ios0]: ios0 Value for 'loopback-intf' (<unsignedInt, 100 .. 199>): 100 Value for 'ip-address' (<IPv4 address>): 10.100.1.1 admin@ncs(config-loopback-1)# commit dry-run cli devices { device ios0 { config { ios:interface { + Loopback 100 { + ip { + address { + primary { + address 10.100.1.1; + mask 255.255.255.255; + } + } + } + } } } } } services { + loopback 1 { + device ios0; + loopback-intf 100; + ip-address 10.100.1.1; + } } |