コード例 #1
0
    def test_ipv6_multiple_lines_confg(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)

        # Apply configuration
        intf1.description = 'multiple lines config'

        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)
        intf1.shutdown = False
        # make intf2 as L3 interface
        intf1.switchport_enable = False

        # Build config
        cfgs = intf1.build_config(apply=False)
        # Check config build correctly
        self.assertMultiLineEqual(
            str(cfgs),
            '\n'.join([
                'interface Ethernet3/7',
                ' description multiple lines config',
                ' no shutdown',
                ' no switchport',
                ' ipv6 address 2001:db1:1::1/64',
                ' ipv6 address 2001:db1:2::2/64',
                ' exit'
                ]))        

        # Build unconfig
        uncfgs = intf1.build_unconfig(apply=False)
        # Check config build correctly
        self.assertMultiLineEqual(
            str(uncfgs),
            '\n'.join([
                'default interface Ethernet3/7',
                ]))
コード例 #2
0
    def test_ipv6_multiple_lines_confg(self):
        # For failures
        self.maxDiff = None

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

        # Device
        dev1 = Device(name='PE1', testbed=testbed, os='iosxr')
        intf1 = Interface(name='GigabitEthernet0/0/0/0', device=dev1, \
            aliases=['PE1_1'])
        vrf = Vrf(name='test', testbed=testbed)
        dev1.add_feature(vrf)

        # Apply configuration
        intf1.description = 'multiple lines config'
        intf1.enabled = False

        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)

        # Build config
        cfgs = intf1.build_config(apply=False)
        # Check config build correctly
        self.assertMultiLineEqual(
            str(cfgs),
            '\n'.join([
                'interface GigabitEthernet0/0/0/0',
                ' ipv6 address 2001:db1:1::1/64',
                ' ipv6 address 2001:db1:2::2/64',
                ' description multiple lines config',
                ' shutdown',
                ' exit'
                ]))        

        # Build unconfig
        uncfgs = intf1.build_unconfig(apply=False, attributes={'ipv6addr':None})
        # Check config build correctly
        self.assertMultiLineEqual(
            str(uncfgs),
            '\n'.join([
                'interface GigabitEthernet0/0/0/0',
                ' no ipv6 address 2001:db1:1::1/64',
                ' no ipv6 address 2001:db1:2::2/64',
                ' exit'
                ]))        
コード例 #3
0
ファイル: modify.py プロジェクト: pythonxian/genielibs
    def configure_intf_ipv6(self, conf_obj, ip, mask, **kwargs):

        # add old ipv6 attributes in conf_object
        # for remove the original ipv6 configurations
        ipv6 = IPv6Addr(device=kwargs['device'])
        for ipInfo in self.keys.values():
            if 'ip' in ipInfo:
                ipv6.ipv6 = IPv6Address(ipInfo['ip'])
            if 'mask' in ipInfo:
                ipv6.ipv6_prefix_length = ipInfo['mask']
            conf_obj.add_ipv6addr(ipv6)

        # remove all existing ipv6 configurations
        conf_obj.build_unconfig(attributes={'ipv6addr': None})
        # clear the used attribtues
        conf_obj.ipv6addr.clear()

        # configure new ipv6 address
        ipv6 = IPv6Addr(device=kwargs['device'])
        ipv6.ipv6 = IPv6Address(ip)
        ipv6.ipv6_prefix_length = mask
        conf_obj.add_ipv6addr(ipv6)
        conf_obj.build_config()
コード例 #4
0
    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',
            ]))
コード例 #5
0
ファイル: device.py プロジェクト: vkoprivica/genielibs
        def traffic_config(self, **kwargs):

            # Supports l3_length
            try:
                kwargs['l2_length'] = kwargs.pop('frame_size')
            except KeyError:
                pass
            try:
                kwargs['l2_length'] = kwargs.pop('packet_len')
            except KeyError:
                pass
            if 'l2_length' in kwargs or 'l2_length_min' in kwargs:
                l2_encap = kwargs.get('l2_encap', '')
                if l2_encap in (
                        'ethernet_ii',
                        'ethernet_ii_vlan',
                        'ethernet_ii_unicast_mpls',
                        'ethernet_ii_multicast_mpls',
                        'ethernet_ii_vlan_unicast_mpls',
                        'ethernet_ii_vlan_multicast_mpls',
                        'ethernet_ii_pppoe',
                        'ethernet_ii_vlan_pppoe',
                        'ethernet_ii_qinq_pppoe',
                ):
                    # L2 = ETH(14) [VLAN(n*4)] [MPLS(n*4)] [PPPoE(6) PPP(2)] L3 FCS(4)
                    l2_hdr_len = 18  # ETH(14) ... FCS(4)
                    if 'vlan' in l2_encap or 'qinq' in l2_encap:
                        if 'vlan_id2' in kwargs or 'vlan_id_outer' in kwargs:
                            l2_hdr_len += 8  # VLAN(2*4)
                        else:
                            l2_hdr_len += 4  # VLAN(4)
                    if 'mpls' in l2_encap:
                        l2_hdr_len += len(
                            self.tcl.cast_list(
                                kwargs['mpls_labels'])) * 4  # MPLS(n*4)
                    if 'pppoe' in l2_encap:
                        l2_hdr_len += 8  # PPPoE(6) PPP(2)
                elif l2_encap in (
                        'ethernet_mac_in_mac',
                        'atm_snap',
                        'atm_snap_802.3snap',
                        'atm_snap_802.3snap_nofcs',
                        'atm_snap_ethernet_ii',
                        'atm_snap_ppp',
                        'atm_snap_pppoe',
                        'atm_llcsnap',
                        'atm_vc_mux',
                        'atm_vc_mux_802.3snap',
                        'atm_vc_mux_802.3snap_nofcs',
                        'atm_vc_mux_ethernet_ii',
                        'atm_vc_mux_ppp',
                        'atm_vc_mux_pppoe',
                        'atm_mpls',
                        'hdlc_unicast',
                        'hdlc_broadcast',
                        'hdlc_unicast_mpls',
                        'hdlc_multicast_mpls',
                        'ppp_link',
                        'cisco_framerelay',
                        'ietf_framerelay',
                        'eth',
                        'raw_l2',
                ):
                    # TODO
                    l2_hdr_len = 18
                else:
                    # TODO
                    l2_hdr_len = 18
                try:
                    kwargs['l3_length'] = int(kwargs['l2_length']) - l2_hdr_len
                except KeyError:
                    pass
                try:
                    kwargs['l3_length_min'] = int(
                        kwargs['l2_length_min']) - l2_hdr_len
                except KeyError:
                    pass
                try:
                    kwargs['l3_length_max'] = int(
                        kwargs['l2_length_max']) - l2_hdr_len
                except KeyError:
                    pass
                try:
                    kwargs['l3_length_step'] = int(kwargs['l2_length_step'])
                except KeyError:
                    pass
                kwargs.pop('l2_length', None)
                kwargs.pop('l2_length_min', None)
                kwargs.pop('l2_length_max', None)
                kwargs.pop('l2_length_step', None)

            # IPv4/IPv6 steps have to be in IP format
            try:
                kwargs['ip_src_step'] = str(IPv4Address(kwargs['ip_src_step']))
            except KeyError:
                pass
            try:
                kwargs['ip_dst_step'] = str(IPv4Address(kwargs['ip_dst_step']))
            except KeyError:
                pass
            try:
                kwargs['ipv6_src_step'] = str(
                    IPv6Address(kwargs['ipv6_src_step']))
            except KeyError:
                pass
            try:
                kwargs['ipv6_dst_step'] = str(
                    IPv6Address(kwargs['ipv6_dst_step']))
            except KeyError:
                pass
            # MAC steps have to be in MAC format
            try:
                kwargs['mac_src_step'] = str(MAC(kwargs['mac_src_step']))
            except KeyError:
                pass
            try:
                kwargs['mac_dst_step'] = str(MAC(kwargs['mac_dst_step']))
            except KeyError:
                pass
            try:
                kwargs['mac_src2_step'] = str(MAC(kwargs['mac_src2_step']))
            except KeyError:
                pass
            try:
                kwargs['mac_dst2_step'] = str(MAC(kwargs['mac_dst2_step']))
            except KeyError:
                pass
            # Pagent HLTAPI does not support l3_protocol=none, not sending it is equivalent.
            if kwargs.get('l3_protocol', None) == 'none':
                del kwargs['l3_protocol']
            # Pagent HLTAPI does not support l4_protocol=none, not sending it is equivalent.
            if kwargs.get('l4_protocol', None) == 'none':
                del kwargs['l4_protocol']
            # Pagent does not support -mac_discovery_gw
            kwargs.pop('mac_discovery_gw', None)
            # Pagent does not support -name
            kwargs.pop('name', None)
            # Pagent only supports -mpls_labels in this format: <label>,<cos>,<bottom>,<ttl>
            if 'mpls_labels' in kwargs:
                mpls_labels = self.tcl.cast_list(kwargs['mpls_labels'],
                                                 item_cast=tclstr)
                for i, mpls_label in enumerate(mpls_labels):
                    try:
                        mpls_label = int(mpls_label)
                    except ValueError:
                        continue
                    else:
                        mpls_label = '{mpls_label},{cos},{bottom},{ttl}'.format(
                            mpls_label=mpls_label,
                            cos=0,
                            bottom=int(i == len(mpls_labels) - 1),
                            ttl=0)
                    mpls_labels[i] = mpls_label
            # Pagent does not support -gateway and -ipv6_gateway
            kwargs.pop('gateway', None)
            kwargs.pop('ipv6_gateway', None)
            # Pagent does not support -mpls_labels_mode, support is equivalent to "fixed"
            if kwargs.get('mpls_labels_mode', None) == 'fixed':
                del kwargs['mpls_labels_mode']

            # -type is Agilent-specific. Default should be "stream"; Anything else is not supported.
            if kwargs.get('type', None) == 'stream':
                del kwargs['type']
            # -dut_type is Agilent-specific.
            kwargs.pop('dut_type', None)
            # Pagent does not support -dest_port_list
            kwargs.pop('dest_port_list', None)

            hltkl = self.pyats_connection.traffic_config(**kwargs)

            if kwargs.get('mode', None) == 'remove' \
                    and 'port_handle' in kwargs \
                    and 'stream_id' in kwargs:
                pagent_stream_ids_var = self.tcl.vars.byref(
                    '::Pagent::_Tgn_Info', array_index=kwargs['port_handle'])
                if pagent_stream_ids_var.exists():
                    # Workaround a bug in Pagent where -mode remove does not
                    # "forget" the stream IDs associated with a port
                    pagent_stream_ids = self.tcl.cast_list(
                        pagent_stream_ids_var.get_obj(), item_cast=tclstr)
                    kwarg_stream_ids = set(
                        self.tcl.cast_list(kwargs['stream_id'],
                                           item_cast=tclstr))
                    pagent_stream_ids = [
                        stream_id for stream_id in pagent_stream_ids
                        if stream_id not in kwarg_stream_ids
                    ]
                    if pagent_stream_ids:
                        pagent_stream_ids_var.set(pagent_stream_ids)
                    else:
                        # If left empty, commands such as traffic_control -action
                        # poll may return failure.
                        pagent_stream_ids_var.unset()

            return hltkl
コード例 #6
0
ファイル: device.py プロジェクト: vkoprivica/genielibs
        def traffic_config(self, **kwargs):
            if 'name' in kwargs:
                assert '.' not in kwargs['name'], \
                    'Ixia stream names are used as stream IDs in Tcl keyed ' \
                    'lists and should not contain "." characters: {}' \
                    .format(kwargs['name'])
            # Supports frame_size or l3_length
            try:
                kwargs['frame_size'] = kwargs.pop('packet_len')
            except KeyError:
                pass
            try:
                kwargs['frame_size'] = kwargs.pop('l2_length')
            except KeyError:
                pass
            # IPv4/IPv6 steps have to be in IP format
            try:
                kwargs['ip_src_step'] = str(IPv4Address(kwargs['ip_src_step']))
            except KeyError:
                pass
            try:
                kwargs['ip_dst_step'] = str(IPv4Address(kwargs['ip_dst_step']))
            except KeyError:
                pass
            try:
                kwargs['ipv6_src_step'] = str(
                    IPv6Address(kwargs['ipv6_src_step']))
            except KeyError:
                pass
            try:
                kwargs['ipv6_dst_step'] = str(
                    IPv6Address(kwargs['ipv6_dst_step']))
            except KeyError:
                pass
            # Legacy API accepts MAC steps can be in either MAC or integer format and internally converts to integer.
            # ixnetwork_540 API accepts only MAC steps in MAC format.
            try:
                kwargs['mac_src_step'] = str(MAC(kwargs['mac_src_step']))
            except KeyError:
                pass
            try:
                kwargs['mac_dst_step'] = str(MAC(kwargs['mac_dst_step']))
            except KeyError:
                pass
            try:
                kwargs['mac_src2_step'] = str(MAC(kwargs['mac_src2_step']))
            except KeyError:
                pass
            try:
                kwargs['mac_dst2_step'] = str(MAC(kwargs['mac_dst2_step']))
            except KeyError:
                pass
            try:
                kwargs['arp_src_hw_step'] = str(MAC(kwargs['arp_src_hw_step']))
            except KeyError:
                pass
            try:
                kwargs['arp_dst_hw_step'] = str(MAC(kwargs['arp_dst_hw_step']))
            except KeyError:
                pass
            # Ixia HLTAPI does not support l3_protocol=none, not sending it is equivalent.
            if kwargs.get('l3_protocol', None) == 'none':
                del kwargs['l3_protocol']
            # Ixia HLTAPI does not support l4_protocol=none, not sending it is equivalent.
            if kwargs.get('l4_protocol', None) == 'none':
                del kwargs['l4_protocol']
            # Ixia HLTAPI does not support mac_discovery_gw
            kwargs.pop('mac_discovery_gw', None)
            kwargs.pop('mac_discovery_gw_count', None)
            kwargs.pop('mac_discovery_gw_step', None)
            # Enable tracking
            if kwargs.get('mode', None) == 'create':
                kwargs.setdefault('track_by', 'traffic_item')
            # Extra Ixia options for MPLS
            if 'mpls_labels' in kwargs:
                kwargs.setdefault('mpls_labels_mode', 'fixed')
                kwargs.setdefault('mpls', 'enable')
            # Extra Ixia vlan toggle
            if kwargs.get('mode', None) == 'create' and 'vlan_id' in kwargs:
                kwargs.setdefault('vlan', 'enable')

            # -type is Agilent-specific. Default should be "stream"; Anything else is not supported.
            if kwargs.get('type', None) == 'stream':
                del kwargs['type']
            # -dut_type is Agilent-specific.
            kwargs.pop('dut_type', None)
            # Ixia uses -port_handle2 instead of -dest_port_list (for unidirectional streams)
            if 'dest_port_list' in kwargs:
                kwargs.setdefault('port_handle2', kwargs.pop('dest_port_list'))

            hltkl = self.pyats_connection.traffic_config(**kwargs)

            return hltkl
コード例 #7
0
    def test_init(self):

        rte_min = BgpL2vpnEvpnRoute('[1][0.0.0.0.0][0]')
        rte_max = BgpL2vpnEvpnRoute(
            '[5][65535][128][ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]')

        rte = BgpL2vpnEvpnRoute('[1][1.2.3.4.5][3]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.ethernet_ad)
        self.assertEqual(rte.esi, ESI('0.1.0.2.0.3.0.4.0.5'))
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 0)
        self.assertEqual(rte.ip, None)
        self.assertEqual(rte.prefix_length, 120)
        self.assertEqual(str(rte), '[1][0001.0002.0003.0004.0005][3]/120')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[1][100:1][1.2.3.4.5][3]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.ethernet_ad)
        self.assertEqual(rte.esi, ESI('0.1.0.2.0.3.0.4.0.5'))
        self.assertEqual(rte.rd, RouteDistinguisher('100:1'))
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 0)
        self.assertEqual(rte.ip, None)
        self.assertEqual(rte.prefix_length, 184)
        self.assertEqual(str(rte),
                         '[1][100:1][0001.0002.0003.0004.0005][3]/184')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[2][3][48][a.b.c][0]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.mac)
        self.assertEqual(rte.esi, None)
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 48)
        self.assertEqual(rte.mac, MAC('a.b.c'))
        self.assertEqual(rte.ip_length, 0)
        self.assertEqual(rte.ip, None)
        self.assertEqual(rte.prefix_length, 104)
        self.assertEqual(str(rte), '[2][3][48][000a.000b.000c][0]/104')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[2][3][48][a.b.c][32][1.2.3.4]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.mac)
        self.assertEqual(rte.esi, None)
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 48)
        self.assertEqual(rte.mac, MAC('a.b.c'))
        self.assertEqual(rte.ip_length, 32)
        self.assertEqual(rte.ip, IPv4Address('1.2.3.4'))
        self.assertEqual(rte.prefix_length, 136)
        self.assertEqual(str(rte),
                         '[2][3][48][000a.000b.000c][32][1.2.3.4]/136')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[2][3][48][a.b.c][128][1::2]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.mac)
        self.assertEqual(rte.esi, None)
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 48)
        self.assertEqual(rte.mac, MAC('a.b.c'))
        self.assertEqual(rte.ip_length, 128)
        self.assertEqual(rte.ip, IPv6Address('1::2'))
        self.assertEqual(rte.prefix_length, 232)
        self.assertEqual(str(rte), '[2][3][48][000a.000b.000c][128][1::2]/232')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[3][3][32][1.2.3.4]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.inclusive_multicast)
        self.assertEqual(rte.esi, None)
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 32)
        self.assertEqual(rte.ip, IPv4Address('1.2.3.4'))
        self.assertEqual(rte.prefix_length, 80)
        self.assertEqual(str(rte), '[3][3][32][1.2.3.4]/80')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[3][3][128][1::2]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.inclusive_multicast)
        self.assertEqual(rte.esi, None)
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 128)
        self.assertEqual(rte.ip, IPv6Address('1::2'))
        self.assertEqual(rte.prefix_length, 176)
        self.assertEqual(str(rte), '[3][3][128][1::2]/176')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[4][1.2.3.4.5]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.ethernet_segment)
        self.assertEqual(rte.esi, ESI('0.1.0.2.0.3.0.4.0.5'))
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, None)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 0)
        self.assertEqual(rte.ip, None)
        self.assertEqual(rte.prefix_length, 88)
        self.assertEqual(str(rte), '[4][0001.0002.0003.0004.0005]/88')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[4][1.2.3.4.5][32][1.2.3.4]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.ethernet_segment)
        self.assertEqual(rte.esi, ESI('0.1.0.2.0.3.0.4.0.5'))
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, None)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 32)
        self.assertEqual(rte.ip, IPv4Address('1.2.3.4'))
        self.assertEqual(rte.prefix_length, 120)
        self.assertEqual(str(rte),
                         '[4][0001.0002.0003.0004.0005][32][1.2.3.4]/120')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[4][1.2.3.4.5][128][1::2]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.ethernet_segment)
        self.assertEqual(rte.esi, ESI('0.1.0.2.0.3.0.4.0.5'))
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, None)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 128)
        self.assertEqual(rte.ip, IPv6Address('1::2'))
        self.assertEqual(rte.prefix_length, 216)
        self.assertEqual(str(rte),
                         '[4][0001.0002.0003.0004.0005][128][1::2]/216')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[5][3][32][1.2.3.4]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.ip)
        self.assertEqual(rte.esi, None)
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 32)
        self.assertEqual(rte.ip, IPv4Address('1.2.3.4'))
        self.assertEqual(rte.prefix_length, 80)
        self.assertEqual(str(rte), '[5][3][32][1.2.3.4]/80')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[5][3][24][1.2.3.0]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.ip)
        self.assertEqual(rte.esi, None)
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 24)
        self.assertEqual(rte.ip, IPv4Address('1.2.3.0'))
        self.assertEqual(rte.prefix_length, 80)
        self.assertEqual(str(rte), '[5][3][24][1.2.3.0]/80')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)

        rte = BgpL2vpnEvpnRoute('[5][3][128][1::2]')
        self.assertIs(rte.af, AddressFamily.l2vpn_evpn)
        self.assertEqual(rte.type, rte.Type.ip)
        self.assertEqual(rte.esi, None)
        self.assertEqual(rte.rd, None)
        self.assertEqual(rte.eth_tag, 3)
        self.assertEqual(rte.mac_length, 0)
        self.assertEqual(rte.mac, None)
        self.assertEqual(rte.ip_length, 128)
        self.assertEqual(rte.ip, IPv6Address('1::2'))
        self.assertEqual(rte.prefix_length, 176)
        self.assertEqual(str(rte), '[5][3][128][1::2]/176')
        rte2 = BgpL2vpnEvpnRoute(rte)
        self.assertEqual(rte, rte2)
        self.assertTrue(rte_min < rte < rte_max)
        self.assertFalse(rte != rte2)