Exemple #1
0
    def test_static_routing_with_interface_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')

        static_routing = StaticRouting()

        static_routing.device_attr[dev1].vrf_attr['VRF1'].address_family_attr[
            'ipv4'].route_attr['10.2.1.0/24'].interface_attr[
                'GigabitEthernet0/1'].if_nexthop = '192.168.1.2'

        static_routing.device_attr[dev1].vrf_attr['VRF1'].address_family_attr[
            'ipv4'].route_attr['10.2.1.0/24'].interface_attr[
                'GigabitEthernet0/1'].if_preference = 2

        self.assertIs(static_routing.testbed, testbed)

        dev1.add_feature(static_routing)

        cfgs = static_routing.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(
            str(cfgs[dev1.name]), '\n'.join([
                'ip route vrf VRF1 10.2.1.0 255.255.255.0 GigabitEthernet0/1 192.168.1.2 2'
            ]))

        static_routing_4 = StaticRouting()

        static_routing_4.device_attr[dev1].vrf_attr[
            'default'].address_family_attr['ipv4'].route_attr[
                '3.3.3.3/32'].interface_attr['GigabitEthernet0/3']

        self.assertIs(static_routing_4.testbed, testbed)

        dev1.add_feature(static_routing_4)

        cfgs = static_routing_4.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(
            str(cfgs[dev1.name]),
            '\n'.join(['ip route 3.3.3.3 255.255.255.255 GigabitEthernet0/3']))
    def test_static_routing_ipv6_with_interface_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')

        static_routing = StaticRouting()
        interface = 'GigabitEthernet0/1'
        vrf = 'VRF1'
        af = 'ipv6'

        route = '{}'.format('2001:2:2:2::2/128')

        static_routing.device_attr[dev1].vrf_attr[vrf].address_family_attr[
            af].route_attr[route].interface_attr[
                interface].if_nexthop = '2001:20:1:2::2'

        self.assertIs(static_routing.testbed, testbed)

        dev1.add_feature(static_routing)

        cfgs = static_routing.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(
            str(cfgs[dev1.name]), '\n'.join([
                'ipv6 route vrf VRF1 2001:2:2:2::2/128 GigabitEthernet0/1 2001:20:1:2::2'
            ]))

        static_routing_2 = StaticRouting()

        static_routing_2.device_attr[dev1].vrf_attr[
            'default'].address_family_attr['ipv6'].route_attr[
                '2001:2:2:2::2/128'].interface_attr['Null0'].if_preference = 5

        self.assertIs(static_routing_2.testbed, testbed)

        dev1.add_feature(static_routing_2)

        cfgs = static_routing_2.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(str(cfgs[dev1.name]),
                         '\n'.join(['ipv6 route 2001:2:2:2::2/128 Null0 5']))
Exemple #3
0
    def test_partial_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')

        with self.assertNoWarnings():

            Genie.testbed = None
            with self.assertRaises(TypeError):
                bgp = Bgp()
            with self.assertRaises(TypeError):
                bgp = Bgp(testbed=testbed)
            Genie.testbed = testbed
            with self.assertRaises(TypeError):
                bgp = Bgp()
            bgp = Bgp(bgp_id=100)
            self.assertIs(bgp.testbed, testbed)
            Genie.testbed = testbed
            bgp = Bgp(bgp_id=100)
            self.assertIs(bgp.testbed, Genie.testbed)
            self.assertIs(bgp.testbed, testbed)

            # Defining attributes
            bgp.device_attr[dev1]
            dev1.add_feature(bgp)
            ps_name = 'PEER-SESSION'
            bgp.device_attr[dev1].peer_session_attr[ps_name].ps_fall_over_bfd=\
                True
            partial_cfg1 = bgp.build_config(
                                apply=False,
                                attributes={'device_attr':\
                                           {'*':{'peer_session_attr':\
                                           {'*':"ps_fall_over_bfd"}}}})

            self.assertCountEqual(partial_cfg1.keys(), [dev1.name])
            self.assertMultiLineEqual(str(partial_cfg1[dev1.name]), '\n'.\
                join([
                'router bgp 100',
                ' template peer-session PEER-SESSION',
                '  fall-over bfd',
                '  exit',
                ' exit',
                    ]))
    def test_static_routing_without_interface_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')

        static_routing = StaticRouting()

        static_routing.device_attr[dev1].vrf_attr['VRF1'].address_family_attr[
            'ipv4'].route_attr['10.2.1.0/24'].next_hop_attr[
                '192.168.1.2'].preference = 3

        self.assertIs(static_routing.testbed, testbed)

        dev1.add_feature(static_routing)

        cfgs = static_routing.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(
            str(cfgs[dev1.name]), '\n'.join(
                ['ip route vrf VRF1 10.2.1.0 255.255.255.0 192.168.1.2 3']))
    def test_static_routing_default_uncfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')

        static_routing = StaticRouting()
        static_routing.af = 'ipv4'
        static_routing.interface = 'Ethernet0/1'
        static_routing.route = '10.2.1.0/24'

        static_routing.device_attr[dev1].vrf_attr['default'].address_family_attr[static_routing.af].route_attr[
            static_routing.route].interface_attr[static_routing.interface].if_nexthop = '192.168.2.2'

        dev1.add_feature(static_routing)

        un_cfgs = static_routing.build_unconfig(apply=False)
        self.assertCountEqual(un_cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(str(un_cfgs[dev1.name]), '\n'.join(
            ['no ip route 10.2.1.0/24 Ethernet0/1 192.168.2.2',
             ]))
Exemple #6
0
    def test_uncfg_new_vlan_name(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')
        with self.assertNoWarnings():
            vlan = Vlan(vlan='100')
            vlan.device_attr[dev1].vlan_attr['100'].name = "new_vlan"

            self.assertIs(vlan.testbed, testbed)

            dev1.add_feature(vlan)

            uncfgs = vlan.build_unconfig(apply=False, attributes={'device_attr': \
                                                                      {'*':
                                                                            {'vlan_attr': \
                                                                            {'*': "name"}}}})
            self.assertCountEqual(uncfgs.keys(), [dev1.name])
            self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join([
                'vlan 100',
                ' no name new_vlan',
                ' exit',
            ]))
    def test_static_routing_ipv6_without_interface_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')

        static_routing_6 = StaticRouting()

        static_routing_6.device_attr[dev1].vrf_attr[
            'VRF1'].address_family_attr['ipv6'].route_attr[
                '2001:3:3:3::3/128'].next_hop_attr[
                    '2001:10:1:2::2'].preference = 3

        self.assertIs(static_routing_6.testbed, testbed)

        dev1.add_feature(static_routing_6)

        cfgs_6 = static_routing_6.build_config(apply=False)
        self.assertCountEqual(cfgs_6.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(
            str(cfgs_6[dev1.name]), '\n'.join(
                ['ipv6 route vrf VRF1 2001:3:3:3::3/128 2001:10:1:2::2 3']))
    def test_static_routing_ipv6_without_interface_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')

        static_routing = StaticRouting()
        static_routing.af = 'ipv6'

        static_routing.route = '2001:2:2:2::2/128'

        static_routing.device_attr[dev1].vrf_attr['default'].address_family_attr[static_routing.af].route_attr[
            static_routing.route].next_hop_attr['2001:10:2:3::2'].preference = 3

        self.assertIs(static_routing.testbed, testbed)

        dev1.add_feature(static_routing)

        cfgs = static_routing.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(str(cfgs[dev1.name]), '\n'.join(
            ['ipv6 route 2001:2:2:2::2/128 2001:10:2:3::2 3',
             ]))
Exemple #9
0
    def test_uncfg2(self):

        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')

        with self.assertNoWarnings():

            Genie.testbed = None
            with self.assertRaises(TypeError):
                bgp = Bgp()
            with self.assertRaises(TypeError):
                bgp = Bgp(testbed=testbed)
            Genie.testbed = testbed
            with self.assertRaises(TypeError):
                bgp = Bgp()
            bgp = Bgp(bgp_id=100)
            self.assertIs(bgp.testbed, testbed)
            Genie.testbed = testbed
            bgp = Bgp(bgp_id=100)
            self.assertIs(bgp.testbed, Genie.testbed)
            self.assertIs(bgp.testbed, testbed)

            dev1.add_feature(bgp)

            # Defining attributes
            af_name = 'ipv4 unicast'
            bgp.device_attr[dev1]
            bgp.device_attr[dev1].vrf_attr[None].always_compare_med = True
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name]
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\
                af_label_allocation_mode = 'per-vrf'

            uncfg = bgp.build_unconfig(apply=False)
            self.assertCountEqual(uncfg.keys(), [dev1.name])
            self.assertMultiLineEqual(str(uncfg[dev1.name]), '\n'.\
                join([
                'no router bgp 100',
                'no mpls label mode vrf default protocol bgp-vpnv4 per-vrf',
                    ]))
Exemple #10
0
    def test_deactivate_feature(self):

        tb = Genie.testbed = Testbed()
        dev = Device(testbed=tb, name='PE1', os='nxos')

        rip = Rip(instance_id=1)
        rip.add_force_vrf(None)
        dev.add_feature(rip)

        # Default configuration, let's make sure it works
        output = rip.build_unconfig(apply=False)
        self.assertMultiLineDictEqual(output, {'PE1':
            'feature rip\n'
            'no router rip 1'
            })
        # Set a mock
        dev.cli = Mock()
        dev.configure = Mock()
        output = rip.build_unconfig(apply=True)

        expected_output = None
        self.assertEqual(output, expected_output)
Exemple #11
0
    def test_remove_af(self):
        # Add a device to it
        tb = Genie.testbed = Testbed()
        dev1 = Device(testbed=tb, name='dev1', os='nxos')
        dev2 = Device(testbed=tb, name='dev2', os='nxos')
        rip = Rip(instance_id=5)
        rip.add_force_vrf(None)
        dev1.add_feature(rip)
        dev2.add_feature(rip)

        # Configure rip
        rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv4 unicast'].distance = 5

        output = rip.build_config(apply=False)
        self.assertMultiLineDictEqual(output,
{'dev1': 'feature rip\n'
         'router rip 5\n'
         ' address-family ipv4 unicast\n'
         '  distance 5\n'
         '  exit\n'
         ' exit',
'dev2': 'feature rip\n'
         'router rip 5\n'
         ' address-family ipv4 unicast\n'
         '  exit\n'
         ' exit'})

        output = rip.build_unconfig(
            attributes={
                'device_attr': {
                    'dev1': {
                        'vrf_attr': {
                            None: {
                                'address_family_attr': {
                                    'ipv4 unicast': None}}}}}},
            apply=False)
        self.assertMultiLineDictEqual(output,
{'dev1': 'router rip 5\n no address-family ipv4 unicast\n exit'})
Exemple #12
0
    def test_arp_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')

        arp = Arp()
        arp.device_attr[dev1].max_entries = 100

        self.assertIs(arp.testbed, testbed)
        dev1.add_feature(arp)

        cfgs = arp.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertMultiLineEqual(
            str(cfgs[dev1.name]), '\n'.join([
                'arp entries interface-limit 100',
            ]))

        un_cfgs = arp.build_unconfig(apply=False)
        self.assertCountEqual(un_cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(str(un_cfgs[dev1.name]),
                         '\n'.join(['no arp entries interface-limit 100']))
Exemple #13
0
    def test_switchport_enable_config(self):
        
        # For failures
        self.maxDiff = None

        # Set Genie Tb
        testbed = Testbed()
        Genie.testbed = testbed

        # Device
        dev1 = Device(name='PE1', testbed=testbed, os='nxos')
        intf1 = Interface(name='Ethernet3/7', device=dev1, aliases=['PE1_1'])
        vrf = Vrf(name='test', testbed=testbed)
        dev1.add_feature(vrf)

        # make intf2 as L2 interface
        intf1.switchport_enable = True

        # Build config
        cfgs = intf1.build_config(apply=False)
        # Check config build correctly
        self.assertMultiLineEqual(
            str(cfgs),
            '\n'.join([
                'interface Ethernet3/7',
                ' switchport',
                ' exit'
                ]))

        # Build unconfig
        uncfgs = intf1.build_unconfig(apply=False)
        # Check config build correctly
        self.assertMultiLineEqual(
            str(uncfgs),
            '\n'.join([
                'default interface Ethernet3/7',
                ]))
Exemple #14
0
    def test_basic_uncfg(self):

        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxr')

        rpl1 = RoutePolicy(policy_definition='rpl1')
        dev1.add_feature(rpl1)

        rpl1.device_attr[dev1].statement_attr['10']
        rpl1.device_attr[dev1].statement_attr['10'].match_med_eq = 5
        rpl1.device_attr[dev1].statement_attr['10'].match_nexthop_in = 'hop'
        rpl1.device_attr[dev1].statement_attr['10'].actions = 'pass'

        # Unconfig testing
        # Set a mock
        dev1.configure = Mock()
        dev1.add_feature(rpl1)
        # Mock config

        uncfg1 = rpl1.build_unconfig(apply=False)
        self.assertCountEqual(uncfg1.keys(), ['PE1'])
        self.assertMultiLineEqual(str(uncfg1['PE1']), '\n'.join(
            ['no route-policy rpl1'
            ]))
    def test_vxlan_fabric_forwarding_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')

        vxlan = Vxlan()
        vxlan.device_attr[dev1].fabric_fwd_anycast_gw_mac = '0002.0002.0002'

        self.assertIs(vxlan.testbed, testbed)
        dev1.add_feature(vxlan)
        cfgs = vxlan.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertMultiLineEqual(
            str(cfgs[dev1.name]), '\n'.join([
                'fabric forwarding anycast-gateway-mac 0002.0002.0002',
            ]))

        un_cfgs = vxlan.build_unconfig(apply=False)
        self.assertCountEqual(un_cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(
            str(un_cfgs[dev1.name]), '\n'.join([
                'no fabric forwarding anycast-gateway-mac 0002.0002.0002',
            ]))
Exemple #16
0
    def test_tunnel_peerip(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')

        tunnelencryption = TunnelEncryption()
        tunnelencryption.device_attr[dev1].tunnelpeerip_attr['100.100.100.2'].keychain_name='kc1'
        tunnelencryption.device_attr[dev1].tunnelpeerip_attr['100.100.100.2'].tunnelpolicy_name = 'kc1'

        self.assertIs(tunnelencryption.testbed, testbed)
        dev1.add_feature(tunnelencryption)
        cfgs = tunnelencryption.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join(
            ['tunnel-encryption peer-ip 100.100.100.2',
             ' keychain kc1 policy kc1',
             ' exit',
             ]))
        un_cfgs = tunnelencryption.build_unconfig(apply=False)
        self.assertCountEqual(un_cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(str(un_cfgs[dev1.name]), '\n'.join(
            ['no tunnel-encryption peer-ip 100.100.100.2',
             ]))
Exemple #17
0
    def test_uncfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')

        with self.assertNoWarnings():
            Genie.testbed = None
            with self.assertRaises(TypeError):
                vlan = Vlan()
            Genie.testbed = testbed

            vlan = Vlan(vlan='102')
            vlan.device_attr[dev1].vlan_attr['102'].name = 'vlan2'
            vlan.device_attr[dev1].vlan_attr['102'].state = 'active'
            vlan.device_attr[dev1].vlan_attr['102'].mode = 'ce'

            self.assertIs(vlan.testbed, testbed)

            dev1.add_feature(vlan)

            cfgs = vlan.build_unconfig(apply=False)
            self.assertCountEqual(cfgs.keys(), [dev1.name])
            self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join([
                'no vlan 102',
            ]))
    def test_static_routing_ipv6_with_interface_tag_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')

        static_routing = StaticRouting()

        static_routing.device_attr[dev1].vrf_attr[
            'default'].address_family_attr['ipv6'].route_attr[
                '2001:2:2:2::2/128'].interface_attr[
                    'GigabitEthernet0/0'].if_nexthop = '2001:10:1:2::2'

        static_routing.device_attr[dev1].vrf_attr[
            'default'].address_family_attr['ipv6'].route_attr[
                '2001:2:2:2::2/128'].interface_attr[
                    'GigabitEthernet0/0'].if_tag = 100

        static_routing.device_attr[dev1].vrf_attr[
            'default'].address_family_attr['ipv6'].route_attr[
                '2001:2:2:2::2/128'].interface_attr[
                    'GigabitEthernet0/0'].if_track = 1
        static_routing.device_attr[dev1].vrf_attr[
            'default'].address_family_attr['ipv6'].route_attr[
                '2001:2:2:2::2/128'].interface_attr[
                    'GigabitEthernet0/0'].if_preference = 11

        self.assertIs(static_routing.testbed, testbed)

        dev1.add_feature(static_routing)

        cfgs = static_routing.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertEqual(
            str(cfgs[dev1.name]), '\n'.join([
                'ipv6 route 2001:2:2:2::2/128 GigabitEthernet0/0 2001:10:1:2::2 11 tag 100 track 1'
            ]))
Exemple #19
0
    def test_uncfg3(self):

        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')
        dev2 = Device(testbed=testbed, name='PE2', os='iosxe')
        intf4 = Interface(device=dev2, name='Ethernet0/0/4',
                          ipv4='10.2.0.2/24')


        with self.assertNoWarnings():
            Genie.testbed = testbed
            bgp = Bgp(bgp_id=100)
            self.assertIs(bgp.testbed, Genie.testbed)
            self.assertIs(bgp.testbed, testbed)

            dev1.add_feature(bgp)

            # Defining attributes
            bgp.device_attr[dev1]
            neighbor_id = intf4.ipv4
            bgp.device_attr[dev1].vrf_attr[None].add_neighbor(neighbor_id)
            bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]

            partial_uncfg = bgp.build_unconfig(
                                apply=False,
                                attributes={'device_attr':\
                                           {'*':{'vrf_attr':\
                                           {'*':{'neighbor_attr':'*'}}}}})

            self.assertCountEqual(partial_uncfg.keys(), [dev1.name])
            self.assertMultiLineEqual(str(partial_uncfg[dev1.name]), '\n'.\
                join([
                'router bgp 100',
                ' no neighbor 10.2.0.2',
                ' exit',
                    ]))
    def test_ospfv3_non_default_vrf_config(self):

        # For failures
        self.maxDiff = None

        # Set testbed
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')

        # Create VRF objects
        vrf1 = Vrf('VRF1')

        # Create Interface object
        intf1 = Interface(name='Ethernet1/1', device=dev1)

        # Create OSPF object
        ospfv3_1 = Ospfv3()
        ospfv3_1.device_attr[dev1].enabled = True

        # Add OSPF configuration to vrf VRF1
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].instance = '30'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].inst_shutdown = False
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].router_id = '3.3.3.3'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].passive_interface = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].log_adjacency_changes = True
        ospfv3_1.device_attr[dev1].vrf_attr[
            vrf1].log_adjacency_changes_detail = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_arrival = 30
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_group_pacing = 40
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_start_time = 50
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_hold_time = 60
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_max_time = 70

        # Add graceful restart configuration to vrf default
        gr1 = GracefulRestart(device=dev1)
        gr1.gr_enable = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr1)
        # Add graceful restart configuration to vrf default
        gr2 = GracefulRestart(device=dev1)
        gr2.gr_enable = True
        gr2.gr_restart_interval = 100
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr2)
        # # Add graceful restart configuration to vrf default
        gr3 = GracefulRestart(device=dev1)
        gr3.gr_enable = True
        gr3.gr_helper_enable = False
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr3)
        # # Add graceful restart configuration to vrf default
        gr4 = GracefulRestart(device=dev1)
        gr4.gr_enable = True
        gr4.gr_planned_only = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr4)

        # Add area configuration to vrf default
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '1'].area_type = 'stub'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '1'].nosummary = False
        # Add area configuration to vrf default
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '2'].area_type = 'nssa'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '2'].nosummary = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '2'].nssa_default_info_originate = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '2'].nssa_route_map = 'test_route_map'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '2'].nssa_translate_always = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '2'].nssa_translate_supressfa = True

        # address_family attributes
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].default_metric = 100

        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_bgp_id = 100
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_bgp_route_map = 'test'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_rip_id = 'rip-nxos'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_rip_route_map = 'test'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_direct = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_direct_route_map = 'test'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_static = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_static_route_map = 'test'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_isis_id = 'ABC'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_isis_route_map = 'test'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].default_originate = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].default_originate_routemap = 'test'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_max_prefix = 12
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_max_prefix_thld = 10
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].redist_max_prefix_warn_only = True

        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].spf_start_time = 100
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].spf_hold_time = 200
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].spf_max_time = 300
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].table_map = 'test'

        # Add area default cost configuration to vrf default
        ad1 = AreaDefaultCost(device=dev1)
        ad1.af_area_id = '2'
        ad1.area_def_cost = 10
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].add_areacost_key(ad1)

        # # Add area routemap direction to vrf default
        arm1 = AreaRouteMap(device=dev1)
        arm1.routemap_area_id = '2'
        arm1.ar_route_map_in = 'test_in'
        arm1.ar_route_map_out = 'test_out'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].add_arearoutemap_key(arm1)

        # Add summary address configuration to vrf default
        sa1 = SummaryAddress(device=dev1)
        sa1.summary_address_prefix = '2001:db1:1::1/64'
        sa1.summary_address_not_advertise = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].add_sumadd_key(sa1)

        # Add summary address configuration to vrf default
        sa2 = SummaryAddress(device=dev1)
        sa2.summary_address_prefix = '2001:db2:2::2/64'
        sa2.summary_address_tag = 10
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].add_sumadd_key(sa2)

        # Add area range configuration to vrf default
        ar1 = AreaRange(device=dev1)
        ar1.range_area_id = '2'
        ar1.area_range_prefix = '2001:bd12:2::2/64'
        ar1.area_range_not_advertise = True
        ar1.area_range_cost = 10
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].add_arearange_key(ar1)

        # virtual link attributes
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '7'].virtual_link_attr['ospfv3_vl1'].vl_router_id = '7.7.7.7'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '7'].virtual_link_attr['ospfv3_vl1'].vl_hello_interval = 55
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '7'].virtual_link_attr['ospfv3_vl1'].vl_dead_interval = 65
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '7'].virtual_link_attr['ospfv3_vl1'].vl_retransmit_interval = 75
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '7'].virtual_link_attr['ospfv3_vl1'].vl_transmit_delay = 85

        # Add interface configuration to VRF default
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_admin_control = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_secondaries = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_cost = 10
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_type = 'point-to-point'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_passive = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_priority = 110
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_hello_interval = 50
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_dead_interval = 60
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_retransmit_interval = 70
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_transmit_delay = 70
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_mtu_ignore = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_instance = 60
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_protocol_shutdown = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '0'].interface_attr[intf1].if_multi_area = 10

        dev1.add_feature(ospfv3_1)

        # Build config
        cfgs = ospfv3_1.build_config(apply=False)

        # Check config strings built correctly
        self.assertMultiLineEqual(
            str(cfgs[dev1.name]), '\n'.join([
                'feature ospfv3', 'router ospfv3 30', ' vrf VRF1',
                '  router-id 3.3.3.3', '  passive-interface default',
                '  log-adjacency-changes detail', '  timers lsa-arrival 30',
                '  timers lsa-group-pacing 40',
                '  timers throttle lsa 50 60 70', '  graceful-restart',
                '  graceful-restart grace-period 100',
                '  graceful-restart helper-disable',
                '  graceful-restart planned-only',
                '  address-family ipv6 unicast',
                '   default-information originate True route-map test',
                '   default-metric 100',
                '   redistribute bgp 100 route-map test',
                '   redistribute direct route-map test',
                '   redistribute static route-map test',
                '   redistribute isis ABC route-map test',
                '   redistribute rip rip-nxos route-map test',
                '   redistribute maximum-prefix 12 10 warning-only',
                '   table-map test', '   timers throttle lsa 100 200 300',
                '   area 2 default-cost 10',
                '   area 2 filter-list route-map test_in in',
                '   area 2 filter-list route-map test_out out',
                '   summary-address 2001:db1:1::1/64 not-advertise',
                '   summary-address 2001:db2:2::2/64 tag 10',
                '   area 2 range 2001:bd12:2::2/64 not-advertise cost 10',
                '   exit', '  area 1 stub',
                '  area 2 nssa no-summary default-information-originate route-map test_route_map',
                '  area 2 nssa translate type7 always suppress-fa',
                '  area 7 virtual-link 7.7.7.7', '   hello-interval 55',
                '   dead-interval 65', '   retransmit-interval 75',
                '   transmit-delay 85', '   exit', '  exit', ' exit',
                'interface Ethernet1/1', ' ipv6 router ospfv3 30 area 0',
                ' ospfv3 cost 10', ' ospfv3 network point-to-point',
                ' ospfv3 passive-interface', ' ospfv3 priority 110',
                ' ospfv3 hello-interval 50', ' ospfv3 dead-interval 60',
                ' ospfv3 retransmit-interval 70', ' ospfv3 mtu-ignore',
                ' ospfv3 instance 60', ' ospfv3 shutdown',
                ' ospfv3 transmit-delay 70',
                ' ipv6 router ospfv3 30 multi-area 10', ' exit'
            ]))

        # Unconfig
        ospfv3_uncfg = ospfv3_1.build_unconfig(apply=False)

        # Check unconfig strings built correctly
        self.assertMultiLineEqual(str(ospfv3_uncfg[dev1.name]), '\n'.join([
            'no feature ospfv3',
        ]))
    def test_ospfv3_partial_config_unconfig(self):

        # For failures
        self.maxDiff = None

        # Set testbed
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')

        # Create VRF objects
        vrf1 = Vrf('VRF1')

        # Create Interface object
        intf1 = Interface(name='Ethernet1/1', device=dev1)

        # Create OSPF object
        ospfv3_1 = Ospfv3()
        ospfv3_1.device_attr[dev1].enabled = True

        # Add OSPF configuration to vrf default
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].instance = '30'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].inst_shutdown = False
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].router_id = '3.3.3.3'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].passive_interface = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].log_adjacency_changes = True
        ospfv3_1.device_attr[dev1].vrf_attr[
            vrf1].log_adjacency_changes_detail = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_arrival = 30
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_group_pacing = 40
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_start_time = 50
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_hold_time = 60
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].lsa_max_time = 70

        # Add graceful restart configuration to vrf vrf1
        gr1 = GracefulRestart(device=dev1)
        gr1.gr_enable = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr1)
        # Add graceful restart configuration to vrf vrf1
        gr2 = GracefulRestart(device=dev1)
        gr2.gr_enable = True
        gr2.gr_restart_interval = 100
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr2)
        # # Add graceful restart configuration to vrf vrf1
        gr3 = GracefulRestart(device=dev1)
        gr3.gr_enable = True
        gr3.gr_helper_enable = False
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr3)
        # # Add graceful restart configuration to vrf vrf1
        gr4 = GracefulRestart(device=dev1)
        gr4.gr_enable = True
        gr4.gr_planned_only = True
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].add_gr_key(gr4)

        # Add area configuration to vrf vrf1
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '1'].area_type = 'stub'
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].area_attr[
            '1'].nosummary = True

        # Add summary address configuration to vrf vrf1
        sa2 = SummaryAddress(device=dev1)
        sa2.summary_address_prefix = '2001:db2:2::2/64'
        sa2.summary_address_tag = 10
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].address_family_attr[
            'ipv6 unicast'].add_sumadd_key(sa2)

        dev1.add_feature(ospfv3_1)

        # Build config
        cfgs = ospfv3_1.build_config(apply=False)

        # Check config strings built correctly
        self.assertMultiLineEqual(
            str(cfgs[dev1.name]), '\n'.join([
                'feature ospfv3', 'router ospfv3 30', ' vrf VRF1',
                '  router-id 3.3.3.3', '  passive-interface default',
                '  log-adjacency-changes detail', '  timers lsa-arrival 30',
                '  timers lsa-group-pacing 40',
                '  timers throttle lsa 50 60 70', '  graceful-restart',
                '  graceful-restart grace-period 100',
                '  graceful-restart helper-disable',
                '  graceful-restart planned-only',
                '  address-family ipv6 unicast',
                '   summary-address 2001:db2:2::2/64 tag 10', '   exit',
                '  area 1 stub no-summary', '  exit', ' exit'
            ]))
        # change partial config - router_id
        ospfv3_1.device_attr[dev1].vrf_attr[vrf1].router_id = '7.7.7.7'
        partial_cfg1 = ospfv3_1.build_config(apply=False,
                                             attributes={
                                                 'device_attr': {
                                                     '*': {
                                                         'vrf_attr': {
                                                             '*': "router_id"
                                                         }
                                                     }
                                                 }
                                             })
        self.assertCountEqual(partial_cfg1.keys(), [dev1.name])
        self.assertMultiLineEqual(
            str(partial_cfg1[dev1.name]), '\n'.join([
                'router ospfv3 30',
                ' vrf VRF1',
                '  router-id 7.7.7.7',
                '  exit',
                ' exit',
            ]))

        # remove cfg - area 1 stub
        partial_uncfg1 = ospfv3_1.build_unconfig(apply=False,
                                                 attributes={
                                                     'device_attr': {
                                                         '*': {
                                                             'vrf_attr': {
                                                                 '*':
                                                                 "lsa_arrival"
                                                             }
                                                         }
                                                     }
                                                 })

        self.assertMultiLineEqual(
            str(partial_uncfg1[dev1.name]), '\n'.join([
                'router ospfv3 30',
                ' vrf VRF1',
                '  no timers lsa-arrival 30',
                '  exit',
                ' exit',
            ]))

        # # remove a single attribute from a specific gr key
        partial_uncfg2 = ospfv3_1.build_unconfig(
            apply=False,
            attributes={
                'device_attr': {
                    '*': {
                        'vrf_attr': {
                            '*': {
                                'gr_keys': {
                                    gr4: {
                                        'gr_enable': None
                                    }
                                }
                            }
                        }
                    }
                }
            })

        self.assertMultiLineEqual(
            str(partial_uncfg2[dev1.name]), '\n'.join([
                'router ospfv3 30',
                ' vrf VRF1',
                '  no graceful-restart',
                '  exit',
                ' exit',
            ]))

        # remove all grace full restart multiline configs
        partial_uncfg3 = ospfv3_1.build_unconfig(
            apply=False,
            attributes={'device_attr': {
                '*': {
                    'vrf_attr': {
                        '*': 'gr_keys'
                    }
                }
            }})

        self.assertMultiLineEqual(
            str(partial_uncfg3[dev1.name]), '\n'.join([
                'router ospfv3 30',
                ' vrf VRF1',
                '  no graceful-restart',
                '  no graceful-restart grace-period 100',
                '  no graceful-restart helper-disable',
                '  no graceful-restart planned-only',
                '  exit',
                ' exit',
            ]))
Exemple #22
0
    def test_uncfg(self):

        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')
        intf1 = Interface(device=dev1, name='Ethernet0/0/1',
                          ipv4='10.1.0.1/24')
        intf2 = Interface(device=dev1, name='Ethernet0/0/2',
                          ipv4='10.2.0.1/24')
        dev2 = Device(testbed=testbed, name='PE2', os='nxos')
        intf3 = Interface(device=dev2, name='Ethernet0/0/3',
                          ipv4='10.1.0.2/24', ipv6='2001:111:222::/64')
        intf4 = Interface(device=dev2, name='Ethernet0/0/4',
                          ipv4='10.2.0.2/24')

        with self.assertNoWarnings():

            Genie.testbed = None
            with self.assertRaises(TypeError):
                bgp = Bgp()
            with self.assertRaises(TypeError):
                bgp = Bgp(testbed=testbed)
            Genie.testbed = testbed
            with self.assertRaises(TypeError):
                bgp = Bgp()
            bgp = Bgp(asn=100,bgp_id=100)
            self.assertIs(bgp.testbed, testbed)
            Genie.testbed = testbed
            bgp = Bgp(asn=100,bgp_id=100)
            self.assertIs(bgp.testbed, Genie.testbed)
            self.assertIs(bgp.testbed, testbed)

            dev1.add_feature(bgp)

            bgp.device_attr[dev1].enabled = True
            uncfgs = bgp.build_unconfig(apply=False)
            self.assertCountEqual(uncfgs.keys(), [dev1.name])
            self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join([
                'no feature bgp',
                    ]))

            # Defining attributes
            af_name = 'vpnv4 unicast'
            af_name2 = 'link-state'
            vrf_id = 'vrf1'
            vrf1 = Vrf(vrf_id)
            bgp.device_attr[dev1]
            bgp.device_attr[dev1].vrf_attr[None].always_compare_med = True
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name]
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name2]
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\
                af_retain_rt_all = True
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\
                af_dampening = True
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\
                af_dampening_half_life_time = 1
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\
                af_dampening_reuse_time = 10
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\
                af_dampening_suppress_time = 30
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name].\
                af_dampening_max_suppress_time = 2
            neighbor_id = intf4.ipv4
            bgp.device_attr[dev1].vrf_attr[vrf1].add_neighbor(neighbor_id)
            bgp.device_attr[dev1].vrf_attr[vrf1].neighbor_attr[neighbor_id]
            bgp.device_attr[dev1].vrf_attr[vrf1].neighbor_attr[neighbor_id].\
                nbr_fall_over_bfd = True
            nbr_af_name = 'ipv4 unicast'
            bgp.device_attr[dev1].vrf_attr[vrf1].neighbor_attr[neighbor_id].\
                address_family_attr[nbr_af_name]
            bgp.device_attr[dev1].vrf_attr[vrf1].neighbor_attr[neighbor_id].\
                address_family_attr[nbr_af_name].nbr_af_allowas_in = True


            partial_uncfg1 = bgp.build_unconfig(
                                apply=False,
                                attributes={'device_attr':\
                                           {'*':{'vrf_attr':\
                                           {'*':"always_compare_med"}}}})
            self.assertCountEqual(partial_uncfg1.keys(), [dev1.name])
            self.assertMultiLineEqual(str(partial_uncfg1[dev1.name]), '\n'.\
                join([
                'router bgp 100',
                ' no bestpath always-compare-med',
                ' exit',
                    ]))

            partial_uncfg2 = bgp.build_unconfig(\
                                apply=False,
                                attributes={'device_attr':\
                                           {'*':{'vrf_attr':'*'}}})
            self.assertCountEqual(partial_uncfg2.keys(), [dev1.name])
            self.assertMultiLineEqual(str(partial_uncfg2[dev1.name]), '\n'.\
                join([
                'router bgp 100',
                ' no bestpath always-compare-med',
                ' no address-family link-state',
                ' no address-family vpnv4 unicast',
                ' no vrf vrf1',
                ' exit',
                    ]))

            partial_uncfg3 = bgp.build_unconfig(
                                apply=False,
                                attributes={'device_attr': {'*': {'vrf_attr':
                                    {'*': {'neighbor_attr':\
                                    {'*': {'address_family_attr':\
                                    {'*':"nbr_af_allowas_in"}}}}}}}})
            self.assertCountEqual(partial_uncfg3.keys(), [dev1.name])
            self.assertMultiLineEqual(str(partial_uncfg3[dev1.name]), '\n'.\
                join([
                'router bgp 100',
                ' vrf vrf1',
                '  neighbor 10.2.0.2',
                '   address-family ipv4 unicast',
                '    no allowas-in',
                '    exit',
                '   exit',
                '  exit',
                ' exit',
                    ]))

            bgp.device_attr[dev1].protocol_shutdown = True
            partial_uncfg4 = bgp.build_unconfig(
                                apply=False,
                                attributes={'device_attr':\
                                           {'*':"protocol_shutdown"}})
            self.assertCountEqual(partial_uncfg4.keys(), [dev1.name])
            self.assertMultiLineEqual(str(partial_uncfg4[dev1.name]), '\n'.\
                join([
                'router bgp 100',
                ' no shutdown',
                ' exit',
                    ]))

            partial_uncfg5 = bgp.build_unconfig(\
                                apply=False,
                                attributes={'device_attr':\
                                            {'*':\
                                                {'vrf_attr':\
                                                    {'*':\
                                                        {'address_family_attr':\
                                                            {'*':\
                                                            "af_dampening"}}}}}})
            self.assertCountEqual(partial_uncfg5.keys(), [dev1.name])
            self.assertMultiLineEqual(str(partial_uncfg5[dev1.name]), '\n'.\
                join([
                'router bgp 100',
                ' address-family vpnv4 unicast',
                '  no dampening',
                '  exit',
                ' exit',
                    ]))

            bgp.device_attr[dev1].enabled = False
            uncfgs = bgp.build_unconfig(apply=False)
            self.assertCountEqual(uncfgs.keys(), [dev1.name])
            self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join([
                'no router bgp 100',
                    ]))

            bgp.device_attr[dev1].enabled = True
            uncfgs = bgp.build_unconfig(apply=False)
            self.assertCountEqual(uncfgs.keys(), [dev1.name])
            self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join([
                'no feature bgp',
                    ]))
class test_prefix_list(TestCase):
    def setUp(self):
        # Set Genie Tb
        testbed = Testbed()
        Genie.testbed = testbed
        # Device
        self.dev1 = Device(name='PE1', testbed=testbed, os='nxos')

    def test_cli_config_v4(self):
        # prefix-list conf
        prefix_conf = PrefixList(prefix_set_name='test')
        self.dev1.add_feature(prefix_conf)
        # Apply configuration
        prefix_conf.device_attr[self.dev1].prefix_attr['35.0.0.0/8'].\
            maxlength_range_attr['8..8'].protocol = 'ipv4'
        prefix_conf.device_attr[self.dev1].prefix_attr['35.0.0.0/8'].\
            maxlength_range_attr['8..16'].protocol = 'ipv4'
        prefix_conf.device_attr[self.dev1].prefix_attr['37.0.0.0/8'].\
            maxlength_range_attr['16..24'].protocol = 'ipv4'
        prefix_conf.device_attr[self.dev1].prefix_attr['38.0.0.0/8'].\
            maxlength_range_attr['16..32'].protocol = 'ipv4'
        prefix_conf.device_attr[self.dev1].prefix_attr['2001:DB8:4::/64']\
            .maxlength_range_attr['65..98'].protocol = 'ipv6'

        # Build config
        cfgs = prefix_conf.build_config(apply=False)

        # Check config built correctly
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]), '\n'.join([
                'ipv6 prefix-list test permit 2001:DB8:4::/64 ge 65 le 98',
                'ip prefix-list test permit 35.0.0.0/8 le 16',
                'ip prefix-list test permit 35.0.0.0/8',
                'ip prefix-list test permit 37.0.0.0/8 ge 16 le 24',
                'ip prefix-list test permit 38.0.0.0/8 ge 16',
            ]))

        # Build unconfig
        cfgs = prefix_conf.build_unconfig(apply=False)

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]), '\n'.join([
                'no ipv6 prefix-list test permit 2001:DB8:4::/64 ge 65 le 98',
                'no ip prefix-list test permit 35.0.0.0/8 le 16',
                'no ip prefix-list test permit 35.0.0.0/8',
                'no ip prefix-list test permit 37.0.0.0/8 ge 16 le 24',
                'no ip prefix-list test permit 38.0.0.0/8 ge 16',
            ]))

    def test_cli_config_v6(self):
        # prefix-list conf
        prefix_conf_v6 = PrefixList(prefix_set_name='test6')
        prefix_conf_v6.device_attr[self.dev1].prefix_attr['2001:DB8:1::/64']\
            .maxlength_range_attr['64..64'].protocol = 'ipv6'
        prefix_conf_v6.device_attr[self.dev1].prefix_attr['2001:DB8:2::/64']\
            .maxlength_range_attr['65..128'].protocol = 'ipv6'
        prefix_conf_v6.device_attr[self.dev1].prefix_attr['2001:DB8:3::/64']\
            .maxlength_range_attr['64..128'].protocol = 'ipv6'
        prefix_conf_v6.device_attr[self.dev1].prefix_attr['2001:DB8:4::/64']\
            .maxlength_range_attr['65..98'].protocol = 'ipv6'

        # Build config
        cfgs = prefix_conf_v6.build_config(apply=False)

        # Check config built correctly
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]), '\n'.join([
                'ipv6 prefix-list test6 permit 2001:DB8:1::/64',
                'ipv6 prefix-list test6 permit 2001:DB8:2::/64 ge 65',
                'ipv6 prefix-list test6 permit 2001:DB8:3::/64 le 128',
                'ipv6 prefix-list test6 permit 2001:DB8:4::/64 ge 65 le 98',
            ]))

        # Build unconfig
        cfgs = prefix_conf_v6.build_unconfig(apply=False)

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]), '\n'.join([
                'no ipv6 prefix-list test6 permit 2001:DB8:1::/64',
                'no ipv6 prefix-list test6 permit 2001:DB8:2::/64 ge 65',
                'no ipv6 prefix-list test6 permit 2001:DB8:3::/64 le 128',
                'no ipv6 prefix-list test6 permit 2001:DB8:4::/64 ge 65 le 98',
            ]))
Exemple #24
0
    def test_cfg2(self):

        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')
        intf1 = Interface(device=dev1, name='Ethernet0/0/1',
                          ipv4='10.1.0.1/24')
        intf2 = Interface(device=dev1, name='Ethernet0/0/2',
                          ipv4='10.2.0.1/24')
        dev2 = Device(testbed=testbed, name='PE2', os='nxos')
        intf3 = Interface(device=dev2, name='Ethernet0/0/3',
                          ipv4='10.1.0.2/24', ipv6='2001:111:222::/64')
        intf4 = Interface(device=dev2, name='Ethernet0/0/4',
                          ipv4='10.2.0.2/24')

        with self.assertNoWarnings():

            Genie.testbed = None
            with self.assertRaises(TypeError):
                bgp = Bgp()
            with self.assertRaises(TypeError):
                bgp = Bgp(testbed=testbed)
            Genie.testbed = testbed
            with self.assertRaises(TypeError):
                bgp = Bgp()
            bgp = Bgp(asn=100,bgp_id=100)
            self.assertIs(bgp.testbed, testbed)
            Genie.testbed = testbed
            bgp = Bgp(asn=100,bgp_id=100)
            self.assertIs(bgp.testbed, Genie.testbed)
            self.assertIs(bgp.testbed, testbed)

            # Defining attributes
            vrf_id = 'vrf1'
            vrf1 = Vrf(vrf_id)
            pp_name = 'PEER-POLICY'
            ps_name = 'PEER-SESSION'
            bgp.device_attr[dev2].enabled = True
            bgp.device_attr[dev2].peer_policy_attr[pp_name].pp_allowas_in =\
                True
            bgp.device_attr[dev2].peer_session_attr[ps_name].ps_fall_over_bfd=\
                True
            bgp.device_attr[dev2].vrf_attr[None].cluster_id = '150'
            af_name = 'ipv6 unicast'
            bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name]
            bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\
                af_nexthop_route_map = 'test'
            bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\
                af_dampening = True
            bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\
                af_dampening_half_life_time = 1
            bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\
                af_dampening_reuse_time = 10
            bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\
                af_dampening_suppress_time = 30
            bgp.device_attr[dev2].vrf_attr[None].address_family_attr[af_name].\
                af_dampening_max_suppress_time = 2
            neighbor_id = intf2.ipv4
            bgp.device_attr[dev2].vrf_attr[vrf1].add_neighbor(neighbor_id)
            bgp.device_attr[dev2].vrf_attr[vrf1].neighbor_attr[neighbor_id].\
                nbr_suppress_four_byte_as_capability = True
            nbr_af_name = 'vpnv6 unicast'
            bgp.device_attr[dev2].vrf_attr[vrf1].neighbor_attr[neighbor_id].\
                address_family_attr[nbr_af_name]
            bgp.device_attr[dev2].vrf_attr[vrf1].neighbor_attr[neighbor_id].\
                address_family_attr[nbr_af_name].\
                nbr_af_maximum_prefix_max_prefix_no = 300000
            bgp.device_attr[dev2].vrf_attr[vrf1].neighbor_attr[neighbor_id].\
                address_family_attr[nbr_af_name].nbr_af_default_originate = True

            dev2.add_feature(bgp)
            cfgs = bgp.build_config(apply=False)
            self.assertCountEqual(cfgs.keys(), [dev2.name])
            self.maxDiff = None
            self.assertEqual(str(cfgs[dev2.name]), '\n'.join(
                ['feature bgp',
                'router bgp 100',
                ' cluster-id 150',
                ' address-family ipv6 unicast',
                '  dampening 1 10 30 2',
                '  nexthop route-map test',
                '  exit',
                ' vrf vrf1',
                '  neighbor 10.2.0.1',
                '   capability suppress 4-byte-as',
                '   address-family vpnv6 unicast',
                '    maximum-prefix 300000',
                '    default-originate',
                '    exit',
                '   exit',
                '  exit',
                ' template peer-session PEER-SESSION',
                '  bfd',
                '  exit',
                ' template peer-policy PEER-POLICY',
                '  allowas-in',
                '  exit',
                ' exit',
                ]))

            partial_uncfg1 = bgp.build_unconfig(apply=False, attributes={\
                                'device_attr':\
                                    {dev2.name:\
                                        {'vrf_attr':\
                                            {'vrf1':\
                                                {'neighbor_attr':\
                                                    {'10.2.0.1':\
                                                        {'address_family_attr':\
                                                            {'vpnv6 unicast':\
                                                                {'nbr_af_default_originate': None}}}}}}}}})
            self.assertCountEqual(partial_uncfg1.keys(), [dev2.name])
            self.assertMultiLineEqual(str(partial_uncfg1[dev2.name]), '\n'.\
                join([
                'router bgp 100',
                ' vrf vrf1',
                '  neighbor 10.2.0.1',
                '   address-family vpnv6 unicast',
                '    no default-originate',
                '    exit',
                '   exit',
                '  exit',
                ' exit',
                ]))
Exemple #25
0
    def test_cfg_vxlan(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')
        bgp = Bgp(bgp_id=100)

        # Defining attributes
        af_name = 'l2vpn evpn'
        vrf = Vrf('default')
        bgp.device_attr[dev1].vrf_attr[vrf].address_family_attr[af_name].af_advertise_pip = True

        bgp.device_attr[dev1]

        self.assertIs(bgp.testbed, testbed)
        dev1.add_feature(bgp)

        cfgs = bgp.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join(
            ['router bgp 100',
             ' address-family l2vpn evpn',
             '  advertise-pip',
             '  exit',
             ' exit',
             ]))

        uncfgs = bgp.build_unconfig(
            apply=False,
            attributes={'device_attr': {'*': {'vrf_attr':
                                            {'*': {'address_family_attr': \
                                                {'*': "af_advertise_pip"}}}}}})

        self.assertCountEqual(uncfgs.keys(), [dev1.name])
        self.maxDiff = None
        self.assertMultiLineEqual(str(uncfgs[dev1.name]), '\n'.join(
            ['router bgp 100',
             ' address-family l2vpn evpn',
             '  no advertise-pip',
             '  exit',
             ' exit',
             ]))

        bgp2 = Bgp(bgp_id=100)
        neighbor_id = '10.0.0.1'
        bgp2.device_attr[dev1].vrf_attr[vrf].neighbor_attr[neighbor_id].\
                    nbr_peer_type = Bgp.NBR_PEER_TYPE.fabric_border_leaf
        bgp2.device_attr[dev1].vrf_attr[vrf].neighbor_attr[neighbor_id].address_family_attr[af_name]. \
            nbr_af_rewrite_evpn_rt_asn = True

        bgp2.device_attr[dev1]

        self.assertIs(bgp2.testbed, testbed)
        dev1.add_feature(bgp2)

        cfgs = bgp2.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join(
            ['router bgp 100',
             ' neighbor 10.0.0.1',
             '  peer-type fabric-border-leaf',
             '  address-family l2vpn evpn',
             '   rewrite-evpn-rt-asn',
             '   exit',
             '  exit',
             ' exit',
             ]))

        uncfgs2 = bgp2.build_unconfig(
            apply=False,
            attributes={'device_attr': {'*': {'vrf_attr':
                                                  {'*': {'neighbor_attr': \
                                                     {'*': {"nbr_peer_type":None,
                                                            'address_family_attr': \
                                                                   {'*': "nbr_af_rewrite_evpn_rt_asn"},
                                                            }}}}}}})

        self.assertCountEqual(uncfgs2.keys(), [dev1.name])
        self.maxDiff = None
        self.assertMultiLineEqual(str(uncfgs2[dev1.name]), '\n'.join(
            ['router bgp 100',
             ' neighbor 10.0.0.1',
             '  no peer-type fabric-border-leaf',
             '  address-family l2vpn evpn',
             '   no rewrite-evpn-rt-asn',
             '   exit',
             '  exit',
             ' exit',
             ]))
Exemple #26
0
    def test_cfg(self):
        Genie.testbed = testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='nxos')
        intf1 = Interface(device=dev1, name='Ethernet0/0/1',
                          ipv4='10.1.0.1/24')
        intf2 = Interface(device=dev1, name='Ethernet0/0/2',
                          ipv4='10.2.0.1/24')
        dev2 = Device(testbed=testbed, name='PE2', os='nxos')
        intf3 = Interface(device=dev2, name='Ethernet0/0/3',
                          ipv4='10.1.0.2/24', ipv6='2001:111:222::/64')
        intf4 = Interface(device=dev2, name='Ethernet0/0/4',
                          ipv4='10.2.0.2/24')

        with self.assertNoWarnings():
            Genie.testbed = None
            with self.assertRaises(TypeError):
                bgp = Bgp()
            with self.assertRaises(TypeError):
                bgp = Bgp(testbed=testbed)
            Genie.testbed = testbed
            with self.assertRaises(TypeError):
                bgp = Bgp()
            bgp = Bgp(asn=100, bgp_id=100)
            self.assertIs(bgp.testbed, testbed)
            Genie.testbed = testbed
            bgp = Bgp(asn=100, bgp_id=100)
            self.assertIs(bgp.testbed, Genie.testbed)
            self.assertIs(bgp.testbed, testbed)

            # Defining attributes
            af_name = 'vpnv4 unicast'
            af_name2 = 'link-state'
            bgp.device_attr[dev1]
            bgp.device_attr[dev1].enabled = True
            bgp.device_attr[dev1].vrf_attr[None].always_compare_med = True
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name]
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name2]
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name]. \
                af_retain_rt_all = True
            bgp.device_attr[dev1].vrf_attr[None].address_family_attr[af_name]. \
                af_dampening = True
            neighbor_id = intf4.ipv4
            bgp.device_attr[dev1].vrf_attr[None].add_neighbor(neighbor_id)
            bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]
            bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]. \
                nbr_fall_over_bfd = True
            bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]. \
                nbr_shutdown = True
            nbr_af_name = 'ipv4 unicast'
            bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]. \
                address_family_attr[nbr_af_name]
            bgp.device_attr[dev1].vrf_attr[None].neighbor_attr[neighbor_id]. \
                address_family_attr[nbr_af_name].nbr_af_allowas_in = True

            dev1.add_feature(bgp)

            cfgs = bgp.build_config(apply=False)
            self.assertCountEqual(cfgs.keys(), [dev1.name])
            self.assertMultiLineEqual(str(cfgs[dev1.name]), '\n'.join(
                ['feature bgp',
                 'router bgp 100',
                 ' bestpath always-compare-med',
                 ' neighbor 10.2.0.2',
                 '  bfd',
                 '  shutdown',
                 '  address-family ipv4 unicast',
                 '   allowas-in',
                 '   exit',
                 '  exit',
                 ' address-family link-state',
                 '  exit',
                 ' address-family vpnv4 unicast',
                 '  dampening',
                 '  retain route-target all',
                 '  exit',
                 ' exit',
                 ]))

            bgp.device_attr[dev1].protocol_shutdown = True
            partial_cfg1 = bgp.build_config(
                apply=False,
                attributes={'device_attr': \
                                {'*': "enabled", '*': "protocol_shutdown"}})
            self.assertCountEqual(partial_cfg1.keys(), [dev1.name])
            self.assertMultiLineEqual(str(partial_cfg1[dev1.name]), '\n'. \
                                      join([
                'router bgp 100',
                ' shutdown',
                ' exit',
            ]))
Exemple #27
0
class test_vrf(TestCase):

    def setUp(self):
        # Set Genie Tb
        testbed = Testbed()
        Genie.testbed = testbed
        # Device
        self.dev1 = Device(name='PE1', testbed=testbed, os='iosxr')

    def test_cli_config(self):        
        # prefix-list conf
        vrf_conf = Vrf('VRF1')
        self.dev1.add_feature(vrf_conf)

        # Apply configuration
        vrf_conf.device_attr[self.dev1].address_family_attr['ipv4 unicast'].\
            route_target_attr['200:1'].rt_type  = 'both'
        vrf_conf.device_attr[self.dev1].address_family_attr['ipv4 unicast'].\
            route_target_attr['100:1'].rt_type  = 'import'

        # Build config
        cfgs = vrf_conf.build_config(apply=False)

        # Check config built correctly
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'vrf VRF1',
                ' address-family ipv4 unicast',
                '  import route-target 100:1',
                '  import route-target 200:1',
                '  export route-target 200:1',
                '  exit',
                ' exit',
            ]))

        # Build unconfig
        cfgs = vrf_conf.build_unconfig(apply=False)

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'no vrf VRF1',
            ]))

        # Build unconfig for selected attributes
        cfgs = vrf_conf.build_unconfig(apply=False,
                                       attributes={'device_attr': {
                                                        self.dev1: {
                                                            'address_family_attr': {
                                                                'ipv4 unicast': {
                                                                    'route_target_attr': None
                                                                }
                                                             }}}})

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'vrf VRF1',
                ' address-family ipv4 unicast',
                '  no import route-target 100:1',
                '  no import route-target 200:1',
                '  no export route-target 200:1',
                '  exit',
                ' exit',
            ]))

        # Build unconfig for selected attributes
        cfgs = vrf_conf.build_unconfig(apply=False,
                                       attributes={'device_attr': {
                                                    self.dev1: {
                                                        'address_family_attr': {
                                                            'ipv4 unicast': {
                                                                'route_target_attr': {
                                                                    '200:1': {
                                                                        'rt_type': None}
                                                    }}}}}})

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'vrf VRF1',
                ' address-family ipv4 unicast',
                '  no import route-target 200:1',
                '  no export route-target 200:1',
                '  exit',
                ' exit',
            ]))

    def test_cli_config_v6(self):        
        # prefix-list conf
        vrf_conf = Vrf('VRF2')
        self.dev1.add_feature(vrf_conf)

        # Apply configuration
        vrf_conf.device_attr[self.dev1].address_family_attr['ipv6 unicast'].\
            route_target_attr['100:1'].rt_type  = 'export'
        vrf_conf.device_attr[self.dev1].address_family_attr['ipv6 unicast'].\
            route_target_attr['200:1'].rt_type  = 'export'
        vrf_conf.device_attr[self.dev1].address_family_attr['ipv6 unicast'].\
            route_target_attr['300:1'].rt_type  = 'import'
        vrf_conf.device_attr[self.dev1].address_family_attr['ipv6 unicast'].\
            route_target_attr['400:1'].rt_type  = 'both'

        # Build config
        cfgs = vrf_conf.build_config(apply=False)

        # Check config built correctly
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'vrf VRF2',
                ' address-family ipv6 unicast',
                '  export route-target 100:1',
                '  export route-target 200:1',
                '  import route-target 300:1',
                '  import route-target 400:1',
                '  export route-target 400:1',
                '  exit',
                ' exit',
            ]))

        # Build unconfig
        cfgs = vrf_conf.build_unconfig(apply=False)

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'no vrf VRF2',
            ]))

        # Build unconfig for selected attributes
        cfgs = vrf_conf.build_unconfig(apply=False,
                                       attributes={
                                           'device_attr': {
                                                self.dev1: {
                                                    'address_family_attr': {
                                                        'ipv6 unicast': {
                                                            'route_target_attr': None
                                                        }
                                            }}}})

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'vrf VRF2',
                ' address-family ipv6 unicast',
                '  no export route-target 100:1',
                '  no export route-target 200:1',
                '  no import route-target 300:1',
                '  no import route-target 400:1',
                '  no export route-target 400:1',
                '  exit',
                ' exit',
            ]))

        # Build unconfig for selected attributes
        cfgs = vrf_conf.build_unconfig(apply=False,
                                       attributes={
                                            'device_attr': {
                                                self.dev1: {
                                                    'address_family_attr': {
                                                        'ipv6 unicast': {
                                                            'route_target_attr': {
                                                                '200:1': {
                                                                    'rt_type': None}
                                            }}}}}})

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'vrf VRF2',
                ' address-family ipv6 unicast',
                '  no export route-target 200:1',
                '  exit',
                ' exit',
            ]))
Exemple #28
0
    def test_init(self):

        testbed = Genie.testbed = Testbed()
        dev1 = Device(testbed=testbed, name='PE1', os='iosxe')
        intf1 = Interface(device=dev1, name='GigabitEthernet0/0/1')
        intf2 = Interface(device=dev1, name='GigabitEthernet0/0/2')
        dev2 = Device(testbed=testbed, name='PE2', os='iosxe')
        intf3 = Interface(device=dev2, name='GigabitEthernet0/0/3')
        intf4 = Interface(device=dev2, name='GigabitEthernet0/0/4')
        link1 = Link(testbed=testbed, name='link1', interfaces=(intf1, intf3))
        link2 = Link(testbed=testbed, name='link2', interfaces=(intf2, intf4))

        with self.assertRaises(TypeError):
            xc1 = Xconnect()

        xc1 = Xconnect(name='xc1')
        self.assertIs(xc1.xconnect_type, Xconnect.Type.p2p)
        self.assertEqual(xc1.name, 'xc1')

        self.assertCountEqual(xc1.devices, [])
        self.assertCountEqual(xc1.interfaces, [])
        self.assertCountEqual(xc1.segments, [])
        self.assertCountEqual(xc1.link.interfaces, [])

        dev1.add_feature(xc1)
        self.assertCountEqual(xc1.devices, [dev1])
        self.assertCountEqual(xc1.interfaces, [])
        self.assertCountEqual(xc1.segments, [])
        self.assertCountEqual(xc1.link.interfaces, [])

        cfgs = xc1.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.assertMultiLineEqual(
            str(cfgs[dev1.name]), '\n'.join([
                'l2vpn xconnect context xc1',
                ' exit',
            ]))

        efp = Interface(device=dev1,
                        name='GigabitEthernet0/0/1.20',
                        service_instance=20)
        efp.encapsulation = 'dot1q'
        efp.rewrite_ingress = 'pop 1 symmetric'

        xc1.add_segment(efp)
        self.assertCountEqual(xc1.interfaces, [efp])
        self.assertCountEqual(xc1.devices, [dev1])
        self.assertCountEqual(xc1.segments, [efp])
        self.assertCountEqual(xc1.device_attr[dev1].interfaces, [efp])
        self.assertCountEqual(xc1.device_attr[dev2].interfaces, [])
        self.assertCountEqual(xc1.device_attr[dev1].segments, [efp])
        self.assertCountEqual(xc1.device_attr[dev2].segments, [])

        cfgs = xc1.build_config(apply=False)
        self.assertCountEqual(cfgs.keys(), [dev1.name])
        self.assertMultiLineEqual(
            str(cfgs[dev1.name]), '\n'.join([
                'l2vpn xconnect context xc1',
                ' member GigabitEthernet0/0/1 service-instance 20',
                ' exit',
            ]))
    def test_single_line_config(self):

        # For failures
        self.maxDiff = None

        # Set Genie Tb
        testbed = Testbed()
        Genie.testbed = testbed

        # Device
        dev1 = Device(name='PE1', testbed=testbed, os='nxos')
        intf1 = Interface(name='Ethernet3/7', device=dev1, aliases=['PE1_1'])
        intf2 = Interface(name='Ethernet3/9', device=dev1, aliases=['PE1_2'])
        subif1 = Interface(name='Ethernet3/6.10',
                           device=dev1,
                           aliases=['PE1_1'])
        vrf = Vrf(name='test', testbed=testbed)
        dev1.add_feature(vrf)

        # Apply configuration
        intf1.description = 'test'
        intf1.enabled = False
        # intf1.shutdown = False
        intf1.link_up_down_trap_enable = True
        intf1.mtu = 1492
        intf1.vrf = vrf
        intf1.mac_address = 'aabb.ccdd.eeff'
        intf1.bandwidth = 8192
        intf1.link_status = True
        intf1.load_interval = 33
        intf1.dhcp = True
        intf1.unnumbered_intf_ref = 'Ethernet3/6.10'
        intf1.ipv6_autoconf = True
        intf1.switchport_mode = 'access'
        intf1.medium = 'p2p'
        intf1.delay = 11
        intf1.access_vlan = '19'
        intf1.auto_negotiate = False
        # make intf2 as L2 interface
        intf1.switchport_enable = True

        intf2.enabled = True
        intf2.switchport_enable = True
        intf2.switchport_mode = 'trunk'
        intf2.trunk_add_vlans = '1,2,3'

        # Build config
        cfgs = intf1.build_config(apply=False)
        # Check config build correctly
        self.assertMultiLineEqual(
            str(cfgs), '\n'.join([
                'interface Ethernet3/7', ' medium p2p', ' bandwidth 8192',
                ' delay 11', ' description test', ' mtu 1492', ' shutdown',
                ' snmp trap link-status', ' vrf member test',
                ' logging event port link-status', ' ip address dhcp',
                ' ip unnumbered Ethernet3/6.10', ' ipv6 address autoconfig',
                ' switchport', ' switchport mode access', ' load-interval 33',
                ' mac-address aabb.ccdd.eeff', ' switchport access vlan 19',
                ' no speed', ' no duplex', ' exit'
            ]))

        cfgs = intf2.build_config(apply=False)
        # Check config build correctly
        self.assertMultiLineEqual(
            str(cfgs), '\n'.join([
                'interface Ethernet3/9', ' no shutdown', ' switchport',
                ' switchport mode trunk',
                ' switchport trunk allowed vlan add 1,2,3', ' exit'
            ]))

        # Build unconfig
        uncfgs = intf1.build_unconfig(apply=False,
                                      attributes={
                                          'mtu': True,
                                          'enabled': True
                                      })
        # Check config build correctly
        self.assertMultiLineEqual(
            str(uncfgs), '\n'.join(
                ['interface Ethernet3/7', ' no mtu', ' no shutdown', ' exit']))

        uncfgs = intf2.build_unconfig(apply=False,
                                      attributes={'trunk_add_vlans': True})
        # Check config build correctly
        self.assertMultiLineEqual(
            str(uncfgs), '\n'.join([
                'interface Ethernet3/9',
                ' switchport trunk allowed vlan remove 1,2,3', ' exit'
            ]))
    def test_all_ethernet(self):
        testbed = Testbed()
        Genie.testbed = Testbed()
        dev1 = Device(name='PE1', os='iosxe')
        intf1 = Interface(device=dev1, name='GigabitEthernet0/0/1')
        vrf = Vrf(name='test', testbed=testbed)
        dev1.add_feature(vrf)

        # Defining attributes section
        intf1.description = 'test desc'
        intf1.enabled = True
        intf1.link_up_down_trap_enable = True
        intf1.mtu = 500
        intf1.vrf = vrf
        intf1.vrf_downstream = 'vrf_downstream_test'
        intf1.mac_address = 'aaaa.bbbb.cccc'
        intf1.bandwidth = 768
        intf1.link_status = True
        intf1.load_interval = 30
        intf1.encapsulation = 'dot1q'
        intf1.first_dot1q = '20'
        intf1.second_dot1q = '30'

        ipv4a = IPv4Addr(device=dev1)
        ipv4a.ipv4 = IPv4Address('192.168.1.1')
        ipv4a.prefix_length = '24'
        intf1.add_ipv4addr(ipv4a)
        ipv4b = IPv4Addr(device=dev1)
        ipv4b.ipv4 = IPv4Address('192.168.1.2')
        ipv4b.prefix_length = '24'
        ipv4b.ipv4_secondary = True
        intf1.add_ipv4addr(ipv4b)

        ipv6a = IPv6Addr(device=dev1)
        ipv6a.ipv6 = IPv6Address('2001:db1:1::1')
        ipv6a.ipv6_prefix_length = '64'
        intf1.add_ipv6addr(ipv6a)
        ipv6b = IPv6Addr(device=dev1)
        ipv6b.ipv6 = IPv6Address('2001:db1:2::2')
        ipv6b.ipv6_prefix_length = '64'
        intf1.add_ipv6addr(ipv6b)
        ipv6b.ipv6_anycast = True

        intf1.dhcp = True
        intf1.dhcp_client_id = '10'
        intf1.dhcp_hostname = 'dhcp-host'
        intf1.unnumbered_intf_ref = 'GigabitEthernet0/0/2.20'
        intf1.ipv6_unnumbered_intf_ref = 'GigabitEthernet0/0/3.100'
        intf1.ipv6_enabled = True
        intf1.ipv6_autoconf = True
        intf1.ipv6_autoconf_default = True
        intf1.medium = "broadcast"
        intf1.delay = 100
        intf1.port_speed = '1000'
        intf1.auto_negotiate = True
        intf1.duplex_mode = "full"
        intf1.flow_control_receive = True
        intf1.flow_control_send = False

        # Check config
        cfg = intf1.build_config(apply=False)
        self.assertMultiLineEqual(
            str(cfg), '\n'.join([
                'interface GigabitEthernet0/0/1',
                ' encapsulation dot1q 20 second-dot1q 30',
                ' vrf forwarding test downstream vrf_downstream_test',
                ' description test desc',
                ' bandwidth 768',
                ' mtu 500',
                ' no shutdown',
                ' snmp trap link-status',
                ' logging event link-status',
                ' load-interval 30',
                ' ipv6 enable',
                ' ipv6 address autoconfig default',
                ' ip unnumbered GigabitEthernet0/0/2.20',
                ' ipv6 unnumbered GigabitEthernet0/0/3.100',
                ' speed 1000',
                ' negotiation auto',
                ' duplex full',
                ' flowcontrol receive on',
                ' flowcontrol send off',
                ' ip address dhcp client-id 10 hostname dhcp-host',
                ' medium broadcast',
                ' delay 100',
                ' ip address 192.168.1.1 255.255.255.0',
                ' ip address 192.168.1.2 255.255.255.0 secondary',
                ' ipv6 address 2001:db1:1::1/64',
                ' ipv6 address 2001:db1:2::2/64 anycast',
                ' mac-address aaaa.bbbb.cccc',
                ' exit',
            ]))

        # Check unconfig without attribtues
        uncfg = intf1.build_unconfig(apply=False)
        self.assertMultiLineEqual(
            str(uncfg), '\n'.join([
                'default interface GigabitEthernet0/0/1',
                'interface GigabitEthernet0/0/1',
                'shutdown',
            ]))

        # Check ipv4 unconfig
        uncfg = intf1.build_unconfig(apply=False, attributes="ipv4addr")
        self.assertMultiLineEqual(
            str(uncfg), '\n'.join([
                'interface GigabitEthernet0/0/1',
                ' no ip address 192.168.1.1 255.255.255.0',
                ' no ip address 192.168.1.2 255.255.255.0 secondary',
                ' exit',
            ]))

        # Check encapsulation unconfig
        uncfg = intf1.build_unconfig(apply=False,
                                     attributes={
                                         "encapsulation": None,
                                         "first_dot1q": None
                                     })
        self.assertMultiLineEqual(
            str(uncfg), '\n'.join([
                'interface GigabitEthernet0/0/1',
                ' no encapsulation dot1q',
                ' exit',
            ]))