teardown improved with linking bugs if test failed for bgp multipath suite
[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 Library           RequestsLibrary
16 Library           SSHLibrary
17 Variables         ${CURDIR}/../../../variables/Variables.py
18 Resource          ${CURDIR}/../../../libraries/Utils.robot
19 Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
20 Resource          ${CURDIR}/../../../libraries/TemplatedRequests.robot
21 Library           ${CURDIR}/../../../libraries/norm_json.py
22 Library           ${CURDIR}/../../../libraries/BgpRpcClient.py    ${TOOLS_SYSTEM_IP}
23 Resource          ${CURDIR}/../../../libraries/BGPcliKeywords.robot
24 Resource          ${CURDIR}/../../../libraries/KarafKeywords.robot
25 Resource          ${CURDIR}/../../../libraries/SSHKeywords.robot
26
27 *** Variables ***
28 ${HOLDTIME}       180
29 ${DEVICE_NAME}    controller-config
30 ${BGP_PEER_NAME}    example-bgp-peer
31 ${RIB_INSTANCE}    example-bgp-rib
32 ${APP_PEER_NAME}    example-bgp-peer-app
33 ${CMD}            env exabgp.tcp.port=1790 exabgp --debug
34 ${BGP_VAR_FOLDER}    ${CURDIR}/../../../variables/bgpfunctional
35 ${MULT_VAR_FOLDER}    ${BGP_VAR_FOLDER}/multipaths
36 ${DEFAUTL_RPC_CFG}    exa.cfg
37 ${CONFIG_SESSION}    config-session
38 ${EXARPCSCRIPT}    ${CURDIR}/../../../../tools/exabgp_files/exarpc.py
39 ${N_PATHS_VALUE}    2
40 &{DEFAULT_MAPPING}    ODLIP=${ODL_SYSTEM_IP}    EXAIP=${TOOLS_SYSTEM_IP}    NPATHS=${N_PATHS_VALUE}
41 @{PATH_ID_LIST}    1    2    3
42 ${PATH_ID_LIST_LEN}    3
43 ${NEXT_HOP_PREF}    100.100.100.
44 ${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
45 ${PEER_CHECK_URL}    /restconf/operational/bgp-rib:bgp-rib/rib/example-bgp-rib/peer/bgp:%2F%2F
46 ${NPATHS_SELM}    n-paths
47 ${ALLPATHS_SELM}    all-paths
48 ${ADDPATHCAP_SR}    send\\/receive
49 ${ADDPATHCAP_S}    send
50 ${ADDPATHCAP_R}    receive
51 ${ADDPATHCAP_D}    disable
52
53 *** Test Cases ***
54 Reconfigure_ODL_To_Accept_Connection
55     [Documentation]    Configure BGP peer module with initiate-connection set to false.
56     KarafKeywords.Log_Testcase_Start_To_Controller_Karaf
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}
59     TemplatedRequests.Put_As_Xml_Templated    ${BGP_VAR_FOLDER}/bgp_peer    mapping=${mapping}    session=${CONFIG_SESSION}
60
61 Odl Allpaths Exa SendReceived
62     [Documentation]    all-paths selected policy selected
63     [Tags]    critical
64     [Setup]    Configure_Path_Selection_And_App_Peer_And_Connect_Peer    ${ALLPATHS_SELM}    ${ADDPATHCAP_SR}
65     Log_Loc_Rib_Operational
66     BuiltIn.Wait_Until_Keyword_Succeeds    6x    2s    Verify_Expected_Update_Count    ${PATH_ID_LIST_LEN}
67     [Teardown]    Remove_App_Peer_Configuration_And_Stop_Tool
68
69 Odl Npaths Exa SendReceived
70     [Documentation]    n-paths policy selected on odl
71     [Tags]    critical
72     [Setup]    Configure_Path_Selection_And_App_Peer_And_Connect_Peer    ${NPATHS_SELM}    ${ADDPATHCAP_SR}
73     Log_Loc_Rib_Operational
74     BuiltIn.Wait_Until_Keyword_Succeeds    6x    2s    Verify_Expected_Update_Count    ${N_PATHS_VALUE}
75     [Teardown]    Remove_App_Peer_Configuration_And_Stop_Tool
76
77 Delete_Bgp_Peer_Configuration
78     [Documentation]    Revert the BGP configuration to the original state: without any configured peers.
79     KarafKeywords.Log_Testcase_Start_To_Controller_Karaf
80     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    BGP_NAME=${BGP_PEER_NAME}
81     TemplatedRequests.Delete_Templated    ${BGP_VAR_FOLDER}/bgp_peer    mapping=${mapping}    session=${CONFIG_SESSION}
82
83 *** Keywords ***
84 Start_Suite
85     [Documentation]    Suite setup keyword
86     SetupUtils.Setup_Utils_For_Setup_And_Teardown
87     ${mininet_conn_id}=    SSHLibrary.Open Connection    ${TOOLS_SYSTEM_IP}    prompt=${DEFAULT_LINUX_PROMPT}    timeout=6s
88     Builtin.Set Suite Variable    ${mininet_conn_id}
89     Utils.Flexible Mininet Login    ${TOOLS_SYSTEM_USER}
90     SSHKeywords.Virtual_Env_Create
91     SSHKeywords.Virtual_Env_Install_Package    exabgp==3.4.16
92     RequestsLibrary.Create_Session    ${CONFIG_SESSION}    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}    auth=${AUTH}
93     Upload_Config_Files
94     Configure_Odl_With_Multipaths
95
96 Stop_Suite
97     [Documentation]    Suite teardown keyword with ord rib restoration
98     SSHKeywords.Virtual_Env_Delete
99     TemplatedRequests.Put_As_Xml_To_Uri    ${RIB_URI}    ${rib_old}    session=${CONFIG_SESSION}
100     SSHLibrary.Close_All_Connections
101     RequestsLibrary.Delete_All_Sessions
102
103 Upload_Config_Files
104     [Arguments]    ${addpath}=disable
105     [Documentation]    Uploads exabgp config files
106     SSHLibrary.Put_File    ${BGP_VAR_FOLDER}/${DEFAUTL_RPC_CFG}    .
107     SSHLibrary.Put_File    ${EXARPCSCRIPT}    .
108     @{cfgfiles}=    SSHLibrary.List_Files_In_Directory    .    *.cfg
109     : FOR    ${cfgfile}    IN    @{cfgfiles}
110     \    SSHLibrary.Execute_Command    sed -i -e 's/EXABGPIP/${TOOLS_SYSTEM_IP}/g' ${cfgfile}
111     \    SSHLibrary.Execute_Command    sed -i -e 's/ODLIP/${ODL_SYSTEM_IP}/g' ${cfgfile}
112     \    SSHLibrary.Execute_Command    sed -i -e 's/ROUTEREFRESH/enable/g' ${cfgfile}
113     \    SSHLibrary.Execute_Command    sed -i -e 's/ADDPATH/${addpath}/g' ${cfgfile}
114     \    ${stdout}=    SSHLibrary.Execute_Command    cat ${cfgfile}
115     \    Log    ${stdout}
116
117 Configure_Path_Selection_And_App_Peer_And_Connect_Peer
118     [Arguments]    ${odl_path_sel_mode}    ${exa_add_path_value}
119     [Documentation]    Setup test case keyword. Early after the path selection config the incomming connection
120     ...    from exabgp towards odl may be rejected by odl due to config process not finished yet. Because of that
121     ...    we try to start the tool 3 times in case early attempts fail.
122     KarafKeywords.Log_Testcase_Start_To_Controller_Karaf
123     Configure_Path_Selection_Mode    ${odl_path_sel_mode}
124     Configure_App_Peer_With_Routes
125     Upload_Config_Files    addpath=${exa_add_path_value}
126     BuiltIn.Wait_Until_Keyword_Succeeds    3x    1s    Start_Tool_And_Verify_Connected    ${DEFAUTL_RPC_CFG}
127
128 Get_New_Config_File
129     [Arguments]    ${cfg_template_file}    ${mapping}={}    ${new_cfg_name}=cfg.cfg
130     [Documentation]    Returns a new config file from template
131     ${cfg_content}=    TemplatedRequests.Resolve_Text_From_Template_File    ${cfg_template}    ${mapping}
132     SSHLibrary.Execute_Command    echo    ${cfg_content} > ${new_cfg_name}
133     [Return]    ${new_cfg_name}
134
135 Start_Tool
136     [Arguments]    ${cfg_file}    ${mapping}={}
137     [Documentation]    Start the tool ${cmd} ${cfg_file}
138     ${start_cmd}    BuiltIn.Set_Variable    ${cmd} ${cfg_file}
139     BuiltIn.Log    ${start_cmd}
140     SSHKeywords.Virtual_Env_Activate_On_Current_Session    log_output=${True}
141     ${output}=    SSHLibrary.Write    ${start_cmd}
142     BuiltIn.Log    ${output}
143
144 Verify_Tools_Connection
145     [Arguments]    ${connected}=${True}
146     [Documentation]    Checks peer presence in operational datastore
147     ${exp_status_code}=    BuiltIn.Set_Variable_If    ${connected}    ${200}    ${404}
148     ${rsp}=    RequestsLibrary.Get Request    ${CONFIG_SESSION}    ${PEER_CHECK_URL}${TOOLS_SYSTEM_IP}
149     BuiltIn.Log    ${rsp.content}
150     BuiltIn.Should_Be_Equal_As_Numbers    ${exp_status_code}    ${rsp.status_code}
151
152 Start_Tool_And_Verify_Connected
153     [Arguments]    ${cfg_file}
154     [Documentation]    Start the tool and verify its connection
155     Start_Tool    ${cfg_file}
156     BuiltIn.Wait_Until_Keyword_Succeeds    3x    3s    Verify_Tools_Connection    connected=${True}
157
158 Stop_Tool
159     [Documentation]    Stop the tool by sending ctrl+c
160     ${output}=    SSHLibrary.Read
161     BuiltIn.Log    ${output}
162     Utils.Write_Bare_Ctrl_C
163     ${output}=    SSHLibrary.Read_Until_Prompt
164     BuiltIn.Log    ${output}
165     SSHKeywords.Virtual_Env_Deactivate_On_Current_Session    log_output=${True}
166
167 Remove_App_Peer_Configuration_And_Stop_Tool
168     Deconfigure_App_Peer
169     Stop_Tool
170     SetupUtils.Teardown_Test_Show_Bugs_If_Test_Failed
171
172 Verify_Expected_Update_Count
173     [Arguments]    ${exp_count}
174     [Documentation]    Verify number of received update messages
175     ${tool_count}=    BgpRpcClient.exa_get_received_update_count
176     BuiltIn.Should_Be_Equal_As_Numbers    ${exp_count}    ${tool_count}
177
178 Configure_Path_Selection_Mode
179     [Arguments]    ${psm}
180     [Documentation]    Configure path selection mode and get rib information for potential debug purposes
181     &{mapping}    BuiltIn.Create_Dictionary    PATHSELMODE=${psm}
182     TemplatedRequests.Get_As_Xml_Templated    ${MULT_VAR_FOLDER}/rib    mapping=${mapping}    session=${CONFIG_SESSION}
183     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/module_psm    mapping=${mapping}    session=${CONFIG_SESSION}
184
185 Configure_Odl_With_Multipaths
186     [Documentation]    Configures odl to support n-paths or all-paths selection
187     ${mapping}=    BuiltIn.Set Variable    ${DEFAULT_MAPPING}
188     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/module_n_paths    mapping=${mapping}    session=${CONFIG_SESSION}
189     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/module_all_paths    mapping=${mapping}    session=${CONFIG_SESSION}
190     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/service_psmf    mapping=${mapping}    session=${CONFIG_SESSION}
191     Configure_Path_Selection_Mode    n-paths
192     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/service_bpsm    mapping=${mapping}    session=${CONFIG_SESSION}
193     ${rib_old}=    TemplatedRequests.Get_As_Xml_Templated    ${MULT_VAR_FOLDER}/rib    mapping=${mapping}    session=${CONFIG_SESSION}
194     BuiltIn.Set_Suite_Variable    ${rib_old}
195     TemplatedRequests.Put_As_Xml_Templated    ${MULT_VAR_FOLDER}/rib    mapping=${mapping}    session=${CONFIG_SESSION}
196
197 Log_Loc_Rib_Operational
198     ${rsp}=    RequestsLibrary.Get Request    ${CONFIG_SESSION}    /restconf/operational/bgp-rib:bgp-rib/rib/example-bgp-rib/loc-rib/
199     BuiltIn.Log    ${rsp.content}
200
201 Configure_App_Peer_With_Routes
202     [Documentation]    Configure bgp application peer and fill it immediately with routes.
203     &{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}
204     TemplatedRequests.Put_As_Xml_Templated    ${BGP_VAR_FOLDER}/app_peer    mapping=${mapping}    session=${CONFIG_SESSION}
205     : FOR    ${pathid}    IN    @{PATH_ID_LIST}
206     \    &{route_mapping}    BuiltIn.Create_Dictionary    NEXTHOP=${NEXT_HOP_PREF}${pathid}    LOCALPREF=${pathid}00    PATHID=${pathid}
207     \    TemplatedRequests.Post_As_Xml_Templated    ${MULT_VAR_FOLDER}/route    mapping=${route_mapping}    session=${CONFIG_SESSION}
208
209 Deconfigure_App_Peer
210     [Documentation]    Revert the BGP configuration to the original state: without application peer
211     &{route_mapping}    BuiltIn.Create_Dictionary
212     TemplatedRequests.Delete_Templated    ${MULT_VAR_FOLDER}/route    mapping=${route_mapping}    session=${CONFIG_SESSION}
213     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    APP_PEER_NAME=${APP_PEER_NAME}
214     TemplatedRequests.Delete_Templated    ${BGP_VAR_FOLDER}/app_peer    mapping=${mapping}    session=${CONFIG_SESSION}