예제 #1
0
    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)
예제 #2
0
    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'})
예제 #3
0
    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)
예제 #4
0
    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'))