def test_init(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxr') intf1 = Interface(device=dev1, name='GigabitEthernet0/0/0/1') intf2 = Interface(device=dev1, name='GigabitEthernet0/0/0/2') dev2 = Device(testbed=testbed, name='PE2', os='iosxr') intf3 = Interface(device=dev2, name='GigabitEthernet0/0/0/3') intf4 = Interface(device=dev2, name='GigabitEthernet0/0/0/4') with self.assertNoWarnings(): Genie.testbed = None with self.assertRaises(TypeError): evpn = Evpn() evpn = Evpn(testbed=testbed) self.assertIs(evpn.testbed, testbed) Genie.testbed = testbed evpn = Evpn() self.assertIs(evpn.testbed, Genie.testbed) self.assertIs(evpn.testbed, testbed) self.assertIsNone(getattr(dev1, 'evpn', None)) self.assertIsNone(getattr(intf1, 'evpn', None)) intf1.add_feature(evpn) self.assertIs(intf1.evpn, evpn) # TODO self.assertIs(dev1.evpn, evpn) self.assertIsNone(getattr(dev1, 'evpn', None)) dev1.add_feature(evpn) self.assertIs(dev1.evpn, evpn)
def test_remove_vrf_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') vrf1 = Vrf(name='blue') intf1 = Interface(device=dev1, name='Ethernet0/0', vrf=vrf1) rip = Rip(instance_id=5) rip.add_force_vrf(None) dev1.add_feature(rip) dev2.add_feature(rip) intf1.add_feature(rip) # Configure rip rip.device_attr['dev1'].vrf_attr['blue'].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' ' exit\n' ' vrf blue\n' ' address-family ipv4 unicast\n' ' distance 5\n' ' exit\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__blue__address_family_attr__ipv4 unicast', apply=False) self.assertMultiLineDictEqual(output, {'dev1': 'router rip 5\n' ' vrf blue\n' ' no address-family ipv4 unicast\n' ' exit\n' ' exit'})
def test_cfg(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) rip.device_attr['PE1'] output = rip.build_config(apply=False) self.assertMultiLineDictEqual(output, {'PE1': 'feature rip\n' 'router rip 1\n' ' address-family ipv4 unicast\n' ' exit\n' ' exit' }) vrf1 = Vrf('vrf1') intf1 = Interface(device=dev, name='Ethernet0/0', vrf=vrf1) intf1.add_feature(rip) rip.address_families |= {AddressFamily.ipv6_unicast} rip.shutdown = False rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].maximum_paths = 2 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].default_metric = 1 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].distance = 120 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_direct_rmap\ = 'rmap1' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_static_rmap\ = 'rmap2' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_lisp_rmap\ = 'rmap3' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].maximum_paths = 7 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].default_metric = 3 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].distance = 120 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_direct_rmap\ = 'rmap4' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_static_rmap\ = 'rmap5' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_lisp_rmap\ = 'rmap6' rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ maximum_paths = 10 rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ default_metric = 7 rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ distance = 127 rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ redistribute_direct_rmap = 'rmap14' rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ redistribute_static_rmap = 'rmap15' rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ redistribute_lisp_rmap = 'rmap16' # rip.build_config(apply=False) output = rip.build_config(apply=False) expected_output = {'PE1': '''\ router rip 1 no shutdown address-family ipv4 unicast default-metric 1 distance 120 maximum-paths 2 redistribute lisp route-map rmap3 redistribute direct route-map rmap1 redistribute static route-map rmap2 exit address-family ipv6 unicast default-metric 3 distance 120 maximum-paths 7 redistribute lisp route-map rmap6 redistribute direct route-map rmap4 redistribute static route-map rmap5 exit vrf vrf1 address-family ipv4 unicast exit address-family ipv6 unicast default-metric 7 distance 127 maximum-paths 10 redistribute lisp route-map rmap16 redistribute direct route-map rmap14 redistribute static route-map rmap15 exit exit exit'''} self.maxDiff = None self.assertMultiLineDictEqual(output, expected_output) # Set a mock dev.cli = Mock() dev.configure = Mock() dev.add_feature(rip) # Mock config output = rip.build_config(apply=True)
def test_config(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxr') intf1 = Interface(device=dev1, name='GigabitEthernet0/0/0/1') intf2 = Interface(device=dev1, name='GigabitEthernet0/0/0/2') dev2 = Device(testbed=testbed, name='PE2', os='iosxr') intf3 = Interface(device=dev2, name='GigabitEthernet0/0/0/3') intf4 = Interface(device=dev2, name='GigabitEthernet0/0/0/4') with self.assertNoWarnings(): evpn = Evpn() intf1.add_feature(evpn) dev1.add_feature(evpn) cfgs = evpn.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'evpn', ' interface GigabitEthernet0/0/0/1', ' exit', ' exit', ])) dev2.add_feature(evpn) self.assertIs(dev2.evpn, evpn) cfgs = evpn.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name, dev2.name]) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'evpn', ' interface GigabitEthernet0/0/0/1', ' exit', ' exit', ])) self.assertMultiLineEqual(str(cfgs[dev2.name]), '\n'.join([ 'evpn', ' exit', ])) evpn.recovery_timer = 100 with self.assertRaisesRegex( ValueError, r'^blah: Not None\. Not of type int\.$'): evpn.device_attr[dev1].recovery_timer = 'blah' evpn.device_attr[dev1].recovery_timer = 200 evpn.peering_timer = 300 evpn.device_attr[dev2].peering_timer = 400 self.assertEqual(evpn.recovery_timer, 100) self.assertEqual(evpn.peering_timer, 300) self.assertEqual(evpn.device_attr[dev1].recovery_timer, 200) self.assertEqual(evpn.device_attr[dev2].recovery_timer, 100) self.assertEqual(evpn.device_attr[dev1].peering_timer, 300) self.assertEqual(evpn.device_attr[dev2].peering_timer, 400) self.assertIs(evpn.device_attr[dev1].isinherited('recovery_timer'), False) self.assertIs(evpn.device_attr[dev2].isinherited('recovery_timer'), True) cfgs = evpn.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name, dev2.name]) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'evpn', ' interface GigabitEthernet0/0/0/1', ' exit', ' timers', ' recovery 200', ' peering 300', ' exit', ' exit', ])) self.assertMultiLineEqual( str(cfgs[dev2.name]), '\n'.join([ 'evpn', ' timers', ' recovery 100', ' peering 400', ' exit', ' exit', ])) evpn.device_attr[ intf1.device].interface_attr[intf1].peering_timer = 200 evpn.mac_flush = 'mvrp' with self.assertWarns(UnsupportedAttributeWarning, msg='evpn interface peering_timer'): cfgs = evpn.build_config(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name, dev2.name]) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'evpn', ' interface GigabitEthernet0/0/0/1', ' mac-flush mvrp', ' exit', ' timers', ' recovery 200', ' peering 300', ' exit', ' exit', ])) self.assertMultiLineEqual( str(cfgs[dev2.name]), '\n'.join([ 'evpn', ' timers', ' recovery 100', ' peering 400', ' exit', ' exit', ])) with self.assertWarns(UnsupportedAttributeWarning, msg='evpn interface peering_timer'): cfgs = evpn.build_config( apply=False, attributes='device_attr__*__interface_attr') self.assertCountEqual(cfgs.keys(), [dev1.name, dev2.name]) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'evpn', ' interface GigabitEthernet0/0/0/1', ' mac-flush mvrp', ' exit', ' exit', ])) self.assertMultiLineEqual(str(cfgs[dev2.name]), '\n'.join([ 'evpn', ' exit', ])) cfgs = evpn.build_unconfig(apply=False) self.assertCountEqual(cfgs.keys(), [dev1.name, dev2.name]) self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join([ 'no evpn', ])) self.assertMultiLineEqual(str(cfgs[dev2.name]), '\n'.join([ 'no evpn', ])) cfgs = evpn.build_unconfig(apply=False, devices=[dev1]) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join([ 'no evpn', ])) cfgs = evpn.build_unconfig(apply=False, attributes='device_attr__{}'.format( dev1.name)) self.assertCountEqual(cfgs.keys(), [dev1.name]) self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join([ 'no evpn', ])) cfgs = evpn.build_unconfig( apply=False, attributes='device_attr__*__interface_attr') self.assertCountEqual(sorted(cfgs.keys()), sorted([dev1.name, dev2.name])) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'evpn', ' no interface GigabitEthernet0/0/0/1', ' exit', ])) cfgs = evpn.build_unconfig( apply=False, attributes='device_attr__*__peering_timer') self.assertCountEqual(cfgs.keys(), [dev1.name, dev2.name]) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'evpn', ' timers', ' no peering 300', ' exit', ' exit', ])) self.assertMultiLineEqual( str(cfgs[dev2.name]), '\n'.join([ 'evpn', ' timers', ' no peering 400', ' exit', ' exit', ])) # TODO # cfgs = evpn.build_unconfig(apply=False, # attributes=[ # 'device_attr__{}__peering_timer'.format(dev1.name), # 'device_attr__{}__recovery_timer'.format(dev2.name), # ]) cfgs = evpn.build_unconfig(apply=False, attributes={ 'device_attr': { dev1.name: 'peering_timer', dev2.name: 'recovery_timer', }, }) self.assertCountEqual(cfgs.keys(), [dev1.name, dev2.name]) self.assertMultiLineEqual( str(cfgs[dev1.name]), '\n'.join([ 'evpn', ' timers', ' no peering 300', ' exit', ' exit', ])) self.assertMultiLineEqual( str(cfgs[dev2.name]), '\n'.join([ 'evpn', ' timers', ' no recovery 100', ' exit', ' exit', ])) evpn.bgp.rd = RouteDistinguisher('1000:5000') self.assertIs(type(evpn.bgp.rd), RouteDistinguisher) self.assertEqual(evpn.bgp.rd, RouteDistinguisher('1000:5000')) evpn.bgp.rd = '1000:5000' self.assertIs(type(evpn.bgp.rd), RouteDistinguisher) self.assertEqual(evpn.bgp.rd, RouteDistinguisher('1000:5000')) o = evpn.device_attr[intf1.device].interface_attr[intf1] o.rd = RouteDistinguisher('1000:5001') self.assertIs(type(o.rd), RouteDistinguisher) self.assertEqual(o.rd, RouteDistinguisher('1000:5001')) o.rd = '1000:5001' #self.assertIs(type(o.rd), RouteDistinguisher) self.assertEqual(o.rd, RouteDistinguisher('1000:5001'))