예제 #1
0
def get_mac_all_dut(dut_list, thread=True):
   st.log("Displaying mac ..in all dut")
   dut_li = list([str(e) for e in dut_list]) if isinstance(dut_list, list) else [dut_list]
   params = list()
   for dut in dut_li:
       params.append([get_mac, dut])
   if params:
       exec_all(thread, params)
예제 #2
0
def debug_vrrp(dut_list):
    """
    Author : Sooriya G
    email : [email protected]
    :param dut_list:
    :return:
    """
    st.log("### Start of Debug commands #####")
    cmd_list = ['show vrrp','teamshow','show mac','show ip route','show vlan brief','bcmcmd \'l2 show \'', 'bcmcmd \'l3 defip show\'','bcmcmd \'l3 l3table show\'']
    arg_list = [[st.apply_script,dut,cmd_list] for dut in dut_list]
    utils.exec_all(True,arg_list)
    st.log(" End of Dubug commands")
예제 #3
0
def config_ospf(config='yes'):
    if config == 'yes':
        hdrMsg('Configure ospf between DUT1 and DUT3')
        utils.exec_all(True, [[
            ospf_obj.config_ospf_router_id, data.dut1, dut1_ospf_router_id,
            'default', '', 'yes'
        ],
                              [
                                  ospf_obj.config_ospf_router_id, data.dut3,
                                  dut3_ospf_router_id, 'default', '', 'yes'
                              ]])

        utils.exec_all(True, [[
            ospf_obj.config_ospf_network, data.dut1, dut1_loopback_ip_list[0] +
            '/' + ip_loopback_prefix, 0, 'default', '', 'yes'
        ],
                              [
                                  ospf_obj.config_ospf_network, data.dut3,
                                  dut3_loopback_ip_list[0] + '/' +
                                  ip_loopback_prefix, 0, 'default', '', 'yes'
                              ]])

        utils.exec_all(
            True,
            [[
                ospf_obj.config_interface_ip_ospf_network_type, data.dut1,
                'PortChannel14', 'point-to-point', 'default', 'yes'
            ],
             [
                 ospf_obj.config_interface_ip_ospf_network_type, data.dut3,
                 'PortChannel14', 'point-to-point', 'default', 'yes'
             ]])

        ospf_obj.config_ospf_router_redistribute(data.dut3, 'connected')
    else:
        hdrMsg('UnConfig ospf between DUT1 and DUT3')

        utils.exec_all(
            True,
            [[
                ospf_obj.config_interface_ip_ospf_network_type, data.dut1,
                'PortChannel14', 'point-to-point', 'default', 'no'
            ],
             [
                 ospf_obj.config_interface_ip_ospf_network_type, data.dut3,
                 'PortChannel14', 'point-to-point', 'default', 'no'
             ]])

        utils.exec_all(
            True,
            [[ospf_obj.config_ospf_router, data.dut1, 'default', '', 'no'],
             [ospf_obj.config_ospf_router, data.dut3, 'default', '', 'no']])
예제 #4
0
def tg_vrf_bind(**kwargs):
    vars = st.get_testbed_vars()

    dut1 = st.get_dut_names()[0]
    dut2 = st.get_dut_names()[1]
    if 'config' in kwargs:
        config = kwargs['config']
    else:
        config = ''

    if config == '':
        st.log('######------Configure vlans on the PE--CE side-------######')
        for i in range(3):
            utils.exec_all(True, [[vlan_obj.create_vlan, vars.D1, data.dut1_tg1_vlan[i]], [vlan_obj.create_vlan, vars.D2, data.dut2_tg1_vlan[i]]])
            utils.exec_all(True,[[vlan_obj.add_vlan_member,vars.D1,data.dut1_tg1_vlan[i],vars.D1T1P1,True,True], [vlan_obj.add_vlan_member,vars.D2,data.dut2_tg1_vlan[i],vars.D2T1P1,True,True]])
            '''
            vlan_obj.create_vlan(vars.D1, data.dut1_tg1_vlan[i]) # Vlan-1, VRF-101, port1
            vlan_obj.add_vlan_member(vars.D1, data.dut1_tg1_vlan[i], vars.D1T1P1, True, True)
            vlan_obj.create_vlan(vars.D2, data.dut2_tg1_vlan[i])
            vlan_obj.add_vlan_member(vars.D2, data.dut2_tg1_vlan[i], vars.D2T1P1, True, True)
            '''
        st.log('######------Bind DUT1 <--> tg1 vlans to vrf, assign v4 and v6 address------######')
        for vrf, vlan, ip, ipv6 in zip(data.vrf_name[0:3], data.dut1_tg1_vlan[0:3],data.dut1_tg1_vrf_ip[0:3], data.dut1_tg1_vrf_ipv6[0:3]):
            vrf_api.bind_vrf_interface(dut = vars.D1, vrf_name = vrf, intf_name = 'Vlan'+vlan, skip_error = True)
            ipfeature.config_ip_addr_interface(vars.D1, 'Vlan'+vlan, ip, data.dut1_tg1_vrf_ip_subnet, 'ipv4')
            ipfeature.config_ip_addr_interface(vars.D1, 'Vlan'+vlan, ipv6, data.dut1_tg1_vrf_ipv6_subnet, 'ipv6')

        st.log('######------Bind DUT2 <--> tg1 vlans to vrf, assign v4 and v6 address------######')
        for vrf, vlan,ip,ipv6 in zip(data.vrf_name[0:3], data.dut2_tg1_vlan[0:3], data.dut2_tg1_vrf_ip[0:3], data.dut2_tg1_vrf_ipv6[0:3]):
            vrf_api.bind_vrf_interface(dut = vars.D2, vrf_name = vrf, intf_name = 'Vlan'+vlan, skip_error = True)
            ipfeature.config_ip_addr_interface(vars.D2, 'Vlan'+vlan, ip, data.dut2_tg1_vrf_ip_subnet, 'ipv4')
            ipfeature.config_ip_addr_interface(vars.D2, 'Vlan'+vlan, ipv6, data.dut2_tg1_vrf_ipv6_subnet, 'ipv6')
    else:
        st.log('######------Unbind DUT1 <--> tg1port1 vlans to vrf, assign v4 and v6 address------######')
        for vrf, vlan, ip, ipv6 in zip(data.vrf_name[0:3], data.dut1_tg1_vlan[0:3],data.dut1_tg1_vrf_ip[0:3], data.dut1_tg1_vrf_ipv6[0:3]):
            ipfeature.delete_ip_interface(dut1, 'Vlan'+vlan, ip, data.dut1_tg1_vrf_ip_subnet, 'ipv4')
            ipfeature.delete_ip_interface(dut1, 'Vlan'+vlan, ipv6, data.dut1_tg1_vrf_ipv6_subnet, 'ipv6')
            vrf_api.bind_vrf_interface(dut = dut1, vrf_name = vrf, intf_name = 'Vlan'+vlan, skip_error = True, config = 'no')
        st.log('######------Unbind DUT2 <--> tg1 vlans to vrf, assign v4 and v6 address------######')
        for vrf, vlan,ip,ipv6 in zip(data.vrf_name[0:3], data.dut2_tg1_vlan[0:3], data.dut2_tg1_vrf_ip[0:3], data.dut2_tg1_vrf_ipv6[0:3]):
            ipfeature.delete_ip_interface(dut2, 'Vlan'+vlan, ip, data.dut2_tg1_vrf_ip_subnet, 'ipv4')
            ipfeature.delete_ip_interface(dut2, 'Vlan'+vlan, ipv6, data.dut2_tg1_vrf_ipv6_subnet, 'ipv6')
            vrf_api.bind_vrf_interface(dut = dut2, vrf_name = vrf, intf_name = 'Vlan'+vlan, skip_error = True, config = 'no')

        st.log('######------Unconfigure vlans on the PE--CE side -------######')
        for i in range(3):
            vlan_obj.delete_vlan_member(dut1, data.dut1_tg1_vlan[i], vars.D1T1P1, tagging_mode=True)
            vlan_obj.delete_vlan(dut1, data.dut1_tg1_vlan[i]) # Vlan-1, VRF-101, port1
            vlan_obj.delete_vlan_member(dut2, data.dut2_tg1_vlan[i], vars.D2T1P1, tagging_mode=True)
            vlan_obj.delete_vlan(dut2, data.dut2_tg1_vlan[i])
예제 #5
0
def config_stp_vlan_parameters_parallel(dut_list, thread=True, **kwargs):
    """
    Author : chaitanya lohith bollapragada
    This will configure the "config_stp_vlan_parameters" in parallel to all DUTs mentioned.
    :param dut_list:
    :param vlan: list of vlans
    :param priority: list of STP priorities
    :param thread: True | False
    :return:
    """
    st.log("Configuring STP vlan parameters in paraller on all DUT's ... ")
    dut_li = list(dut_list) if isinstance(dut_list, list) else [dut_list]
    vlan_li = list(kwargs['vlan']) if isinstance(kwargs['vlan'],
                                                 list) else [kwargs['vlan']]
    priority_li = list(kwargs['priority']) if isinstance(
        kwargs['priority'], list) else [kwargs['priority']]
    if not len(dut_li) == len(vlan_li) == len(priority_li):
        return False
    params = list()
    for i, each in enumerate(dut_list):
        params.append(
            utility.ExecAllFunc(config_stp_vlan_parameters,
                                each,
                                vlan_li[i],
                                priority=priority_li[i]))
    [out, exceptions] = exec_all(thread, params)
    st.log(exceptions)
    return False if False in out else True
예제 #6
0
def debug_vrrpv3(dut_list):
    """
    Author : Raghukumar Rampur
    email : [email protected]
    :param dut_list:
    :return:
    """
    st.log("### Start of Debug commands #####")
    cmd_list = [
        'show vrrp6', 'teamshow', 'show mac', 'show ip route',
        'show ipv6 route', 'show vlan brief', 'bcmcmd \'l2 show \'',
        'bcmcmd \'l3 defip show\'', 'bcmcmd \'l3 l3table show\''
    ]
    arg_list = [[st.apply_script, dut, cmd_list] for dut in dut_list]
    utils.exec_all(True, arg_list)
    st.log(" End of Dubug commands")
예제 #7
0
def verify_root_bridge_on_stp_instances(dut_list, vlan, bridge_identifier):
    """
    API to verify the bridge identifier with root bridge identifier
    :param dut_list:
    :param vlan:
    :param bridge_identifier:
    :return:
    """
    dut_li = list(dut_list) if isinstance(dut_list, list) else [dut_list]
    params = list()
    for dut in dut_li:
        params.append([get_stp_bridge_param, dut, vlan, "rt_id"])
    if params:
        [out, exceptions] = exec_all(True, params)
        st.log("#########OUTPUT###########")
        st.log(out)
        st.log(exceptions)
        for value in exceptions:
            st.log("Exceptions observed {}".format(value))
            if value is not None:
                return False
        for identifier in out:
            st.log("Comparing ROOT bridge ID {} with Provided ID {}".format(
                identifier, bridge_identifier))
            if identifier != bridge_identifier:
                st.log("Mismatch in root and bridge identifiers")
                return False
            else:
                st.log(
                    "Root Bridge Identifier {} is matched with provided identifier {}"
                    .format(identifier, bridge_identifier))
                return True
    return False
예제 #8
0
def ip_config(test_type, vrfname='default'):
    D1_ports, D2_ports, max_bfd, ipv4_bgp, ipv6_bgp, dut1_ip, dut2_ip, dut1_ipv6, dut2_ipv6, vlan_list, vlan_intf = \
    return_vars(vrfname)

    if test_type == 'mix':
        ############################################################################################
        hdrMsg(
            "Step-C1: Configure ip address %s on dut1 and %s on dut2 for all Vlans"
            % (dut1_ip, dut2_ip))
        ############################################################################################
        for vlan, ip_1, ip_3 in zip(vlan_intf, dut1_ip, dut2_ip):
            utils.exec_all(
                True,
                [[ip_api.config_ip_addr_interface, dut1, vlan, ip_1, ip_mask],
                 [ip_api.config_ip_addr_interface, dut2, vlan, ip_3, ip_mask]])

        ############################################################################################
        hdrMsg(
            "Step-C2: Configure ipv6 address %s on dut1 and %s on dut2 for all Vlans"
            % (dut1_ipv6, dut2_ipv6))
        ############################################################################################
        for vlan, ip_1, ip_3 in zip(vlan_intf, dut1_ipv6, dut2_ipv6):
            utils.exec_all(True, [[
                ip_api.config_ip_addr_interface, dut1, vlan, ip_1, ipv6_mask,
                'ipv6'
            ],
                                  [
                                      ip_api.config_ip_addr_interface, dut2,
                                      vlan, ip_3, ipv6_mask, 'ipv6'
                                  ]])
    elif test_type == 'ipv4':
        ############################################################################################
        hdrMsg(
            "Step-C1: Configure ip address %s on dut1 and %s on dut2 for all Vlans"
            % (dut1_ip, dut2_ip))
        ############################################################################################
        for vlan, ip_1, ip_3 in zip(vlan_intf, dut1_ip, dut2_ip):
            utils.exec_all(
                True,
                [[ip_api.config_ip_addr_interface, dut1, vlan, ip_1, ip_mask],
                 [ip_api.config_ip_addr_interface, dut2, vlan, ip_3, ip_mask]])

    else:
        ############################################################################################
        hdrMsg(
            "Step-C1: Configure ipv6 address %s on dut1 and %s on dut2 for all Vlans"
            % (dut1_ipv6, dut2_ipv6))
        ############################################################################################
        for vlan, ip_1, ip_3 in zip(vlan_intf, dut1_ipv6, dut2_ipv6):
            utils.exec_all(True, [[
                ip_api.config_ip_addr_interface, dut1, vlan, ip_1, ipv6_mask,
                'ipv6'
            ],
                                  [
                                      ip_api.config_ip_addr_interface, dut2,
                                      vlan, ip_3, ipv6_mask, 'ipv6'
                                  ]])
예제 #9
0
def check_for_single_root_bridge_per_vlan(dut_list,
                                          vlan_list,
                                          dut_vlan_data,
                                          cli_type='click'):
    """
    API to check for single root bridge per VLAN
    Author: Chaitanya Vella ([email protected])
    :param dut:
    :param vlanid:
    :param cli_type:
    :return:
    """
    st.log("Verifying the single root bridge per vlan ...")
    dut_li = list([str(e) for e in dut_list]) if isinstance(
        dut_list, list) else [dut_list]
    vlan_li = list([str(e) for e in vlan_list]) if isinstance(
        vlan_list, list) else [vlan_list]
    if len(vlan_list) != len(dut_list):
        st.log("Invalid data provided to check the root bridge per vlan ...")
        st.report_fail("invalid_data_for_root_bridge_per_vlan")
    for vlan in vlan_li:
        root_count = 0
        params = list()
        for dut in dut_li:
            params.append([show_stp_vlan, dut, vlan, cli_type])
        stp_output, exceptions = exec_all(True, params)
        st.log(stp_output)
        st.log(exceptions)
        for value in exceptions:
            st.log("Exceptions observed {}".format(value))
            if value is not None:
                st.log("Exception occured {}".format(value))
                return False
        if not stp_output:
            st.log("STP output not found on {} for {} instance".format(
                dut_li, vlan))
            st.report_fail("stp_output_not_found", dut_li, vlan)
        for index, stp_out in enumerate(stp_output):
            if len(stp_out) <= 0:
                st.log("STP OUTPUT IS NOT OBSERVED --- {}".format(stp_out))
                st.report_fail("stp_output_not_found")
            root_bridge = stp_out[0]["rt_id"]
            dut_bridge_id = stp_out[0]["br_id"]
            if root_bridge == dut_bridge_id and stp_out[0]["rt_port"] == "Root":
                if dut_vlan_data[dut_li[index]] != int(vlan.strip()):
                    st.log(
                        "Expected DUT {} is not root for {} instance".format(
                            dut_li[index], vlan))
                    st.report_fail("expected_dut_not_root", dut_li[index],
                                   vlan)
                root_count += 1
            if root_count > 1:
                st.log(
                    "Observed more than 1 root bridge per {} instance".format(
                        vlan))
                st.report_fail("observed_more_than_1_root_bridge", vlan)
    return True
예제 #10
0
def get_root_bridge_for_vlan(dut_vlan_data, thread=True):
    params = list()
    result = dict()
    for dut, vlan in dut_vlan_data.items():
        params.append([check_dut_is_root_bridge_for_vlan, dut, vlan])
    if params:
        [out, exceptions] = exec_all(thread, params)
    utils.banner_log("Getting root bridge details")
    for i, response in enumerate(out):
        result[params[i][1]] = response
    print(result)
    return result
예제 #11
0
def initialize_topology():
    # code for ensuring min topology
    st.log(
        "Initialize............................................................................................................."
    )
    vars = st.ensure_min_topology("D1D2:4", "D1T1:2", "D2T1:2")
    data.dut_list = st.get_dut_names()
    data.dut1 = data.dut_list[0]
    data.dut2 = data.dut_list[1]
    utils.exec_all(True,
                   [[bgp_api.enable_docker_routing_config_mode, data.dut1],
                    [bgp_api.enable_docker_routing_config_mode, data.dut2]])
    data.d1_dut_ports = [vars.D1D2P1]
    data.d2_dut_ports = [vars.D2D1P1]
    data.dut1_tg1_ports = [vars.D1T1P1]
    data.dut2_tg1_ports = [vars.D2T1P1]
    data.tg_dut1_hw_port = vars.T1D1P1
    data.tg_dut2_hw_port = vars.T1D2P1
    data.tg1 = tgen_obj_dict[vars['tgen_list'][0]]
    data.tg2 = tgen_obj_dict[vars['tgen_list'][0]]
    data.tg_dut1_p1 = data.tg1.get_port_handle(vars.T1D1P1)
    data.tg_dut2_p1 = data.tg2.get_port_handle(vars.T1D2P1)
    data.d1_p1_intf_v4 = {}
    data.d1_p1_intf_v6 = {}
    data.d2_p1_intf_v4 = {}
    data.d2_p1_intf_v6 = {}
    data.stream_list_scale = {}
    data.stream = []
    data.dut1_dut2_ip_list = ip_range('5.0.0.1', 2, 1000)
    data.dut2_dut1_ip_list = ip_range('5.0.0.2', 2, 1000)
    data.dut1_tg_host = '6.0.0.1'
    data.tg_dut1_host = '6.0.0.2'
    data.dut2_tg_host = '7.0.0.1'
    data.tg_dut2_host = '7.0.0.2'
    data.tg_dut1_stream_start = ip_range('6.0.0.3', 3, 1000)
    data.tg_dut2_stream_start = ip_range('7.0.0.3', 3, 1000)
    data.intf_list = []
    for vlan in dut1_dut2_vlan_scale:
        data.intf_list.append('Vlan' + vlan)
예제 #12
0
def config_stp_root_bridge_by_vlan(stp_data):
    """
    :param stp_data: {dut1: {"vlan":10, "priority": "0"}, dut2: {"vlan":20, "priority": "0"}, dut3: {"vlan":30, "priority": "0"}}
    """
    params = list()
    for dut, data in stp_data.items():
        params.append(
            utility.ExecAllFunc(config_stp_vlan_parameters,
                                dut,
                                data["vlan"],
                                priority=data["priority"]))
    [out, exceptions] = exec_all(True, params)
    ensure_no_exception(exceptions)
예제 #13
0
def config_stp_in_parallel(dut_list,
                           feature="pvst",
                           mode="enable",
                           vlan=None,
                           thread=True):
    """
    API to configure stp in parallel on all the provided DUT's
    Author: Chaitanya Vella ([email protected])
    :param dut_list:
    :param feature:
    :param mode:
    :param vlan:
    :param thread:
    :return:
    """
    st.log("Configuring {} on all the DUT's with mode as {}".format(
        feature.capitalize(), mode))
    dut_li = list([str(e) for e in dut_list]) if isinstance(
        dut_list, list) else [dut_list]
    params = list()
    for dut in dut_li:
        params.append([config_spanning_tree, dut, feature, mode, vlan])
    if params:
        exec_all(thread, params)
예제 #14
0
def bgp_unnum_post_config():
    vars = st.get_testbed_vars()
    bgp_obj.cleanup_router_bgp(st.get_dut_names())
    ip_obj.clear_ip_configuration(st.get_dut_names(),
                                  family='ipv4',
                                  skip_error_check=True)
    ip_obj.clear_ip_configuration(st.get_dut_names(),
                                  family='ipv6',
                                  skip_error_check=True)
    utils.exec_all(True, [[
        ip_obj.config_interface_ip6_link_local, vars.D1, d1_int_ipv6_list,
        "disable"
    ],
                          [
                              ip_obj.config_interface_ip6_link_local, vars.D2,
                              d2_int_ipv6_list, "disable"
                          ]])
    vlan_obj.clear_vlan_configuration(st.get_dut_names())
    pc_obj.clear_portchannel_configuration(st.get_dut_names())

    st.log("Cleaning up routing interfaces configured on TG")
    st.log(
        "Stopping the TG traffic again, if in case of any failures in test function misses the stop operation"
    )
def debug_cmds2():
    global vars
    ############################################################################################
    hdrMsg(" \n######### Debugs ##########\n")
    ############################################################################################
    utils.exec_all(True, [[Bgp.show_bgp_ipv4_summary_vtysh, vars.D1], [Bgp.show_bgp_ipv4_summary_vtysh, vars.D2]])
    utils.exec_all(True, [[ip.show_ip_route, vars.D1], [ip.show_ip_route, vars.D2],
                          [ip.show_ip_route, vars.D3],[ip.show_ip_route, vars.D6]])
    utils.exec_all(True, [[ip.show_ip_route, vars.D1, "ipv6"], [ip.show_ip_route, vars.D2, "ipv6"],
                          [ip.show_ip_route, vars.D3, "ipv6"],[ip.show_ip_route, vars.D6, "ipv6"]])
예제 #16
0
def base_config(vrfname='default'):
    D1_ports, D2_ports, max_bfd, ipv4_bgp, ipv6_bgp, dut1_ip, dut2_ip, dut1_ipv6, dut2_ipv6, vlan_list, vlan_intf = \
    return_vars(vrfname)

    hdrMsg("##### BASE config Starts ####")

    ############################################################################################
    hdrMsg("Step-C1: Configure %s Vlans  on dut1 and dut2" % max_bfd)
    ############################################################################################
    utils.exec_all(True, [[
        vlan_api.config_vlan_range, dut1, '{} {}'.format(
            vlan_list[0], vlan_list[-1])
    ],
                          [
                              vlan_api.config_vlan_range, dut2, '{} {}'.format(
                                  vlan_list[0], vlan_list[-1])
                          ]])
    if vrfname == user_vrf_name:
        dict1 = {'vrf_name': user_vrf_name, 'skip_error': True}
        parallel.exec_parallel(True, [dut1, dut2], vrf_api.config_vrf,
                               [dict1, dict1])
        dict1 = {
            'vrf_name': [vrfname] * len(vlan_intf),
            'intf_name': vlan_intf,
            'skip_error': True
        }
        dict2 = {
            'vrf_name': [vrfname] * len(vlan_intf),
            'intf_name': vlan_intf,
            'skip_error': True
        }
        parallel.exec_parallel(True, [dut1, dut2], vrf_api.bind_vrf_interface,
                               [dict1, dict2])
    ############################################################################################
    hdrMsg(
        "Step-C2: Configure %s as tagged member for vlans %s  on dut1 and %s on dut2"
        % (D1_ports[0], vlan_list[0:((total_vlans / 2))], D2_ports[0]))
    ############################################################################################

    utils.exec_all(
        True, [[
            vlan_api.config_vlan_range_members, dut1, '{} {}'.format(
                vlan_list[0], vlan_list[total_vlans / 2]), D1_ports[0]
        ],
               [
                   vlan_api.config_vlan_range_members, dut2, '{} {}'.format(
                       vlan_list[0], vlan_list[total_vlans / 2]), D2_ports[0]
               ]])

    ############################################################################################
    hdrMsg(
        "Step-C2: Configure %s as tagged member for vlans %s  on dut1 and %s on dut2"
        % (D1_ports[1], vlan_list[((total_vlans / 2)):], D2_ports[1]))
    ############################################################################################

    utils.exec_all(
        True, [[
            vlan_api.config_vlan_range_members, dut1, '{} {}'.format(
                vlan_list[((total_vlans / 2) + 1)], vlan_list[-1]), D1_ports[1]
        ],
               [
                   vlan_api.config_vlan_range_members, dut2, '{} {}'.format(
                       vlan_list[((total_vlans / 2) + 1)], vlan_list[-1]),
                   D2_ports[1]
               ]])

    ip_config(test_type, vrfname)
    dict1 = {
        'vrf_name': vrfname,
        'local_as': dut1_as,
        'router_id': '1.1.1.1',
        'config_type_list': ['router_id']
    }
    dict2 = {
        'vrf_name': vrfname,
        'local_as': dut2_as,
        'router_id': '2.2.2.2',
        'config_type_list': ['router_id']
    }
    parallel.exec_parallel(True, [dut1, dut2], bgp_api.config_bgp,
                           [dict1, dict2])

    bgp_config(test_type, vrfname)

    ############################################################################################
    hdrMsg("Step-C3: Verify all BGP/BGP+ sessions are in Established state")
    ############################################################################################
    if test_type == 'ipv4':
        nbr_list = dut2_ip
    elif test_type == 'ipv6':
        nbr_list = dut2_ipv6
    else:
        nbr_list = dut2_ip + dut2_ipv6
    result = retry_api(ip_bgp.check_bgp_session,
                       dut1,
                       nbr_list=nbr_list,
                       state_list=['Established'] * len(nbr_list),
                       vrf_name=vrfname,
                       retry_count=10,
                       delay=3)

    if result is False:
        st.error("One or more BGP sessions did not come up")
        st.report_fail('module_config_failed',
                       'One or more BGP sessions did not come up')
    hdrMsg("##### BASE config END ####")
예제 #17
0
def base_unconfig():
    ###############################################################################################################################

    st.log('######------Unconfigure static routes on 900 VRFs-----######')
    for vrf, dut1_as, dut2_as in zip(vrf_list[899:1000], dut1_as_scale[0:100],
                                     dut2_as_scale[0:100]):
        dict1 = {
            'vrf_name': vrf,
            'local_as': dut1_as,
            'config': 'no',
            'removeBGP': 'yes',
            'config_type_list': ['removeBGP']
        }
        dict2 = {
            'vrf_name': vrf,
            'local_as': dut2_as,
            'config': 'no',
            'removeBGP': 'yes',
            'config_type_list': ['removeBGP']
        }
        parallel.exec_parallel(True, [data.dut1, data.dut2],
                               bgp_api.config_bgp, [dict1, dict2])

    ###############################################################################################################################

    st.log('######------Unconfigure static routes on 900 VRFs-----######')
    dict1 = {
        'dest_list': data.tg_dut2_stream_start[0:425],
        'next_hop_list': data.dut2_dut1_ip_list[0:425],
        'vrf_list': vrf_list[0:425],
        'config': 'no'
    }
    dict2 = {
        'dest_list': data.tg_dut2_stream_start[0:425],
        'vrf_list': vrf_list[0:425],
        'config': 'no'
    }
    parallel.exec_parallel(True, [data.dut1, data.dut2], vrf_static_route,
                           [dict1, dict2])
    st.wait(30)

    st.log('######----- UnConfigure IP on DUT--TG interface------######')
    utils.exec_all(
        True,
        [[
            ip_api.config_ip_addr_interface, data.dut1, data.dut1_tg1_ports[0],
            data.dut1_tg_host, '16', 'ipv4', 'remove'
        ],
         [
             ip_api.config_ip_addr_interface, data.dut2,
             data.dut2_tg1_ports[0], data.dut2_tg_host, '16', 'ipv4', 'remove'
         ]])

    dict1 = {
        'dest_list': data.tg_dut2_stream_start[425:899],
        'next_hop_list': data.dut2_dut1_ip_list[425:899],
        'vrf_list': vrf_list[425:899],
        'config': 'no'
    }
    dict2 = {
        'dest_list': data.tg_dut2_stream_start[425:899],
        'vrf_list': vrf_list[425:899],
        'config': 'no'
    }
    parallel.exec_parallel(True, [data.dut1, data.dut2], vrf_static_route,
                           [dict1, dict2])
    st.wait(30)

    ###############################################################################################################################

    st.log('###### ----- Laoding back the config_db file ------######')
    #cmd = 'cp /etc/sonic/default.json /etc/sonic/config_db.json'
    src_path = "/etc/sonic/default.json"
    dst_path = "/etc/sonic/config_db.json"
    utils.exec_all(
        True,
        [[basic_obj.copy_file_to_local_path, data.dut1, src_path, dst_path],
         [basic_obj.copy_file_to_local_path, data.dut2, src_path, dst_path]])
    utils.exec_all(
        True, [[st.reboot, data.dut1, 'fast'], [st.reboot, data.dut2, 'fast']])

    ###############################################################################################################################

    host_config(config='no')
예제 #18
0
def base_config():
    ###############################################################################################################################

    st.log('###### ----- Taking backup for unconfig ------######')
    src_path = "/etc/sonic/config_db.json"
    dst_path = "/etc/sonic/default.json"
    #cmd = 'cp /etc/sonic/config_db.json /etc/sonic/default.json'
    utils.exec_all(
        True,
        [[basic_obj.copy_file_to_local_path, data.dut1, src_path, dst_path],
         [basic_obj.copy_file_to_local_path, data.dut2, src_path, dst_path]])
    ###############################################################################################################################

    st.log(
        '###### ----- Loading json file with vrf and IP address config ------######'
    )
    curr_path = os.getcwd()
    json_file_dut1 = curr_path + "/routing/VRF/vrf_scale_dut1.json"
    st.apply_files(data.dut1, [json_file_dut1])

    json_file_dut2 = curr_path + "/routing/VRF/vrf_scale_dut2.json"
    st.apply_files(data.dut2, [json_file_dut2])

    utils.exec_all(True, [[st.apply_files, data.dut1, [json_file_dut1]],
                          [st.apply_files, data.dut2, [json_file_dut2]]])

    st.log('######------Configure vlans and add members------######')
    utils.exec_all(True,
                   [[vlan_api.config_vlan_range, data.dut1, '1 999', 'add'],
                    [vlan_api.config_vlan_range, data.dut2, '1 999', 'add']])
    utils.exec_all(True, [[
        vlan_api.config_vlan_range_members, data.dut1, '1 999',
        data.d1_dut_ports[0], 'add'
    ],
                          [
                              vlan_api.config_vlan_range_members, data.dut2,
                              '1 999', data.d2_dut_ports[0], 'add'
                          ]])

    ###############################################################################################################################

    st.log('######----- Configure IP on DUT--TG interface------######')
    utils.exec_all(True,
                   [[
                       ip_api.config_ip_addr_interface, data.dut1,
                       data.dut1_tg1_ports[0], data.dut1_tg_host, '16', 'ipv4'
                   ],
                    [
                        ip_api.config_ip_addr_interface, data.dut2,
                        data.dut2_tg1_ports[0], data.dut2_tg_host, '16', 'ipv4'
                    ]])

    ###############################################################################################################################

    st.log(
        '######----- Configure hosts and create traffic streams for all VRFs------######'
    )
    host_config()
    gateway_mac = mac_api.get_sbin_intf_mac(data.dut1, data.dut1_tg1_ports[0])

    data.stream = data.tg1.tg_traffic_config(
        port_handle=data.tg_dut1_p1,
        mode='create',
        duration='5',
        transmit_mode='continuous',
        length_mode='fixed',
        port_handle2=data.tg_dut2_p1,
        rate_pps=1000,
        mac_src='00.00.00.11.12.53',
        mac_dst=gateway_mac,
        ip_src_addr=data.tg_dut1_stream_start[0],
        ip_dst_addr=data.tg_dut2_stream_start[0],
        l3_protocol='ipv4',
        ip_src_mode='increment',
        ip_src_count=1000,
        ip_src_step='0.0.0.1')
    data.stream_list_scale.update({'pc_v4_stream': data.stream['stream_id']})
    st.wait(30)
예제 #19
0
def test_ft_bgp_unnumbered_peer_basic():
    # ################ Author Details ################
    # Name: Kiran Vedula
    # Email: [email protected]
    # ################################################
    utils_obj.banner_log(
        'FtOtSoRtBgpUnFn001,FtOtSoRtBgpUnFn002,FtOtSoRtBgpUnFn018,FtOtSoRtBgpUnFn019'
    )
    st.log('######------Configure Unnumbered BGP peers------######')
    result = 0
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D1,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D1D2P1,
                           state='Established'):
        st.log("Failed to form BGP unnumbered peering using IPv6 link local")
        result += 1
    bgp_obj.config_bgp_neighbor_properties(vars.D1,
                                           data.d1_local_as,
                                           vars.D1D2P1,
                                           family="ipv6",
                                           neighbor_shutdown='',
                                           no_form='')
    if utils.poll_wait(bgp_obj.verify_bgp_summary,
                       data.wait,
                       vars.D1,
                       family='ipv6',
                       shell=bgp_cli_type,
                       neighbor=vars.D1D2P1,
                       state='Established'):
        st.log("unnumbered BGP peering is established even after shutdown")
        result += 1
    bgp_obj.config_bgp_neighbor_properties(vars.D1,
                                           data.d1_local_as,
                                           vars.D1D2P1,
                                           family="ipv6",
                                           neighbor_shutdown='',
                                           no_form='no')
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D1,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D1D2P1,
                           state='Established'):
        st.log(
            "Failed to form BGP unnumbered peering using IPv6 link local after no shutdown"
        )
        result += 1
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D1,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=data.vlan_in_1,
                           state='Established'):
        st.log(
            "Failed to form BGP unnumbered peering using IPv6 link local on a VLAN"
        )
        result += 1
    # Get show ndp output
    st.log('######------shut/no shut link with unnumbered BGP------######')
    utils.exec_all(
        True,
        [[arp_obj.show_ndp, vars.D1, None], [arp_obj.show_ndp, vars.D2, None]])
    intf_obj.interface_operation(vars.D1,
                                 vars.D1D2P1,
                                 operation="shutdown",
                                 skip_verify=True)
    st.wait(data.wait)
    intf_obj.interface_status_show(vars.D1, vars.D1D2P1)
    intf_obj.interface_operation(vars.D1,
                                 vars.D1D2P1,
                                 operation="startup",
                                 skip_verify=True)
    st.wait(data.wait)
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D1,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D1D2P1,
                           state='Established'):
        st.log("Failed to form BGP unnumbered peering using IPv6 link local")
        result += 1
    if result == 0:
        st.report_pass("test_case_passed")
    else:
        st.log("BGP IPv6 unnumbered neighborship failure")
        st.report_fail("test_case_failed")
예제 #20
0
def bgp_unnum_pre_config():
    global vars
    vars = st.ensure_min_topology("D1D2:4", "D1T1:2", "D2T1:2")
    global dut1_rt_int_mac, dut2_rt_int_mac, d1_prt_link_local, \
           d2_prt_link_local, d1_int_ipv6_list, d2_int_ipv6_list
    # For debugging purpose, checking 'running config' before proceeding for module config
    utils.exec_all(True, [[sc_obj.get_running_config, vars.D1],
                          [sc_obj.get_running_config, vars.D2]])
    # For debugging purpose, checking 'routing interfaces' before proceeding for module config
    # utils.exec_all(True, [[ip_obj.get_interface_ip_address, vars.D1, None, "ipv6"],
    #                       [ip_obj.get_interface_ip_address, vars.D2, None, "ipv6"]])
    pc_obj.config_portchannel(vars.D1,
                              vars.D2,
                              data.portchannel_name,
                              [vars.D1D2P3, vars.D1D2P4],
                              [vars.D2D1P3, vars.D2D1P4],
                              config='add',
                              thread=True)
    # vlan config
    utils.exec_all(
        True,
        [[vlan_obj.create_vlan, vars.D1, [data.vlan_li[0], data.vlan_li[1]]],
         [vlan_obj.create_vlan, vars.D2, [data.vlan_li[0], data.vlan_li[1]]]])
    utils.exec_all(True, [[
        vlan_mem_cfg, vars.D1,
        [[data.vlan_li[0], vars.D1D2P2, True],
         [data.vlan_li[1], vars.D1D2P2, True]]
    ],
                          [
                              vlan_mem_cfg, vars.D2,
                              [[data.vlan_li[0], vars.D2D1P2, True],
                               [data.vlan_li[1], vars.D2D1P2, True]]
                          ]])
    d1_int_ipv6_list = [
        vars.D1D2P1, data.vlan_in_1, data.vlan_in_2, data.portchannel_name
    ]
    d2_int_ipv6_list = [
        vars.D2D1P1, data.vlan_in_1, data.vlan_in_2, data.portchannel_name
    ]
    utils.exec_all(
        True,
        [[ip_obj.config_interface_ip6_link_local, vars.D1, d1_int_ipv6_list],
         [ip_obj.config_interface_ip6_link_local, vars.D2, d2_int_ipv6_list]])
    # TG connected int ipv6 address config
    utils.exec_all(
        True,
        [[
            ip_obj.config_ip_addr_interface, vars.D1, vars.D1T1P2,
            data.tgd_ip6_addr_l[0], data.tg_ip6_addr_mask_l[0], "ipv6", 'add'
        ],
         [
             ip_obj.config_ip_addr_interface, vars.D2, vars.D2T1P2,
             data.tgd_ip6_addr_l[1], data.tg_ip6_addr_mask_l[1], "ipv6", 'add'
         ]])
    utils.exec_all(
        True,
        [[
            ip_obj.config_ip_addr_interface, vars.D1, vars.D1T1P1,
            data.tgd_ip4_addr_l[0], data.tg_ip4_addr_mask_l[0], "ipv4", 'add'
        ],
         [
             ip_obj.config_ip_addr_interface, vars.D2, vars.D2T1P1,
             data.tgd_ip4_addr_l[1], data.tg_ip4_addr_mask_l[1], "ipv4", 'add'
         ]])
    # Get DUT mac address
    [rt_int_mac, exceptions
     ] = utils.exec_all(True,
                        [[basic_obj.get_ifconfig_ether, vars.D1, vars.D1D2P1],
                         [basic_obj.get_ifconfig_ether, vars.D2, vars.D2D1P1]])
    for value in exceptions:
        if value is not None:
            st.log("Exceptions observed {}".format(value))
            st.error(
                "Exceptions observed while getting mac address of routing interface"
            )
    dut1_rt_int_mac = rt_int_mac[0]
    dut2_rt_int_mac = rt_int_mac[1]
    # Get DUT link local addresses
    [rt_link_local_addr, exceptions] = utils.exec_all(
        True, [[ip_obj.get_link_local_addresses, vars.D1, vars.D1D2P1],
               [ip_obj.get_link_local_addresses, vars.D2, vars.D2D1P1]])
    for value in exceptions:
        if value is not None:
            st.log("Exceptions observed {}".format(value))
            st.error(
                "Exceptions observed while getting mac address of routing interface"
            )
    d1_prt_link_local = rt_link_local_addr[0]
    d2_prt_link_local = rt_link_local_addr[1]
    st.log("######------Get show ndp output------######")
    utils.exec_all(
        True,
        [[arp_obj.show_ndp, vars.D1, None], [arp_obj.show_ndp, vars.D2, None]])
    bgp_unnumbered_neighbour_config()
예제 #21
0
def dut_vrf_bind(**kwargs):
    vars = st.get_testbed_vars()

    dut1 = st.get_dut_names()[0]
    dut2 = st.get_dut_names()[1]

    if 'config' in kwargs:
        config = kwargs['config']
    else:
        config = ''

    if  config == '':
        st.log('######------Configure vlans on the PE--PE side - DUT1 -- DUT2------######')
        for vlan in data.dut1_dut2_vlan[0:3]:
            vlan_obj.create_vlan(dut1, vlan)
            vlan_obj.add_vlan_member(dut1, vlan, vars.D1D2P1, True, True)
        for vlan in data.dut2_dut1_vlan[0:3]:
            vlan_obj.create_vlan(dut2, vlan)
            vlan_obj.add_vlan_member(dut2, vlan, vars.D2D1P1, True, True)

        st.log('######------Bind DUT1 <--> DUT2 vlans to vrf, assign v4 and v6 address------######')
        for vlan, ip, ip2, ipv6, ipv6_2, vrf in zip(data.dut1_dut2_vlan[0:3], data.dut1_dut2_vrf_ip[0:3], data.dut2_dut1_vrf_ip[0:3], data.dut1_dut2_vrf_ipv6[0:3], data.dut2_dut1_vrf_ipv6[0:3], data.vrf_name[0:3]):
            dict1 = {'vrf_name':vrf, 'intf_name':'Vlan'+vlan,'skip_error':True}
            dict2 = {'vrf_name':vrf, 'intf_name':'Vlan'+vlan,'skip_error':True}
            parallel.exec_parallel(True, [dut1, dut2], vrf_api.bind_vrf_interface, [dict1, dict2])

            utils.exec_all(True,[[ipfeature.config_ip_addr_interface,dut1,'Vlan'+vlan,ip,data.dut1_dut2_vrf_ip_subnet,'ipv4'], [ipfeature.config_ip_addr_interface,dut2, 'Vlan'+vlan, ip2, data.dut2_dut1_vrf_ip_subnet, 'ipv4']])

            utils.exec_all(True,[[ipfeature.config_ip_addr_interface,dut1,'Vlan'+vlan,ipv6,data.dut1_dut2_vrf_ipv6_subnet,'ipv6'], [ipfeature.config_ip_addr_interface,dut2, 'Vlan'+vlan,ipv6_2, data.dut2_dut1_vrf_ipv6_subnet, 'ipv6']])

            '''
            vrf_api.bind_vrf_interface(dut = dut1, vrf_name = vrf, intf_name = 'Vlan'+vlan, skip_error = True)
            ipfeature.config_ip_addr_interface(dut1, 'Vlan'+vlan, ip, data.dut1_dut2_vrf_ip_subnet, 'ipv4')
            ipfeature.config_ip_addr_interface(dut1, 'Vlan'+vlan, ipv6, data.dut1_dut2_vrf_ipv6_subnet, 'ipv6')
            '''
        '''
        st.log('######------Bind DUT2 <--> DUT1 virtual interfaces to vrf and config IP addresses------######')
        for vlan, ip, ipv6, vrf in zip(data.dut2_dut1_vlan[0:3], data.dut2_dut1_vrf_ip[0:3], data.dut2_dut1_vrf_ipv6[0:3],data.vrf_name[0:3]):
            vrf_api.bind_vrf_interface(dut = dut2, vrf_name = vrf, intf_name = 'Vlan'+vlan, skip_error = True)
            ipfeature.config_ip_addr_interface(dut2, 'Vlan'+vlan, ip, data.dut2_dut1_vrf_ip_subnet, 'ipv4')
            ipfeature.config_ip_addr_interface(dut2, 'Vlan'+vlan, ipv6, data.dut2_dut1_vrf_ipv6_subnet, 'ipv6')
        '''

    elif config == 'no':
        '''
        st.log('######------Unbind DUT1 <--> DUT2 vlans to vrf, assign v4 and v6 address------######')
        for vlan, ip, ipv6, vrf in zip(data.dut1_dut2_vlan[0:3], data.dut1_dut2_vrf_ip[0:3], data.dut1_dut2_vrf_ipv6[0:3],data.vrf_name[0:3]):
            vrf_api.bind_vrf_interface(dut = dut1, vrf_name = vrf, intf_name = 'Vlan'+vlan, skip_error = True, config = 'no')
            ipfeature.delete_ip_interface(dut1, 'Vlan'+vlan, ip, data.dut1_dut2_vrf_ip_subnet, 'ipv4')
            ipfeature.delete_ip_interface(dut1, 'Vlan'+vlan, ipv6, data.dut1_dut2_vrf_ipv6_subnet, 'ipv6')

        st.log('######------Unbind DUT2 <--> DUT1 physical interfaces to vrf and config IP addresses------######')
        for vlan, ip, ipv6, vrf in zip(data.dut2_dut1_vlan[0:3], data.dut2_dut1_vrf_ip[0:3], data.dut2_dut1_vrf_ipv6[0:3],data.vrf_name[0:3]):
            vrf_api.bind_vrf_interface(dut = dut2, vrf_name = vrf, intf_name = 'Vlan'+vlan, skip_error = True, config = 'no')
            ipfeature.delete_ip_interface(dut2, 'Vlan'+vlan, ip, data.dut2_dut1_vrf_ip_subnet, 'ipv4')
            ipfeature.delete_ip_interface(dut2, 'Vlan'+vlan, ipv6, data.dut2_dut1_vrf_ipv6_subnet, 'ipv6')
        '''
        st.log('######------Delete vlans on the PE--PE side - DUT1 -- DUT2------######')
        for vlan in data.dut1_dut2_vlan[0:3]:
            vlan_obj.delete_vlan_member(dut1, vlan, vars.D1D2P1, tagging_mode=True)
            vlan_obj.delete_vlan(dut1, vlan)
        for vlan in data.dut2_dut1_vlan[0:3]:
            vlan_obj.delete_vlan_member(dut2, vlan, vars.D2D1P1, tagging_mode=True)
            vlan_obj.delete_vlan(dut2, vlan)
def setup_evpn_5549():

    global vars
    vars = st.get_testbed_vars()
    make_global_vars()

    ############################################################################################
    hdrMsg("\n########## BASE CONFIGS ############\n")
    ############################################################################################

    ############################################################################################
    hdrMsg("\n########## Enable debugs ############\n")
    ############################################################################################
    enable_debugs()

    ############################################################################################
    hdrMsg("\n########## Configure Port-channel and portchannel members ############\n")
    ############################################################################################

    st.log("create port channel interface b/w leaf and spine nodes")
    utils.exec_all(True, [[pch.create_portchannel, data.leaf_nodes_list[0], data.leaf1_po_list],
                    [pch.create_portchannel, data.leaf_nodes_list[1], data.leaf2_po_list],
                    [pch.create_portchannel, data.leaf_nodes_list[2], data.leaf3_po_list],
                    [pch.create_portchannel, data.leaf_nodes_list[3], data.leaf4_po_list],
                    [pch.create_portchannel, data.spine_nodes_list[0], data.spine1_po_list],
                    [pch.create_portchannel, data.spine_nodes_list[1], data.spine2_po_list]])

    st.log("Add members to port channel created b/w leaf and spine nodes")
    utils.exec_all(True, [[pch.add_portchannel_member, data.leaf_nodes_list[0], data.leaf1_po_list[0], data.leaf1_spine1_po_intf_list],
                          [pch.add_portchannel_member, data.leaf_nodes_list[1], data.leaf2_po_list[0], data.leaf2_spine1_po_intf_list],
                          [pch.add_portchannel_member, data.leaf_nodes_list[2], data.leaf3_po_list[0], data.leaf3_spine1_po_intf_list],
                          [pch.add_portchannel_member, data.leaf_nodes_list[3], data.leaf4_po_list[0], data.leaf4_spine1_po_intf_list]])

    utils.exec_all(True, [[pch.add_portchannel_member, data.leaf_nodes_list[0], data.leaf1_po_list[1], data.leaf1_spine2_po_intf_list],
                          [pch.add_portchannel_member, data.leaf_nodes_list[1], data.leaf2_po_list[1], data.leaf2_spine2_po_intf_list],
                          [pch.add_portchannel_member, data.leaf_nodes_list[2], data.leaf3_po_list[1], data.leaf3_spine2_po_intf_list],
                          [pch.add_portchannel_member, data.leaf_nodes_list[3], data.leaf4_po_list[1], data.leaf4_spine2_po_intf_list]])

    for po1,po2,intf_list1,intf_list2 in zip(data.spine1_po_list,data.spine2_po_list,data.spine1_all_lfs_po_intf_list,data.spine2_all_lfs_po_intf_list):
        utils.exec_all(True, [[pch.add_portchannel_member,data.spine_nodes_list[0], po1, intf_list1],
                          [pch.add_portchannel_member, data.spine_nodes_list[1], po2, intf_list2]])

    st.log("Enable portchannel interface on all leaf and spine nodes")
    utils.exec_all(True, [[Intf.interface_operation, data.leaf_nodes_list[0], data.leaf1_po_list, "startup"],
                          [Intf.interface_operation, data.leaf_nodes_list[1], data.leaf2_po_list, "startup"],
                          [Intf.interface_operation, data.leaf_nodes_list[2], data.leaf3_po_list, "startup"],
                          [Intf.interface_operation, data.leaf_nodes_list[3], data.leaf4_po_list, "startup"],
                          [Intf.interface_operation, data.spine_nodes_list[0], data.spine1_po_list, "startup"],
                          [Intf.interface_operation, data.spine_nodes_list[1], data.spine2_po_list, "startup"]])

    ############################################################################################
    hdrMsg("\n####### Configure IP address on link1 of all the DUTs ##############\n")
    ############################################################################################

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D1, data.spine1_port_list1], [ipfeature.config_interface_ip6_link_local, vars.D2, data.spine2_port_list1]])

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D3, data.leafs_spine1_port_lst1[0]], [ipfeature.config_interface_ip6_link_local, vars.D4, data.leafs_spine1_port_lst1[1]], [ipfeature.config_interface_ip6_link_local, vars.D5, data.leafs_spine1_port_lst1[2]],[ipfeature.config_interface_ip6_link_local, vars.D6, data.leafs_spine1_port_lst1[3]]])

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D3, data.leafs_spine2_port_lst1[0]], [ipfeature.config_interface_ip6_link_local, vars.D4, data.leafs_spine2_port_lst1[1]], [ipfeature.config_interface_ip6_link_local, vars.D5, data.leafs_spine2_port_lst1[2]],[ipfeature.config_interface_ip6_link_local, vars.D6, data.leafs_spine2_port_lst1[3]]])

    ############################################################################################
    hdrMsg("\n########## Configure IP address on link2 (LAG) of all the DUTs ##############\n")
    ############################################################################################
    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D1, data.spine1_po_list], [ipfeature.config_interface_ip6_link_local, vars.D2, data.spine2_po_list]])

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D3, data.leaf1_po_list[0]], [ipfeature.config_interface_ip6_link_local, vars.D4, data.leaf2_po_list[0]], [ipfeature.config_interface_ip6_link_local, vars.D5, data.leaf3_po_list[0]], [ipfeature.config_interface_ip6_link_local, vars.D6, data.leaf4_po_list[0]]])

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D3, data.leaf1_po_list[1]], [ipfeature.config_interface_ip6_link_local, vars.D4, data.leaf2_po_list[1]], [ipfeature.config_interface_ip6_link_local, vars.D5, data.leaf3_po_list[1]], [ipfeature.config_interface_ip6_link_local, vars.D6, data.leaf4_po_list[1]]])


    ############################################################################################
    hdrMsg("\n####### Configure IP address on link3 of all the DUTs ##############\n")
    ############################################################################################

    for ipv6_1,ipv6_2,po1,po2 in zip(data.spine1_ipv6_list, data.spine2_ipv6_list,data.spine1_port_list4, data.spine2_port_list4):
        utils.exec_all(True,[[ipfeature.config_ip_addr_interface,vars.D1, po1, ipv6_1 , data.maskv6,'ipv6'],[ipfeature.config_ip_addr_interface,vars.D2, po2, ipv6_2, data.maskv6,'ipv6']])

    utils.exec_all(True,[[ipfeature.config_ip_addr_interface,vars.D3, data.leafs_spine1_port_lst4[0], data.leaf_spine1_ipv6_list[0], data.maskv6,'ipv6'],[ipfeature.config_ip_addr_interface,vars.D4, data.leafs_spine1_port_lst4[1], data.leaf_spine1_ipv6_list[1], data.maskv6,'ipv6'], [ipfeature.config_ip_addr_interface,vars.D5, data.leafs_spine1_port_lst4[2], data.leaf_spine1_ipv6_list[2] , data.maskv6,'ipv6'], [ipfeature.config_ip_addr_interface,vars.D6, data.leafs_spine1_port_lst4[3], data.leaf_spine1_ipv6_list[3] , data.maskv6,'ipv6']])

    utils.exec_all(True,[[ipfeature.config_ip_addr_interface,vars.D3, data.leafs_spine2_port_lst4[0], data.leaf_spine2_ipv6_list[0], data.maskv6,'ipv6'],[ipfeature.config_ip_addr_interface,vars.D4, data.leafs_spine2_port_lst4[1], data.leaf_spine2_ipv6_list[1], data.maskv6,'ipv6'], [ipfeature.config_ip_addr_interface,vars.D5, data.leafs_spine2_port_lst4[2], data.leaf_spine2_ipv6_list[2], data.maskv6,'ipv6'], [ipfeature.config_ip_addr_interface,vars.D6, data.leafs_spine2_port_lst4[3], data.leaf_spine2_ipv6_list[3], data.maskv6,'ipv6']])

    ############################################################################################
    hdrMsg("\n########## Enable router bgp and configure router id ##############\n")
    ############################################################################################

    dict1 = {'local_as': data.bgp_leaf_local_as[0],'router_id':data.leaf_loopback_list[0],'config_type_list':['router_id']}
    dict2 = {'local_as': data.bgp_leaf_local_as[1],'router_id':data.leaf_loopback_list[1],'config_type_list':['router_id']}
    dict3 = {'local_as': data.bgp_leaf_local_as[2],'router_id':data.leaf_loopback_list[2],'config_type_list':['router_id']}
    dict4 = {'local_as': data.bgp_leaf_local_as[3],'router_id':data.leaf_loopback_list[3],'config_type_list':['router_id']}

    parallel.exec_parallel(True, data.leaf_nodes_list, bgp_obj.config_bgp, [dict1,dict2,dict3,dict4])

    dict1 = {'local_as':data.bgp_spine_local_as[0],'router_id':data.spine_loopback_list[0], 'config_type_list':['router_id']}
    dict2 = {'local_as':data.bgp_spine_local_as[1],'router_id':data.spine_loopback_list[1],'config_type_list':['router_id']}

    parallel.exec_parallel(True, data.spine_nodes_list, bgp_obj.config_bgp, [dict1,dict2])

    ############################################################################################
    hdrMsg(" \n######### Configure BGP neighbor for link1 on all spines and leafs ##########\n")
    ############################################################################################
    dict1 = {'local_as':data.bgp_spine_local_as[0], 'config': 'yes',  'config_type_list':["multipath-relax"]}
    dict2 = {'local_as':data.bgp_spine_local_as[1], 'config': 'yes',  'config_type_list':["multipath-relax"]}
    parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])

    dict = {}
    for i in range(0,4):
        dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes',  'config_type_list':["multipath-relax"]}
    dict_lst = [dict[x] for x in range(0,4)]
    parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)

    for intf1,intf2 in zip(data.spine1_port_list1,data.spine2_port_list1):
       if evpn_dict['cli_mode'] == 'click':
           dict1 = {'local_as':data.bgp_spine_local_as[0],'config':'yes','config_type_list':["remote-as"],'remote_as':'external','interface':intf1}
           dict2 = {'local_as':data.bgp_spine_local_as[1],'config':'yes','config_type_list':["remote-as"],'remote_as':'external','interface':intf2}
           parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])
           dict1 = {'local_as':data.bgp_spine_local_as[0],'config':'yes','config_type_list':["connect"],'neighbor':intf1,'connect':"1"}
           dict2 = {'local_as':data.bgp_spine_local_as[1],'config':'yes','config_type_list':["connect"],'neighbor':intf2,'connect':"1"}
           parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])
       elif evpn_dict['cli_mode'] == 'klish':
           dict1 = {'local_as':data.bgp_spine_local_as[0],'config':'yes','config_type_list':["neighbor","connect"],'remote_as':'external','neighbor':intf1, \
               'addr_family':"ipv6",'connect':"1"}
           dict2 = {'local_as':data.bgp_spine_local_as[1],'config':'yes','config_type_list':["neighbor","connect"],'remote_as':'external','neighbor':intf2,'connect':"1"}
           parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])

       dict1 = {'local_as':data.bgp_spine_local_as[0], 'config': 'yes', 'config_type_list':["activate"], 'neighbor':intf1,'remote_as':'external'}
       dict2 = {'local_as':data.bgp_spine_local_as[1], 'config': 'yes', 'config_type_list':["activate"], 'neighbor':intf2,'remote_as':'external'}
       parallel.exec_parallel(True,data.spine_nodes_list,evpn_api.config_bgp_evpn,[dict1,dict2])

    for port_lst1 in [data.leafs_spine1_port_lst1, data.leafs_spine2_port_lst1]:
       if evpn_dict['cli_mode'] == 'click':
          dict = {}
          for i in range(0,4):
              dict[i] ={'local_as':data.bgp_leaf_local_as[i],'config':'yes','config_type_list':["remote-as"],'remote_as':'external','interface':port_lst1[i]}
          dict_lst = [dict[x] for x in range(0,4)]
          parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)
          dict = {}
          for i in range(0,4):
              dict[i] ={'local_as':data.bgp_leaf_local_as[i],'config':'yes','config_type_list':["connect"],'neighbor':port_lst1[i],'connect':"1"}
          dict_lst = [dict[x] for x in range(0,4)]
          parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)
       elif evpn_dict['cli_mode'] == 'klish':
          for i in range(0,4):
              dict[i] ={'local_as':data.bgp_leaf_local_as[i],'config':'yes','config_type_list':["neighbor","connect"],'remote_as':'external', \
                  'addr_family':"ipv6",'neighbor':port_lst1[i],'connect':"1"}
          dict_lst = [dict[x] for x in range(0,4)]
          parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)

       dict = {}
       for i in range(0,4):
           dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes',  'config_type_list':["activate"], 'neighbor':port_lst1[i],'remote_as':'external'}
       dict_lst = [dict[x] for x in range(0,4)]
       parallel.exec_parallel(True,data.leaf_nodes_list,evpn_api.config_bgp_evpn,dict_lst)

    ############################################################################################
    hdrMsg(" \n######### Configure BGP neighbor for link2 on all spines and leafs ##########\n")
    ############################################################################################
    for intf1,intf2,j in zip(data.spine1_po_list,data.spine2_po_list,range(0,4)):
       if evpn_dict['cli_mode'] == 'click':
          dict1 = {'local_as':data.bgp_spine_local_as[0],'config':'yes','config_type_list':["remote-as"],'remote_as':data.bgp_leaf_local_as[j],'interface' :intf1}
          dict2 = {'local_as':data.bgp_spine_local_as[1],'config':'yes','config_type_list':["remote-as"],'remote_as':data.bgp_leaf_local_as[j],'interface' :intf2}
          parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])
          dict1 = {'local_as':data.bgp_spine_local_as[0],'config':'yes','config_type_list':["connect"],'neighbor' :intf1,'connect':"1"}
          dict2 = {'local_as':data.bgp_spine_local_as[1],'config':'yes','config_type_list':["connect"],'neighbor' :intf2,'connect':"1"}
          parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])
       elif evpn_dict['cli_mode'] == 'klish':
          dict1 = {'local_as':data.bgp_spine_local_as[0],'config':'yes','config_type_list':["neighbor","connect"],'remote_as':data.bgp_leaf_local_as[j], \
              'addr_family':"ipv6",'neighbor' :intf1,'connect':"1"}
          dict2 = {'local_as':data.bgp_spine_local_as[1],'config':'yes','config_type_list':["neighbor","connect"],'remote_as':data.bgp_leaf_local_as[j], \
              'addr_family':"ipv6",'neighbor' :intf2,'connect':"1"}
          parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])

       dict1 = {'local_as':data.bgp_spine_local_as[0], 'config': 'yes', 'config_type_list':["activate"], 'neighbor':intf1,'remote_as':data.bgp_leaf_local_as[j]}
       dict2 = {'local_as':data.bgp_spine_local_as[1], 'config': 'yes', 'config_type_list':["activate"], 'neighbor':intf2,'remote_as':data.bgp_leaf_local_as[j]}
       parallel.exec_parallel(True,data.spine_nodes_list,evpn_api.config_bgp_evpn,[dict1,dict2])

    for j,port_lst1 in zip(range(0,2),[data.leafs_spine1_po_lst1, data.leafs_spine2_po_lst1]):
       if evpn_dict['cli_mode'] == 'click':
          dict = {}
          for i in range(0,4):
              dict[i] = {'local_as':data.bgp_leaf_local_as[i],'config':'yes','config_type_list':["remote-as"],'remote_as':data.bgp_spine_local_as[j],'interface':port_lst1[i]}
          dict_lst = [dict[x] for x in range(0,4)]
          parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)
          dict = {}
          for i in range(0,4):
              dict[i] = {'local_as':data.bgp_leaf_local_as[i],'config':'yes','config_type_list':["connect"],'neighbor':port_lst1[i],'connect':"1"}
          dict_lst = [dict[x] for x in range(0,4)]
          parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)
       elif evpn_dict['cli_mode'] == 'klish':
          dict = {}
          for i in range(0,4):
              dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes',  'config_type_list':["neighbor","connect"], 'remote_as': data.bgp_spine_local_as[j], 'neighbor' : port_lst1[i],'addr_family':"ipv6",'connect':"1"}
          dict_lst = [dict[x] for x in range(0,4)]
          parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)

       dict = {}
       for i in range(0,4):
           dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes',  'config_type_list':["activate"],'neighbor':port_lst1[i],'remote_as': data.bgp_spine_local_as[j]}
       dict_lst = [dict[x] for x in range(0,4)]
       parallel.exec_parallel(True,data.leaf_nodes_list,evpn_api.config_bgp_evpn,dict_lst)

    ############################################################################################
    hdrMsg(" \n######### Configure BGP neighbor for link3 on all spines and leafs ##########\n")
    ############################################################################################
    for ipv6_1,ipv6_2,j in zip(data.leaf_spine1_ipv6_list, data.leaf_spine2_ipv6_list,range(0,4)):
       dict1 = {'local_as':data.bgp_spine_local_as[0], 'config': 'yes',  'config_type_list':["neighbor","connect"], 'remote_as':data.bgp_leaf_local_as[j], 'neighbor' : ipv6_1,'addr_family':"ipv6",'connect':"1"}
       dict2 = {'local_as':data.bgp_spine_local_as[1], 'config': 'yes',  'config_type_list':["neighbor","connect"], 'remote_as':data.bgp_leaf_local_as[j], 'neighbor' : ipv6_2,'addr_family':"ipv6",'connect':"1"}
       parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])

       dict1 = {'local_as':data.bgp_spine_local_as[0], 'config': 'yes', 'config_type_list':["activate"], 'neighbor':ipv6_1,'remote_as':data.bgp_leaf_local_as[j]}
       dict2 = {'local_as':data.bgp_spine_local_as[1], 'config': 'yes', 'config_type_list':["activate"], 'neighbor':ipv6_2,'remote_as':data.bgp_leaf_local_as[j]}
       parallel.exec_parallel(True,data.spine_nodes_list,evpn_api.config_bgp_evpn,[dict1,dict2])

    for ipv6_lst1,j in zip([data.spine1_ipv6_list,data.spine2_ipv6_list],range(0,2)):
        dict = {}
        for i in range(0,4):
            dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes', 'config_type_list':["neighbor","connect"], 'remote_as':data.bgp_spine_local_as[j], 'neighbor' : ipv6_lst1[i],'addr_family':"ipv6",'connect':"1"}
        dict_lst = [dict[x] for x in range(0,4)]
        parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)

        dict = {}
        for i in range(0,4):
            dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes',  'config_type_list':["activate"], 'neighbor':ipv6_lst1[i],'remote_as':data.bgp_spine_local_as[j]}
        dict_lst = [dict[x] for x in range(0,4)]
        parallel.exec_parallel(True,data.leaf_nodes_list,evpn_api.config_bgp_evpn,dict_lst)

    dict1 = {'local_as':data.bgp_spine_local_as[0], 'config': 'yes', 'config_type_list':["advertise_all_vni"]}
    dict2 = {'local_as':data.bgp_spine_local_as[1], 'config': 'yes', 'config_type_list':["advertise_all_vni"]}
    parallel.exec_parallel(True,data.spine_nodes_list,evpn_api.config_bgp_evpn,[dict1,dict2])
    dict = {}
    for i in range(0,4):
        dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes', 'config_type_list':["advertise_all_vni"]}
    dict_lst = [dict[x] for x in range(0,4)]
    parallel.exec_parallel(True,data.leaf_nodes_list,evpn_api.config_bgp_evpn,dict_lst)

    ############################################################################################
    hdrMsg(" \n####### Verify BGP neighborship on Spine1 and Spine2 ##############\n")
    ############################################################################################
    if not retry_api(ip_bgp.check_bgp_session,vars.D1,nbr_list=data.spine1_port_list1,state_list=['Established']*4,retry_count=9,delay=5):
        st.error("########## BGP neighborship between Spine 1 towards Leafs is not Up ##########")
    if not retry_api(ip_bgp.check_bgp_session,vars.D2,nbr_list=data.spine2_port_list1,state_list=['Established']*4,retry_count=9,delay=5):
        st.error("########## BGP neighborship between Spine 2 towards Leaf is not Up ##########")
    evpn_verify1 = { "neighbor": data.leaf_spine1_ipv6_list+data.spine1_port_list1+data.spine1_po_list, "updown": ["up"]*12}
    evpn_verify2 = { "neighbor": data.leaf_spine2_ipv6_list+data.spine2_port_list1+data.spine2_po_list, "updown": ["up"]*12}

    st.log("verify BGP EVPN neighborship for ipv6 global address, router port & L3 PortChannel b/w Spine towards Leaf ndoes")
    parallel.exec_parallel(True, data.spine_nodes_list, evpn_api.verify_bgp_l2vpn_evpn_summary,[evpn_verify1,evpn_verify2])

    ############################################################################################
    hdrMsg(" \n####### Configure loopback interface ##############\n")
    ############################################################################################

    dict={}
    for i in range(0,6):
        dict[i] = {'loopback_name':'Loopback1', 'config':'yes'}
    dict_lst = [dict[x] for x in range(0,6)]

    parallel.exec_parallel(True,data.spine_nodes_list+data.leaf_nodes_list,ipfeature.configure_loopback,dict_lst)

    utils.exec_all(True,[[ipfeature.config_ip_addr_interface, vars.D1, 'Loopback1', data.spine_loopback_list[0], 32, 'ipv4'], [ipfeature.config_ip_addr_interface, vars.D2, 'Loopback1', data.spine_loopback_list[1], 32, 'ipv4'], [ipfeature.config_ip_addr_interface, vars.D3, 'Loopback1', data.leaf_loopback_list[0], 32, 'ipv4'], [ipfeature.config_ip_addr_interface, vars.D4, 'Loopback1', data.leaf_loopback_list[1], 32, 'ipv4'], [ipfeature.config_ip_addr_interface, vars.D5, 'Loopback1', data.leaf_loopback_list[2], 32, 'ipv4'], [ipfeature.config_ip_addr_interface, vars.D6, 'Loopback1', data.leaf_loopback_list[3], 32, 'ipv4']])

    ############################################################################################
    hdrMsg(" \n####### Redistribute connected route in to bgp ##############\n")
    ############################################################################################
    dict = {}
    for i,as1 in zip(range(0,6),data.bgp_spine_local_as+data.bgp_leaf_local_as):
        dict[i] = {'local_as':as1, 'config_type_list':['redist'],'redistribute':'connected'}

    dict_lst = [dict[x] for x in range(0,6)]
    parallel.exec_parallel(True,data.spine_nodes_list+data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)

    ############################################################################################
    hdrMsg(" \n####### Verify ip route shows IPv6 NH ##############\n")
    ############################################################################################
    x={}
    for i, dut, port in zip(range(0,4), data.leaf_nodes_list, data.leafs_spine1_port_lst1):
        x[i]=basic_obj.get_ifconfig_inet6(dut, port)

    for i,ip in zip(range(0,4),data.leaf_loopback_list):
        if not retry_api(ipfeature.verify_ip_route,vars.D1, type='B', nexthop = x[i][0].strip(), ip_address = ip+'/32',retry_count=9,delay=1):
            st.report_fail("ip_routing_int_create_fail", ip)

    ############################################################################################
    hdrMsg(" \n####### Configure BFD on BGP unnumbered sessions ##############\n")
    ############################################################################################

    for intf1,intf2 in zip(data.spine1_port_list1,data.spine2_port_list1):
       dict1 = {'local_as':data.bgp_spine_local_as[0], 'config': 'yes',  'config_type_list':["bfd"], 'interface' : intf1,'remote_as':'external'}
       dict2 = {'local_as':data.bgp_spine_local_as[1], 'config': 'yes',  'config_type_list':["bfd"], 'interface' : intf2,'remote_as':'external'}
       parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])

    for port_lst1 in [data.leafs_spine1_port_lst1, data.leafs_spine2_port_lst1]:
        dict = {}
        for i in range(0,4):
            dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes',  'config_type_list':["bfd"], 'remote_as':'external', 'interface' : port_lst1[i]}
        dict_lst = [dict[x] for x in range(0,4)]
        parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp, dict_lst)

    for intf1,intf2,j in zip(data.spine1_po_list,data.spine2_po_list,range(0,4)):
       dict1 = {'local_as':data.bgp_spine_local_as[0], 'config': 'yes',  'config_type_list':["bfd"], 'remote_as':data.bgp_leaf_local_as[j], 'interface' : intf1}
       dict2 = {'local_as':data.bgp_spine_local_as[1], 'config': 'yes',  'config_type_list':["bfd"], 'remote_as':data.bgp_leaf_local_as[j], 'interface' : intf2}
       parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])

    for j,port_lst1 in zip(range(0,2),[data.leafs_spine1_po_lst1, data.leafs_spine2_po_lst1]):
        dict = {}
        for i in range(0,4):
            dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes',  'config_type_list':["bfd"], 'remote_as': data.bgp_spine_local_as[j], 'interface' : port_lst1[i]}
        dict_lst = [dict[x] for x in range(0,4)]
        parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)

    for ipv6_1,ipv6_2,j in zip(data.leaf_spine1_ipv6_list, data.leaf_spine2_ipv6_list,range(0,4)):
       dict1 = {'local_as':data.bgp_spine_local_as[0], 'config': 'yes',  'config_type_list':["bfd"], 'neighbor' : ipv6_1,'remote_as':data.bgp_leaf_local_as[j]}
       dict2 = {'local_as':data.bgp_spine_local_as[1], 'config': 'yes',  'config_type_list':["bfd"], 'neighbor' : ipv6_2,'remote_as':data.bgp_leaf_local_as[j]}
       parallel.exec_parallel(True,data.spine_nodes_list,bgp_obj.config_bgp,[dict1,dict2])

    for ipv6_lst1,j in zip([data.spine1_ipv6_list,data.spine2_ipv6_list],range(0,2)):
        dict = {}
        for i in range(0,4):
            dict[i] = {'local_as':data.bgp_leaf_local_as[i], 'config': 'yes', 'config_type_list':["bfd"], 'remote_as':data.bgp_spine_local_as[j], 'neighbor' : ipv6_lst1[i]}
        dict_lst = [dict[x] for x in range(0,4)]
        parallel.exec_parallel(True,data.leaf_nodes_list,bgp_obj.config_bgp,dict_lst)

    n1 = get_num_of_bfd_sessions_up(vars.D1)
    n2 = get_num_of_bfd_sessions_up(vars.D2)
    if n1 >= 8 and n2 >= 8:
        st.log('PASS: Total number of BFD sesions found is {} so expected min no of BFD session 8 found in Spine 1'.format(n1))
        st.log('PASS: Total number of BFD sesions found is {} so expected min no of BFD session 8 found in Spine 2'.format(n2))
    else:
        st.error('FAIL: Min number of BFD sesions expected 8 but found {} sessions in Spine 1'.format(n1))
        st.error('FAIL: Min number of BFD sesions expected 8 but found {} sessions in Spine 2'.format(n2))
        st.report_fail("base_config_verification_failed")
예제 #23
0
def test_ft_bgp_unnumbered_clear_bgp_ndp():
    # ################ Author Details ################
    # Name: Kiran Vedula
    # Email: [email protected]
    # ################################################
    utils_obj.banner_log(
        'FtOtSoRtBgpUnFn004,FtOtSoRtBgpUnFn005,FtOtSoRtBgpUnFn007')
    result = 0
    st.log('######------Clear BGP on both nodes------######')
    utils.exec_all(True, [[arp_obj.clear_ndp_table, vars.D1],
                          [arp_obj.clear_ndp_table, vars.D2]])
    utils.exec_all(True,
                   [[arp_obj.show_ndp, vars.D1], [arp_obj.show_ndp, vars.D2]])
    utils.exec_all(True, [[bgp_obj.clear_ip_bgp_vtysh, vars.D1],
                          [bgp_obj.clear_ip_bgp_vtysh, vars.D2]])
    utils.exec_all(True,
                   [[arp_obj.show_ndp, vars.D1], [arp_obj.show_ndp, vars.D2]])
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D1,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D1D2P1,
                           state='Established'):
        st.log("Failed to form BGP unnumbered peering after clear NDP/BGP")
        result += 1
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D2,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D2D1P1,
                           state='Established'):
        st.log("Failed to form BGP unnumbered peering after clear NDP/BGP")
        result += 1
    utils.exec_all(True, [[ip_obj.config_ipv6, vars.D1, "disable"],
                          [ip_obj.config_ipv6, vars.D2, "disable"]])
    utils.exec_all(True, [[bgp_obj.clear_ip_bgp_vtysh, vars.D1],
                          [bgp_obj.clear_ip_bgp_vtysh, vars.D2]])
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D2,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D2D1P1,
                           state='Active'):
        st.log("BGP unnumbered peers established even after disable IPv6")
        result += 1
    utils.exec_all(True, [[ip_obj.config_ipv6, vars.D1, "enable"],
                          [ip_obj.config_ipv6, vars.D2, "enable"]])
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D2,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D2D1P1,
                           state='Established'):
        st.log("Failed to form BGP unnumbered peering after enable IPv6")
        result += 1
    if result == 0:
        st.report_pass("test_case_passed")
    else:
        st.log("BGP unnumbered neighborship failed after config state toggle")
        st.report_fail("test_case_failed")
예제 #24
0
def config_ip(config='yes'):
    if config == 'yes':
        api_name = ip_api.config_ip_addr_interface
        config_str = "Configure"
    else:
        api_name = ip_api.delete_ip_interface
        config_str = "Delete"

    hdrMsg("Bring-up the port on dut3 which is connected to dhcp server ")
    interface_api.interface_operation(data.dut3,
                                      data.dhcp_server_port,
                                      operation="startup")

    ##########################################################################
    hdrMsg(
        "IP-config: {} IP address between dut2 interface {} and dut3 interface {}"
        .format(config_str, data.d2d3_ports, data.d3d2_ports))
    ##########################################################################
    utils.exec_all(True, [[
        api_name, data.dut2, data.d2d3_ports[0], dut2_3_ip_list[0], mask_24
    ], [api_name, data.dut3, data.d3d2_ports[0], dut3_2_ip_list[0], mask_24]])

    if config == 'yes':
        st.banner('Install L2 DHCP rules on dhcp client device')
        copp_api.bind_class_action_copp_policy(data.dut4,
                                               classifier='copp-system-dhcpl2',
                                               action_group='copp-system-dhcp')
        ##########################################################################
        hdrMsg("Create loopback interfaces on dut1, dut2 and dut3")
        ##########################################################################
        parallel.exec_parallel(True, [data.dut1, data.dut2, data.dut3],
                               ip_api.configure_loopback,
                               [{
                                   'loopback_name': 'Loopback1'
                               }] * 3)

        ##########################################################################
        hdrMsg("Loopback-config: {} IP address on Loopback interface".format(
            config_str))
        ##########################################################################
        utils.exec_all(True, [[
            api_name, data.dut1, "Loopback1", dut1_loopback_ip_list[0], '32'
        ], [
            api_name, data.dut2, "Loopback1", dut2_loopback_ip_list[0], '32'
        ], [api_name, data.dut3, "Loopback1", dut3_loopback_ip_list[0], '32']])

        ##########################################
        hdrMsg("config required vlan to test on dut2 and dut4")
        ##########################################
        utils.exec_all(True, [[vlan_api.create_vlan, data.dut2, ['100']],
                              [vlan_api.create_vlan, data.dut4, ['100']]])
        vlan_api.create_vlan(data.dut4, ['200', '300'])

        ##########################################
        hdrMsg("Add vlan members")
        ##########################################
        utils.exec_all(True, [[
            vlan_api.add_vlan_member, data.dut2, '100', data.d2d4_ports[0],
            True
        ],
                              [
                                  vlan_api.add_vlan_member, data.dut4, '100',
                                  data.d4d2_ports[0], True
                              ]])

        #########################################################
        hdrMsg("LAG-Config: Create portchannel on dut2 and dut4")
        #########################################################
        utils.exec_all(True,
                       [[pc.create_portchannel, data.dut2, ['PortChannel12']],
                        [pc.create_portchannel, data.dut4, ['PortChannel12']]])

        #########################################################
        hdrMsg("LAG-Config: add member ports to portchannel")
        #########################################################
        utils.exec_all(True, [[
            pc.add_del_portchannel_member, data.dut2, 'PortChannel12',
            data.d2d4_ports[2], 'add'
        ],
                              [
                                  pc.add_del_portchannel_member, data.dut4,
                                  'PortChannel12', data.d4d2_ports[2], 'add'
                              ]])

        #########################################################
        hdrMsg("LAG-Config: Create portchannel on dut3 and dut1")
        #########################################################
        utils.exec_all(True,
                       [[pc.create_portchannel, data.dut3, ['PortChannel14']],
                        [pc.create_portchannel, data.dut1, ['PortChannel14']]])

        #########################################################
        hdrMsg("LAG-Config: add member ports to portchannel")
        #########################################################
        utils.exec_all(True, [[
            pc.add_del_portchannel_member, data.dut3, 'PortChannel14',
            data.d3d1_ports[0], 'add'
        ],
                              [
                                  pc.add_del_portchannel_member, data.dut1,
                                  'PortChannel14', data.d1d3_ports[0], 'add'
                              ]])

        ip_api.config_ip_addr_interface(data.dut2, 'Vlan100',
                                        dut2_4_ip_list[0], mask_24)
        ip_api.config_ip_addr_interface(data.dut2, data.d2d4_ports[1],
                                        dut2_4_ip_list[1], mask_24)
        ip_api.config_ip_addr_interface(data.dut2, 'PortChannel12',
                                        dut2_4_ip_list[2], mask_24)
        ip_api.config_ip_addr_interface(data.dut1,
                                        'PortChannel14',
                                        data.dhcp_server_ipv6,
                                        mask_v6,
                                        family='ipv6')

        #########################################
        hdrMsg("Add vlan members on DUT4")
        #########################################
        vlan_api.add_vlan_member(data.dut4, '200', data.d4d2_ports[1])
        vlan_api.add_vlan_member(data.dut4, '300', 'PortChannel12')

        st.exec_all([[create_static_route_dut2], [create_static_route_dut3]])
    else:
        st.banner('Remove L2 DHCP rules on dhcp client device')
        copp_api.bind_class_action_copp_policy(data.dut4,
                                               classifier='copp-system-dhcpl2',
                                               action_group='copp-system-dhcp',
                                               config='no')
        ##########################################################################
        hdrMsg("Loopback-config: {} IP address on Loopback interface".format(
            config_str))
        ##########################################################################
        utils.exec_all(True, [[
            api_name, data.dut1, "Loopback1", dut1_loopback_ip_list[0], '32'
        ], [
            api_name, data.dut2, "Loopback1", dut2_loopback_ip_list[0], '32'
        ], [api_name, data.dut3, "Loopback1", dut3_loopback_ip_list[0], '32']])

        ##########################################################################
        hdrMsg("Delete loopback interfaces on dut1, dut2 and dut3")
        ##########################################################################
        parallel.exec_parallel(True, [data.dut1, data.dut2, data.dut3],
                               ip_api.configure_loopback, [{
                                   'loopback_name': 'Loopback1',
                                   'config': 'no'
                               }] * 3)

        st.exec_all([[delete_static_route_dut2], [delete_static_route_dut3]])

        hdrMsg(" Remove all ip configs on dut2")
        ip_api.delete_ip_interface(data.dut2, 'Vlan100', dut2_4_ip_list[0],
                                   mask_24)
        ip_api.delete_ip_interface(data.dut2, data.d2d4_ports[1],
                                   dut2_4_ip_list[1], mask_24)
        ip_api.delete_ip_interface(data.dut2, 'PortChannel12',
                                   dut2_4_ip_list[2], mask_24)
        ip_api.delete_ip_interface(data.dut1,
                                   'PortChannel14',
                                   data.dhcp_server_ipv6,
                                   mask_v6,
                                   family='ipv6')

        ###########################################################
        hdrMsg("LAG-unConfig: delete member ports to portchannel")
        ###########################################################
        utils.exec_all(True, [[
            pc.add_del_portchannel_member, data.dut2, 'PortChannel12',
            data.d2d4_ports[2], 'del'
        ],
                              [
                                  pc.add_del_portchannel_member, data.dut4,
                                  'PortChannel12', data.d4d2_ports[2], 'del'
                              ]])
        utils.exec_all(True, [[
            pc.add_del_portchannel_member, data.dut3, 'PortChannel14',
            data.d3d1_ports[0], 'del'
        ],
                              [
                                  pc.add_del_portchannel_member, data.dut1,
                                  'PortChannel14', data.d1d3_ports[0], 'del'
                              ]])

        vlan_api.delete_vlan_member(data.dut4, '300', 'PortChannel12')
        #######################################################
        hdrMsg("LAG-UnConfig: Delete portchannel on dut2 and dut4")
        #######################################################
        utils.exec_all(True,
                       [[pc.delete_portchannel, data.dut2, ['PortChannel12']],
                        [pc.delete_portchannel, data.dut4, ['PortChannel12']]])
        utils.exec_all(True,
                       [[pc.delete_portchannel, data.dut3, ['PortChannel14']],
                        [pc.delete_portchannel, data.dut1, ['PortChannel14']]])

        ########################################
        hdrMsg("Delete vlan member ports")
        ########################################
        utils.exec_all(True, [[
            vlan_api.delete_vlan_member, data.dut2, '100', data.d2d4_ports[0],
            True
        ],
                              [
                                  vlan_api.delete_vlan_member, data.dut4,
                                  '100', data.d4d2_ports[0], True
                              ]])
        vlan_api.delete_vlan_member(data.dut4, '200', data.d4d2_ports[1])

        ####################################
        hdrMsg("Unconfig vlan fron dut2 and dut4")
        ###################################
        utils.exec_all(True, [[vlan_api.delete_vlan, data.dut2, ['100']],
                              [vlan_api.delete_vlan, data.dut4, ['100']]])
        vlan_api.delete_vlan(data.dut4, ['200', '300'])
def cleanup_evpn_5549():

    make_global_vars()
    global vars
    vars = st.get_testbed_vars()
    ############################################################################################
    hdrMsg("Delete router bgp on dut1 and dut2")
    ############################################################################################
    dict1 = {'config_type_list': ["removeBGP"], 'removeBGP': 'yes', 'config': 'no'}

    parallel.exec_parallel(True, data.spine_nodes_list, bgp_obj.config_bgp, [dict1,dict1])
    parallel.exec_parallel(True, data.leaf_nodes_list, bgp_obj.config_bgp, [dict1,dict1,dict1,dict1])

    ############################################################################################
    hdrMsg("\n####### Unconfigure IP address on link1 of all the DUTs ##############\n")
    ############################################################################################

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D1, data.spine1_port_list1, 'disable'], [ipfeature.config_interface_ip6_link_local, vars.D2, data.spine2_port_list1, 'disable']])

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D3, data.leafs_spine1_port_lst1[0], 'disable'], [ipfeature.config_interface_ip6_link_local, vars.D4, data.leafs_spine1_port_lst1[1], 'disable'], [ipfeature.config_interface_ip6_link_local, vars.D5, data.leafs_spine1_port_lst1[2], 'disable'],[ipfeature.config_interface_ip6_link_local, vars.D6, data.leafs_spine1_port_lst1[3], 'disable']])

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D3, data.leafs_spine2_port_lst1[0], 'disable'], [ipfeature.config_interface_ip6_link_local, vars.D4, data.leafs_spine2_port_lst1[1],'disable'], [ipfeature.config_interface_ip6_link_local, vars.D5, data.leafs_spine2_port_lst1[2],'disable'],[ipfeature.config_interface_ip6_link_local, vars.D6, data.leafs_spine2_port_lst1[3],'disable']])

    ############################################################################################
    hdrMsg("\n########## Unconfigure IP address on link2 (LAG) of all the DUTs ##############\n")
    ############################################################################################

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D1, data.spine1_po_list, 'disable'], [ipfeature.config_interface_ip6_link_local, vars.D2, data.spine2_po_list, 'disable']])

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D3, data.leaf1_po_list[0], 'disable'], [ipfeature.config_interface_ip6_link_local, vars.D4, data.leaf2_po_list[0], 'disable'], [ipfeature.config_interface_ip6_link_local, vars.D5, data.leaf3_po_list[0], 'disable'],[ipfeature.config_interface_ip6_link_local, vars.D6, data.leaf4_po_list[0], 'disable']])

    utils.exec_all(True, [[ipfeature.config_interface_ip6_link_local, vars.D3, data.leaf1_po_list[1], 'disable'], [ipfeature.config_interface_ip6_link_local, vars.D4, data.leaf2_po_list[1], 'disable'], [ipfeature.config_interface_ip6_link_local, vars.D5, data.leaf3_po_list[1], 'disable'],[ipfeature.config_interface_ip6_link_local, vars.D6, data.leaf4_po_list[1], 'disable']])

    ############################################################################################
    hdrMsg("\n####### Unconfigure IP address on link3 of all the DUTs ##############\n")
    ############################################################################################

    for ipv6_1,ipv6_2,po1,po2 in zip(data.spine1_ipv6_list, data.spine2_ipv6_list,data.spine1_port_list4, data.spine2_port_list4):
        utils.exec_all(True,[[ipfeature.delete_ip_interface,vars.D1, po1, ipv6_1 , data.maskv6,'ipv6'],[ipfeature.delete_ip_interface,vars.D2, po2, ipv6_2, data.maskv6,'ipv6']])

    utils.exec_all(True,[[ipfeature.delete_ip_interface,vars.D3, data.leafs_spine1_port_lst4[0], data.leaf_spine1_ipv6_list[0], data.maskv6,'ipv6'],[ipfeature.delete_ip_interface,vars.D4, data.leafs_spine1_port_lst4[1], data.leaf_spine1_ipv6_list[1], data.maskv6,'ipv6'], [ipfeature.delete_ip_interface,vars.D5, data.leafs_spine1_port_lst4[2], data.leaf_spine1_ipv6_list[2] , data.maskv6,'ipv6'], [ipfeature.delete_ip_interface,vars.D6, data.leafs_spine1_port_lst4[3], data.leaf_spine1_ipv6_list[3] , data.maskv6,'ipv6']])

    utils.exec_all(True,[[ipfeature.delete_ip_interface,vars.D3, data.leafs_spine2_port_lst4[0], data.leaf_spine2_ipv6_list[0], data.maskv6,'ipv6'],[ipfeature.delete_ip_interface,vars.D4, data.leafs_spine2_port_lst4[1], data.leaf_spine2_ipv6_list[1], data.maskv6,'ipv6'], [ipfeature.delete_ip_interface,vars.D5, data.leafs_spine2_port_lst4[2], data.leaf_spine2_ipv6_list[2], data.maskv6,'ipv6'], [ipfeature.delete_ip_interface,vars.D6, data.leafs_spine2_port_lst4[3], data.leaf_spine2_ipv6_list[3], data.maskv6,'ipv6']])

    ############################################################################################
    hdrMsg("\n########## Delete Port-channel and portchannel members ############\n")
    ############################################################################################

    st.log("Add members to port channel created b/w leaf and spine nodes")
    utils.exec_all(True, [[pch.delete_portchannel_member, data.leaf_nodes_list[0], data.leaf1_po_list[0], data.leaf1_spine1_po_intf_list],
                          [pch.delete_portchannel_member, data.leaf_nodes_list[1], data.leaf2_po_list[0], data.leaf2_spine1_po_intf_list],
                          [pch.delete_portchannel_member, data.leaf_nodes_list[2], data.leaf3_po_list[0], data.leaf3_spine1_po_intf_list],
                          [pch.delete_portchannel_member, data.leaf_nodes_list[3], data.leaf4_po_list[0], data.leaf4_spine1_po_intf_list]])

    utils.exec_all(True, [[pch.delete_portchannel_member, data.leaf_nodes_list[0], data.leaf1_po_list[1], data.leaf1_spine2_po_intf_list],
                          [pch.delete_portchannel_member, data.leaf_nodes_list[1], data.leaf2_po_list[1], data.leaf2_spine2_po_intf_list],
                          [pch.delete_portchannel_member, data.leaf_nodes_list[2], data.leaf3_po_list[1], data.leaf3_spine2_po_intf_list],
                          [pch.delete_portchannel_member, data.leaf_nodes_list[3], data.leaf4_po_list[1], data.leaf4_spine2_po_intf_list]])

    for po1,po2,intf_list1,intf_list2 in zip(data.spine1_po_list,data.spine2_po_list,data.spine1_all_lfs_po_intf_list,data.spine2_all_lfs_po_intf_list):
        utils.exec_all(True, [[pch.delete_portchannel_member, data.spine_nodes_list[0], po1, intf_list1],
                          [pch.delete_portchannel_member, data.spine_nodes_list[1], po2, intf_list2]])

    for i in range(0,2):
        utils.exec_all(True, [[pch.delete_portchannel, data.leaf_nodes_list[0], data.leaf1_po_list[i]],
                    [pch.delete_portchannel, data.leaf_nodes_list[1], data.leaf2_po_list[i]],
                    [pch.delete_portchannel, data.leaf_nodes_list[2], data.leaf3_po_list[i]],
                    [pch.delete_portchannel, data.leaf_nodes_list[3], data.leaf4_po_list[i]]])

    for i in range(0,4):
        utils.exec_all(True,
                    [[pch.delete_portchannel, data.spine_nodes_list[0], data.spine1_po_list[i]],
                    [pch.delete_portchannel, data.spine_nodes_list[1], data.spine2_po_list[i]]])

    ############################################################################################
    hdrMsg(" \n########### Unconfigure loopback interface ##############\n")
    ############################################################################################

    utils.exec_all(True,[[ipfeature.delete_ip_interface, vars.D1, 'Loopback1', data.spine_loopback_list[0], 32, 'ipv4'], [ipfeature.delete_ip_interface, vars.D2, 'Loopback1', data.spine_loopback_list[1], 32, 'ipv4'], [ipfeature.delete_ip_interface, vars.D3, 'Loopback1', data.leaf_loopback_list[0], 32, 'ipv4'], [ipfeature.delete_ip_interface, vars.D4, 'Loopback1', data.leaf_loopback_list[1], 32, 'ipv4'], [ipfeature.delete_ip_interface, vars.D5, 'Loopback1', data.leaf_loopback_list[2], 32, 'ipv4'], [ipfeature.delete_ip_interface, vars.D6, 'Loopback1', data.leaf_loopback_list[3], 32, 'ipv4']])

    dict={}
    for i in range(0,6):
        dict[i] = {'loopback_name':'Loopback1', 'config':'no'}
    dict_lst = [dict[x] for x in range(0,6)]

    parallel.exec_parallel(True,data.spine_nodes_list+data.leaf_nodes_list,ipfeature.configure_loopback,dict_lst)

    ############################################################################################
    hdrMsg("\n########## Disable debugs ############\n")
    ############################################################################################
    disable_debugs()
예제 #26
0
def test_ft_bgp_ebgp_multihop_4byteASN():
    """

    Verify the functioning of ebgp multihop command with 4 byte ASN
    """
    # On DUT1 and DUT3, create BGP with 4byte ASN
    dut1_as = 6500001
    dut1 = topo['dut_list'][0]
    dut3_as = 6500002
    dut3 = topo['dut_list'][2]
    result = 0
    wait_timer = 150

    st.banner("Verify the ebgp multihop functionality with 4 byte AS Number")

    # Configure bgp on DUT1 and configure DUT3 as neighbor with ebgp-multihop ttl set to 5
    st.log(
        "Configure eBGP on DUT1 with Neighbor as DUT3 with multihop set to maximum hops of 5"
    )
    bgpapi.config_bgp(dut1,
                      local_as=dut1_as,
                      neighbor=topo['D3D2P1_ipv4'],
                      remote_as=dut3_as,
                      config_type_list=["neighbor", "ebgp_mhop"],
                      ebgp_mhop='5')

    # Add static route towards neighbor DUT3
    st.log("Add static route towards DUT3")
    ipapi.create_static_route(dut1, topo['D1D2P1_neigh_ipv4'],
                              "{}/24".format(topo['D3D2P1_ipv4']))

    # Configure bgp on DUT3 and configure DUT1 as neighbor with ebgp-multihop ttl set to 5
    st.log(
        "Configure eBGP on DUT3 with DUT1 as Neighbor with multihop set to maximum hops of 5"
    )
    bgpapi.config_bgp(dut3,
                      local_as=dut3_as,
                      neighbor=topo['D1D2P1_ipv4'],
                      remote_as=dut1_as,
                      config_type_list=["neighbor", "ebgp_mhop"],
                      ebgp_mhop='5')

    # Add static route towards neighbor DUT1
    st.log("Add static route towards DUT1")
    ipapi.create_static_route(dut3, topo['D3D2P1_neigh_ipv4'],
                              "{}/24".format(topo['D1D2P1_ipv4']))

    st.log("Verify BGP neighborship on DUT1")
    #result = bgpapi.verify_bgp_summary(dut1, family='ipv4', neighbor=topo['D3D2P1_ipv4'], state='Established')
    if not utils.poll_wait(bgpapi.verify_bgp_summary,
                           wait_timer,
                           dut1,
                           family='ipv4',
                           neighbor=topo['D3D2P1_ipv4'],
                           state='Established'):
        st.log("Failed to form BGP eBGP multihop peering with 4byte ASN")
        result += 1
    if result == 0:
        st.log("Pass: BGP neighborship established between DUT1 and DUT3")
    else:
        st.error(
            "Fail: BGP neighborship not established between DUT1 and DUT3")
        st.banner("Collecting techsupport")
        exec_all(True, [[
            st.generate_tech_support, topo['dut_list'][0],
            "test_ft_bgp_ebgp_multihop_4byteASN"
        ],
                        [
                            st.generate_tech_support, topo['dut_list'][1],
                            "test_ft_bgp_ebgp_multihop_4byteASN"
                        ],
                        [
                            st.generate_tech_support, topo['dut_list'][2],
                            "test_ft_bgp_ebgp_multihop_4byteASN"
                        ]])

    #Clear applied configs
    st.banner("Cleanup for TestFunction")
    bgpapi.cleanup_router_bgp(dut1)
    bgpapi.cleanup_router_bgp(dut3)
    ipapi.delete_static_route(dut1, topo['D1D2P1_neigh_ipv4'],
                              "{}/24".format(topo['D3D2P1_ipv4']))
    ipapi.delete_static_route(dut3, topo['D3D2P1_neigh_ipv4'],
                              "{}/24".format(topo['D1D2P1_ipv4']))

    if result == 0:
        st.report_pass("test_case_passed")
    else:
        st.report_fail("test_case_failed")
예제 #27
0
def test_ft_bgp_unnumbered_nondefault_vrf():
    """
    # ################ Author Details ################
    # Name: Sesha Reddy Koilkonda
    # Email: [email protected]
    # ################################################
    :return:
    """
    utils_obj.banner_log("FtOtSoRtBgpUnFn016,FtOtSoRtBgpUnFn017")
    result = 0
    bgp_obj.cleanup_router_bgp(st.get_dut_names())
    dict1 = {'vrf_name': data.vrf_name, 'skip_error': True}
    parallel.exec_parallel(True, [vars.D1, vars.D2], vrf_api.config_vrf,
                           [dict1, dict1])
    utils.exec_all(True, [[
        ip_obj.config_interface_ip6_link_local, vars.D1, vars.D1D2P1, "disable"
    ], [
        ip_obj.config_interface_ip6_link_local, vars.D2, vars.D2D1P1, "disable"
    ]])
    dict1 = {
        'vrf_name': data.vrf_name,
        'intf_name': vars.D1D2P1,
        'skip_error': True
    }
    dict2 = {
        'vrf_name': data.vrf_name,
        'intf_name': vars.D2D1P1,
        'skip_error': True
    }

    parallel.exec_parallel(True, [vars.D1, vars.D2],
                           vrf_api.bind_vrf_interface, [dict1, dict2])
    utils.exec_all(
        True, [[ip_obj.config_interface_ip6_link_local, vars.D1, vars.D1D2P1],
               [ip_obj.config_interface_ip6_link_local, vars.D2, vars.D2D1P1]])
    utils.exec_all(True,
                   [[ip_obj.get_interface_ip_address, vars.D1, None, "ipv6"],
                    [ip_obj.get_interface_ip_address, vars.D2, None, "ipv6"]])
    dict1 = {
        'vrf_name': data.vrf_name,
        'router_id': data.d1_rid,
        'local_as': data.d1_local_as,
        'addr_family': 'ipv6',
        'neighbor': vars.D1D2P1,
        'remote_as': 'external',
        'config_type_list': ["remote-as", "activate"],
        'interface': vars.D1D2P1
    }
    dict2 = {
        'vrf_name': data.vrf_name,
        'router_id': data.d2_rid,
        'local_as': data.d2_local_as,
        'addr_family': 'ipv6',
        'neighbor': vars.D2D1P1,
        'remote_as': 'external',
        'config_type_list': ["remote-as", "activate"],
        'interface': vars.D2D1P1
    }
    parallel.exec_parallel(True, [vars.D1, vars.D2], bgp_obj.config_bgp,
                           [dict1, dict2])

    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D1,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D1D2P1,
                           vrf=data.vrf_name,
                           state='Established'):
        st.error(
            "BGP unnumbered neighbourship with the non-default vrf configuration failed."
        )
        result += 1
    st.log('######------Save and reboot------######')
    reboot_obj.config_save(vars.D1, "sonic")
    reboot_obj.config_save(vars.D1, "vtysh")

    st.reboot(vars.D1)
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D1,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D1D2P1,
                           vrf=data.vrf_name,
                           state='Established'):
        st.error(
            "BGP unnumbered neighbourship with the non-default vrf configuration failed after save and reboot."
        )
        result += 1
    st.log('######------Config reload with BGP unnumbered------######')
    st.log("Config reload the DUT")
    reboot_obj.config_save_reload(vars.D1)
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D1,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D1D2P1,
                           vrf=data.vrf_name,
                           state='Established'):
        st.error(
            "BGP unnumbered neighbourship with the non-default vrf configuration failed after config reload."
        )
        result += 1
    # unconfig part:

    dict1 = {
        'vrf_name': data.vrf_name,
        'local_as': data.d1_local_as,
        'config': 'no',
        'removeBGP': 'yes',
        'config_type_list': ['removeBGP']
    }
    dict2 = {
        'vrf_name': data.vrf_name,
        'local_as': data.d2_local_as,
        'config': 'no',
        'removeBGP': 'yes',
        'config_type_list': ['removeBGP']
    }
    parallel.exec_parallel(True, [vars.D1, vars.D2], bgp_obj.config_bgp,
                           [dict1, dict2])
    utils.exec_all(True, [[
        ip_obj.config_interface_ip6_link_local, vars.D1, vars.D1D2P1, "disable"
    ], [
        ip_obj.config_interface_ip6_link_local, vars.D2, vars.D2D1P1, "disable"
    ]])
    dict1 = {
        'vrf_name': data.vrf_name,
        'intf_name': vars.D1D2P1,
        'skip_error': True,
        'config': 'no'
    }
    dict2 = {
        'vrf_name': data.vrf_name,
        'intf_name': vars.D2D1P1,
        'skip_error': True,
        'config': 'no'
    }
    parallel.exec_parallel(True, [vars.D1, vars.D2],
                           vrf_api.bind_vrf_interface, [dict1, dict2])
    dict1 = {'vrf_name': data.vrf_name, 'skip_error': True, 'config': 'no'}
    parallel.exec_parallel(True, [vars.D1, vars.D2], vrf_api.config_vrf,
                           [dict1, dict1])
    bgp_obj.cleanup_router_bgp(st.get_dut_names())
    utils.exec_all(
        True,
        [[ip_obj.config_interface_ip6_link_local, vars.D1, d1_int_ipv6_list],
         [ip_obj.config_interface_ip6_link_local, vars.D2, d2_int_ipv6_list]])
    if result == 0:
        st.report_pass("test_case_passed")
    else:
        st.error(
            "BGP unnumbered neighborship failed with the non-default vrf configuration."
        )
        st.report_fail("test_case_failed")
예제 #28
0
def base_deconfig(vrfname='default'):
    D1_ports, D2_ports, max_bfd, ipv4_bgp, ipv6_bgp, dut1_ip, dut2_ip, dut1_ipv6, dut2_ipv6, vlan_list, vlan_intf = \
    return_vars(vrfname)
    hdrMsg("##### BASE Deconfig Starts ####")
    ############################################################################################
    hdrMsg("Step-DC1: Remove BGP router from dut1 and dut2")
    ############################################################################################
    dict1 = {
        'local_as': dut1_as,
        'vrf_name': vrfname,
        'config_type_list': ["removeBGP"],
        'removeBGP': 'yes',
        'config': 'no'
    }
    dict2 = {
        'local_as': dut2_as,
        'vrf_name': vrfname,
        'config_type_list': ["removeBGP"],
        'removeBGP': 'yes',
        'config': 'no'
    }
    parallel.exec_parallel(True, [dut1, dut2], bgp_api.config_bgp,
                           [dict1, dict2])

    ip_deconfig(test_type, vrfname)

    utils.exec_all(
        True,
        [[
            vlan_api.config_vlan_range_members, dut1, '{} {}'.format(
                vlan_list[0], vlan_list[total_vlans / 2]), D1_ports[0], 'del'
        ],
         [
             vlan_api.config_vlan_range_members, dut2, '{} {}'.format(
                 vlan_list[0], vlan_list[total_vlans / 2]), D2_ports[0], 'del'
         ]])

    utils.exec_all(True,
                   [[
                       vlan_api.config_vlan_range_members, dut1,
                       '{} {}'.format(vlan_list[((total_vlans / 2) + 1)],
                                      vlan_list[-1]), D1_ports[1], 'del'
                   ],
                    [
                        vlan_api.config_vlan_range_members, dut2,
                        '{} {}'.format(vlan_list[((total_vlans / 2) + 1)],
                                       vlan_list[-1]), D2_ports[1], 'del'
                    ]])

    if vrfname == user_vrf_name:
        dict1 = {
            'vrf_name': [vrfname] * len(vlan_intf),
            'intf_name': vlan_intf,
            'skip_error': True,
            'config': 'no'
        }
        dict2 = {
            'vrf_name': [vrfname] * len(vlan_intf),
            'intf_name': vlan_intf,
            'skip_error': True,
            'config': 'no'
        }
        parallel.exec_parallel(True, [dut1, dut2], vrf_api.bind_vrf_interface,
                               [dict1, dict2])

    utils.exec_all(True, [[
        vlan_api.config_vlan_range, dut1, '{} {}'.format(
            vlan_list[0], vlan_list[-1]), 'del'
    ],
                          [
                              vlan_api.config_vlan_range, dut2, '{} {}'.format(
                                  vlan_list[0], vlan_list[-1]), 'del'
                          ]])

    hdrMsg("##### BASE Deconfig End ####")
예제 #29
0
def test_ft_bgp_unnumbered_warmboot():
    # ################ Author Details ################
    # Name: Kiran Vedula
    # Email: [email protected]
    # ################################################
    utils_obj.banner_log('FtOtSoRtBgpUnFn009')
    utils.exec_all(True, [[bgp_obj.show_bgp_ipv6_summary_vtysh, vars.D1],
                          [bgp_obj.show_bgp_ipv6_summary_vtysh, vars.D2]])
    utils.exec_all(
        True,
        [[arp_obj.show_ndp, vars.D1, None], [arp_obj.show_ndp, vars.D2, None]])
    result = 0
    st.log('######------Warm reboot with BGP unnumbered------######')
    platform = basic_obj.get_hwsku(vars.D1)
    common_constants = st.get_datastore(vars.D1, "constants", "default")
    if not platform.lower(
    ) in common_constants['WARM_REBOOT_SUPPORTED_PLATFORMS']:
        st.error("Warm-Reboot is not supported for this platform {}".format(
            platform))
        st.report_unsupported('Warmboot_unsupported_platform', platform)
    reboot_obj.config_save(vars.D1, "sonic")
    reboot_obj.config_save(vars.D1, "vtysh")
    st.reboot(vars.D1, 'warm')
    st.wait(data.wait)
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D2,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=vars.D2D1P1,
                           state='Established'):
        st.log("Failed to form BGP unnumbered peering after warm reboot")
        result += 1
    st.wait(data.wait)
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D2,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=data.vlan_in_1,
                           state='Established'):
        st.log("Failed to form BGP unnumbered peering after warm reboot")
        result += 1
    st.wait(data.wait)
    if not utils.poll_wait(bgp_obj.verify_bgp_summary,
                           data.wait_timer,
                           vars.D2,
                           family='ipv6',
                           shell=bgp_cli_type,
                           neighbor=data.portchannel_name,
                           state='Established'):
        st.log("Failed to form BGP unnumbered peering after warm reboot")
        result += 1
    if result == 0:
        st.report_pass("test_case_passed")
    else:
        st.log("BGP unnumbered neighborship failed warm reboot")
        utils.exec_all(True, [[arp_obj.show_ndp, vars.D1, None],
                              [arp_obj.show_ndp, vars.D2, None]])
        utils.exec_all(True, [[bgp_obj.show_bgp_ipv6_neighbor_vtysh, vars.D1],
                              [bgp_obj.show_bgp_ipv6_neighbor_vtysh, vars.D2]])
        st.report_fail("test_case_failed")
예제 #30
0
    def test_confed_route_distribution_with_rmap(self):
        st.banner("Verify the behavior of Route-Maps over confederation peers")
        result = False

        network1 = '134.5.6.0/24'
        network2 = '134.5.7.0/24'
        network3 = '134.5.8.0'
        as_path = '200'
        access_list1 = 'test-access-list1'
        access_list2 = 'test-access-list2'
        access_list3 = 'test-access-list3'

        st.log(
            "Create access-lists and a route-map in DUT1, add to it permit, deny and AS-path prepending policies"
        )
        # Create access-list test-access-list1
        ipapi.config_access_list(topo['dut_list'][0],
                                 access_list1,
                                 network3 + '/24',
                                 'permit',
                                 seq_num="1")
        # Create route-map and permit network3
        ipapi.config_route_map_match_ip_address(topo['dut_list'][0],
                                                'test-rmap', 'permit', '10',
                                                access_list1)

        # Add set option to prepend as-path 200
        ipapi.config_route_map_set_aspath(topo['dut_list'][0], 'test-rmap',
                                          'permit', '10', as_path)

        # Create access-list test-access-list2
        ipapi.config_access_list(topo['dut_list'][0],
                                 access_list2,
                                 network1,
                                 'deny',
                                 seq_num="2")
        # In route-map, deny network1
        ipapi.config_route_map_match_ip_address(topo['dut_list'][0],
                                                'test-rmap', 'deny', '20',
                                                access_list2)

        # Create access-list test-access-list3
        ipapi.config_access_list(topo['dut_list'][0],
                                 access_list3,
                                 network2,
                                 'permit',
                                 seq_num="3")
        # In route-map, permit network2
        ipapi.config_route_map_match_ip_address(topo['dut_list'][0],
                                                'test-rmap', 'permit', '30',
                                                access_list3)

        # Advertise three networks from leaf
        st.log(
            "Advertise the networks from DUT1 through BGP and associate with the route-map"
        )
        bgpapi.advertise_bgp_network(topo['dut_list'][0],
                                     topo['D1_as'],
                                     network1,
                                     'test-rmap',
                                     network_import_check=True)
        bgpapi.advertise_bgp_network(topo['dut_list'][0],
                                     topo['D1_as'],
                                     network2,
                                     'test-rmap',
                                     network_import_check=True)
        bgpapi.advertise_bgp_network(topo['dut_list'][0],
                                     topo['D1_as'],
                                     network3 + '/24',
                                     'test-rmap',
                                     network_import_check=True)

        st.log(
            "Verify in peer DUT2 the network configured in {} has the AS-path prepended"
            .format(access_list1))
        # Verify that the neighbor has the as-path prepended
        output = bgpapi.show_bgp_ipvx_prefix(topo['dut_list'][1],
                                             prefix=network3,
                                             masklen=topo['D1_as'])
        for x in output:  # type: basestring
            peer_asn = x['peerasn']
            peer_asn = peer_asn.split()
            for each in peer_asn:
                if each == as_path:
                    result = True
        if result:
            st.log("Pass: AS-Path {} found to be prepended with network {}/24".
                   format(as_path, network3))
        else:
            st.error(
                "Fail: AS-Path {} not found to be prepended".format(as_path))

        # Verify that network1 is not present in ip route table
        st.log(
            "Verify that peer DUT2 not learnt the network configured as 'deny' in {}"
            .format(access_list2))
        n1 = ipapi.verify_ip_route(topo['dut_list'][1], ip_address=network1)
        if n1 is False:
            result = result & True
            st.log("Pass: DUT2 did not learn network {}".format(network1))
        else:
            result = result & False
            st.error("Fail: DUT2 learned the network {}".format(network1))

        # Verify that network2 is present in ip route table
        st.log(
            "Verify that peer DUT2 learnt the network configured as 'permit' in {}"
            .format(access_list3))
        n2 = ipapi.verify_ip_route(topo['dut_list'][1], ip_address=network2)
        if n2:
            result = result & True
            st.log("Pass: DUT2 learned the network {}".format(network2))
        else:
            result = result & False
            st.error("Fail: DUT2 did not learn network {}".format(network2))

        if not result:
            st.banner("Collecting techsupport")
            exec_all(True, [[
                st.generate_tech_support, topo['dut_list'][0],
                "test_confed_route_distribution_with_rmap"
            ],
                            [
                                st.generate_tech_support, topo['dut_list'][1],
                                "test_confed_route_distribution_with_rmap"
                            ]])

        ipapi.config_route_map_mode(topo['dut_list'][0],
                                    'test-rmap',
                                    'permit',
                                    '10',
                                    config='no')

        # Clear applied configurations
        st.banner("Cleanup for TestFunction")
        ipapi.config_access_list(topo['dut_list'][0],
                                 'test-access-list3',
                                 network2,
                                 'permit',
                                 config='no',
                                 seq_num="3")
        ipapi.config_access_list(topo['dut_list'][0],
                                 'test-access-list2',
                                 network1,
                                 'deny',
                                 config='no',
                                 seq_num="2")
        ipapi.config_access_list(topo['dut_list'][0],
                                 'test-access-list1',
                                 network3 + '/24',
                                 'permit',
                                 config='no',
                                 seq_num="1")

        bgpapi.advertise_bgp_network(topo['dut_list'][0],
                                     topo['D1_as'],
                                     network1,
                                     'test-rmap',
                                     config='no')
        bgpapi.advertise_bgp_network(topo['dut_list'][0],
                                     topo['D1_as'],
                                     network2,
                                     'test-rmap',
                                     config='no')
        bgpapi.advertise_bgp_network(topo['dut_list'][0],
                                     topo['D1_as'],
                                     network3 + '/24',
                                     'test-rmap',
                                     config='no')

        if result:
            st.report_pass("test_case_passed")
        else:
            st.report_fail("test_case_failed")