Add mandatory configuration
[integration/test.git] / csit / suites / bgpcep / bgpfunct / 020_bgp_functional_multipath.robot
1 *** Settings ***
2 Documentation     Functional test suite for bgp - n-path and all-path selection
3 ...
4 ...               Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
5 ...
6 ...               This program and the accompanying materials are made available under the
7 ...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
8 ...               and is available at http://www.eclipse.org/legal/epl-v10.html
9 ...
10 ...               This suite tests n-path and all-path selection policy.
11 ...               It uses odl and exabgp as bgp peers. Routes advertized from odl
12 ...               are configured via application peer.
13 Suite Setup       Start_Suite
14 Suite Teardown    Stop_Suite
15 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
16 Library           RequestsLibrary
17 Library           SSHLibrary
18 Resource          ${CURDIR}/../../../variables/Variables.robot
19 Resource          ${CURDIR}/../../../libraries/ExaBgpLib.robot
20 Resource          ${CURDIR}/../../../libraries/Utils.robot
21 Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
22 Resource          ${CURDIR}/../../../libraries/TemplatedRequests.robot
23 Library           ${CURDIR}/../../../libraries/BgpRpcClient.py    ${TOOLS_SYSTEM_IP}
24 Resource          ${CURDIR}/../../../libraries/BGPcliKeywords.robot
25 Resource          ${CURDIR}/../../../libraries/SSHKeywords.robot
26 Resource          ${CURDIR}/../../../libraries/CompareStream.robot
27
28 *** Variables ***
29 ${HOLDTIME}       180
30 ${DEVICE_NAME}    controller-config
31 ${BGP_PEER_NAME}    example-bgp-peer
32 ${RIB_INSTANCE}    example-bgp-rib
33 ${PROTOCOL_OPENCONFIG}    ${RIB_INSTANCE}
34 ${APP_PEER_NAME}    example-bgp-peer-app
35 ${BGP_VAR_FOLDER}    ${CURDIR}/../../../variables/bgpfunctional
36 ${MULT_VAR_FOLDER}    ${BGP_VAR_FOLDER}/multipaths
37 ${DEFAUTL_RPC_CFG}    exa.cfg
38 ${CONFIG_SESSION}    config-session
39 ${EXARPCSCRIPT}    ${CURDIR}/../../../../tools/exabgp_files/exarpc.py
40 ${N_PATHS_VALUE}    2
41 &{DEFAULT_MAPPING}    ODLIP=${ODL_SYSTEM_IP}    EXAIP=${TOOLS_SYSTEM_IP}    NPATHS=${N_PATHS_VALUE}
42 @{PATH_ID_LIST}    1    2    3
43 ${PATH_ID_LIST_LEN}    3
44 ${NEXT_HOP_PREF}    100.100.100.
45 ${RIB_URI}        /restconf/config/network-topology:network-topology/topology/topology-netconf/node/controller-config/yang-ext:mount/config:modules/module/odl-bgp-rib-impl-cfg:rib-impl/example-bgp-rib
46 ${OPENCONFIG_RIB_URI}    /restconf/config/openconfig-network-instance:network-instances/network-instance/global-bgp/openconfig-network-instance:protocols/protocol/openconfig-policy-types:BGP/example-bgp-rib
47 ${NPATHS_SELM}    n-paths
48 ${ALLPATHS_SELM}    all-paths
49 ${ADDPATHCAP_SR}    send\\/receive
50 ${ADDPATHCAP_S}    send
51 ${ADDPATHCAP_R}    receive
52 ${ADDPATHCAP_D}    disable
53
54 *** Test Cases ***
55 Reconfigure_ODL_To_Accept_Connection
56     [Documentation]    Configures BGP peer module with initiate-connection set to false.
57     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    BGP_NAME=${BGP_PEER_NAME}    IP=${TOOLS_SYSTEM_IP}    HOLDTIME=${HOLDTIME}    PEER_PORT=${BGP_TOOL_PORT}
58     ...    INITIATE=false    RIB_INSTANCE_NAME=${RIB_INSTANCE}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}    PASSIVE_MODE=true
59
60 Odl Allpaths Exa SendReceived
61     [Documentation]    all-paths selected policy selected
62     [Tags]    critical
63     [Setup]    Configure_Path_Selection_And_App_Peer_And_Connect_Peer    ${ALLPATHS_SELM}    ${ADDPATHCAP_SR}
64     Log_Loc_Rib_Operational
65     BuiltIn.Wait_Until_Keyword_Succeeds    6x    2s    Verify_Expected_Update_Count    ${PATH_ID_LIST_LEN}
66     [Teardown]    Remove_Odl_And_App_Peer_Configuration_And_Stop_ExaBgp
67
68 Odl Npaths Exa SendReceived
69     [Documentation]    n-paths policy selected on odl
70     [Tags]    critical
71     [Setup]    Configure_Path_Selection_And_App_Peer_And_Connect_Peer    ${NPATHS_SELM}    ${ADDPATHCAP_SR}
72     Log_Loc_Rib_Operational
73     BuiltIn.Wait_Until_Keyword_Succeeds    6x    2s    Verify_Expected_Update_Count    ${N_PATHS_VALUE}
74     [Teardown]    Remove_Odl_And_App_Peer_Configuration_And_Stop_ExaBgp
75
76 Delete_Bgp_Peer_Configuration
77     [Documentation]    Revert the BGP configuration to the original state: without any configured peers.
78     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    BGP_NAME=${BGP_PEER_NAME}    IP=${TOOLS_SYSTEM_IP}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
79
80 *** Keywords ***
81 Start_Suite
82     [Documentation]    Suite setup keyword.
83     SetupUtils.Setup_Utils_For_Setup_And_Teardown
84     ${tools_system_conn_id}=    SSHLibrary.Open_Connection    ${TOOLS_SYSTEM_IP}    prompt=${DEFAULT_LINUX_PROMPT}    timeout=6s
85     Builtin.Set_Suite_Variable    ${tools_system_conn_id}
86     SSHKeywords.Flexible_Mininet_Login    ${TOOLS_SYSTEM_USER}
87     SSHKeywords.Virtual_Env_Create
88     SSHKeywords.Virtual_Env_Install_Package    exabgp==3.4.16
89     RequestsLibrary.Create_Session    ${CONFIG_SESSION}    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}    auth=${AUTH}
90     Upload_Config_Files
91     Store_Rib_Configuration
92
93 Stop_Suite
94     [Documentation]    Suite teardown keyword with old rib restoration
95     SSHKeywords.Virtual_Env_Delete
96     TemplatedRequests.Put_As_Xml_To_Uri    ${OPENCONFIG_RIB_URI}    ${rib_old}    session=${CONFIG_SESSION}
97     SSHLibrary.Close_All_Connections
98     RequestsLibrary.Delete_All_Sessions
99
100 Upload_Config_Files
101     [Arguments]    ${addpath}=disable
102     [Documentation]    Uploads exabgp config files
103     SSHLibrary.Put_File    ${BGP_VAR_FOLDER}/${DEFAUTL_RPC_CFG}    .
104     SSHLibrary.Put_File    ${EXARPCSCRIPT}    .
105     @{cfgfiles}=    SSHLibrary.List_Files_In_Directory    .    *.cfg
106     : FOR    ${cfgfile}    IN    @{cfgfiles}
107     \    SSHLibrary.Execute_Command    sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}
108     \    SSHLibrary.Execute_Command    sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}
109     \    SSHLibrary.Execute_Command    sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}
110     \    SSHLibrary.Execute_Command    sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}
111     \    ${stdout}=    SSHLibrary.Execute_Command    cat ${cfgfile}
112     \    Log    ${stdout}
113
114 Configure_Path_Selection_And_App_Peer_And_Connect_Peer
115     [Arguments]    ${odl_path_sel_mode}    ${exa_add_path_value}
116     [Documentation]    Setup test case keyword. Early after the path selection config the incomming connection
117     ...    from exabgp towards odl may be rejected by odl due to config process not finished yet. Because of that
118     ...    we try to start the tool 3 times in case early attempts fail.
119     SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
120     Configure_Odl_Peer_With_Path_Selection_Mode    ${odl_path_sel_mode}
121     Configure_App_Peer_With_Routes
122     Upload_Config_Files    addpath=${exa_add_path_value}
123     ExaBgpLib.Start_ExaBgp_And_Verify_Connected    ${DEFAUTL_RPC_CFG}    ${CONFIG_SESSION}    ${TOOLS_SYSTEM_IP}    connection_retries=${3}
124
125 Remove_Odl_And_App_Peer_Configuration_And_Stop_ExaBgp
126     &{mapping}    BuiltIn.Create_Dictionary    IP=${TOOLS_SYSTEM_IP}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
127     TemplatedRequests.Delete_Templated    ${MULT_VAR_FOLDER}/bgp_peer    mapping=${mapping}    session=${CONFIG_SESSION}
128     Deconfigure_App_Peer
129     ExaBgpLib.Stop_ExaBgp
130     SetupUtils.Teardown_Test_Show_Bugs_If_Test_Failed
131
132 Verify_Expected_Update_Count
133     [Arguments]    ${exp_count}
134     [Documentation]    Verify number of received update messages
135     ${tool_count}=    BgpRpcClient.exa_get_received_update_count
136     BuiltIn.Should_Be_Equal_As_Numbers    ${exp_count}    ${tool_count}
137
138 Configure_Path_Selection_Mode
139     [Arguments]    ${psm}
140     [Documentation]    Configure path selection mode and get rib information for potential debug purposes
141     &{mapping}    BuiltIn.Create_Dictionary    PATHSELMODE=${psm}
142     TemplatedRequests.Get_As_Xml_Templated    ${MULT_VAR_FOLDER}/rib    mapping=${mapping}    session=${CONFIG_SESSION}
143     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/module_psm    mapping=${mapping}    session=${CONFIG_SESSION}
144
145 Configure_Odl_Peer_With_Path_Selection_Mode
146     [Arguments]    ${psm}
147     [Documentation]    Configures odl peer with path selection mode
148     ${npaths}=    BuiltIn.Set_Variable_If    "${psm}"=="${ALLPATHS_SELM}"    0    ${N_PATHS_VALUE}
149     &{mapping}    BuiltIn.Create_Dictionary    IP=${TOOLS_SYSTEM_IP}    HOLDTIME=${HOLDTIME}    PEER_PORT=${BGP_TOOL_PORT}    PASSIVE_MODE=true    MULTIPATH=${npaths}
150     ...    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
151     CompareStream.Run_Keyword_If_Less_Than_Fluorine    TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/rib    mapping=${mapping}    session=${CONFIG_SESSION}
152     CompareStream.Run_Keyword_If_At_Least_Fluorine    TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/rib_policies    mapping=${mapping}    session=${CONFIG_SESSION}
153     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/bgp_peer    mapping=${mapping}    session=${CONFIG_SESSION}
154
155 Configure_Odl_With_Multipaths
156     [Documentation]    Configures odl to support n-paths or all-paths selection
157     ${mapping}=    BuiltIn.Set Variable    ${DEFAULT_MAPPING}
158     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/module_n_paths    mapping=${mapping}    session=${CONFIG_SESSION}
159     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/module_all_paths    mapping=${mapping}    session=${CONFIG_SESSION}
160     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/service_psmf    mapping=${mapping}    session=${CONFIG_SESSION}
161     Configure_Path_Selection_Mode    n-paths
162     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/service_bpsm    mapping=${mapping}    session=${CONFIG_SESSION}
163     Store_Rib_Configuration
164     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/rib    mapping=${mapping}    session=${CONFIG_SESSION}
165
166 Store_Rib_Configuration
167     [Documentation]    Stores rib configuration
168     ${rib_old}=    TemplatedRequests.Get_As_Xml_Templated    ${MULT_VAR_FOLDER}/rib    mapping=${DEFAULT_MAPPING}    session=${CONFIG_SESSION}
169     BuiltIn.Set_Suite_Variable    ${rib_old}
170
171 Log_Loc_Rib_Operational
172     ${rsp}=    RequestsLibrary.Get Request    ${CONFIG_SESSION}    /restconf/operational/bgp-rib:bgp-rib/rib/example-bgp-rib/loc-rib/
173     BuiltIn.Log    ${rsp.content}
174
175 Configure_App_Peer_With_Routes
176     [Documentation]    Configure bgp application peer and fill it immediately with routes.
177     ${app_rib}    Set Variable    ${ODL_SYSTEM_IP}
178     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    APP_PEER_NAME=${APP_PEER_NAME}    RIB_INSTANCE_NAME=${RIB_INSTANCE}    APP_PEER_ID=${ODL_SYSTEM_IP}    IP=${ODL_SYSTEM_IP}
179     ...    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
180     TemplatedRequests.Put_As_Xml_Templated    ${BGP_VAR_FOLDER}/app_peer    mapping=${mapping}    session=${CONFIG_SESSION}
181     : FOR    ${pathid}    IN    @{PATH_ID_LIST}
182     \    &{route_mapping}    BuiltIn.Create_Dictionary    NEXTHOP=${NEXT_HOP_PREF}${pathid}    LOCALPREF=${pathid}00    PATHID=${pathid}    APP_RIB=${app_rib}
183     \    TemplatedRequests.Post_As_Xml_Templated    ${MULT_VAR_FOLDER}/route    mapping=${route_mapping}    session=${CONFIG_SESSION}
184
185 Deconfigure_App_Peer
186     [Documentation]    Revert the BGP configuration to the original state: without application peer
187     ${app_rib}    Set Variable    ${ODL_SYSTEM_IP}
188     &{route_mapping}    BuiltIn.Create_Dictionary    APP_RIB=${app_rib}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
189     TemplatedRequests.Delete_Templated    ${MULT_VAR_FOLDER}/route    mapping=${route_mapping}    session=${CONFIG_SESSION}
190     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    APP_PEER_NAME=${APP_PEER_NAME}    IP=${ODL_SYSTEM_IP}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
191     TemplatedRequests.Delete_Templated    ${BGP_VAR_FOLDER}/app_peer    mapping=${mapping}    session=${CONFIG_SESSION}