def test_static_routing_with_interface_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') static_routing = StaticRouting() static_routing.device_attr[dev1].vrf_attr['VRF1'].address_family_attr[ 'ipv4'].route_attr['10.2.1.0/24'].interface_attr[ 'GigabitEthernet0/1'].if_nexthop = '192.168.1.2' static_routing.device_attr[dev1].vrf_attr['VRF1'].address_family_attr[ 'ipv4'].route_attr['10.2.1.0/24'].interface_attr[ 'GigabitEthernet0/1'].if_preference = 2 self.assertIs(static_routing.testbed, testbed) dev1.add_feature(static_routing) cfgs = static_routing.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual( str(cfgs[dev1.name]), '\n'.join([ 'ip route vrf VRF1 10.2.1.0 255.255.255.0 GigabitEthernet0/1 192.168.1.2 2' ])) static_routing_4 = StaticRouting() static_routing_4.device_attr[dev1].vrf_attr[ 'default'].address_family_attr['ipv4'].route_attr[ '3.3.3.3/32'].interface_attr['GigabitEthernet0/3'] self.assertIs(static_routing_4.testbed, testbed) dev1.add_feature(static_routing_4) cfgs = static_routing_4.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual( str(cfgs[dev1.name]), '\n'.join(['ip route 3.3.3.3 255.255.255.255 GigabitEthernet0/3']))
def test_static_routing_ipv6_with_interface_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') static_routing = StaticRouting() interface = 'GigabitEthernet0/1' vrf = 'VRF1' af = 'ipv6' route = '{}'.format('2001:2:2:2::2/128') static_routing.device_attr[dev1].vrf_attr[vrf].address_family_attr[ af].route_attr[route].interface_attr[ interface].if_nexthop = '2001:20:1:2::2' self.assertIs(static_routing.testbed, testbed) dev1.add_feature(static_routing) cfgs = static_routing.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual( str(cfgs[dev1.name]), '\n'.join([ 'ipv6 route vrf VRF1 2001:2:2:2::2/128 GigabitEthernet0/1 2001:20:1:2::2' ])) static_routing_2 = StaticRouting() static_routing_2.device_attr[dev1].vrf_attr[ 'default'].address_family_attr['ipv6'].route_attr[ '2001:2:2:2::2/128'].interface_attr['Null0'].if_preference = 5 self.assertIs(static_routing_2.testbed, testbed) dev1.add_feature(static_routing_2) cfgs = static_routing_2.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual(str(cfgs[dev1.name]), '\n'.join(['ipv6 route 2001:2:2:2::2/128 Null0 5']))
def test_partial_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') with self.assertNoWarnings(): Genie.testbed = None with self.assertRaises(TypeError): bgp = Bgp() with self.assertRaises(TypeError): bgp = Bgp(testbed=testbed) Genie.testbed = testbed with self.assertRaises(TypeError): bgp = Bgp() bgp = Bgp(bgp_id=100) self.assertIs(bgp.testbed, testbed) Genie.testbed = testbed bgp = Bgp(bgp_id=100) self.assertIs(bgp.testbed, Genie.testbed) self.assertIs(bgp.testbed, testbed) # Defining attributes bgp.device_attr[dev1] dev1.add_feature(bgp) ps_name = 'PEER-SESSION' bgp.device_attr[dev1].peer_session_attr[ps_name].ps_fall_over_bfd=\ True partial_cfg1 = bgp.build_config( apply=False, attributes={'device_attr':\ {'*':{'peer_session_attr':\ {'*':"ps_fall_over_bfd"}}}}) self.assertCountEqual(partial_cfg1.keys(), [dev1.name]) self.assertMultiLineEqual(str(partial_cfg1[dev1.name]), '\n'.\ join([ 'router bgp 100', ' template peer-session PEER-SESSION', ' fall-over bfd', ' exit', ' exit', ]))
def test_static_routing_without_interface_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') static_routing = StaticRouting() static_routing.device_attr[dev1].vrf_attr['VRF1'].address_family_attr[ 'ipv4'].route_attr['10.2.1.0/24'].next_hop_attr[ '192.168.1.2'].preference = 3 self.assertIs(static_routing.testbed, testbed) dev1.add_feature(static_routing) cfgs = static_routing.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual( str(cfgs[dev1.name]), '\n'.join( ['ip route vrf VRF1 10.2.1.0 255.255.255.0 192.168.1.2 3']))
def test_static_routing_default_uncfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') static_routing = StaticRouting() static_routing.af = 'ipv4' static_routing.interface = 'Ethernet0/1' static_routing.route = '10.2.1.0/24' static_routing.device_attr[dev1].vrf_attr['default'].address_family_attr[static_routing.af].route_attr[ static_routing.route].interface_attr[static_routing.interface].if_nexthop = '192.168.2.2' dev1.add_feature(static_routing) un_cfgs = static_routing.build_unconfig(apply=False) self.assertCountEqual(un_cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual(str(un_cfgs[dev1.name]), '\n'.join( ['no ip route 10.2.1.0/24 Ethernet0/1 192.168.2.2', ]))
def test_uncfg_new_vlan_name(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') with self.assertNoWarnings(): vlan = Vlan(vlan='100') vlan.device_attr[dev1].vlan_attr['100'].name = "new_vlan" self.assertIs(vlan.testbed, testbed) dev1.add_feature(vlan) uncfgs = vlan.build_unconfig(apply=False, attributes={'device_attr': \ {'*': {'vlan_attr': \ {'*': "name"}}}}) self.assertCountEqual(uncfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join([ 'vlan 100', ' no name new_vlan', ' exit', ]))
def test_static_routing_ipv6_without_interface_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') static_routing_6 = StaticRouting() static_routing_6.device_attr[dev1].vrf_attr[ 'VRF1'].address_family_attr['ipv6'].route_attr[ '2001:3:3:3::3/128'].next_hop_attr[ '2001:10:1:2::2'].preference = 3 self.assertIs(static_routing_6.testbed, testbed) dev1.add_feature(static_routing_6) cfgs_6 = static_routing_6.build_config(apply=False) self.assertCountEqual(cfgs_6.keys(), [dev1.name]) self.maxDiff = None self.assertEqual( str(cfgs_6[dev1.name]), '\n'.join( ['ipv6 route vrf VRF1 2001:3:3:3::3/128 2001:10:1:2::2 3']))
def test_static_routing_ipv6_without_interface_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') static_routing = StaticRouting() static_routing.af = 'ipv6' static_routing.route = '2001:2:2:2::2/128' static_routing.device_attr[dev1].vrf_attr['default'].address_family_attr[static_routing.af].route_attr[ static_routing.route].next_hop_attr['2001:10:2:3::2'].preference = 3 self.assertIs(static_routing.testbed, testbed) dev1.add_feature(static_routing) cfgs = static_routing.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual(str(cfgs[dev1.name]), '\n'.join( ['ipv6 route 2001:2:2:2::2/128 2001:10:2:3::2 3', ]))
def test_uncfg2(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') with self.assertNoWarnings(): Genie.testbed = None with self.assertRaises(TypeError): bgp = Bgp() with self.assertRaises(TypeError): bgp = Bgp(testbed=testbed) Genie.testbed = testbed with self.assertRaises(TypeError): bgp = Bgp() bgp = Bgp(bgp_id=100) self.assertIs(bgp.testbed, testbed) Genie.testbed = testbed bgp = Bgp(bgp_id=100) self.assertIs(bgp.testbed, Genie.testbed) self.assertIs(bgp.testbed, testbed) dev1.add_feature(bgp) # Defining attributes af_name = 'ipv4 unicast' bgp.device_attr[dev1] bgp.device_attr[dev1].vrf_attr[None].always_compare_med = True bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name] bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\ af_label_allocation_mode = 'per-vrf' uncfg = bgp.build_unconfig(apply=False) self.assertCountEqual(uncfg.keys(), [dev1.name]) self.assertMultiLineEqual(str(uncfg[dev1.name]), '\n'.\ join([ 'no router bgp 100', 'no mpls label mode vrf default protocol bgp-vpnv4 per-vrf', ]))
def test_deactivate_feature(self): tb = Genie.testbed = Testbed() dev = Device(testbed=tb, name='PE1', os='nxos') rip = Rip(instance_id=1) rip.add_force_vrf(None) dev.add_feature(rip) # Default configuration, let's make sure it works output = rip.build_unconfig(apply=False) self.assertMultiLineDictEqual(output, {'PE1': 'feature rip\n' 'no router rip 1' }) # Set a mock dev.cli = Mock() dev.configure = Mock() output = rip.build_unconfig(apply=True) expected_output = None self.assertEqual(output, expected_output)
def test_remove_af(self): # Add a device to it tb = Genie.testbed = Testbed() dev1 = Device(testbed=tb, name='dev1', os='nxos') dev2 = Device(testbed=tb, name='dev2', os='nxos') rip = Rip(instance_id=5) rip.add_force_vrf(None) dev1.add_feature(rip) dev2.add_feature(rip) # Configure rip rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv4 unicast'].distance = 5 output = rip.build_config(apply=False) self.assertMultiLineDictEqual(output, {'dev1': 'feature rip\n' 'router rip 5\n' ' address-family ipv4 unicast\n' ' distance 5\n' ' exit\n' ' exit', 'dev2': 'feature rip\n' 'router rip 5\n' ' address-family ipv4 unicast\n' ' exit\n' ' exit'}) output = rip.build_unconfig( attributes={ 'device_attr': { 'dev1': { 'vrf_attr': { None: { 'address_family_attr': { 'ipv4 unicast': None}}}}}}, apply=False) self.assertMultiLineDictEqual(output, {'dev1': 'router rip 5\n no address-family ipv4 unicast\n exit'})
def test_arp_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') arp = Arp() arp.device_attr[dev1].max_entries = 100 self.assertIs(arp.testbed, testbed) dev1.add_feature(arp) cfgs = arp.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'arp entries interface-limit 100', ])) un_cfgs = arp.build_unconfig(apply=False) self.assertCountEqual(un_cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual(str(un_cfgs[dev1.name]), '\n'.join(['no arp entries interface-limit 100']))
def test_switchport_enable_config(self): # For failures self.maxDiff = None # Set Genie Tb testbed = Testbed() Genie.testbed = testbed # Device dev1 = Device(name='PE1', testbed=testbed, os='nxos') intf1 = Interface(name='Ethernet3/7', device=dev1, aliases=['PE1_1']) vrf = Vrf(name='test', testbed=testbed) dev1.add_feature(vrf) # make intf2 as L2 interface intf1.switchport_enable = True # Build config cfgs = intf1.build_config(apply=False) # Check config build correctly self.assertMultiLineEqual( str(cfgs), '\n'.join([ 'interface Ethernet3/7', ' switchport', ' exit' ])) # Build unconfig uncfgs = intf1.build_unconfig(apply=False) # Check config build correctly self.assertMultiLineEqual( str(uncfgs), '\n'.join([ 'default interface Ethernet3/7', ]))
def test_basic_uncfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxr') rpl1 = RoutePolicy(policy_definition='rpl1') dev1.add_feature(rpl1) rpl1.device_attr[dev1].statement_attr['10'] rpl1.device_attr[dev1].statement_attr['10'].match_med_eq = 5 rpl1.device_attr[dev1].statement_attr['10'].match_nexthop_in = 'hop' rpl1.device_attr[dev1].statement_attr['10'].actions = 'pass' # Unconfig testing # Set a mock dev1.configure = Mock() dev1.add_feature(rpl1) # Mock config uncfg1 = rpl1.build_unconfig(apply=False) self.assertCountEqual(uncfg1.keys(), ['PE1']) self.assertMultiLineEqual(str(uncfg1['PE1']), '\n'.join( ['no route-policy rpl1' ]))
def test_vxlan_fabric_forwarding_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') vxlan = Vxlan() vxlan.device_attr[dev1].fabric_fwd_anycast_gw_mac = '0002.0002.0002' self.assertIs(vxlan.testbed, testbed) dev1.add_feature(vxlan) cfgs = vxlan.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'fabric forwarding anycast-gateway-mac 0002.0002.0002', ])) un_cfgs = vxlan.build_unconfig(apply=False) self.assertCountEqual(un_cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual( str(un_cfgs[dev1.name]), '\n'.join([ 'no fabric forwarding anycast-gateway-mac 0002.0002.0002', ]))
def test_tunnel_peerip(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') tunnelencryption = TunnelEncryption() tunnelencryption.device_attr[dev1].tunnelpeerip_attr['100.100.100.2'].keychain_name='kc1' tunnelencryption.device_attr[dev1].tunnelpeerip_attr['100.100.100.2'].tunnelpolicy_name = 'kc1' self.assertIs(tunnelencryption.testbed, testbed) dev1.add_feature(tunnelencryption) cfgs = tunnelencryption.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join( ['tunnel-encryption peer-ip 100.100.100.2', ' keychain kc1 policy kc1', ' exit', ])) un_cfgs = tunnelencryption.build_unconfig(apply=False) self.assertCountEqual(un_cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual(str(un_cfgs[dev1.name]), '\n'.join( ['no tunnel-encryption peer-ip 100.100.100.2', ]))
def test_uncfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') with self.assertNoWarnings(): Genie.testbed = None with self.assertRaises(TypeError): vlan = Vlan() Genie.testbed = testbed vlan = Vlan(vlan='102') vlan.device_attr[dev1].vlan_attr['102'].name = 'vlan2' vlan.device_attr[dev1].vlan_attr['102'].state = 'active' vlan.device_attr[dev1].vlan_attr['102'].mode = 'ce' self.assertIs(vlan.testbed, testbed) dev1.add_feature(vlan) cfgs = vlan.build_unconfig(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join([ 'no vlan 102', ]))
def test_static_routing_ipv6_with_interface_tag_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') static_routing = StaticRouting() static_routing.device_attr[dev1].vrf_attr[ 'default'].address_family_attr['ipv6'].route_attr[ '2001:2:2:2::2/128'].interface_attr[ 'GigabitEthernet0/0'].if_nexthop = '2001:10:1:2::2' static_routing.device_attr[dev1].vrf_attr[ 'default'].address_family_attr['ipv6'].route_attr[ '2001:2:2:2::2/128'].interface_attr[ 'GigabitEthernet0/0'].if_tag = 100 static_routing.device_attr[dev1].vrf_attr[ 'default'].address_family_attr['ipv6'].route_attr[ '2001:2:2:2::2/128'].interface_attr[ 'GigabitEthernet0/0'].if_track = 1 static_routing.device_attr[dev1].vrf_attr[ 'default'].address_family_attr['ipv6'].route_attr[ '2001:2:2:2::2/128'].interface_attr[ 'GigabitEthernet0/0'].if_preference = 11 self.assertIs(static_routing.testbed, testbed) dev1.add_feature(static_routing) cfgs = static_routing.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.maxDiff = None self.assertEqual( str(cfgs[dev1.name]), '\n'.join([ 'ipv6 route 2001:2:2:2::2/128 GigabitEthernet0/0 2001:10:1:2::2 11 tag 100 track 1' ]))
def test_uncfg3(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') dev2 = Device(testbed=testbed, name='PE2', os='iosxe') intf4 = Interface(device=dev2, name='Ethernet0/0/4', ipv4='10.2.0.2/24') with self.assertNoWarnings(): Genie.testbed = testbed bgp = Bgp(bgp_id=100) self.assertIs(bgp.testbed, Genie.testbed) self.assertIs(bgp.testbed, testbed) dev1.add_feature(bgp) # Defining attributes bgp.device_attr[dev1] neighbor_id = intf4.ipv4 bgp.device_attr[dev1].vrf_attr[None].add_neighbor(neighbor_id) bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id] partial_uncfg = bgp.build_unconfig( apply=False, attributes={'device_attr':\ {'*':{'vrf_attr':\ {'*':{'neighbor_attr':'*'}}}}}) self.assertCountEqual(partial_uncfg.keys(), [dev1.name]) self.assertMultiLineEqual(str(partial_uncfg[dev1.name]), '\n'.\ join([ 'router bgp 100', ' no neighbor 10.2.0.2', ' exit', ]))
def test_ospfv3_non_default_vrf_config(self): # For failures self.maxDiff = None # Set testbed Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') # Create VRF objects vrf1 = Vrf('VRF1') # Create Interface object intf1 = Interface(name='Ethernet1/1', device=dev1) # Create OSPF object ospfv3_1 = Ospfv3() ospfv3_1.device_attr[dev1].enabled = True # Add OSPF configuration to vrf VRF1 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].instance = '30' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].inst_shutdown = False ospfv3_1.device_attr[dev1].vrf_attr[vrf1].router_id = '3.3.3.3' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].passive_interface = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].log_adjacency_changes = True ospfv3_1.device_attr[dev1].vrf_attr[ vrf1].log_adjacency_changes_detail = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_arrival = 30 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_group_pacing = 40 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_start_time = 50 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_hold_time = 60 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_max_time = 70 # Add graceful restart configuration to vrf default gr1 = GracefulRestart(device=dev1) gr1.gr_enable = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr1) # Add graceful restart configuration to vrf default gr2 = GracefulRestart(device=dev1) gr2.gr_enable = True gr2.gr_restart_interval = 100 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr2) # # Add graceful restart configuration to vrf default gr3 = GracefulRestart(device=dev1) gr3.gr_enable = True gr3.gr_helper_enable = False ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr3) # # Add graceful restart configuration to vrf default gr4 = GracefulRestart(device=dev1) gr4.gr_enable = True gr4.gr_planned_only = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr4) # Add area configuration to vrf default ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '1'].area_type = 'stub' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '1'].nosummary = False # Add area configuration to vrf default ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '2'].area_type = 'nssa' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '2'].nosummary = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '2'].nssa_default_info_originate = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '2'].nssa_route_map = 'test_route_map' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '2'].nssa_translate_always = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '2'].nssa_translate_supressfa = True # address_family attributes ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].default_metric = 100 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_bgp_id = 100 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_bgp_route_map = 'test' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_rip_id = 'rip-nxos' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_rip_route_map = 'test' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_direct = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_direct_route_map = 'test' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_static = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_static_route_map = 'test' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_isis_id = 'ABC' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_isis_route_map = 'test' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].default_originate = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].default_originate_routemap = 'test' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_max_prefix = 12 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_max_prefix_thld = 10 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].redist_max_prefix_warn_only = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].spf_start_time = 100 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].spf_hold_time = 200 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].spf_max_time = 300 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].table_map = 'test' # Add area default cost configuration to vrf default ad1 = AreaDefaultCost(device=dev1) ad1.af_area_id = '2' ad1.area_def_cost = 10 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].add_areacost_key(ad1) # # Add area routemap direction to vrf default arm1 = AreaRouteMap(device=dev1) arm1.routemap_area_id = '2' arm1.ar_route_map_in = 'test_in' arm1.ar_route_map_out = 'test_out' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].add_arearoutemap_key(arm1) # Add summary address configuration to vrf default sa1 = SummaryAddress(device=dev1) sa1.summary_address_prefix = '2001:db1:1::1/64' sa1.summary_address_not_advertise = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].add_sumadd_key(sa1) # Add summary address configuration to vrf default sa2 = SummaryAddress(device=dev1) sa2.summary_address_prefix = '2001:db2:2::2/64' sa2.summary_address_tag = 10 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].add_sumadd_key(sa2) # Add area range configuration to vrf default ar1 = AreaRange(device=dev1) ar1.range_area_id = '2' ar1.area_range_prefix = '2001:bd12:2::2/64' ar1.area_range_not_advertise = True ar1.area_range_cost = 10 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].add_arearange_key(ar1) # virtual link attributes ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '7'].virtual_link_attr['ospfv3_vl1'].vl_router_id = '7.7.7.7' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '7'].virtual_link_attr['ospfv3_vl1'].vl_hello_interval = 55 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '7'].virtual_link_attr['ospfv3_vl1'].vl_dead_interval = 65 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '7'].virtual_link_attr['ospfv3_vl1'].vl_retransmit_interval = 75 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '7'].virtual_link_attr['ospfv3_vl1'].vl_transmit_delay = 85 # Add interface configuration to VRF default ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_admin_control = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_secondaries = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_cost = 10 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_type = 'point-to-point' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_passive = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_priority = 110 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_hello_interval = 50 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_dead_interval = 60 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_retransmit_interval = 70 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_transmit_delay = 70 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_mtu_ignore = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_instance = 60 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_protocol_shutdown = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '0'].interface_attr[intf1].if_multi_area = 10 dev1.add_feature(ospfv3_1) # Build config cfgs = ospfv3_1.build_config(apply=False) # Check config strings built correctly self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'feature ospfv3', 'router ospfv3 30', ' vrf VRF1', ' router-id 3.3.3.3', ' passive-interface default', ' log-adjacency-changes detail', ' timers lsa-arrival 30', ' timers lsa-group-pacing 40', ' timers throttle lsa 50 60 70', ' graceful-restart', ' graceful-restart grace-period 100', ' graceful-restart helper-disable', ' graceful-restart planned-only', ' address-family ipv6 unicast', ' default-information originate True route-map test', ' default-metric 100', ' redistribute bgp 100 route-map test', ' redistribute direct route-map test', ' redistribute static route-map test', ' redistribute isis ABC route-map test', ' redistribute rip rip-nxos route-map test', ' redistribute maximum-prefix 12 10 warning-only', ' table-map test', ' timers throttle lsa 100 200 300', ' area 2 default-cost 10', ' area 2 filter-list route-map test_in in', ' area 2 filter-list route-map test_out out', ' summary-address 2001:db1:1::1/64 not-advertise', ' summary-address 2001:db2:2::2/64 tag 10', ' area 2 range 2001:bd12:2::2/64 not-advertise cost 10', ' exit', ' area 1 stub', ' area 2 nssa no-summary default-information-originate route-map test_route_map', ' area 2 nssa translate type7 always suppress-fa', ' area 7 virtual-link 7.7.7.7', ' hello-interval 55', ' dead-interval 65', ' retransmit-interval 75', ' transmit-delay 85', ' exit', ' exit', ' exit', 'interface Ethernet1/1', ' ipv6 router ospfv3 30 area 0', ' ospfv3 cost 10', ' ospfv3 network point-to-point', ' ospfv3 passive-interface', ' ospfv3 priority 110', ' ospfv3 hello-interval 50', ' ospfv3 dead-interval 60', ' ospfv3 retransmit-interval 70', ' ospfv3 mtu-ignore', ' ospfv3 instance 60', ' ospfv3 shutdown', ' ospfv3 transmit-delay 70', ' ipv6 router ospfv3 30 multi-area 10', ' exit' ])) # Unconfig ospfv3_uncfg = ospfv3_1.build_unconfig(apply=False) # Check unconfig strings built correctly self.assertMultiLineEqual(str(ospfv3_uncfg[dev1.name]), '\n'.join([ 'no feature ospfv3', ]))
def test_ospfv3_partial_config_unconfig(self): # For failures self.maxDiff = None # Set testbed Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') # Create VRF objects vrf1 = Vrf('VRF1') # Create Interface object intf1 = Interface(name='Ethernet1/1', device=dev1) # Create OSPF object ospfv3_1 = Ospfv3() ospfv3_1.device_attr[dev1].enabled = True # Add OSPF configuration to vrf default ospfv3_1.device_attr[dev1].vrf_attr[vrf1].instance = '30' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].inst_shutdown = False ospfv3_1.device_attr[dev1].vrf_attr[vrf1].router_id = '3.3.3.3' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].passive_interface = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].log_adjacency_changes = True ospfv3_1.device_attr[dev1].vrf_attr[ vrf1].log_adjacency_changes_detail = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_arrival = 30 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_group_pacing = 40 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_start_time = 50 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_hold_time = 60 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_max_time = 70 # Add graceful restart configuration to vrf vrf1 gr1 = GracefulRestart(device=dev1) gr1.gr_enable = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr1) # Add graceful restart configuration to vrf vrf1 gr2 = GracefulRestart(device=dev1) gr2.gr_enable = True gr2.gr_restart_interval = 100 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr2) # # Add graceful restart configuration to vrf vrf1 gr3 = GracefulRestart(device=dev1) gr3.gr_enable = True gr3.gr_helper_enable = False ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr3) # # Add graceful restart configuration to vrf vrf1 gr4 = GracefulRestart(device=dev1) gr4.gr_enable = True gr4.gr_planned_only = True ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr4) # Add area configuration to vrf vrf1 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '1'].area_type = 'stub' ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[ '1'].nosummary = True # Add summary address configuration to vrf vrf1 sa2 = SummaryAddress(device=dev1) sa2.summary_address_prefix = '2001:db2:2::2/64' sa2.summary_address_tag = 10 ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[ 'ipv6 unicast'].add_sumadd_key(sa2) dev1.add_feature(ospfv3_1) # Build config cfgs = ospfv3_1.build_config(apply=False) # Check config strings built correctly self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'feature ospfv3', 'router ospfv3 30', ' vrf VRF1', ' router-id 3.3.3.3', ' passive-interface default', ' log-adjacency-changes detail', ' timers lsa-arrival 30', ' timers lsa-group-pacing 40', ' timers throttle lsa 50 60 70', ' graceful-restart', ' graceful-restart grace-period 100', ' graceful-restart helper-disable', ' graceful-restart planned-only', ' address-family ipv6 unicast', ' summary-address 2001:db2:2::2/64 tag 10', ' exit', ' area 1 stub no-summary', ' exit', ' exit' ])) # change partial config - router_id ospfv3_1.device_attr[dev1].vrf_attr[vrf1].router_id = '7.7.7.7' partial_cfg1 = ospfv3_1.build_config(apply=False, attributes={ 'device_attr': { '*': { 'vrf_attr': { '*': "router_id" } } } }) self.assertCountEqual(partial_cfg1.keys(), [dev1.name]) self.assertMultiLineEqual( str(partial_cfg1[dev1.name]), '\n'.join([ 'router ospfv3 30', ' vrf VRF1', ' router-id 7.7.7.7', ' exit', ' exit', ])) # remove cfg - area 1 stub partial_uncfg1 = ospfv3_1.build_unconfig(apply=False, attributes={ 'device_attr': { '*': { 'vrf_attr': { '*': "lsa_arrival" } } } }) self.assertMultiLineEqual( str(partial_uncfg1[dev1.name]), '\n'.join([ 'router ospfv3 30', ' vrf VRF1', ' no timers lsa-arrival 30', ' exit', ' exit', ])) # # remove a single attribute from a specific gr key partial_uncfg2 = ospfv3_1.build_unconfig( apply=False, attributes={ 'device_attr': { '*': { 'vrf_attr': { '*': { 'gr_keys': { gr4: { 'gr_enable': None } } } } } } }) self.assertMultiLineEqual( str(partial_uncfg2[dev1.name]), '\n'.join([ 'router ospfv3 30', ' vrf VRF1', ' no graceful-restart', ' exit', ' exit', ])) # remove all grace full restart multiline configs partial_uncfg3 = ospfv3_1.build_unconfig( apply=False, attributes={'device_attr': { '*': { 'vrf_attr': { '*': 'gr_keys' } } }}) self.assertMultiLineEqual( str(partial_uncfg3[dev1.name]), '\n'.join([ 'router ospfv3 30', ' vrf VRF1', ' no graceful-restart', ' no graceful-restart grace-period 100', ' no graceful-restart helper-disable', ' no graceful-restart planned-only', ' exit', ' exit', ]))
def test_uncfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') intf1 = Interface(device=dev1, name='Ethernet0/0/1', ipv4='10.1.0.1/24') intf2 = Interface(device=dev1, name='Ethernet0/0/2', ipv4='10.2.0.1/24') dev2 = Device(testbed=testbed, name='PE2', os='nxos') intf3 = Interface(device=dev2, name='Ethernet0/0/3', ipv4='10.1.0.2/24', ipv6='2001:111:222::/64') intf4 = Interface(device=dev2, name='Ethernet0/0/4', ipv4='10.2.0.2/24') with self.assertNoWarnings(): Genie.testbed = None with self.assertRaises(TypeError): bgp = Bgp() with self.assertRaises(TypeError): bgp = Bgp(testbed=testbed) Genie.testbed = testbed with self.assertRaises(TypeError): bgp = Bgp() bgp = Bgp(asn=100,bgp_id=100) self.assertIs(bgp.testbed, testbed) Genie.testbed = testbed bgp = Bgp(asn=100,bgp_id=100) self.assertIs(bgp.testbed, Genie.testbed) self.assertIs(bgp.testbed, testbed) dev1.add_feature(bgp) bgp.device_attr[dev1].enabled = True uncfgs = bgp.build_unconfig(apply=False) self.assertCountEqual(uncfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join([ 'no feature bgp', ])) # Defining attributes af_name = 'vpnv4 unicast' af_name2 = 'link-state' vrf_id = 'vrf1' vrf1 = Vrf(vrf_id) bgp.device_attr[dev1] bgp.device_attr[dev1].vrf_attr[None].always_compare_med = True bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name] bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name2] bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\ af_retain_rt_all = True bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\ af_dampening = True bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\ af_dampening_half_life_time = 1 bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\ af_dampening_reuse_time = 10 bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\ af_dampening_suppress_time = 30 bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\ af_dampening_max_suppress_time = 2 neighbor_id = intf4.ipv4 bgp.device_attr[dev1].vrf_attr[vrf1].add_neighbor(neighbor_id) bgp.device_attr[dev1].vrf_attr[vrf1].neighbor_attr[neighbor_id] bgp.device_attr[dev1].vrf_attr[vrf1].neighbor_attr[neighbor_id].\ nbr_fall_over_bfd = True nbr_af_name = 'ipv4 unicast' bgp.device_attr[dev1].vrf_attr[vrf1].neighbor_attr[neighbor_id].\ address_family_attr[nbr_af_name] bgp.device_attr[dev1].vrf_attr[vrf1].neighbor_attr[neighbor_id].\ address_family_attr[nbr_af_name].nbr_af_allowas_in = True partial_uncfg1 = bgp.build_unconfig( apply=False, attributes={'device_attr':\ {'*':{'vrf_attr':\ {'*':"always_compare_med"}}}}) self.assertCountEqual(partial_uncfg1.keys(), [dev1.name]) self.assertMultiLineEqual(str(partial_uncfg1[dev1.name]), '\n'.\ join([ 'router bgp 100', ' no bestpath always-compare-med', ' exit', ])) partial_uncfg2 = bgp.build_unconfig(\ apply=False, attributes={'device_attr':\ {'*':{'vrf_attr':'*'}}}) self.assertCountEqual(partial_uncfg2.keys(), [dev1.name]) self.assertMultiLineEqual(str(partial_uncfg2[dev1.name]), '\n'.\ join([ 'router bgp 100', ' no bestpath always-compare-med', ' no address-family link-state', ' no address-family vpnv4 unicast', ' no vrf vrf1', ' exit', ])) partial_uncfg3 = bgp.build_unconfig( apply=False, attributes={'device_attr': {'*': {'vrf_attr': {'*': {'neighbor_attr':\ {'*': {'address_family_attr':\ {'*':"nbr_af_allowas_in"}}}}}}}}) self.assertCountEqual(partial_uncfg3.keys(), [dev1.name]) self.assertMultiLineEqual(str(partial_uncfg3[dev1.name]), '\n'.\ join([ 'router bgp 100', ' vrf vrf1', ' neighbor 10.2.0.2', ' address-family ipv4 unicast', ' no allowas-in', ' exit', ' exit', ' exit', ' exit', ])) bgp.device_attr[dev1].protocol_shutdown = True partial_uncfg4 = bgp.build_unconfig( apply=False, attributes={'device_attr':\ {'*':"protocol_shutdown"}}) self.assertCountEqual(partial_uncfg4.keys(), [dev1.name]) self.assertMultiLineEqual(str(partial_uncfg4[dev1.name]), '\n'.\ join([ 'router bgp 100', ' no shutdown', ' exit', ])) partial_uncfg5 = bgp.build_unconfig(\ apply=False, attributes={'device_attr':\ {'*':\ {'vrf_attr':\ {'*':\ {'address_family_attr':\ {'*':\ "af_dampening"}}}}}}) self.assertCountEqual(partial_uncfg5.keys(), [dev1.name]) self.assertMultiLineEqual(str(partial_uncfg5[dev1.name]), '\n'.\ join([ 'router bgp 100', ' address-family vpnv4 unicast', ' no dampening', ' exit', ' exit', ])) bgp.device_attr[dev1].enabled = False uncfgs = bgp.build_unconfig(apply=False) self.assertCountEqual(uncfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join([ 'no router bgp 100', ])) bgp.device_attr[dev1].enabled = True uncfgs = bgp.build_unconfig(apply=False) self.assertCountEqual(uncfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join([ 'no feature bgp', ]))
class test_prefix_list(TestCase): def setUp(self): # Set Genie Tb testbed = Testbed() Genie.testbed = testbed # Device self.dev1 = Device(name='PE1', testbed=testbed, os='nxos') def test_cli_config_v4(self): # prefix-list conf prefix_conf = PrefixList(prefix_set_name='test') self.dev1.add_feature(prefix_conf) # Apply configuration prefix_conf.device_attr[self.dev1].prefix_attr['35.0.0.0/8'].\ maxlength_range_attr['8..8'].protocol = 'ipv4' prefix_conf.device_attr[self.dev1].prefix_attr['35.0.0.0/8'].\ maxlength_range_attr['8..16'].protocol = 'ipv4' prefix_conf.device_attr[self.dev1].prefix_attr['37.0.0.0/8'].\ maxlength_range_attr['16..24'].protocol = 'ipv4' prefix_conf.device_attr[self.dev1].prefix_attr['38.0.0.0/8'].\ maxlength_range_attr['16..32'].protocol = 'ipv4' prefix_conf.device_attr[self.dev1].prefix_attr['2001:DB8:4::/64']\ .maxlength_range_attr['65..98'].protocol = 'ipv6' # Build config cfgs = prefix_conf.build_config(apply=False) # Check config built correctly self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'ipv6 prefix-list test permit 2001:DB8:4::/64 ge 65 le 98', 'ip prefix-list test permit 35.0.0.0/8 le 16', 'ip prefix-list test permit 35.0.0.0/8', 'ip prefix-list test permit 37.0.0.0/8 ge 16 le 24', 'ip prefix-list test permit 38.0.0.0/8 ge 16', ])) # Build unconfig cfgs = prefix_conf.build_unconfig(apply=False) # Check config correctly unconfigured self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'no ipv6 prefix-list test permit 2001:DB8:4::/64 ge 65 le 98', 'no ip prefix-list test permit 35.0.0.0/8 le 16', 'no ip prefix-list test permit 35.0.0.0/8', 'no ip prefix-list test permit 37.0.0.0/8 ge 16 le 24', 'no ip prefix-list test permit 38.0.0.0/8 ge 16', ])) def test_cli_config_v6(self): # prefix-list conf prefix_conf_v6 = PrefixList(prefix_set_name='test6') prefix_conf_v6.device_attr[self.dev1].prefix_attr['2001:DB8:1::/64']\ .maxlength_range_attr['64..64'].protocol = 'ipv6' prefix_conf_v6.device_attr[self.dev1].prefix_attr['2001:DB8:2::/64']\ .maxlength_range_attr['65..128'].protocol = 'ipv6' prefix_conf_v6.device_attr[self.dev1].prefix_attr['2001:DB8:3::/64']\ .maxlength_range_attr['64..128'].protocol = 'ipv6' prefix_conf_v6.device_attr[self.dev1].prefix_attr['2001:DB8:4::/64']\ .maxlength_range_attr['65..98'].protocol = 'ipv6' # Build config cfgs = prefix_conf_v6.build_config(apply=False) # Check config built correctly self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'ipv6 prefix-list test6 permit 2001:DB8:1::/64', 'ipv6 prefix-list test6 permit 2001:DB8:2::/64 ge 65', 'ipv6 prefix-list test6 permit 2001:DB8:3::/64 le 128', 'ipv6 prefix-list test6 permit 2001:DB8:4::/64 ge 65 le 98', ])) # Build unconfig cfgs = prefix_conf_v6.build_unconfig(apply=False) # Check config correctly unconfigured self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'no ipv6 prefix-list test6 permit 2001:DB8:1::/64', 'no ipv6 prefix-list test6 permit 2001:DB8:2::/64 ge 65', 'no ipv6 prefix-list test6 permit 2001:DB8:3::/64 le 128', 'no ipv6 prefix-list test6 permit 2001:DB8:4::/64 ge 65 le 98', ]))
def test_cfg2(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') intf1 = Interface(device=dev1, name='Ethernet0/0/1', ipv4='10.1.0.1/24') intf2 = Interface(device=dev1, name='Ethernet0/0/2', ipv4='10.2.0.1/24') dev2 = Device(testbed=testbed, name='PE2', os='nxos') intf3 = Interface(device=dev2, name='Ethernet0/0/3', ipv4='10.1.0.2/24', ipv6='2001:111:222::/64') intf4 = Interface(device=dev2, name='Ethernet0/0/4', ipv4='10.2.0.2/24') with self.assertNoWarnings(): Genie.testbed = None with self.assertRaises(TypeError): bgp = Bgp() with self.assertRaises(TypeError): bgp = Bgp(testbed=testbed) Genie.testbed = testbed with self.assertRaises(TypeError): bgp = Bgp() bgp = Bgp(asn=100,bgp_id=100) self.assertIs(bgp.testbed, testbed) Genie.testbed = testbed bgp = Bgp(asn=100,bgp_id=100) self.assertIs(bgp.testbed, Genie.testbed) self.assertIs(bgp.testbed, testbed) # Defining attributes vrf_id = 'vrf1' vrf1 = Vrf(vrf_id) pp_name = 'PEER-POLICY' ps_name = 'PEER-SESSION' bgp.device_attr[dev2].enabled = True bgp.device_attr[dev2].peer_policy_attr[pp_name].pp_allowas_in =\ True bgp.device_attr[dev2].peer_session_attr[ps_name].ps_fall_over_bfd=\ True bgp.device_attr[dev2].vrf_attr[None].cluster_id = '150' af_name = 'ipv6 unicast' bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name] bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\ af_nexthop_route_map = 'test' bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\ af_dampening = True bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\ af_dampening_half_life_time = 1 bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\ af_dampening_reuse_time = 10 bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\ af_dampening_suppress_time = 30 bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\ af_dampening_max_suppress_time = 2 neighbor_id = intf2.ipv4 bgp.device_attr[dev2].vrf_attr[vrf1].add_neighbor(neighbor_id) bgp.device_attr[dev2].vrf_attr[vrf1].neighbor_attr[neighbor_id].\ nbr_suppress_four_byte_as_capability = True nbr_af_name = 'vpnv6 unicast' bgp.device_attr[dev2].vrf_attr[vrf1].neighbor_attr[neighbor_id].\ address_family_attr[nbr_af_name] bgp.device_attr[dev2].vrf_attr[vrf1].neighbor_attr[neighbor_id].\ address_family_attr[nbr_af_name].\ nbr_af_maximum_prefix_max_prefix_no = 300000 bgp.device_attr[dev2].vrf_attr[vrf1].neighbor_attr[neighbor_id].\ address_family_attr[nbr_af_name].nbr_af_default_originate = True dev2.add_feature(bgp) cfgs = bgp.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev2.name]) self.maxDiff = None self.assertEqual(str(cfgs[dev2.name]), '\n'.join( ['feature bgp', 'router bgp 100', ' cluster-id 150', ' address-family ipv6 unicast', ' dampening 1 10 30 2', ' nexthop route-map test', ' exit', ' vrf vrf1', ' neighbor 10.2.0.1', ' capability suppress 4-byte-as', ' address-family vpnv6 unicast', ' maximum-prefix 300000', ' default-originate', ' exit', ' exit', ' exit', ' template peer-session PEER-SESSION', ' bfd', ' exit', ' template peer-policy PEER-POLICY', ' allowas-in', ' exit', ' exit', ])) partial_uncfg1 = bgp.build_unconfig(apply=False, attributes={\ 'device_attr':\ {dev2.name:\ {'vrf_attr':\ {'vrf1':\ {'neighbor_attr':\ {'10.2.0.1':\ {'address_family_attr':\ {'vpnv6 unicast':\ {'nbr_af_default_originate': None}}}}}}}}}) self.assertCountEqual(partial_uncfg1.keys(), [dev2.name]) self.assertMultiLineEqual(str(partial_uncfg1[dev2.name]), '\n'.\ join([ 'router bgp 100', ' vrf vrf1', ' neighbor 10.2.0.1', ' address-family vpnv6 unicast', ' no default-originate', ' exit', ' exit', ' exit', ' exit', ]))
def test_cfg_vxlan(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') bgp = Bgp(bgp_id=100) # Defining attributes af_name = 'l2vpn evpn' vrf = Vrf('default') bgp.device_attr[dev1].vrf_attr[vrf].address_family_attr[af_name].af_advertise_pip = True bgp.device_attr[dev1] self.assertIs(bgp.testbed, testbed) dev1.add_feature(bgp) cfgs = bgp.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join( ['router bgp 100', ' address-family l2vpn evpn', ' advertise-pip', ' exit', ' exit', ])) uncfgs = bgp.build_unconfig( apply=False, attributes={'device_attr': {'*': {'vrf_attr': {'*': {'address_family_attr': \ {'*': "af_advertise_pip"}}}}}}) self.assertCountEqual(uncfgs.keys(), [dev1.name]) self.maxDiff = None self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join( ['router bgp 100', ' address-family l2vpn evpn', ' no advertise-pip', ' exit', ' exit', ])) bgp2 = Bgp(bgp_id=100) neighbor_id = '10.0.0.1' bgp2.device_attr[dev1].vrf_attr[vrf].neighbor_attr[neighbor_id].\ nbr_peer_type = Bgp.NBR_PEER_TYPE.fabric_border_leaf bgp2.device_attr[dev1].vrf_attr[vrf].neighbor_attr[neighbor_id].address_family_attr[af_name]. \ nbr_af_rewrite_evpn_rt_asn = True bgp2.device_attr[dev1] self.assertIs(bgp2.testbed, testbed) dev1.add_feature(bgp2) cfgs = bgp2.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join( ['router bgp 100', ' neighbor 10.0.0.1', ' peer-type fabric-border-leaf', ' address-family l2vpn evpn', ' rewrite-evpn-rt-asn', ' exit', ' exit', ' exit', ])) uncfgs2 = bgp2.build_unconfig( apply=False, attributes={'device_attr': {'*': {'vrf_attr': {'*': {'neighbor_attr': \ {'*': {"nbr_peer_type":None, 'address_family_attr': \ {'*': "nbr_af_rewrite_evpn_rt_asn"}, }}}}}}}) self.assertCountEqual(uncfgs2.keys(), [dev1.name]) self.maxDiff = None self.assertMultiLineEqual(str(uncfgs2[dev1.name]), '\n'.join( ['router bgp 100', ' neighbor 10.0.0.1', ' no peer-type fabric-border-leaf', ' address-family l2vpn evpn', ' no rewrite-evpn-rt-asn', ' exit', ' exit', ' exit', ]))
def test_cfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') intf1 = Interface(device=dev1, name='Ethernet0/0/1', ipv4='10.1.0.1/24') intf2 = Interface(device=dev1, name='Ethernet0/0/2', ipv4='10.2.0.1/24') dev2 = Device(testbed=testbed, name='PE2', os='nxos') intf3 = Interface(device=dev2, name='Ethernet0/0/3', ipv4='10.1.0.2/24', ipv6='2001:111:222::/64') intf4 = Interface(device=dev2, name='Ethernet0/0/4', ipv4='10.2.0.2/24') with self.assertNoWarnings(): Genie.testbed = None with self.assertRaises(TypeError): bgp = Bgp() with self.assertRaises(TypeError): bgp = Bgp(testbed=testbed) Genie.testbed = testbed with self.assertRaises(TypeError): bgp = Bgp() bgp = Bgp(asn=100, bgp_id=100) self.assertIs(bgp.testbed, testbed) Genie.testbed = testbed bgp = Bgp(asn=100, bgp_id=100) self.assertIs(bgp.testbed, Genie.testbed) self.assertIs(bgp.testbed, testbed) # Defining attributes af_name = 'vpnv4 unicast' af_name2 = 'link-state' bgp.device_attr[dev1] bgp.device_attr[dev1].enabled = True bgp.device_attr[dev1].vrf_attr[None].always_compare_med = True bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name] bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name2] bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name]. \ af_retain_rt_all = True bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name]. \ af_dampening = True neighbor_id = intf4.ipv4 bgp.device_attr[dev1].vrf_attr[None].add_neighbor(neighbor_id) bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id] bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]. \ nbr_fall_over_bfd = True bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]. \ nbr_shutdown = True nbr_af_name = 'ipv4 unicast' bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]. \ address_family_attr[nbr_af_name] bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]. \ address_family_attr[nbr_af_name].nbr_af_allowas_in = True dev1.add_feature(bgp) cfgs = bgp.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join( ['feature bgp', 'router bgp 100', ' bestpath always-compare-med', ' neighbor 10.2.0.2', ' bfd', ' shutdown', ' address-family ipv4 unicast', ' allowas-in', ' exit', ' exit', ' address-family link-state', ' exit', ' address-family vpnv4 unicast', ' dampening', ' retain route-target all', ' exit', ' exit', ])) bgp.device_attr[dev1].protocol_shutdown = True partial_cfg1 = bgp.build_config( apply=False, attributes={'device_attr': \ {'*': "enabled", '*': "protocol_shutdown"}}) self.assertCountEqual(partial_cfg1.keys(), [dev1.name]) self.assertMultiLineEqual(str(partial_cfg1[dev1.name]), '\n'. \ join([ 'router bgp 100', ' shutdown', ' exit', ]))
class test_vrf(TestCase): def setUp(self): # Set Genie Tb testbed = Testbed() Genie.testbed = testbed # Device self.dev1 = Device(name='PE1', testbed=testbed, os='iosxr') def test_cli_config(self): # prefix-list conf vrf_conf = Vrf('VRF1') self.dev1.add_feature(vrf_conf) # Apply configuration vrf_conf.device_attr[self.dev1].address_family_attr['ipv4 unicast'].\ route_target_attr['200:1'].rt_type = 'both' vrf_conf.device_attr[self.dev1].address_family_attr['ipv4 unicast'].\ route_target_attr['100:1'].rt_type = 'import' # Build config cfgs = vrf_conf.build_config(apply=False) # Check config built correctly self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'vrf VRF1', ' address-family ipv4 unicast', ' import route-target 100:1', ' import route-target 200:1', ' export route-target 200:1', ' exit', ' exit', ])) # Build unconfig cfgs = vrf_conf.build_unconfig(apply=False) # Check config correctly unconfigured self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'no vrf VRF1', ])) # Build unconfig for selected attributes cfgs = vrf_conf.build_unconfig(apply=False, attributes={'device_attr': { self.dev1: { 'address_family_attr': { 'ipv4 unicast': { 'route_target_attr': None } }}}}) # Check config correctly unconfigured self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'vrf VRF1', ' address-family ipv4 unicast', ' no import route-target 100:1', ' no import route-target 200:1', ' no export route-target 200:1', ' exit', ' exit', ])) # Build unconfig for selected attributes cfgs = vrf_conf.build_unconfig(apply=False, attributes={'device_attr': { self.dev1: { 'address_family_attr': { 'ipv4 unicast': { 'route_target_attr': { '200:1': { 'rt_type': None} }}}}}}) # Check config correctly unconfigured self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'vrf VRF1', ' address-family ipv4 unicast', ' no import route-target 200:1', ' no export route-target 200:1', ' exit', ' exit', ])) def test_cli_config_v6(self): # prefix-list conf vrf_conf = Vrf('VRF2') self.dev1.add_feature(vrf_conf) # Apply configuration vrf_conf.device_attr[self.dev1].address_family_attr['ipv6 unicast'].\ route_target_attr['100:1'].rt_type = 'export' vrf_conf.device_attr[self.dev1].address_family_attr['ipv6 unicast'].\ route_target_attr['200:1'].rt_type = 'export' vrf_conf.device_attr[self.dev1].address_family_attr['ipv6 unicast'].\ route_target_attr['300:1'].rt_type = 'import' vrf_conf.device_attr[self.dev1].address_family_attr['ipv6 unicast'].\ route_target_attr['400:1'].rt_type = 'both' # Build config cfgs = vrf_conf.build_config(apply=False) # Check config built correctly self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'vrf VRF2', ' address-family ipv6 unicast', ' export route-target 100:1', ' export route-target 200:1', ' import route-target 300:1', ' import route-target 400:1', ' export route-target 400:1', ' exit', ' exit', ])) # Build unconfig cfgs = vrf_conf.build_unconfig(apply=False) # Check config correctly unconfigured self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'no vrf VRF2', ])) # Build unconfig for selected attributes cfgs = vrf_conf.build_unconfig(apply=False, attributes={ 'device_attr': { self.dev1: { 'address_family_attr': { 'ipv6 unicast': { 'route_target_attr': None } }}}}) # Check config correctly unconfigured self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'vrf VRF2', ' address-family ipv6 unicast', ' no export route-target 100:1', ' no export route-target 200:1', ' no import route-target 300:1', ' no import route-target 400:1', ' no export route-target 400:1', ' exit', ' exit', ])) # Build unconfig for selected attributes cfgs = vrf_conf.build_unconfig(apply=False, attributes={ 'device_attr': { self.dev1: { 'address_family_attr': { 'ipv6 unicast': { 'route_target_attr': { '200:1': { 'rt_type': None} }}}}}}) # Check config correctly unconfigured self.assertMultiLineEqual( str(cfgs[self.dev1.name]), '\n'.join([ 'vrf VRF2', ' address-family ipv6 unicast', ' no export route-target 200:1', ' exit', ' exit', ]))
def test_init(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') intf1 = Interface(device=dev1, name='GigabitEthernet0/0/1') intf2 = Interface(device=dev1, name='GigabitEthernet0/0/2') dev2 = Device(testbed=testbed, name='PE2', os='iosxe') intf3 = Interface(device=dev2, name='GigabitEthernet0/0/3') intf4 = Interface(device=dev2, name='GigabitEthernet0/0/4') link1 = Link(testbed=testbed, name='link1', interfaces=(intf1, intf3)) link2 = Link(testbed=testbed, name='link2', interfaces=(intf2, intf4)) with self.assertRaises(TypeError): xc1 = Xconnect() xc1 = Xconnect(name='xc1') self.assertIs(xc1.xconnect_type, Xconnect.Type.p2p) self.assertEqual(xc1.name, 'xc1') self.assertCountEqual(xc1.devices, []) self.assertCountEqual(xc1.interfaces, []) self.assertCountEqual(xc1.segments, []) self.assertCountEqual(xc1.link.interfaces, []) dev1.add_feature(xc1) self.assertCountEqual(xc1.devices, [dev1]) self.assertCountEqual(xc1.interfaces, []) self.assertCountEqual(xc1.segments, []) self.assertCountEqual(xc1.link.interfaces, []) cfgs = xc1.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'l2vpn xconnect context xc1', ' exit', ])) efp = Interface(device=dev1, name='GigabitEthernet0/0/1.20', service_instance=20) efp.encapsulation = 'dot1q' efp.rewrite_ingress = 'pop 1 symmetric' xc1.add_segment(efp) self.assertCountEqual(xc1.interfaces, [efp]) self.assertCountEqual(xc1.devices, [dev1]) self.assertCountEqual(xc1.segments, [efp]) self.assertCountEqual(xc1.device_attr[dev1].interfaces, [efp]) self.assertCountEqual(xc1.device_attr[dev2].interfaces, []) self.assertCountEqual(xc1.device_attr[dev1].segments, [efp]) self.assertCountEqual(xc1.device_attr[dev2].segments, []) cfgs = xc1.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'l2vpn xconnect context xc1', ' member GigabitEthernet0/0/1 service-instance 20', ' exit', ]))
def test_single_line_config(self): # For failures self.maxDiff = None # Set Genie Tb testbed = Testbed() Genie.testbed = testbed # Device dev1 = Device(name='PE1', testbed=testbed, os='nxos') intf1 = Interface(name='Ethernet3/7', device=dev1, aliases=['PE1_1']) intf2 = Interface(name='Ethernet3/9', device=dev1, aliases=['PE1_2']) subif1 = Interface(name='Ethernet3/6.10', device=dev1, aliases=['PE1_1']) vrf = Vrf(name='test', testbed=testbed) dev1.add_feature(vrf) # Apply configuration intf1.description = 'test' intf1.enabled = False # intf1.shutdown = False intf1.link_up_down_trap_enable = True intf1.mtu = 1492 intf1.vrf = vrf intf1.mac_address = 'aabb.ccdd.eeff' intf1.bandwidth = 8192 intf1.link_status = True intf1.load_interval = 33 intf1.dhcp = True intf1.unnumbered_intf_ref = 'Ethernet3/6.10' intf1.ipv6_autoconf = True intf1.switchport_mode = 'access' intf1.medium = 'p2p' intf1.delay = 11 intf1.access_vlan = '19' intf1.auto_negotiate = False # make intf2 as L2 interface intf1.switchport_enable = True intf2.enabled = True intf2.switchport_enable = True intf2.switchport_mode = 'trunk' intf2.trunk_add_vlans = '1,2,3' # Build config cfgs = intf1.build_config(apply=False) # Check config build correctly self.assertMultiLineEqual( str(cfgs), '\n'.join([ 'interface Ethernet3/7', ' medium p2p', ' bandwidth 8192', ' delay 11', ' description test', ' mtu 1492', ' shutdown', ' snmp trap link-status', ' vrf member test', ' logging event port link-status', ' ip address dhcp', ' ip unnumbered Ethernet3/6.10', ' ipv6 address autoconfig', ' switchport', ' switchport mode access', ' load-interval 33', ' mac-address aabb.ccdd.eeff', ' switchport access vlan 19', ' no speed', ' no duplex', ' exit' ])) cfgs = intf2.build_config(apply=False) # Check config build correctly self.assertMultiLineEqual( str(cfgs), '\n'.join([ 'interface Ethernet3/9', ' no shutdown', ' switchport', ' switchport mode trunk', ' switchport trunk allowed vlan add 1,2,3', ' exit' ])) # Build unconfig uncfgs = intf1.build_unconfig(apply=False, attributes={ 'mtu': True, 'enabled': True }) # Check config build correctly self.assertMultiLineEqual( str(uncfgs), '\n'.join( ['interface Ethernet3/7', ' no mtu', ' no shutdown', ' exit'])) uncfgs = intf2.build_unconfig(apply=False, attributes={'trunk_add_vlans': True}) # Check config build correctly self.assertMultiLineEqual( str(uncfgs), '\n'.join([ 'interface Ethernet3/9', ' switchport trunk allowed vlan remove 1,2,3', ' exit' ]))
def test_all_ethernet(self): testbed = Testbed() Genie.testbed = Testbed() dev1 = Device(name='PE1', os='iosxe') intf1 = Interface(device=dev1, name='GigabitEthernet0/0/1') vrf = Vrf(name='test', testbed=testbed) dev1.add_feature(vrf) # Defining attributes section intf1.description = 'test desc' intf1.enabled = True intf1.link_up_down_trap_enable = True intf1.mtu = 500 intf1.vrf = vrf intf1.vrf_downstream = 'vrf_downstream_test' intf1.mac_address = 'aaaa.bbbb.cccc' intf1.bandwidth = 768 intf1.link_status = True intf1.load_interval = 30 intf1.encapsulation = 'dot1q' intf1.first_dot1q = '20' intf1.second_dot1q = '30' ipv4a = IPv4Addr(device=dev1) ipv4a.ipv4 = IPv4Address('192.168.1.1') ipv4a.prefix_length = '24' intf1.add_ipv4addr(ipv4a) ipv4b = IPv4Addr(device=dev1) ipv4b.ipv4 = IPv4Address('192.168.1.2') ipv4b.prefix_length = '24' ipv4b.ipv4_secondary = True intf1.add_ipv4addr(ipv4b) ipv6a = IPv6Addr(device=dev1) ipv6a.ipv6 = IPv6Address('2001:db1:1::1') ipv6a.ipv6_prefix_length = '64' intf1.add_ipv6addr(ipv6a) ipv6b = IPv6Addr(device=dev1) ipv6b.ipv6 = IPv6Address('2001:db1:2::2') ipv6b.ipv6_prefix_length = '64' intf1.add_ipv6addr(ipv6b) ipv6b.ipv6_anycast = True intf1.dhcp = True intf1.dhcp_client_id = '10' intf1.dhcp_hostname = 'dhcp-host' intf1.unnumbered_intf_ref = 'GigabitEthernet0/0/2.20' intf1.ipv6_unnumbered_intf_ref = 'GigabitEthernet0/0/3.100' intf1.ipv6_enabled = True intf1.ipv6_autoconf = True intf1.ipv6_autoconf_default = True intf1.medium = "broadcast" intf1.delay = 100 intf1.port_speed = '1000' intf1.auto_negotiate = True intf1.duplex_mode = "full" intf1.flow_control_receive = True intf1.flow_control_send = False # Check config cfg = intf1.build_config(apply=False) self.assertMultiLineEqual( str(cfg), '\n'.join([ 'interface GigabitEthernet0/0/1', ' encapsulation dot1q 20 second-dot1q 30', ' vrf forwarding test downstream vrf_downstream_test', ' description test desc', ' bandwidth 768', ' mtu 500', ' no shutdown', ' snmp trap link-status', ' logging event link-status', ' load-interval 30', ' ipv6 enable', ' ipv6 address autoconfig default', ' ip unnumbered GigabitEthernet0/0/2.20', ' ipv6 unnumbered GigabitEthernet0/0/3.100', ' speed 1000', ' negotiation auto', ' duplex full', ' flowcontrol receive on', ' flowcontrol send off', ' ip address dhcp client-id 10 hostname dhcp-host', ' medium broadcast', ' delay 100', ' ip address 192.168.1.1 255.255.255.0', ' ip address 192.168.1.2 255.255.255.0 secondary', ' ipv6 address 2001:db1:1::1/64', ' ipv6 address 2001:db1:2::2/64 anycast', ' mac-address aaaa.bbbb.cccc', ' exit', ])) # Check unconfig without attribtues uncfg = intf1.build_unconfig(apply=False) self.assertMultiLineEqual( str(uncfg), '\n'.join([ 'default interface GigabitEthernet0/0/1', 'interface GigabitEthernet0/0/1', 'shutdown', ])) # Check ipv4 unconfig uncfg = intf1.build_unconfig(apply=False, attributes="ipv4addr") self.assertMultiLineEqual( str(uncfg), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no ip address 192.168.1.1 255.255.255.0', ' no ip address 192.168.1.2 255.255.255.0 secondary', ' exit', ])) # Check encapsulation unconfig uncfg = intf1.build_unconfig(apply=False, attributes={ "encapsulation": None, "first_dot1q": None }) self.assertMultiLineEqual( str(uncfg), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no encapsulation dot1q', ' exit', ]))