After reading the documentation, I realized that it is not necessary to create own methods (or j2 templates if you prefer the other way) to create the config. Instead, it is possible to use community-created classes, like vrf objects below.
For the first method I’m using a yaml config file with parameters, for the second method i’m injecting the parameters in the method ‚live’.
from genie.conf import Genie from genie.conf.base import Device from genie.conf.base import Testbed from genie.conf.base.base import DeviceFeature from genie.libs.conf.vrf import Vrf from genie.libs.conf.static_routing.static_routing import StaticRouting from pyats import topology from genie.testbed import load from genie.libs.conf.address_family import AddressFamily from genie.libs.conf.bgp import RouteTarget def Change17nov2020(): with open('cisco_genie_cfg_loader_config_file.yml', 'rb') as f: conf = yaml.load(f.read()) r1 = load('testbed.yml').devices['R1'] vrf1 = Vrf(name=conf['name'], description=conf['description'], rd=conf['rd']) r1.connect() r1.configure(str(vrf1.build_config(devices=[r1], apply=False)['R1']).split('\n')) def Change18nov2020(): r1 = load('testbed.yml').devices['R1'] static_routing = StaticRouting() static_routing.device_attr[r1].vrf_attr['VRF1'].address_family_attr['ipv4'].route_attr['10.2.1.0/24'].next_hop_attr['192.168.1.2'].preference = 3 r1.connect() r1.configure(str(static_routing.build_config(devices=[r1],apply=False['R1']).split('\n')) Change17nov2020() Change18nov2020()
Reverting the change is very easy, with the ‚unbuild_config’ method instead. Yes, reverting your change is as simple as adding two letters to the code.
Note that sometimes your out-of-the-box solution is not fully baked. You may occasionally need to ‚improve’ the genie libs a bit. In the example above, the vrf.py under ios-xe genie libraries didn’t have the address-family ipv4 command, which didn’t activate the routing table for the vrf. I ended up editing manually (under site packages) the vrf.py file to add the following line:
configurations.append_line(‚address-family ipv4 unicast’)
Alternatively (i think this is clearer), you can do this:
def Change17nov2020(): with open('cisco_genie_cfg_loader_config_file.yml', 'rb') as f: conf = yaml.load(f.read()) # load the config file testbed = load('testbed.yml') r1 = testbed.devices['R1'] r1.connect() vrf1 = Vrf(name=conf['name'], description=conf['description'], rd=conf['rd']) r1.add_feature(vrf1) output = vrf1.build_config()