キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
cancel
告知

JTAC-Mid-Career-Recruitment-2021.8

 

NSO: YANG ファイルから NETCONF NED を作成する

1072
閲覧回数
10
いいね!
0
コメント

[toc:faq]

 

概要

このドキュメントでは YANG ファイルから NETCONF NED を作成する方法を紹介します( ここで作成した NEDを使ってデバイスのシミュレーターを起動して、NSO から設定投入のテストを行うまでの手順を別のドキュメントで紹介する予定です。)
    

YANG ファイルの用意

この例では架空のデバイス、 dumb-router の YANGファイルを使用します。
( デバイスモデルのツリーのルートにあたるYANG ファイルは dumb-rouer.yangで、dumb-interface.yang を import しています。 )

※一般的にはデバイスメーカーから提供される YANGファイルを使用することが多いと思われます。

YANG ファイル1: dumb-router.yang


module dumb-router {
  namespace "urn:example:dumb:router";
  prefix "dr";

  import tailf-common {
    prefix tailf;
  }

  container config {
    leaf hostname {
      type string {
        tailf:info "Hostname";
      }
    }
    uses "di:interfaces";
  }
}


YANG ファイル2: dumb-interface.yang

module dumb-interface {
  namespace "urn:example:dumb:interface";
  prefix "di";

  import tailf-common {
    prefix tailf;
  }

  import ietf-inet-types {
    prefix inet;
  }

  grouping interfaces {
    list TenGigabitEthernet {
      tailf:info "Ten Gigabit Ethernet";
      tailf:cli-mode-name "config-if";
      key name;
      leaf name {
        type string {
          tailf:info "<0-66>/<0-128>;;TenGigabitEthernet interface number";
          pattern '[0-9]+.*';
        }
      }
      leaf ip-address {
        type inet:ipv4-address {
          tailf:info "A.B.C.D;;interface IP address";
        }
      }
      choice prefix-choice {
        leaf netmask {
          tailf:info "Specify the network mask";
          type inet:ipv4-address {
            tailf:info "A.B.C.D;;Network mask";
          }
        }
        leaf prefix-length {
          tailf:info "Specify the prefix length";
          type uint8 {
            tailf:info "<1-32>;;Prefix length";
            range "1..32";
          }
        }
      }
    }
  }
}

 

YANG ファイルの妥当性チェックと修正

YANGファイルを適当なディレクトリにまとめて配置し、pyang -f tree コマンドを使って YANGファイルの妥当性チェックを行います。pyang -f tree の引数にはデバイスモデルのツリーのルートにあたる dumb-router.yang を指定します。

ここでエラーが表示された場合は、コマンド結果のメッセージを参考に YANGファイルの修正と妥当性チェックを繰り返して問題を解決します。

この例では dumb-router.yang に dumb-interface.yang の import 文が含まれていない為にエラーが発生しています。

$ pyang -f tree dumb-router.yang
dumb-router.yang:15: error: prefix "di" is not defined (reported only once)
module: dumb-router
   +--rw config
      +--rw hostname?   string

YANG ファイル1: dumb-router.yang (修正後)


module dumb-router {
  namespace "urn:example:dumb:router";
  prefix "dr";

  import tailf-common {
    prefix tailf;
  }

  import dumb-interface {
    prefix di;
  }
  container config {
    leaf hostname {
      type string {
        tailf:info "Hostname";
      }
    }
    uses "di:interfaces";
  }
}



YANG ファイルに問題が無ければ、以下のように完全なデバイスモデルのストラクチャーが、ツリー上のフォーマットで表示されます。

$ mkdir yang_files
$ cp dumb-router.yang dumb-interface.yang yang_files/
$ ls yang_files/
dumb-interface.yang dumb-router.yang
$
$ pyang -f tree yang_files/dumb-router.yang
module: dumb-router
   +--rw config
      +--rw hostname?             string
      +--rw TenGigabitEthernet* [name]
         +--rw name             string
         +--rw ip-address?      inet:ipv4-address
         +--rw (prefix-choice)?
            +--:(netmask)
            |  +--rw netmask?         inet:ipv4-address
            +--:(prefix-length)
               +--rw prefix-length?   uint8

NETCONF NED の作成

ncs-make-package --netconf-ned コマンドを使って NETCONF NED を作成します。コマンドの引数として YANG ファイルを配置したディレクトリと NEDのディレクトリ名を指定しています。

$ ncs-make-package --netconf-ned yang_files dumb-router
$ tree dumb-router
dumb-router
├── netsim
│   ├── confd.conf.netsim
│   ├── Makefile
│   └── start.sh
├── package-meta-data.xml
└── src
    ├── java
    │   ├── build.xml
    │   └── src
    │       └── com
    │           └── example
    │               └── dumbrouter
    │                   └── namespaces
    ├── Makefile
    └── yang
        ├── dumb-interface.yang
        └── dumb-router.yang

9 directories, 8 files

 

dumb-router/src 配下にある Makefile を実行して NEDのコンパイルを行います。
BUILD SUCCESSFUL が表示されれば、NSO にロードする準備は完了です。

$ cd src/
$ ls
java Makefile yang
$ make
mkdir -p ncsc-out
mkdir -p ../load-dir
mkdir -p ../shared-jar
mkdir -p ../private-jar
/home/user/nso-4.4.2/bin/ncsc --ncs-compile-bundle yang                        \
                 --ncs-device-dir ncsc-out   \
                 --ncs-device-type netconf            \
                  &&                          \
        cp ncsc-out/modules/fxs/*.fxs ../load-dir;
for f in `echo ../load-dir/*.fxs`; do \
           n=`basename $f | sed 's/\.fxs//'`; \
           /home/user/nso-4.4.2/bin/ncsc --java-disable-prefix --exclude-enums --fail-on-warnings --java-package com.example.dumbrouter.namespaces --emit-java java/src/com/example/dumbrouter/namespaces/${n}.java $f  || exit 1; \
        done
touch -m ncsc-out/.done
cd java && ant -q all
    [javac] warning: [options] bootstrap class path not set in conjunction with -source 1.6
    [javac] 1 warning

BUILD SUCCESSFUL
Total time: 1 second
cd ../netsim && make all
make[1]: Entering directory `/home/user/temp/dumb-router/netsim'
make dumb-interface.fxs dumb-router.fxs
make[2]: Entering directory `/home/user/temp/dumb-router/netsim'
/home/user/nso-4.4.2/netsim/confd/bin/confdc --yangpath ../src/yang \
          `ls ../src/yang/dumb-interface-ann.yang  > /dev/null 2>&1 && \
              echo "-a ../src/yang/dumb-interface-ann.yang"` \
          -c -o dumb-interface.fxs  ../src/yang/dumb-interface.yang
/home/user/nso-4.4.2/netsim/confd/bin/confdc --yangpath ../src/yang \
          `ls ../src/yang/dumb-router-ann.yang  > /dev/null 2>&1 && \
              echo "-a ../src/yang/dumb-router-ann.yang"` \
          -c -o dumb-router.fxs  ../src/yang/dumb-router.yang
make[2]: Leaving directory `/home/user/temp/dumb-router/netsim'
make[1]: Leaving directory `/home/user/temp/dumb-router/netsim'