This package automatically creates NSO service models and packages from jinja2 templates of device config.
There are three main components:
- A jinja2 to YANG translator.
- A cookiecutter template for a model-driven jinja2 service package
- A script to tie it all together
The service package is a real service package, and enjoys all the usual benefits of FASTMAP such as full CRUD life-cycle, commit-queues, device handling and NED error handling.
There is a little demo available and the next section explains how to run through the demo yourself.
CAVEAT: This is a very early POC. There are limitations in what is possible to do, and even more limitations in what this package actually does.
You run the demo in the directory called demo
. First make sure that NED_LOCATION
at the top of the Makefile
points to a valid location for a recent version of the cisco-ios
NED, then execute:
make setup
This prepares the environment, you can then generate and build the package (in the packages/example directory):
../generate.py example.j2
make -C packages/example/src
You can look at packages/example/src/yang
to get an understanding of what we generated.
Then start the system, and enter the cli
make start cli
In the cli you can configure an example service instance:
admin connected from 127.0.0.1 using console on VLEIJON-M-V8CE
admin@ncs# devices sync-from
sync-result {
device ios0
result true
}
sync-result {
device ios1
result true
}
sync-result {
device ios2
result true
}
admin@ncs# show packages package example
packages package example
package-version 0.1.0
description "Generated jinja2 package"
ncs-min-version [ 5.3 ]
python-package vm-name example
directory ./state/packages-in-use/1/example
component main
application python-class-name example.main.Main
application start-phase phase2
oper-status up
admin@ncs# config
Entering configuration mode terminal
admin@ncs(config)# example ex1 ip_addr 192.168.1.100 ip_mask 255.255.255.0 device ios0
admin@ncs(config-example-ex1)# routes r1 network 0.0.0.0 mask 0.0.0.0 gws 192.168.1.1
admin@ncs(config-gws-192.168.1.1)# routes r1 network 0.0.0.0 mask 0.0.0.0 gws 192.168.1.2
admin@ncs(config-gws-192.168.1.2)# top
admin@ncs(config)# show conf
example ex1
device [ ios0 ]
ip_addr 192.168.1.100
ip_mask 255.255.255.0
routes r1
gws 192.168.1.1
!
gws 192.168.1.2
!
network 0.0.0.0
mask 0.0.0.0
!
!
admin@ncs(config)# commit dry-run outformat native
native {
device {
name ios0
data interface GigabitEthernet0/1
ip address 192.168.1.100 255.255.255.0
exit
ip route 0.0.0.0 0.0.0.0 192.168.1.1
ip route 0.0.0.0 0.0.0.0 192.168.1.2
}
}
admin@ncs(config)# commit
Commit complete.
admin@ncs(config)# no example ex1 routes r1 gws 192.168.1.2
admin@ncs(config)# show conf
example ex1
routes r1
no gws 192.168.1.2
!
!
admin@ncs(config)# commit dry-run outformat native
native {
device {
name ios0
data no ip route 0.0.0.0 0.0.0.0 192.168.1.2
}
}
The basic usage is to point the script generate.py
to a jinja2 template, and it tries to generate the package.
Only fairly simple jinja2 templates are currently supported, but we do support simple variables, simple lists and complex lists (lists containing lists, or containing many different elements).
It is assumed that there is a single template and that it represents all the configuration you want to push to a single device. We rely on the load-native
capability to load the processed data into NSO, this means the template is limited to what is supposed by the NED (not all NEDs support load-native
).
You can manually refine the YANG model as needed after generation to add types and constraints.
This package was written and tested using python3 and NSO 5.3.
You will need to install cookiecutters and jinja2:
pip3 install -r requirements.txt