def test_vlan_interface_configuration(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxr', context='yang') dev2 = Device(testbed=testbed, name='PE2', os='iosxr', context='yang') intf1 = Interface(name='GigabitEthernet0/0/1', device=dev1, context='yang') intf2 = Interface(name='GigabitEthernet0/0/2', device=dev2, context='yang') intf3 = Interface(name='GigabitEthernet0/0/3', device=dev1, context='yang') link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() for dev in testbed.devices: dev.connections = Mock() dev.connections = {'netconf': NetconfConnectionInfo()} link.add_feature(vlan) vlan.device_attr[dev1] vlan.device_attr[dev2] vlan.device_attr[dev1].interface_attr[intf1] vlan.device_attr[dev1].interface_attr[intf1].eth_encap_type1 = 'dot1q' vlan.device_attr[dev1].interface_attr[intf1].eth_encap_val1 = 2 vlan.device_attr[dev1].interface_attr[ intf1].eth_encap_type2 = 'second-dot1q' vlan.device_attr[dev1].interface_attr[intf1].eth_encap_val2 = 5
def test_vlan_interface_configuration(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxr') dev2 = Device(testbed=testbed, name='PE2', os='iosxr') intf1 = Interface(name='GigabitEthernet0/0/1', device=dev1) intf2 = Interface(name='GigabitEthernet0/0/2', device=dev2) intf3 = Interface(name='GigabitEthernet0/0/3', device=dev1) link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() link.add_feature(vlan) vlan.device_attr[dev1] vlan.device_attr[dev2] vlan.device_attr[dev1].interface_attr[intf1] vlan.device_attr[dev1].interface_attr[intf1].eth_encap_type1 = 'dot1q' vlan.device_attr[dev1].interface_attr[intf1].eth_encap_val1 = 2 vlan.device_attr[dev1].interface_attr[ intf1].eth_encap_type2 = 'second-dot1q' vlan.device_attr[dev1].interface_attr[intf1].eth_encap_val2 = 5 cfg1 = vlan.build_config(apply=False) self.assertCountEqual(cfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(cfg1['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' encapsulation dot1q 2 second-dot1q 5', ' exit', ]))
def test_init(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe', context='yang') dev2 = Device(testbed=testbed, name='PE2', os='iosxe', context='yang') intf1 = Interface(name='GigabitEthernet0/0/1', device=dev1) intf2 = Interface(name='GigabitEthernet0/0/2', device=dev2) link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) self.assertSetEqual(set(link.find_interfaces()), set([intf1, intf2])) self.assertSetEqual(set(dev1.find_interfaces()), set([intf1])) self.assertSetEqual(set(dev2.find_interfaces()), set([intf2])) vrf = Vrf(name='test') self.assertSetEqual(set(vrf.devices), set([])) self.assertSetEqual(set(vrf.interfaces), set([])) intf1.vrf = vrf intf2.vrf = vrf dev1.add_feature(vrf) dev2.add_feature(vrf) self.assertCountEqual(vrf.devices, [dev1, dev2]) self.assertSetEqual(set(vrf.interfaces), set([intf1, intf2])) with self.assertRaises(AttributeError): vrf.address_families = set([AddressFamily.ipv8_unicast])
def test_basic_cfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe', context='yang') dev2 = Device(testbed=testbed, name='PE2', os='iosxe', context='yang') intf1 = Interface(name='GigabitEthernet0/0/1', device=dev1) intf2 = Interface(name='GigabitEthernet0/0/2', device=dev2) intf3 = Interface(name='Vlan100', device=dev1) link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() for dev in testbed.devices: dev.connections = Mock() dev.connections = {'netconf': NetconfConnectionInfo()} link.add_feature(vlan) vlan.vlan_id = 100 cfg1 = vlan.build_config(apply=False) self.assertCountEqual(cfg1.keys(), ['PE1', 'PE2']) compare = "" for i in cfg1['PE1']: compare += str(i) self.assertMultiLineEqual( compare, '\n'.join([ '<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">\n' ' <target>\n' ' <running></running>\n' ' </target>\n' ' <config>\n' ' <vlan xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">\n' ' <vlan-list xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-vlan">\n' ' <id>100</id>\n' ' </vlan-list>\n' ' </vlan>\n' ' </config>\n' '</edit-config>\n' ])) compare = "" for i in cfg1['PE2']: compare += str(i) self.assertMultiLineEqual( compare, '\n'.join([ '<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">\n' ' <target>\n' ' <running></running>\n' ' </target>\n' ' <config>\n' ' <vlan xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">\n' ' <vlan-list xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-vlan">\n' ' <id>100</id>\n' ' </vlan-list>\n' ' </vlan>\n' ' </config>\n' '</edit-config>\n' ]))
def test_init(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') dev2 = Device(testbed=testbed, name='PE2', os='iosxe') intf1 = Interface(name='GigabitEthernet0/0/1',device=dev1) intf2 = Interface(name='GigabitEthernet0/0/2',device=dev2) intf3 = Interface(name='Vlan100',device=dev1) link = Link(name='1_2_1',testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) self.assertSetEqual( set(link.find_interfaces()), set([intf1, intf2])) self.assertSetEqual( set(dev1.find_interfaces()), set([intf1, intf3])) self.assertSetEqual( set(dev2.find_interfaces()), set([intf2])) vlan = Vlan() self.assertSetEqual(set(vlan.devices), set([])) self.assertSetEqual(set(vlan.links), set([])) link.add_feature(vlan) self.assertCountEqual(vlan.devices, [dev1, dev2]) self.assertSetEqual(set(vlan.links), set([link])) self.assertSetEqual(set(vlan.interfaces), set([intf1, intf2])) with self.assertRaises(AttributeError): vlan.access_map_id with self.assertRaises(AttributeError): vlan.vlan_configuration_id
def _write_connections_to_testbed(self, connection_dict, testbed): '''Writes the connections found in the connection_dict into the testbed Args: connection_dict ('dict'): Dictionary with connections found earlier testbed ('testbed'): testbed to write connections into ''' # filter to strip out the numbers from an interface to create a type name # example: ethernet0/3 becomes ethernet interface_filter = re.compile(r'[a-zA-Z]+') log.debug('Adding connections to testbed') for device in connection_dict: log.debug(' Writing connections found in {}'.format(device)) for interface_name in connection_dict[device]: #if connecting interface is not in the testbed, create the interface if interface_name not in testbed.devices[device].interfaces: type_name = interface_filter.match(interface_name) interface = Interface(interface_name, type=type_name[0].lower()) interface.device = testbed.devices[device] else: # get the interface found in the connection on the device searched interface = testbed.devices[device].interfaces[ interface_name] # if the interface is not already part of a link get a list of # all interfaces involved in the link and create a new link # object with the associated interfaces if interface.link is None: int_list = [interface] for entry in connection_dict[device][interface_name]: dev = entry['dest_host'] dest_int = entry['dest_port'] if testbed.devices[dev].interfaces[ dest_int] not in int_list: int_list.append( testbed.devices[dev].interfaces[dest_int]) if len(int_list) > 1: link = Link( 'Link_{num}'.format(num=len(testbed.links)), interfaces=int_list) # if the interface is already part of the link go over the # other interfaces found in the connection_dict and add them to the link # if they are not already there else: link = interface.link for entry in connection_dict[device][interface_name]: dev = entry['dest_host'] dest_int = entry['dest_port'] if testbed.devices[dev].interfaces[ dest_int] not in link.interfaces: link.connect_interface( testbed.devices[dev].interfaces[dest_int])
class test_te(unittest.TestCase): def setUp(self): self.tb = Genie.testbed = Testbed() self.dev1 = Device(testbed=self.tb, name='PE1', os='iosxe') self.dev2 = Device(testbed=self.tb, name='PE2', os='iosxe') self.i1 = Interface(name='GigabitEthernet0/0/1', device=self.dev1) self.i2 = Interface(name='GigabitEthernet0/0/2', device=self.dev2) self.i3 = Interface(name='GigabitEthernet0/0/3', device=self.dev1) self.i4 = Interface(name='GigabitEthernet0/0/4', device=self.dev2) self.i5 = Interface(name='GigabitEthernet0/0/5', device=self.dev1) self.i6 = Interface(name='GigabitEthernet0/0/6', device=self.dev2) self.i7 = Interface(name='GigabitEthernet0/0/7', device=self.dev1) self.i8 = Interface(name='GigabitEthernet0/0/8', device=self.dev2) self.link = Link(name='1_2_1', testbed=self.tb) self.link.connect_interface(interface=self.i1) self.link.connect_interface(interface=self.i2) self.link2 = Link(name='1_2_2', testbed=self.tb) self.link2.connect_interface(interface=self.i3) self.link2.connect_interface(interface=self.i4) self.link3 = Link(name='1_2_3', testbed=self.tb) self.link3.connect_interface(interface=self.i5) self.link3.connect_interface(interface=self.i6) self.link4 = Link(name='1_2_4', testbed=self.tb) self.link4.connect_interface(interface=self.i7) self.link4.connect_interface(interface=self.i8) self.assertSetEqual(set(self.link.find_interfaces()), set([self.i1, self.i2])) self.assertSetEqual(set(self.dev1.find_interfaces()), set([self.i1, self.i3, self.i5, self.i7])) self.assertSetEqual(set(self.dev2.find_interfaces()), set([self.i2, self.i4, self.i6, self.i8])) def test_MplsTe(self): te = Te() self.assertSetEqual(set(te.devices), set([])) self.assertSetEqual(set(te.links), set([])) self.link.add_feature(te) self.link2.add_feature(te) self.link3.add_feature(te) self.link4.add_feature(te) self.assertCountEqual(te.devices, [self.dev1, self.dev2]) self.assertSetEqual( set(te.links), set([self.link, self.link2, self.link3, self.link4])) self.assertSetEqual( set(te.interfaces), set([ self.i1, self.i2, self.i3, self.i4, self.i5, self.i6, self.i7, self.i8 ])) out = te.build_config(apply=False) self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'mpls traffic-eng tunnels', 'interface GigabitEthernet0/0/1', ' mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/3', ' mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/5', ' mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/7', ' mpls traffic-eng tunnels', ' exit', ])) self.assertMultiLineEqual( str(out['PE2']), '\n'.join([ 'mpls traffic-eng tunnels', 'interface GigabitEthernet0/0/2', ' mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/4', ' mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/6', ' mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/8', ' mpls traffic-eng tunnels', ' exit', ])) out = te.build_unconfig(apply=False) self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'default mpls traffic-eng tunnels', 'interface GigabitEthernet0/0/1', ' default mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/3', ' default mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/5', ' default mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/7', ' default mpls traffic-eng tunnels', ' exit', ])) self.assertMultiLineEqual( str(out['PE2']), '\n'.join([ 'default mpls traffic-eng tunnels', 'interface GigabitEthernet0/0/2', ' default mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/4', ' default mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/6', ' default mpls traffic-eng tunnels', ' exit', 'interface GigabitEthernet0/0/8', ' default mpls traffic-eng tunnels', ' exit', ]))
def test_vlan_interface_confoguration(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxr') dev2 = Device(testbed=testbed, name='PE2', os='iosxr') intf1 = Interface(name='GigabitEthernet0/0/1', device=dev1) intf2 = Interface(name='GigabitEthernet0/0/2', device=dev2) intf3 = Interface(name='GigabitEthernet0/0/3', device=dev1) link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() link.add_feature(vlan) vlan.device_attr[dev1] vlan.device_attr[dev2] # Defining attributes section intf1.transceiver_permit_pid_all = True intf1.duplex = 'full' intf1.mac_address = 'aaaa.bbbb.cccc' intf1.eth_encap_type1 = 'dot1q' intf1.eth_encap_val1 = 2 intf1.eth_encap_val2 = 5 intf1.eth_dot1q_type = 'tunneling ethertype' intf1.eth_dot1q_value = '0x9100' intf1.ipv4 = '201.0.12.1' intf2.eth_dot1q_type = 'native vlan' intf2.eth_dot1q_value = '15' cfg1 = intf1.build_config(apply=False) self.assertMultiLineEqual( str(cfg1), '\n'.join([ 'interface GigabitEthernet0/0/1', ' dot1q tunneling ethertype 0x9100', ' encapsulation dot1q 2 second-dot1q 5', ' ipv4 address 201.0.12.1/32', ' transceiver permit pid all', ' duplex full', ' mac-address aaaa.bbbb.cccc', ' exit', ])) cfg2 = intf2.build_config(apply=False) self.assertMultiLineEqual( str(cfg2), '\n'.join([ 'interface GigabitEthernet0/0/2', ' dot1q native vlan 15', ' exit', ])) uncfg = intf1.build_unconfig(apply=False, attributes={ 'mac_address': True, 'duplex': True, 'ipv4': True, 'eth_dot1q_value': True, 'eth_encap_type1': True, }) self.assertMultiLineEqual( str(uncfg), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no encapsulation dot1q 2 second-dot1q 5', ' no ipv4 address 201.0.12.1/32', ' no duplex full', ' no mac-address', ' exit', ]))
class test_te(unittest.TestCase): def setUp(self): self.tb = Genie.testbed = Testbed() self.dev1 = Device(testbed=self.tb, name='PE1', os='iosxr') self.dev2 = Device(testbed=self.tb, name='PE2', os='iosxr') self.i1 = Interface(name='GigabitEthernet0/0/0/1', device=self.dev1) self.i2 = Interface(name='GigabitEthernet0/0/0/2', device=self.dev2) self.i3 = Interface(name='GigabitEthernet0/0/0/3', device=self.dev1) self.i4 = Interface(name='GigabitEthernet0/0/0/4', device=self.dev2) self.i5 = Interface(name='GigabitEthernet0/0/0/5', device=self.dev1) self.i6 = Interface(name='GigabitEthernet0/0/0/6', device=self.dev2) self.i7 = Interface(name='GigabitEthernet0/0/0/7', device=self.dev1) self.i8 = Interface(name='GigabitEthernet0/0/0/8', device=self.dev2) self.link = Link(name='1_2_1', testbed=self.tb) self.link.connect_interface(interface=self.i1) self.link.connect_interface(interface=self.i2) self.link2 = Link(name='1_2_2', testbed=self.tb) self.link2.connect_interface(interface=self.i3) self.link2.connect_interface(interface=self.i4) self.link3 = Link(name='1_2_3', testbed=self.tb) self.link3.connect_interface(interface=self.i5) self.link3.connect_interface(interface=self.i6) self.link4 = Link(name='1_2_4', testbed=self.tb) self.link4.connect_interface(interface=self.i7) self.link4.connect_interface(interface=self.i8) self.assertSetEqual(set(self.link.find_interfaces()), set([self.i1, self.i2])) self.assertSetEqual(set(self.dev1.find_interfaces()), set([self.i1, self.i3, self.i5, self.i7])) self.assertSetEqual(set(self.dev2.find_interfaces()), set([self.i2, self.i4, self.i6, self.i8])) def test_MplsTe(self): te = Te() self.assertSetEqual(set(te.devices), set([])) self.assertSetEqual(set(te.links), set([])) if 0: print("before") print(te.devices) print(te.links) print(te.interfaces) self.link.add_feature(te) self.link2.add_feature(te) self.link3.add_feature(te) self.link4.add_feature(te) self.assertCountEqual(te.devices, [self.dev1, self.dev2]) self.assertSetEqual( set(te.links), set([self.link, self.link2, self.link3, self.link4])) self.assertSetEqual( set(te.interfaces), set([ self.i1, self.i2, self.i3, self.i4, self.i5, self.i6, self.i7, self.i8 ])) if 0: print("after") print(te.links) print(te.devices) print(te.interfaces) te.log_events_preemption = True te.log_events_frr_protection = True te.device_attr['PE1'].log_events_frr_protection_type = 'backup-tunnel' te.device_attr['PE2'].log_events_frr_protection_type = 'primary-lsp' te.device_attr[ 'PE2'].log_events_frr_protection_primary_lsp_type = 'active-state' te.srlg_admin_weight = 20000 te.backup_auto_tun_tunid_min = 210 te.backup_auto_tun_tunid_max = 600 te.auto_tun_backup_affinity_ignore = True te.affinity_map_val_dict['RED'] = "0x1" te.soft_preempt_timeout = 5 te.reoptimize_delay_cleanup = 10 te.reoptimize_delay_install = 1 te.flooding_threshold_up = 1 te.flooding_threshold_down = 1 te.p2mp_auto_tun_tunid_min = 100 te.p2mp_auto_tun_tunid_max = 200 te.device_attr['PE1'].p2mp_auto_tun_tunid_min = 200 te.device_attr['PE1'].p2mp_auto_tun_tunid_max = 300 te.auto_tun_backup_affinity_ignore = True te.auto_tun_backup_timers_rem_unused = 100 te.auto_tun_backup_attr_set = "backup" te.device_attr['PE1'].interface_attr[ self.i1].auto_tun_backup_exclude_srlg = True te.device_attr['PE1'].interface_attr[ self.i3].auto_tun_backup_exclude_srlg = True te.device_attr['PE1'].interface_attr[ self.i3].auto_tun_backup_exclude_srlg_type = 'preferred' te.device_attr['PE1'].interface_attr[ self.i5].auto_tun_backup_exclude_srlg = True te.device_attr['PE1'].interface_attr[ self.i5].auto_tun_backup_exclude_srlg_type = 'weighted' te.device_attr['PE1'].affinity_map_val_dict = {} te.device_attr['PE1'].affinity_map_val_dict['RED'] = "0x2" te.device_attr['PE2'].affinity_map_bitpos_dict = {} te.device_attr['PE2'].affinity_map_bitpos_dict['BLUE'] = 94 te.device_attr['PE2'].affinity_map_bitpos_dict['EDGE'] = 27 te.device_attr['PE2'].affinity_map_bitpos_dict['PINK'] = 95 te.device_attr['PE2'].affinity_map_bitpos_dict['GREEN'] = 91 te.device_attr['PE2'].affinity_map_bitpos_dict['METRO'] = 29 out = te.build_config(apply=False) self.maxDiff = None self.assertCountEqual(out.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'mpls traffic-eng', ' auto-tunnel backup affinity ignore', ' auto-tunnel backup timers removal unused 100', ' auto-tunnel backup tunnel-id min 210 max 600', ' auto-tunnel p2mp tunnel-id min 200 max 300', ' logging events preemption', ' logging events frr-protection backup-tunnel', ' reoptimize timers delay cleanup 10', ' reoptimize timers delay installation 1', ' flooding threshold up 1 down 1', ' affinity-map RED 0x2', ' srlg admin-weight 20000', ' soft-preemption timeout 5', ' interface GigabitEthernet0/0/0/1', ' auto-tunnel backup attribute-set backup', ' auto-tunnel backup exclude srlg', ' exit', ' interface GigabitEthernet0/0/0/3', ' auto-tunnel backup attribute-set backup', ' auto-tunnel backup exclude srlg preferred', ' exit', ' interface GigabitEthernet0/0/0/5', ' auto-tunnel backup attribute-set backup', ' auto-tunnel backup exclude srlg weighted', ' exit', ' interface GigabitEthernet0/0/0/7', ' auto-tunnel backup attribute-set backup', ' exit', ' exit', ])) if 1: self.assertMultiLineEqual( str(out['PE2']), '\n'.join([ 'mpls traffic-eng', ' auto-tunnel backup affinity ignore', ' auto-tunnel backup timers removal unused 100', ' auto-tunnel backup tunnel-id min 210 max 600', ' auto-tunnel p2mp tunnel-id min 100 max 200', ' logging events preemption', ' logging events frr-protection primary-lsp active-state', ' reoptimize timers delay cleanup 10', ' reoptimize timers delay installation 1', ' flooding threshold up 1 down 1', ' affinity-map BLUE bit-position 94', ' affinity-map EDGE bit-position 27', ' affinity-map GREEN bit-position 91', ' affinity-map METRO bit-position 29', ' affinity-map PINK bit-position 95', ' affinity-map RED 0x1', ' srlg admin-weight 20000', ' soft-preemption timeout 5', ' interface GigabitEthernet0/0/0/2', ' auto-tunnel backup attribute-set backup', ' exit', ' interface GigabitEthernet0/0/0/4', ' auto-tunnel backup attribute-set backup', ' exit', ' interface GigabitEthernet0/0/0/6', ' auto-tunnel backup attribute-set backup', ' exit', ' interface GigabitEthernet0/0/0/8', ' auto-tunnel backup attribute-set backup', ' exit', ' exit', ])) def test_UnnumInterfaces(self): # Test unnum interface output te = Te() self.link.add_feature(te) te.ipv4_unnum_interfaces = {self.i1, self.i2, self.i3, self.i4} out = te.build_config(apply=False) self.assertRegex( str(out['PE1']), 'ipv4 unnumbered mpls traffic-eng GigabitEthernet0/0/0/1') self.assertRegex( str(out['PE1']), 'ipv4 unnumbered mpls traffic-eng GigabitEthernet0/0/0/3') self.assertRegex( str(out['PE2']), 'ipv4 unnumbered mpls traffic-eng GigabitEthernet0/0/0/2') self.assertRegex( str(out['PE2']), 'ipv4 unnumbered mpls traffic-eng GigabitEthernet0/0/0/4') def test_Srlg(self): srlg = Srlg() self.dev1.add_feature(srlg) self.dev2.add_feature(srlg) srlg.name_value_dict['R13'] = 10 srlg.name_value_dict['R11'] = 20 srlg.name_value_dict['R23'] = 30 srlg.name_value_dict['R25'] = 40 srlg.name_value_dict['R34'] = 50 # if per-device dict is not initialized, base class dict will be over-written srlg.device_attr['PE1'].name_value_dict = {} srlg.device_attr['PE1'].name_value_dict['R13'] = 10 srlg.device_attr['PE1'].name_value_dict['R11'] = 20 srlg.device_attr['PE1'].name_value_dict['R23'] = 30 srlg.device_attr['PE1'].name_value_dict['R25'] = 40 srlg.device_attr['PE1'].name_value_dict['R34'] = 50 srlg.device_attr['PE1'].name_value_dict['R35'] = 60 srlg.device_attr['PE1'].name_value_dict['R45'] = 70 srlg.device_attr['PE1'].interface_attr[self.i1].intf_name = 'R13' srlg.device_attr['PE1'].interface_attr[self.i3].intf_name = 'R11' srlg.device_attr['PE1'].interface_attr[self.i5].intf_name = 'R23' out = srlg.build_config(apply=False) self.assertCountEqual(out.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'srlg', ' name R11 value 20', ' name R13 value 10', ' name R23 value 30', ' name R25 value 40', ' name R34 value 50', ' name R35 value 60', ' name R45 value 70', ' interface GigabitEthernet0/0/0/1', ' name R13', ' exit', ' interface GigabitEthernet0/0/0/3', ' name R11', ' exit', ' interface GigabitEthernet0/0/0/5', ' name R23', ' exit', ' exit', ])) self.assertMultiLineEqual( str(out['PE2']), '\n'.join([ 'srlg', ' name R11 value 20', ' name R13 value 10', ' name R23 value 30', ' name R25 value 40', ' name R34 value 50', ' exit', ]))
def test_basic_cfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') dev2 = Device(testbed=testbed, name='PE2', os='nxos') intf1 = Interface(name='Ethernet0/0/1', device=dev1, layer=Layer.L3) intf2 = Interface(name='Ethernet0/0/2', device=dev2, layer=Layer.L2) link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() link.add_feature(vlan) vlan.vlan_id = 100 access_map_id = 'ed' vlan_configuration_id = '3' vlan.device_attr[dev1] vlan.device_attr[dev2] vlan.device_attr[dev1].interface_attr[intf1] vlan.device_attr[dev2].interface_attr[intf2] vlan.device_attr[dev2].interface_attr[intf2].switchport_mode = \ L2_type.TRUNK vlan.device_attr[dev2].interface_attr[intf2].sw_trunk_allowed_vlan = \ '200-201' vlan.device_attr[dev1].access_map_attr[access_map_id] vlan.device_attr[dev2].access_map_attr[access_map_id] vlan.device_attr[dev1].vlan_configuration_attr[vlan_configuration_id] vlan.device_attr[dev2].vlan_configuration_attr[vlan_configuration_id] # Defining attributes section vlan.shutdown = False with self.assertRaises(ValueError): vlan.media = 'invalid' vlan.media = 'enet' self.assertIs(type(vlan.media), Vlan.Media) vlan.egress_load_balance = True vlan.device_attr[dev1].access_map_action = 'drop' vlan.datalink_flow_monitor = True intf1.ipv4 = '201.0.12.1' intf1.ipv4.netmask = '255.255.255.0' intf1.speed = 1000 intf1.mtu = 500 intf1.ipv6 = '2001::12:1' cfg1 = vlan.build_config(apply=False) cfg2 = intf1.build_config(apply=False) self.assertCountEqual(cfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(cfg1['PE1']), '\n'.join([ 'vlan 100', ' media enet', ' no shutdown', ' exit', 'vlan access-map ed', ' action drop', ' exit', 'vlan configuration 3', ' egress port-channel load-balance random', ' exit', 'interface Ethernet0/0/1', ' mtu 500', ' ip address 201.0.12.1 255.255.255.0', ' ipv6 address 2001::12:1/128', ' speed 1000', ' exit', ])) self.assertMultiLineEqual( str(cfg1['PE2']), '\n'.join([ 'vlan 100', ' media enet', ' no shutdown', ' exit', 'vlan access-map ed', ' exit', 'vlan configuration 3', ' egress port-channel load-balance random', ' exit', 'interface Ethernet0/0/2', ' switchport mode trunk', ' switchport trunk allowed vlan 200-201', ' exit', ])) self.assertMultiLineEqual( str(cfg2), '\n'.join([ 'interface Ethernet0/0/1', ' mtu 500', ' ip address 201.0.12.1 255.255.255.0', ' ipv6 address 2001::12:1/128', ' speed 1000', ' exit', ]))
class test_ldp(unittest.TestCase): def setUp(self): self.maxDiff = None tb = Genie.testbed = Testbed() self.dev1 = Device(testbed=tb, name='PE1', os='iosxe') self.dev2 = Device(testbed=tb, name='PE2', os='iosxe') self.i1 = Interface(name='GigabitEthernet0/0/1', device=self.dev1) self.i2 = Interface(name='GigabitEthernet0/0/2', device=self.dev2) self.i3 = Interface(name='GigabitEthernet0/0/3', device=self.dev1) self.i4 = Interface(name='GigabitEthernet0/0/4', device=self.dev2) self.i5 = Interface(name='GigabitEthernet0/0/5', device=self.dev1) self.i6 = Interface(name='GigabitEthernet0/0/6', device=self.dev2) self.i7 = Interface(name='GigabitEthernet0/0/7', device=self.dev1) self.i8 = Interface(name='GigabitEthernet0/0/8', device=self.dev2) self.link = Link(name='1_2_1') self.link.connect_interface(interface=self.i1) self.link.connect_interface(interface=self.i2) self.link2 = Link(name='1_2_2') self.link2.connect_interface(interface=self.i3) self.link2.connect_interface(interface=self.i4) self.link3 = Link(name='1_2_3') self.link3.connect_interface(interface=self.i5) self.link3.connect_interface(interface=self.i6) self.link4 = Link(name='1_2_4') self.link4.connect_interface(interface=self.i7) self.link4.connect_interface(interface=self.i8) self.assertSetEqual(set(self.link.find_interfaces()), set([self.i1, self.i2])) self.assertSetEqual(set(self.dev1.find_interfaces()), set([self.i1, self.i3, self.i5, self.i7])) self.assertSetEqual(set(self.dev2.find_interfaces()), set([self.i2, self.i4, self.i6, self.i8])) def test_01_interface_only(self): ldp = Ldp() self.assertSetEqual(set(ldp.devices), set([])) self.assertSetEqual(set(ldp.links), set([])) self.link.add_feature(ldp) self.link2.add_feature(ldp) self.link3.add_feature(ldp) self.link4.add_feature(ldp) self.assertCountEqual(ldp.devices, [self.dev1, self.dev2]) self.assertSetEqual( set(ldp.links), set([self.link, self.link2, self.link3, self.link4])) self.assertSetEqual( set(ldp.interfaces), set([ self.i1, self.i2, self.i3, self.i4, self.i5, self.i6, self.i7, self.i8 ])) # ==Test interface-only config== out = ldp.build_config(apply=False) if 1: self.assertRegex(str(out['PE1']), 'interface GigabitEthernet0/0/1') self.assertRegex(str(out['PE1']), 'interface GigabitEthernet0/0/3') self.assertRegex(str(out['PE1']), 'interface GigabitEthernet0/0/5') self.assertRegex(str(out['PE1']), 'interface GigabitEthernet0/0/7') self.assertRegex(str(out['PE2']), 'interface GigabitEthernet0/0/2') self.assertRegex(str(out['PE2']), 'interface GigabitEthernet0/0/4') self.assertRegex(str(out['PE2']), 'interface GigabitEthernet0/0/6') self.assertRegex(str(out['PE2']), 'interface GigabitEthernet0/0/8') def test_1_top_level(self): acl1 = AccessList(name='1') acl2 = AccessList(name='2') acl3 = AccessList(name='3') acl4 = AccessList(name='4') acl5 = AccessList(name='5') acl6 = AccessList(name='6') acl7 = AccessList(name='7') acl8 = AccessList(name='8') acl9 = AccessList(name='9') acl11 = AccessList(name='11') acl22 = AccessList(name='22') acl33 = AccessList(name='33') acl44 = AccessList(name='44') ldp = Ldp() self.link.add_feature(ldp) # ==Test top-level config== ldp.hello_holdtime = 100 ldp.hello_interval = 200 ldp.targeted_hello_accept = True ldp.gr = True ldp.gr_fwdstate_holdtime = 60 ldp.nsr = True ldp.device_attr['PE1'].session_holdtime = 444 ldp.session_protection = True ldp.session_protection_dur = 222 ldp.device_attr['PE2'].session_protection_dur = 333 ldp.session_protection_for_acl = acl1 out = ldp.build_config(apply=False) if 1: self.assertCountEqual(out.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'mpls label protocol ldp', 'mpls ip', 'mpls ldp nsr', 'mpls ldp graceful-restart', 'mpls ldp graceful-restart timers forwarding-holding 60', 'mpls ldp discovery hello interval 200', 'mpls ldp discovery hello holdtime 100', 'mpls ldp discovery targeted-hello accept', 'mpls ldp session protection for 1 222', 'interface GigabitEthernet0/0/1', ' mpls ip', ' exit', ])) self.assertMultiLineEqual( str(out['PE2']), '\n'.join([ 'mpls label protocol ldp', 'mpls ip', 'mpls ldp nsr', 'mpls ldp graceful-restart', 'mpls ldp graceful-restart timers forwarding-holding 60', 'mpls ldp discovery hello interval 200', 'mpls ldp discovery hello holdtime 100', 'mpls ldp discovery targeted-hello accept', 'mpls ldp session protection for 1 333', 'interface GigabitEthernet0/0/2', ' mpls ip', ' exit', ])) if 1: # set the per-attr variables that are inherited by VRF ldp.device_attr['PE1'].vrf_attr['default'].router_id = self.i1 ldp.device_attr['PE2'].vrf_attr['default'].router_id = self.i2 out = ldp.build_config(apply=False) self.assertRegex(str(out['PE1']), 'router-id GigabitEthernet0/0/1') self.assertRegex(str(out['PE2']), 'router-id GigabitEthernet0/0/2') # Check unconfig - <nsr> config filter out = ldp.build_unconfig(apply=False, attributes='device_attr__*__nsr') if 1: self.assertRegex(str(out['PE1']), 'no mpls ldp nsr') self.assertRegex(str(out['PE2']), 'no mpls ldp nsr') # Check unconfig - <gr> config filter= out = ldp.build_unconfig(apply=False, attributes='device_attr__*__gr') if 1: self.assertRegex(str(out['PE1']), 'no mpls ldp graceful-restart') self.assertRegex(str(out['PE2']), 'no mpls ldp graceful-restart') def test_2_per_vrf(self): acl1 = AccessList(name='1') acl2 = AccessList(name='2') acl3 = AccessList(name='3') acl4 = AccessList(name='4') acl5 = AccessList(name='5') acl6 = AccessList(name='6') acl7 = AccessList(name='7') acl8 = AccessList(name='8') acl9 = AccessList(name='9') acl11 = AccessList(name='11') acl22 = AccessList(name='22') acl33 = AccessList(name='33') acl44 = AccessList(name='44') ldp = Ldp() self.link.add_feature(ldp) vrf = Vrf(name='vrf1') ldp.add_force_vrf(vrf) vrf2 = Vrf(name='vrf2') ldp.add_force_vrf(vrf2) ldp.device_attr['PE1'].router_id = self.i1 ldp.device_attr['PE2'].router_id = self.i2 ldp.device_attr['PE1'].vrf_attr['vrf1'].router_id = self.i3 ldp.device_attr['PE2'].vrf_attr['vrf1'].router_id = self.i4 # Test per vrf config # Check vrf config - full config out = ldp.build_config(apply=False) self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'mpls label protocol ldp', 'mpls ip', 'mpls ldp router-id GigabitEthernet0/0/1', 'mpls ldp router-id vrf vrf1 GigabitEthernet0/0/3', 'interface GigabitEthernet0/0/1', ' mpls ip', ' exit', ])) self.assertMultiLineEqual( str(out['PE2']), '\n'.join([ 'mpls label protocol ldp', 'mpls ip', 'mpls ldp router-id GigabitEthernet0/0/2', 'mpls ldp router-id vrf vrf1 GigabitEthernet0/0/4', 'interface GigabitEthernet0/0/2', ' mpls ip', ' exit', ])) # Test VRF unconfig out = ldp.build_unconfig(apply=False, attributes='device_attr__*__vrf_attr') self.assertTrue( 'no mpls ldp router-id GigabitEthernet0/0/1' in str(out['PE1'])) self.assertTrue( 'no mpls ldp router-id GigabitEthernet0/0/2' in str(out['PE2'])) self.assertTrue('no mpls ldp router-id vrf vrf1 GigabitEthernet0/0/3' in str(out['PE1'])) self.assertTrue('no mpls ldp router-id vrf vrf1 GigabitEthernet0/0/4' in str(out['PE2'])) out2 = ldp.build_config(apply=False, attributes='device_attr__*__vrf_attr') self.assertTrue( 'mpls ldp router-id GigabitEthernet0/0/1' in str(out2['PE1'])) self.assertTrue( 'mpls ldp router-id GigabitEthernet0/0/2' in str(out2['PE2'])) self.assertTrue('mpls ldp router-id vrf vrf1 GigabitEthernet0/0/3' in str(out2['PE1'])) self.assertTrue('mpls ldp router-id vrf vrf1 GigabitEthernet0/0/4' in str(out2['PE2'])) # Check vrf config - vrf <vrf1> config filter out3 = ldp.build_config(apply=False, attributes='device_attr__*__vrf_attr__vrf1') self.assertTrue('mpls ldp router-id vrf vrf1 GigabitEthernet0/0/3' in str(out3['PE1'])) self.assertTrue('mpls ldp router-id vrf vrf1 GigabitEthernet0/0/4' in str(out3['PE2'])) # interface output from default vrf should not be built self.assertNotRegex(str(out['PE1']), '(?s)interface Gig') # Check vrf unconfig - vrf <vrf1> config filter out = ldp.build_unconfig(apply=False, attributes='device_attr__*__vrf_attr__vrf1') self.assertEqual( str(out['PE1']), 'no mpls ldp router-id vrf vrf1 GigabitEthernet0/0/3') self.assertEqual( str(out['PE2']), 'no mpls ldp router-id vrf vrf1 GigabitEthernet0/0/4') # Check vrf unconfig - vrf <vrf1> config filter out = ldp.build_unconfig( apply=False, attributes='device_attr__*__vrf_attr__*__router_id') self.assertTrue( 'no mpls ldp router-id GigabitEthernet0/0/1' in str(out['PE1'])) self.assertTrue( 'no mpls ldp router-id GigabitEthernet0/0/2' in str(out['PE2'])) self.assertTrue('no mpls ldp router-id vrf vrf1 GigabitEthernet0/0/3' in str(out['PE1'])) self.assertTrue('no mpls ldp router-id vrf vrf1 GigabitEthernet0/0/4' in str(out['PE2'])) # Check vrf unconfig - vrf <vrf1> config filter after adding router-id to vrf2 ldp.device_attr['PE2'].vrf_attr['vrf2'].router_id = self.i6 out = ldp.build_unconfig( apply=False, attributes='device_attr__*__vrf_attr__*__router_id') self.assertTrue( 'mpls ldp router-id GigabitEthernet0/0/1' in str(out['PE1'])) self.assertTrue( 'mpls ldp router-id GigabitEthernet0/0/2' in str(out['PE2'])) self.assertTrue('mpls ldp router-id vrf vrf1 GigabitEthernet0/0/3' in str(out['PE1'])) self.assertTrue('mpls ldp router-id vrf vrf1 GigabitEthernet0/0/4' in str(out['PE2'])) self.assertTrue('mpls ldp router-id vrf vrf2 GigabitEthernet0/0/6' in str(out['PE2'])) # Check vrf config - vrf <vrf2> config filter out3 = ldp.build_config(apply=False, attributes='device_attr__*__vrf_attr__vrf2') self.assertEqual(str(out3['PE2']), 'mpls ldp router-id vrf vrf2 GigabitEthernet0/0/6') def test_3_per_intf(self): acl1 = AccessList(name='1') acl2 = AccessList(name='2') acl3 = AccessList(name='3') acl4 = AccessList(name='4') acl5 = AccessList(name='5') acl6 = AccessList(name='6') acl7 = AccessList(name='7') acl8 = AccessList(name='8') acl9 = AccessList(name='9') acl11 = AccessList(name='11') acl22 = AccessList(name='22') acl33 = AccessList(name='33') acl44 = AccessList(name='44') ldp = Ldp() self.link.add_feature(ldp) self.link4.add_feature(ldp) ldp.hello_interval = 88 ldp.device_attr['PE2'].hello_holdtime = 99 # ==Test per interface config=== out = ldp.build_config(apply=False) if 1: self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'mpls label protocol ldp', 'mpls ip', 'mpls ldp discovery hello interval 88', 'interface GigabitEthernet0/0/1', ' mpls ip', ' exit', 'interface GigabitEthernet0/0/7', ' mpls ip', ' exit', ])) self.assertMultiLineEqual( str(out['PE2']), '\n'.join([ 'mpls label protocol ldp', 'mpls ip', 'mpls ldp discovery hello interval 88', 'mpls ldp discovery hello holdtime 99', 'interface GigabitEthernet0/0/2', ' mpls ip', ' exit', 'interface GigabitEthernet0/0/8', ' mpls ip', ' exit', ])) # Check intf unconfig - intf <GigabitEthernet0/0/0/8> config filter out = ldp.build_unconfig( apply=False, attributes='device_attr__*__interface_attr__GigabitEthernet0/0/8') self.assertMultiLineEqual( str(out['PE2']), '\n'.join([ 'interface GigabitEthernet0/0/8', ' no mpls ip', ' exit', ])) def test_4_per_neighbor(self): ldp = Ldp() self.link.add_feature(ldp) nbr1 = IPv4LsrNeighbor('1.2.3.4:0') nbr2 = IPv4LsrNeighbor('1.2.3.5:0') nbr3 = IPv4LsrNeighbor('1.2.3.6:0') ldp.device_attr['PE1'].password = '******' ldp.device_attr['PE2'].password = '******' ldp.device_attr['PE1'].vrf_attr['default'].neighbors = [ nbr1, nbr2, nbr3 ] ldp.device_attr['PE1'].vrf_attr['default'].neighbor_attr[ nbr2].password = '******' ldp.device_attr['PE1'].vrf_attr['default'].neighbor_attr[ nbr3].password = '******' # ==Test per neighbor config== out = ldp.build_config(apply=False) self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'mpls label protocol ldp', 'mpls ip', 'mpls ldp neighbor 1.2.3.4 password password1', 'mpls ldp neighbor 1.2.3.5 password blah', 'mpls ldp neighbor 1.2.3.6 password 060506324F41', 'interface GigabitEthernet0/0/1', ' mpls ip', ' exit', ])) self.assertMultiLineEqual( str(out['PE2']), '\n'.join([ 'mpls label protocol ldp', 'mpls ip', 'interface GigabitEthernet0/0/2', ' mpls ip', ' exit', ])) # Check nbr config - nbr <1.2.3.5:0'> config filter out = ldp.build_config( apply=False, attributes='device_attr__*__vrf_attr__*__neighbor_attr__1.2.3.5:0') self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'mpls ldp neighbor 1.2.3.5 password blah', ])) out = ldp.build_unconfig( apply=False, attributes= 'device_attr__*__vrf_attr__*__neighbor_attr__1.2.3.5:0__password') self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'no mpls ldp neighbor 1.2.3.5 password blah', ])) out = ldp.build_unconfig( apply=False, attributes= 'device_attr__*__vrf_attr__*__neighbor_attr__1.2.3.6:0__password') self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'no mpls ldp neighbor 1.2.3.6 password 060506324F41', ])) def test_8_per_vrf_per_neighbor(self): ldp = Ldp() self.link.add_feature(ldp) vrf = Vrf(name='vrf1') ldp.add_force_vrf(vrf) nbr1 = IPv4LsrNeighbor('1.2.3.4:0') nbr2 = IPv4LsrNeighbor('1.2.3.5:0') nbr3 = IPv4LsrNeighbor('1.2.3.6:0') ldp.device_attr['PE1'].vrf_attr['vrf1'].neighbors = [nbr1, nbr2, nbr3] ldp.device_attr['PE1'].vrf_attr['vrf1'].neighbor_attr[ '1.2.3.5:0'].password = '******' ldp.device_attr['PE1'].vrf_attr['vrf1'].neighbor_attr[ '1.2.3.6:0'].password = '******' # ==Test per vrf per neighbor config== out = ldp.build_config(apply=False) self.assertMultiLineEqual( str(out['PE1']), '\n'.join([ 'mpls label protocol ldp', 'mpls ip', 'mpls ldp neighbor vrf vrf1 1.2.3.5 password blah22', 'mpls ldp neighbor vrf vrf1 1.2.3.6 password 060506324F41', 'interface GigabitEthernet0/0/1', ' mpls ip', ' exit', ]))
class test_vrf(TestCase): def setUp(self): tb = Genie.testbed = Testbed() self.dev1 = Device(testbed=tb, name='PE1', os='iosxr') self.dev2 = Device(testbed=tb, name='PE2', os='iosxr') self.i1 = Interface(name='GigabitEthernet0/0/0/1', device=self.dev1) self.i2 = Interface(name='GigabitEthernet0/0/0/2', device=self.dev2) self.i3 = Interface(name='GigabitEthernet0/0/0/3', device=self.dev1) self.i4 = Interface(name='GigabitEthernet0/0/0/4', device=self.dev2) self.i5 = Interface(name='GigabitEthernet0/0/0/5', device=self.dev1) self.i6 = Interface(name='GigabitEthernet0/0/0/6', device=self.dev2) self.i7 = Interface(name='GigabitEthernet0/0/0/7', device=self.dev1) self.i8 = Interface(name='GigabitEthernet0/0/0/8', device=self.dev2) self.link = Link(name='1_2_1', testbed=tb) self.link.connect_interface(interface=self.i1) self.link.connect_interface(interface=self.i2) self.link2 = Link(name='1_2_2', testbed=tb) self.link2.connect_interface(interface=self.i3) self.link2.connect_interface(interface=self.i4) self.link3 = Link(name='1_2_3', testbed=tb) self.link3.connect_interface(interface=self.i5) self.link3.connect_interface(interface=self.i6) self.link4 = Link(name='1_2_4', testbed=tb) self.link4.connect_interface(interface=self.i7) self.link4.connect_interface(interface=self.i8) self.assertSetEqual(set(self.link.find_interfaces()), set([self.i1, self.i2])) self.assertSetEqual(set(self.dev1.find_interfaces()), set([self.i1, self.i3, self.i5, self.i7])) self.assertSetEqual(set(self.dev2.find_interfaces()), set([self.i2, self.i4, self.i6, self.i8])) def test_init(self): with self.subTest('name'): with self.assertRaises(TypeError): vrf = Vrf() with self.assertRaises(AssertionError): vrf = Vrf(name=123) vrf = Vrf(name='red') vrf2 = Vrf(name='blue') with self.subTest('fallback_vrf'): # fallback_vrf's type is defined post Vrf class; Make sure it works. self.assertIs(vrf.fallback_vrf, None) with self.assertRaises(ValueError): vrf.fallback_vrf = 123 self.assertIs(vrf.fallback_vrf, None) with self.assertRaises(ValueError): vrf.fallback_vrf = 'blue' self.assertIs(vrf.fallback_vrf, None) vrf.fallback_vrf = None self.assertIs(vrf.fallback_vrf, None) vrf.fallback_vrf = vrf2 self.assertIs(vrf.fallback_vrf, vrf2) def test_1_top_level(self): vrf = Vrf(name='vrf1') self.dev1.add_feature(vrf) self.dev2.add_feature(vrf) vrf.device_attr['PE1'].scale_mode = 'big' vrf.description = 'my description' cfgs = vrf.build_config(apply=False) self.assertMultiLineDictEqual( cfgs, { self.dev1.name: '\n'.join([ 'vrf vrf1', ' description my description', ' mode big', ' exit', ]), self.dev2.name: '\n'.join([ 'vrf vrf1', ' description my description', ' exit', ]), }) cfgs = vrf.build_config(apply=False, attributes='device_attr__*__description') self.assertMultiLineDictEqual( cfgs, { self.dev1.name: '\n'.join([ 'vrf vrf1', ' description my description', ' exit', ]), self.dev2.name: '\n'.join([ 'vrf vrf1', ' description my description', ' exit', ]), }) cfgs = vrf.build_config(apply=False, attributes={ 'device_attr': { '*': { 'description': None, }, }, }) self.assertMultiLineDictEqual( cfgs, { self.dev1.name: '\n'.join([ 'vrf vrf1', ' description my description', ' exit', ]), self.dev2.name: '\n'.join([ 'vrf vrf1', ' description my description', ' exit', ]), }) cfgs = vrf.build_config(apply=False, devices=[self.dev2], attributes={ 'device_attr': { '*': { 'description': None, }, }, }) self.assertMultiLineDictEqual( cfgs, { self.dev2.name: '\n'.join([ 'vrf vrf1', ' description my description', ' exit', ]), }) cfgs = vrf.build_config(apply=False, devices=[self.dev2], attributes={ 'device_attr': { self.dev1: { 'description': None, }, }, }) self.assertMultiLineDictEqual(cfgs, {}) cfgs = vrf.build_config(apply=False, devices=[self.dev2], attributes={ 'device_attr': { self.dev2: { 'description': None, }, }, }) self.assertMultiLineDictEqual( cfgs, { self.dev2.name: '\n'.join([ 'vrf vrf1', ' description my description', ' exit', ]), }) cfgs = vrf.build_config(apply=False, devices=[self.dev2], attributes={ 'device_attr': { self.dev2.name: { 'description': None, }, }, }) self.assertMultiLineDictEqual( cfgs, { self.dev2.name: '\n'.join([ 'vrf vrf1', ' description my description', ' exit', ]), }) def test_4_per_af(self): vrf = Vrf(name='vrf1') self.dev1.add_feature(vrf) vrf.address_families |= {AddressFamily.ipv6_unicast} vrf.device_attr['PE1'].address_family_attr[ 'ipv4 unicast'].export_route_targets = [ RouteTarget.ImportExport('100:200', stitching=True), ] cfgs = vrf.build_config(apply=False) self.assertMultiLineDictEqual( cfgs, { self.dev1.name: '\n'.join([ 'vrf vrf1', ' address-family ipv4 unicast', ' export route-target 100:200 stitching', ' exit', ' exit', ]), })
class test_isis(unittest.TestCase): def setUp(self): pass testbed = Genie.testbed = Testbed() self.dev1 = Device(testbed=testbed, name='PE1', os='iosxe') self.dev2 = Device(testbed=testbed, name='PE2', os='iosxe') self.intf1 = Interface(name='GigabitEthernet0/0/1', device=self.dev1) self.intf2 = Interface(name='GigabitEthernet0/0/2', device=self.dev2) self.link = Link(name='1_2_1', testbed=testbed) self.link.connect_interface(interface=self.intf1) self.link.connect_interface(interface=self.intf2) self.assertSetEqual(set(self.link.find_interfaces()), set([self.intf1, self.intf2])) self.assertSetEqual(set(self.dev1.find_interfaces()), set([self.intf1])) self.assertSetEqual(set(self.dev2.find_interfaces()), set([self.intf2])) isis = Isis("core") self.assertSetEqual(set(isis.devices), set([])) self.assertSetEqual(set(isis.links), set([])) self.link.add_feature(isis) for intf_iter in self.link.interfaces: intf_iter.add_feature(isis) self.assertCountEqual(isis.devices, [self.dev1, self.dev2]) self.assertSetEqual(set(isis.links), set([self.link])) self.assertSetEqual(set(isis.interfaces), set([self.intf1, self.intf2])) def test_IsisGlobal(self): isis = Isis("core") self.link.add_feature(isis) # Global ISIS config isis.nsr = True # override default for both devices isis.is_type = Isis.IsType.level_1 isis.device_attr['PE1'].is_type = Isis.IsType.level_1_2 isis.device_attr['PE2'].is_type = Isis.IsType.level_2 # use no default isis.device_attr['PE1'].nsf = Isis.Nsf.ietf isis.device_attr['PE2'].nsf = Isis.Nsf.cisco # override default for one device val = 1 isis.device_attr['PE1'].net_id = "00.0000.0000.000{}.00".format(val) val += 1 isis.device_attr['PE2'].net_id = "00.0000.0000.000{}.00".format(val) cfg1 = isis.build_config(apply=False) self.assertCountEqual(cfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(cfg1['PE1']), '\n'.join([ 'router isis core', ' is-type level-1-2', ' nsf ietf', ' nsr', ' net 00.0000.0000.0001.00', ' exit', 'interface GigabitEthernet0/0/1', ' ip router isis core', ' exit', ])) self.assertMultiLineEqual( str(cfg1['PE2']), '\n'.join([ 'router isis core', ' is-type level-2-only', ' nsf cisco', ' nsr', ' net 00.0000.0000.0002.00', ' exit', 'interface GigabitEthernet0/0/2', ' ip router isis core', ' exit', ])) uncfg1 = isis.build_unconfig(apply=False) self.assertCountEqual(uncfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(uncfg1['PE1']), '\n'.join([ 'no router isis core', 'interface GigabitEthernet0/0/1', ' no ip router isis core', ' exit', ])) self.assertMultiLineEqual( str(uncfg1['PE2']), '\n'.join([ 'no router isis core', 'interface GigabitEthernet0/0/2', ' no ip router isis core', ' exit', ])) partial_cfg1 = isis.build_config(apply=False, attributes='device_attr__PE1__nsf') self.assertCountEqual(partial_cfg1.keys(), ['PE1']) self.assertMultiLineEqual( str(partial_cfg1['PE1']), '\n'.join([ 'router isis core', ' nsf ietf', ' exit', ])) def test_IsisPerAddrFamily(self): isis = Isis("core") self.link.add_feature(isis) val = 1 isis.device_attr['PE1'].net_id = "00.0000.0000.000{}.00".format(val) val += 1 isis.device_attr['PE2'].net_id = "00.0000.0000.000{}.00".format(val) # per address family ISIS isis.device_attr['PE1'].address_family_attr[ 'ipv4 unicast'].metric_style = "wide" isis.device_attr['PE1'].address_family_attr[ 'ipv4 unicast'].mpls_te_level = Isis.IsType.level_1 isis.device_attr['PE1'].address_family_attr[ 'ipv4 unicast'].mpls_te_rtrid = self.intf1 isis.device_attr['PE2'].address_family_attr[ 'ipv4 unicast'].metric_style = "narrow" isis.device_attr['PE2'].address_family_attr[ 'ipv4 unicast'].mpls_te_level = Isis.IsType.level_2 isis.device_attr['PE2'].address_family_attr[ 'ipv4 unicast'].mpls_te_rtrid = self.intf2 cfg1 = isis.build_config(apply=False) self.assertMultiLineEqual( str(cfg1['PE1']), '\n'.join([ 'router isis core', ' net 00.0000.0000.0001.00', ' metric-style wide', ' mpls traffic-eng level-1', ' mpls traffic-eng router-id GigabitEthernet0/0/1', ' exit', 'interface GigabitEthernet0/0/1', ' ip router isis core', ' exit', ])) self.assertMultiLineEqual( str(cfg1['PE2']), '\n'.join([ 'router isis core', ' net 00.0000.0000.0002.00', ' metric-style narrow', ' mpls traffic-eng level-2', ' mpls traffic-eng router-id GigabitEthernet0/0/2', ' exit', 'interface GigabitEthernet0/0/2', ' ip router isis core', ' exit', ])) isis.address_families = set( [AddressFamily.ipv4_unicast, AddressFamily.ipv6_unicast]) isis.device_attr['PE1'].address_family_attr[ 'ipv6 unicast'].metric_style = "wide" isis.device_attr['PE2'].address_family_attr[ 'ipv6 unicast'].metric_style = "narrow" cfg2 = isis.build_config(apply=False) self.assertMultiLineEqual( str(cfg2['PE1']), '\n'.join([ 'router isis core', ' net 00.0000.0000.0001.00', ' metric-style wide', ' mpls traffic-eng level-1', ' mpls traffic-eng router-id GigabitEthernet0/0/1', ' address-family ipv6 unicast', ' metric-style wide', ' exit', ' exit', 'interface GigabitEthernet0/0/1', ' ip router isis core', ' ipv6 router isis core', ' exit', ])) self.assertMultiLineEqual( str(cfg2['PE2']), '\n'.join([ 'router isis core', ' net 00.0000.0000.0002.00', ' metric-style narrow', ' mpls traffic-eng level-2', ' mpls traffic-eng router-id GigabitEthernet0/0/2', ' address-family ipv6 unicast', ' metric-style narrow', ' exit', ' exit', 'interface GigabitEthernet0/0/2', ' ip router isis core', ' ipv6 router isis core', ' exit', ])) uncfg2 = isis.build_unconfig(apply=False) self.assertMultiLineEqual( str(uncfg2['PE1']), '\n'.join([ 'no router isis core', 'interface GigabitEthernet0/0/1', ' no ip router isis core', ' no ipv6 router isis core', ' exit', ])) self.assertMultiLineEqual( str(uncfg2['PE2']), '\n'.join([ 'no router isis core', 'interface GigabitEthernet0/0/2', ' no ip router isis core', ' no ipv6 router isis core', ' exit', ])) partial_uncfg2 = isis.build_unconfig( apply=False, attributes='device_attr__*__address_family_attr__*') self.assertMultiLineEqual( str(partial_uncfg2['PE1']), '\n'.join([ 'router isis core', ' no metric-style wide', ' no mpls traffic-eng level-1', ' no mpls traffic-eng router-id GigabitEthernet0/0/1', ' no address-family ipv4 unicast', ' no address-family ipv6 unicast', ' exit', ])) self.assertMultiLineEqual( str(partial_uncfg2['PE2']), '\n'.join([ 'router isis core', ' no metric-style narrow', ' no mpls traffic-eng level-2', ' no mpls traffic-eng router-id GigabitEthernet0/0/2', ' no address-family ipv4 unicast', ' no address-family ipv6 unicast', ' exit', ])) partial_cfg21 = isis.build_config( apply=False, attributes= 'device_attr__PE1__address_family_attr__ipv4 unicast__metric_style' ) self.assertMultiLineEqual( str(partial_cfg21['PE1']), '\n'.join([ 'router isis core', ' metric-style wide', ' exit', ])) partial_uncfg21 = isis.build_unconfig( apply=False, attributes= 'device_attr__PE1__address_family_attr__ipv4 unicast__metric_style' ) self.assertMultiLineEqual( str(partial_uncfg21['PE1']), '\n'.join([ 'router isis core', ' no metric-style wide', ' exit', ])) partial_cfg22 = isis.build_config( apply=False, attributes= 'device_attr__PE1__address_family_attr__ipv6 unicast__metric_style' ) self.assertMultiLineEqual( str(partial_cfg22['PE1']), '\n'.join([ 'router isis core', ' address-family ipv6 unicast', ' metric-style wide', ' exit', ' exit', ])) partial_uncfg22 = isis.build_unconfig( apply=False, attributes= 'device_attr__PE1__address_family_attr__ipv6 unicast__metric_style' ) self.assertMultiLineEqual( str(partial_uncfg22['PE1']), '\n'.join([ 'router isis core', ' address-family ipv6 unicast', ' no metric-style wide', ' exit', ' exit', ])) def test_IsisPerInterface(self): isis = Isis("core") self.link.add_feature(isis) for intf_iter in self.link.interfaces: intf_iter.add_feature(isis) val = 1 isis.device_attr['PE1'].net_id = "00.0000.0000.000{}.00".format(val) val += 1 isis.device_attr['PE2'].net_id = "00.0000.0000.000{}.00".format(val) # per interface ISIS isis.device_attr['PE1'].interface_attr[self.intf1].passive = True isis.device_attr['PE1'].interface_attr[self.intf1].metric = 20 isis.device_attr['PE2'].interface_attr[ self.intf2].point_to_point = True cfg1 = isis.build_config(apply=False) self.assertMultiLineEqual( str(cfg1['PE1']), '\n'.join([ 'router isis core', ' net 00.0000.0000.0001.00', ' passive-interface GigabitEthernet0/0/1', ' exit', 'interface GigabitEthernet0/0/1', ' ip router isis core', ' isis metric 20', ' exit', ])) self.assertMultiLineEqual( str(cfg1['PE2']), '\n'.join([ 'router isis core', ' net 00.0000.0000.0002.00', ' exit', 'interface GigabitEthernet0/0/2', ' ip router isis core', ' isis network point-to-point', ' exit', ])) isis.address_families = set( [AddressFamily.ipv4_unicast, AddressFamily.ipv6_unicast]) cfg2 = isis.build_config(apply=False) self.assertMultiLineEqual( str(cfg2['PE1']), '\n'.join([ 'router isis core', ' net 00.0000.0000.0001.00', ' passive-interface GigabitEthernet0/0/1', ' exit', 'interface GigabitEthernet0/0/1', ' ip router isis core', ' ipv6 router isis core', ' isis metric 20', ' exit', ])) self.assertMultiLineEqual( str(cfg2['PE2']), '\n'.join([ 'router isis core', ' net 00.0000.0000.0002.00', ' exit', 'interface GigabitEthernet0/0/2', ' ip router isis core', ' ipv6 router isis core', ' isis network point-to-point', ' exit', ])) partial_cfg21 = isis.build_config( apply=False, attributes='device_attr__*__interface_attr__*__metric') self.assertMultiLineEqual( str(partial_cfg21['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' isis metric 20', ' exit', ])) partial_cfg22 = isis.build_config( apply=False, attributes= 'device_attr__*__interface_attr__*__address_family_attr__ipv6 unicast' ) self.assertMultiLineEqual( str(partial_cfg22['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' ipv6 router isis core', ' exit', ]))
class test_rsvp(TestCase): def setUp(self): tb = Genie.testbed = Testbed() self.dev1 = Device(testbed=tb, name='PE1', os='iosxr') self.dev2 = Device(testbed=tb, name='PE2', os='iosxr') self.i1 = Interface(name='GigabitEthernet0/0/0/1', device=self.dev1) self.i2 = Interface(name='GigabitEthernet0/0/0/2', device=self.dev2) self.i3 = Interface(name='GigabitEthernet0/0/0/3', device=self.dev1) self.i4 = Interface(name='GigabitEthernet0/0/0/4', device=self.dev2) self.i5 = Interface(name='GigabitEthernet0/0/0/5', device=self.dev1) self.i6 = Interface(name='GigabitEthernet0/0/0/6', device=self.dev2) self.i7 = Interface(name='GigabitEthernet0/0/0/7', device=self.dev1) self.i8 = Interface(name='GigabitEthernet0/0/0/8', device=self.dev2) self.link = Link(name='1_2_1') self.link.connect_interface(interface=self.i1) self.link.connect_interface(interface=self.i2) self.link2 = Link(name='1_2_2') self.link2.connect_interface(interface=self.i3) self.link2.connect_interface(interface=self.i4) self.link3 = Link(name='1_2_3') self.link3.connect_interface(interface=self.i5) self.link3.connect_interface(interface=self.i6) self.link4 = Link(name='1_2_4') self.link4.connect_interface(interface=self.i7) self.link4.connect_interface(interface=self.i8) self.assertCountEqual(self.link.find_interfaces(), [self.i1, self.i2]) self.assertCountEqual(self.dev1.find_interfaces(), [self.i1, self.i3, self.i5, self.i7]) self.assertCountEqual(self.dev2.find_interfaces(), [self.i2, self.i4, self.i6, self.i8]) def test_0_interface_only(self): rsvp = Rsvp() self.assertCountEqual(rsvp.devices, []) self.assertCountEqual(rsvp.links, []) self.assertCountEqual(rsvp.interfaces, []) self.link.add_feature(rsvp) self.link2.add_feature(rsvp) self.link3.add_feature(rsvp) self.link4.add_feature(rsvp) self.assertCountEqual(rsvp.devices, [self.dev1, self.dev2]) self.assertCountEqual(rsvp.links, [self.link, self.link2, self.link3, self.link4]) self.assertCountEqual(rsvp.interfaces, [ self.i1, self.i2, self.i3, self.i4, self.i5, self.i6, self.i7, self.i8 ]) rsvp.device_attr[self.i1.device].interface_attr[ self.i1].rdm_bw_total = None rsvp.device_attr[self.i1.device].interface_attr[ self.i3].rdm_bw_cli_rdm_kw = False rsvp.device_attr[self.i1.device].interface_attr[ self.i5].rdm_bw_cli_style = Rsvp.RdmBwCliStyle.bc0_bc1 rsvp.device_attr[self.i1.device].interface_attr[ self.i7].rdm_bw_cli_style = Rsvp.RdmBwCliStyle.global_subpool cfgs = rsvp.build_config(apply=False) self.assertMultiLineDictEqual( cfgs, { self.dev1.name: '\n'.join([ 'rsvp', ' interface GigabitEthernet0/0/0/1', ' exit', ' interface GigabitEthernet0/0/0/3', ' bandwidth 20000 20000', ' exit', ' interface GigabitEthernet0/0/0/5', ' bandwidth rdm bc0 20000 20000', ' exit', ' interface GigabitEthernet0/0/0/7', ' bandwidth rdm global-pool 20000 20000', ' exit', ' exit', ]), self.dev2.name: '\n'.join([ 'rsvp', ' interface GigabitEthernet0/0/0/2', ' bandwidth rdm 20000 20000', ' exit', ' interface GigabitEthernet0/0/0/4', ' bandwidth rdm 20000 20000', ' exit', ' interface GigabitEthernet0/0/0/6', ' bandwidth rdm 20000 20000', ' exit', ' interface GigabitEthernet0/0/0/8', ' bandwidth rdm 20000 20000', ' exit', ' exit', ]), })
def test_basic_uncfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxr') dev2 = Device(testbed=testbed, name='PE2', os='iosxr') intf1 = Interface(name='GigabitEthernet0/0/1', device=dev1) intf2 = Interface(name='GigabitEthernet0/0/2', device=dev2) intf3 = Interface(name='GigabitEthernet0/0/3', device=dev1) link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() link.add_feature(vlan) # Defining attributes section vlan.device_attr[dev1] vlan.device_attr[dev2] vlan.device_attr[dev1].interface_attr[intf1] vlan.device_attr[dev1].interface_attr[intf1].eth_encap_type1 = 'dot1q' vlan.device_attr[dev1].interface_attr[intf1].eth_encap_val1 = 2 vlan.device_attr[dev1].interface_attr[ intf1].eth_encap_type2 = 'second-dot1q' vlan.device_attr[dev1].interface_attr[intf1].eth_encap_val2 = 5 # Unconfig testing # Set a mock dev1.cli = Mock() dev1.configure = Mock() dev2.cli = Mock() dev2.configure = Mock() dev1.add_feature(vlan) dev2.add_feature(vlan) # Mock config output = vlan.build_config(apply=True) uncfg = vlan.build_unconfig(apply=False) self.assertMultiLineEqual( str(uncfg['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no encapsulation dot1q 2 second-dot1q 5', ' exit', ])) all_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={'device_attr':\ {'*':{'interface_attr':'*'}}}) self.assertCountEqual(all_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(all_vlan_interface_uncfg['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no encapsulation dot1q 2 second-dot1q 5', ' exit', ])) partial_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={'device_attr':\ {'*':{'interface_attr':\ {'*':"eth_encap_type1"}}}}) self.assertCountEqual(partial_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_vlan_interface_uncfg['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no encapsulation dot1q 2 second-dot1q 5', ' exit', ]))
def test_basic_cfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') dev2 = Device(testbed=testbed, name='PE2', os='iosxe') intf1 = Interface(name='GigabitEthernet0/0/1',device=dev1) intf2 = Interface(name='GigabitEthernet0/0/2',device=dev2) intf3 = Interface(name='Vlan100',device=dev1) link = Link(name='1_2_1',testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() link.add_feature(vlan) vlan.vlan_id = 100 access_map_id = 'ed' vlan_configuration_id = '3' vlan.device_attr[dev1] vlan.device_attr[dev2] vlan.device_attr[dev1].interface_attr[intf1].switchport_mode = \ 'trunk' vlan.device_attr[dev1].interface_attr[intf1].sw_trunk_allowed_vlan = \ '200-201' vlan.device_attr[dev1].access_map_attr[access_map_id] vlan.device_attr[dev2].access_map_attr[access_map_id] vlan.device_attr[dev1].vlan_configuration_attr[vlan_configuration_id] vlan.device_attr[dev2].vlan_configuration_attr[vlan_configuration_id] # Defining attributes section vlan.shutdown = False with self.assertRaises(ValueError): vlan.media = 'invalid' vlan.media = 'enet' self.assertIs(type(vlan.media), Vlan.Media) vlan.accounting_type = 'input' vlan.device_attr[dev1].access_map_action = 'drop' vlan.datalink_flow_monitor = True vlan.private_vlan_type = 'association' vlan.private_vlan_association_action = 'add' vlan.private_vlan_association_ids = '201,205' cfg1 = vlan.build_config(apply=False) self.assertCountEqual(cfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(cfg1['PE1']), '\n'.join([ 'vlan 100', ' media enet', ' no shutdown', ' private-vlan association add 201,205', ' exit', 'vlan accounting input', 'vlan access-map ed', ' action drop', ' exit', 'vlan configuration 3', ' datalink flow monitor', ' exit', 'interface GigabitEthernet0/0/1', ' switchport mode trunk', ' switchport trunk allowed vlan 200-201', ' exit', ])) self.assertMultiLineEqual( str(cfg1['PE2']), '\n'.join([ 'vlan 100', ' media enet', ' no shutdown', ' private-vlan association add 201,205', ' exit', 'vlan accounting input', 'vlan access-map ed', ' exit', 'vlan configuration 3', ' datalink flow monitor', ' exit', ]))
def test_basic_uncfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') dev2 = Device(testbed=testbed, name='PE2', os='nxos') intf1 = Interface(name='Ethernet0/0/1', device=dev1, layer=Layer.L3) intf2 = Interface(name='Ethernet0/0/2', device=dev2, layer=Layer.L2) link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() link.add_feature(vlan) vlan.vlan_id = 100 access_map_id = 'ed' vlan_configuration_id = '3' vlan.device_attr[dev1] vlan.device_attr[dev2] vlan.device_attr[dev1].access_map_attr[access_map_id] vlan.device_attr[dev2].access_map_attr[access_map_id] vlan.device_attr[dev1].interface_attr[intf1] vlan.device_attr[dev2].interface_attr[intf2] vlan.device_attr[dev2].interface_attr[intf2].switchport_mode = \ L2_type.TRUNK vlan.device_attr[dev2].interface_attr[intf2].sw_trunk_allowed_vlan = \ '200-201' vlan.device_attr[dev1].vlan_configuration_attr[vlan_configuration_id] vlan.device_attr[dev2].vlan_configuration_attr[vlan_configuration_id] # Defining attributes section vlan.shutdown = False with self.assertRaises(ValueError): vlan.media = 'invalid' vlan.media = 'enet' self.assertIs(type(vlan.media), Vlan.Media) vlan.egress_port_channel_load_balance_random = True vlan.device_attr[dev1].access_map_action = 'drop' vlan.datalink_flow_monitor = True # Unconfig testing # Set a mock dev1.cli = Mock() dev1.configure = Mock() dev2.cli = Mock() dev2.configure = Mock() dev1.add_feature(vlan) dev2.add_feature(vlan) # Mock config output = vlan.build_config(apply=True) uncfg1 = vlan.build_unconfig(apply=False) self.assertCountEqual(uncfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(uncfg1['PE1']), '\n'.join([ 'no vlan 100', 'no vlan access-map ed', 'no vlan configuration 3', ])) self.assertMultiLineEqual( str(uncfg1['PE2']), '\n'.join([ 'no vlan 100', 'no vlan access-map ed', 'no vlan configuration 3', 'interface Ethernet0/0/2', ' no switchport mode trunk', ' no switchport trunk allowed vlan 200-201', ' exit', ])) partial_uncfg1 = vlan.build_unconfig(apply=False, attributes={'device_attr': \ {'*': "media"}}) self.assertCountEqual(partial_uncfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_uncfg1['PE1']), '\n'.join([ 'vlan 100', ' no media enet', ' exit', ])) partial_unconfigure = vlan.build_unconfig(apply=False, attributes={'device_attr': \ {'*': {'access_map_attr': \ {'*': "access_map_action"}}}}) self.assertCountEqual(partial_unconfigure.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_unconfigure['PE1']), '\n'.join([ 'vlan access-map ed', ' no action drop', ' exit', ])) all_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={ \ 'device_attr': {'*': { \ 'interface_attr': '*'}}}) self.assertCountEqual(all_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(all_vlan_interface_uncfg['PE2']), '\n'.join([ 'interface Ethernet0/0/2', ' no switchport mode trunk', ' no switchport trunk allowed vlan 200-201', ' exit', ])) partial_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={ \ 'device_attr': {'*': \ {'interface_attr': \ { '*': "sw_trunk_allowed_vlan"}}}}) self.assertCountEqual(partial_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_vlan_interface_uncfg['PE2']), '\n'.join([ 'interface Ethernet0/0/2', ' no switchport trunk allowed vlan 200-201', ' exit', ]))
class test_rsvp(TestCase): def setUp(self): tb = Genie.testbed = Testbed() self.dev1 = Device(testbed=tb, name='PE1', os='iosxe') self.dev2 = Device(testbed=tb, name='PE2', os='iosxe') self.i1 = Interface(name='GigabitEthernet0/0/1', device=self.dev1) self.i2 = Interface(name='GigabitEthernet0/0/2', device=self.dev2) self.i3 = Interface(name='GigabitEthernet0/0/3', device=self.dev1) self.i4 = Interface(name='GigabitEthernet0/0/4', device=self.dev2) self.i5 = Interface(name='GigabitEthernet0/0/5', device=self.dev1) self.i6 = Interface(name='GigabitEthernet0/0/6', device=self.dev2) self.i7 = Interface(name='GigabitEthernet0/0/7', device=self.dev1) self.i8 = Interface(name='GigabitEthernet0/0/8', device=self.dev2) self.link = Link(name='1_2_1') self.link.connect_interface(interface=self.i1) self.link.connect_interface(interface=self.i2) self.link2 = Link(name='1_2_2') self.link2.connect_interface(interface=self.i3) self.link2.connect_interface(interface=self.i4) self.link3 = Link(name='1_2_3') self.link3.connect_interface(interface=self.i5) self.link3.connect_interface(interface=self.i6) self.link4 = Link(name='1_2_4') self.link4.connect_interface(interface=self.i7) self.link4.connect_interface(interface=self.i8) self.assertCountEqual(self.link.find_interfaces(), [self.i1, self.i2]) self.assertCountEqual(self.dev1.find_interfaces(), [self.i1, self.i3, self.i5, self.i7]) self.assertCountEqual(self.dev2.find_interfaces(), [self.i2, self.i4, self.i6, self.i8]) def test_0_interface_only(self): rsvp = Rsvp() self.assertCountEqual(rsvp.devices, []) self.assertCountEqual(rsvp.links, []) self.assertCountEqual(rsvp.interfaces, []) self.link.add_feature(rsvp) self.link2.add_feature(rsvp) self.link3.add_feature(rsvp) self.link4.add_feature(rsvp) self.assertCountEqual(rsvp.devices, [self.dev1, self.dev2]) self.assertCountEqual(rsvp.links, [self.link, self.link2, self.link3, self.link4]) self.assertCountEqual(rsvp.interfaces, [ self.i1, self.i2, self.i3, self.i4, self.i5, self.i6, self.i7, self.i8 ]) rsvp.enable_default_bw = True cfgs = rsvp.build_config(apply=False) self.assertMultiLineEqual( str(cfgs['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/3', ' ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/5', ' ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/7', ' ip rsvp bandwidth', ' exit', ])) self.assertMultiLineEqual( str(cfgs['PE2']), '\n'.join([ 'interface GigabitEthernet0/0/2', ' ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/4', ' ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/6', ' ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/8', ' ip rsvp bandwidth', ' exit', ])) uncfgs = rsvp.build_unconfig(apply=False) self.assertMultiLineEqual( str(uncfgs['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/3', ' no ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/5', ' no ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/7', ' no ip rsvp bandwidth', ' exit', ])) self.assertMultiLineEqual( str(uncfgs['PE2']), '\n'.join([ 'interface GigabitEthernet0/0/2', ' no ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/4', ' no ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/6', ' no ip rsvp bandwidth', ' exit', 'interface GigabitEthernet0/0/8', ' no ip rsvp bandwidth', ' exit', ]))
class test_isis(unittest.TestCase): def setUp(self): testbed = Genie.testbed = Testbed() self.dev1 = Device(testbed=testbed, name='PE1', os='iosxr') self.dev2 = Device(testbed=testbed, name='PE2', os='iosxr') self.intf1 = Interface(name='GigabitEthernet0/0/0/1', device=self.dev1) self.intf2 = Interface(name='GigabitEthernet0/0/0/2', device=self.dev2) self.link = Link(name='1_2_1', testbed=testbed) self.link.connect_interface(interface=self.intf1) self.link.connect_interface(interface=self.intf2) def test_init(self): isis = Isis("core") self.assertCountEqual(isis.devices, []) self.assertCountEqual(isis.interfaces, []) self.assertCountEqual(isis.links, []) self.link.add_feature(isis) for intf_iter in self.link.interfaces: intf_iter.add_feature(isis) self.assertCountEqual(isis._devices_with_feature(), [self.dev1, self.dev2]) self.assertCountEqual(isis._interfaces_with_feature(), [self.intf1, self.intf2]) self.assertCountEqual(isis._links_with_feature(), [self.link]) self.assertCountEqual(isis.devices, [self.dev1, self.dev2]) self.assertCountEqual(isis.interfaces, [self.intf1, self.intf2]) self.assertCountEqual(isis.links, [self.link]) def test_IsisGlobal(self): isis = Isis("core") self.link.add_feature(isis) self.assertCountEqual(isis.devices, [self.dev1, self.dev2]) self.assertCountEqual(isis.interfaces, [self.intf1, self.intf2]) self.assertCountEqual(isis.links, [self.link]) # Global ISIS config isis.nsr = True isis.nsf_lifetime = 5 # override default for both devices isis.is_type = Isis.IsType.level_1 isis.device_attr['PE1'].is_type = Isis.IsType.level_1_2 isis.device_attr['PE2'].is_type = Isis.IsType.level_2 # use no default isis.device_attr['PE1'].nsf = Isis.Nsf.ietf isis.device_attr['PE2'].nsf = Isis.Nsf.cisco # override default for one device isis.lsp_mtu = 1400 isis.device_attr['PE1'].lsp_mtu = 1500 val = 1 isis.device_attr['PE1'].net_id = "00.0000.0000.000{}.00".format(val) val += 1 isis.device_attr['PE2'].net_id = "00.0000.0000.000{}.00".format(val) cfg1 = isis.build_config(apply=False) #print("\nPE1 config\n" + str(cfg1['PE1'])) #print("\nPE2 config\n" + str(cfg1['PE2'])) self.assertCountEqual(cfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(cfg1['PE1']), '\n'.join([ 'router isis core', ' is-type level-1-2', ' lsp-mtu 1500', ' net 00.0000.0000.0001.00', ' nsf ietf', ' nsf lifetime 5', ' nsr', ' address-family ipv4 unicast', ' exit', ' interface GigabitEthernet0/0/0/1', ' address-family ipv4 unicast', ' exit', ' exit', ' exit', ])) self.assertMultiLineEqual( str(cfg1['PE2']), '\n'.join([ 'router isis core', ' is-type level-2-only', ' lsp-mtu 1400', ' net 00.0000.0000.0002.00', ' nsf cisco', ' nsf lifetime 5', ' nsr', ' address-family ipv4 unicast', ' exit', ' interface GigabitEthernet0/0/0/2', ' address-family ipv4 unicast', ' exit', ' exit', ' exit', ])) def test_IsisPerAddrFamily(self): isis = Isis("core") self.link.add_feature(isis) # per address family ISIS isis.device_attr['PE1'].address_family_attr[ 'ipv4 unicast'].metric_style = "wide" isis.device_attr['PE1'].address_family_attr[ 'ipv4 unicast'].mpls_te_level = Isis.IsType.level_1 isis.device_attr['PE1'].address_family_attr[ 'ipv4 unicast'].mpls_te_rtrid = self.intf1 isis.device_attr['PE1'].address_family_attr[ 'ipv4 unicast'].redistribute_connected = True isis.device_attr['PE2'].address_family_attr[ 'ipv4 unicast'].metric_style = "narrow" isis.device_attr['PE2'].address_family_attr[ 'ipv4 unicast'].mpls_te_level = Isis.IsType.level_2 isis.device_attr['PE2'].address_family_attr[ 'ipv4 unicast'].mpls_te_rtrid = self.intf2 cfg1 = isis.build_config(apply=False) #print("\nPE1 config\n" + str(cfg1['PE1'])) #print("\nPE2 config\n" + str(cfg1['PE2'])) self.assertMultiLineEqual( str(cfg1['PE1']), '\n'.join([ 'router isis core', ' net 47.6B8D.854F.FFFF.4F2D.4CD8.00', ' address-family ipv4 unicast', ' metric-style wide', ' mpls traffic-eng level-1', ' mpls traffic-eng router-id GigabitEthernet0/0/0/1', ' redistribute connected', ' exit', ' interface GigabitEthernet0/0/0/1', ' address-family ipv4 unicast', ' exit', ' exit', ' exit', ])) self.assertMultiLineEqual( str(cfg1['PE2']), '\n'.join([ 'router isis core', ' net 47.6B8D.854F.FFFF.D624.1D62.00', ' address-family ipv4 unicast', ' metric-style narrow', ' mpls traffic-eng level-2-only', ' mpls traffic-eng router-id GigabitEthernet0/0/0/2', ' exit', ' interface GigabitEthernet0/0/0/2', ' address-family ipv4 unicast', ' exit', ' exit', ' exit', ])) def test_IsisPerInterface(self): isis = Isis("core") self.link.add_feature(isis) for intf_iter in self.link.interfaces: intf_iter.add_feature(isis) # per interface ISIS isis.device_attr['PE1'].interface_attr[self.intf1].passive = True isis.device_attr['PE1'].interface_attr[self.intf1].shutdown = True isis.device_attr['PE2'].interface_attr[ self.intf2].point_to_point = True cfg1 = isis.build_config(apply=False) #print("\nPE1 config\n" + str(cfg1['PE1'])) #print("\nPE2 config\n" + str(cfg1['PE2'])) self.assertMultiLineEqual( str(cfg1['PE1']), '\n'.join([ 'router isis core', ' net 47.6B8D.854F.FFFF.4F2D.4CD8.00', ' address-family ipv4 unicast', ' exit', ' interface GigabitEthernet0/0/0/1', ' passive', ' shutdown', ' address-family ipv4 unicast', ' exit', ' exit', ' exit', ])) self.assertMultiLineEqual( str(cfg1['PE2']), '\n'.join([ 'router isis core', ' net 47.6B8D.854F.FFFF.D624.1D62.00', ' address-family ipv4 unicast', ' exit', ' interface GigabitEthernet0/0/0/2', ' point-to-point', ' address-family ipv4 unicast', ' exit', ' exit', ' exit', ])) def test_IsisPerInterfacePerAddressFamily(self): # No attributes defined yet if 0: # per interface per address family ISIS isis.device_attr['PE1'].interface_attr[ self.intf1].address_family_attr['ipv4 unicast'].attr = "value" isis.device_attr['PE1'].interface_attr[ self.intf1].address_family_attr['ipv4 unicast'].attr = "value" cfg1 = isis.build_config(apply=False) self.assertMultiLineEqual(str(cfg1['PE1']), '\n'.join([ 'router isis 100', ])) self.assertMultiLineEqual(str(cfg1['PE2']), '\n'.join([ 'router isis 100', ])) def test_NET(self): isis = Isis("core") self.assertEqual(isis.system_id, None) self.assertEqual(isis.device_attr[self.dev1].system_id, 'FFFF.4F2D.4CD8') # "PE1" self.assertEqual(isis.device_attr[self.dev2].system_id, 'FFFF.D624.1D62') # "PE2" isis.system_id = '0000.0000.0001' self.assertEqual(isis.device_attr[self.dev1].system_id, '0000.0000.0001') self.assertEqual(isis.device_attr[self.dev2].system_id, '0000.0000.0001') del isis.system_id self.assertEqual(isis.system_id, None) self.assertEqual(isis.device_attr[self.dev1].system_id, 'FFFF.4F2D.4CD8') # "PE1" self.assertEqual(isis.device_attr[self.dev2].system_id, 'FFFF.D624.1D62') # "PE2" self.assertEqual(isis.area_address, '47.6B8D.854F') # "core" self.assertEqual(isis.device_attr[self.dev1].area_address, '47.6B8D.854F') # "core" self.assertEqual(isis.device_attr[self.dev2].area_address, '47.6B8D.854F') # "core" isis.area_address = '47.0000.0000' self.assertEqual(isis.area_address, '47.0000.0000') self.assertEqual(isis.device_attr[self.dev1].area_address, '47.0000.0000') self.assertEqual(isis.device_attr[self.dev2].area_address, '47.0000.0000') isis.area_address = None self.assertEqual(isis.area_address, None) self.assertEqual(isis.device_attr[self.dev1].area_address, '47.4F2D.4CD8') # "PE1" self.assertEqual(isis.device_attr[self.dev2].area_address, '47.D624.1D62') # "PE2" del isis.area_address self.assertEqual(isis.area_address, '47.6B8D.854F') # "core" self.assertEqual(isis.device_attr[self.dev1].area_address, '47.6B8D.854F') # "core" self.assertEqual(isis.device_attr[self.dev2].area_address, '47.6B8D.854F') # "core" self.assertEqual(isis.device_attr[self.dev1].net_id, '47.6B8D.854F.FFFF.4F2D.4CD8.00') # "core"."PE1".00 self.assertEqual(isis.device_attr[self.dev2].net_id, '47.6B8D.854F.FFFF.D624.1D62.00') # "core"."PE2".00