Include file names in bgpcep-userfeatures.txt
[integration/test.git] / csit / suites / bgpcep / bgpuser / cases.robot
1 *** Settings ***
2 Documentation     Basic tests for odl-bgpcep-bgp-all feature.
3 ...
4 ...               Copyright (c) 2015 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 ...               TODO: Rename this file after Beryllium is out, for example to basic.robot
11 ...
12 ...               Test suite performs basic BGP functional test cases:
13 ...               BGP peer initiated coonection
14 ...               - introduce and check 3 prefixes in one update message
15 ...               ODL controller initiated coonection:
16 ...               - introduce and check 3 prefixes in one update message
17 ...               - introduce 2 prefixes in first update message and then additional 2 prefixes
18 ...               in another update while the very first prefix is withdrawn
19 ...               - introduce 3 prefixes and try to withdraw the first one
20 ...               (to be ignored by controller) in a single update message
21 ...
22 ...               Brief description how to perform BGP functional test:
23 ...               https://wiki.opendaylight.org/view/BGP_LS_PCEP:Lithium_Feature_Tests#How_to_test_2
24 ...
25 ...               Reported bugs:
26 ...               https://bugs.opendaylight.org/show_bug.cgi?id=4409
27 ...               https://bugs.opendaylight.org/show_bug.cgi?id=4634
28 Suite Setup       Setup_Everything
29 Suite Teardown    Teardown_Everything
30 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Fast_Failing
31 Test Teardown     FailFast.Start_Failing_Fast_If_This_Failed
32 Library           OperatingSystem
33 Library           SSHLibrary    timeout=10s
34 Library           RequestsLibrary
35 Library           ${CURDIR}/../../../libraries/HsfJson/hsf_json.py
36 Variables         ${CURDIR}/../../../variables/Variables.py
37 Variables         ${CURDIR}/../../../variables/bgpuser/variables.py    ${TOOLS_SYSTEM_IP}
38 Resource          ${CURDIR}/../../../libraries/BGPSpeaker.robot
39 Resource          ${CURDIR}/../../../libraries/ConfigViaRestconf.robot
40 Resource          ${CURDIR}/../../../libraries/FailFast.robot
41 Resource          ${CURDIR}/../../../libraries/KarafKeywords.robot
42 Resource          ${CURDIR}/../../../libraries/KillPythonTool.robot
43 Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
44 Resource          ${CURDIR}/../../../libraries/SSHKeywords.robot
45 Resource          ${CURDIR}/../../../libraries/Utils.robot
46 Resource          ${CURDIR}/../../../libraries/WaitForFailure.robot
47
48 *** Variables ***
49 ${ACTUAL_RESPONSES_FOLDER}    ${TEMPDIR}/actual
50 ${EXPECTED_RESPONSES_FOLDER}    ${TEMPDIR}/expected
51 ${BGP_VARIABLES_FOLDER}    ${CURDIR}/../../../variables/bgpuser/
52 ${TOOLS_SYSTEM_PROMPT}    ${DEFAULT_LINUX_PROMPT}
53 ${HOLDTIME}       180
54 ${BGP_TOOL_LOG_LEVEL}    info
55 ${CONTROLLER_LOG_LEVEL}    INFO
56 ${CONTROLLER_BGP_LOG_LEVEL}    DEFAULT
57
58 *** Test Cases ***
59 Check_For_Empty_Topology_Before_Talking
60     [Documentation]    Sanity check example-ipv4-topology is up but empty.
61     [Tags]    critical
62     Wait_For_Topology_To_Change_To    ${empty_json}    010_Empty.json    timeout=120s
63     # TODO: Verify that 120 seconds is not too short if this suite is run immediatelly after ODL is started.
64
65 Reconfigure_ODL_To_Accept_Connection
66     [Documentation]    Configure BGP peer module with initiate-connection set to false.
67     ${template_as_string}=    BuiltIn.Set_Variable    {'NAME': 'example-bgp-peer', 'IP': '${TOOLS_SYSTEM_IP}', 'HOLDTIME': '${HOLDTIME}', 'PEER_PORT': '${BGP_TOOL_PORT}', 'INITIATE': 'false'}
68     ConfigViaRestconf.Put_Xml_Template_Folder_Config_Via_Restconf    ${BGP_VARIABLES_FOLDER}${/}bgp_peer    ${template_as_string}
69
70 Start_Talking_BGP_speaker
71     [Documentation]    Start Python speaker to connect to ODL, verify that the tool does not promptly exit.
72     # Myport value is needed for checking whether connection at precise port was established.
73     BGPSpeaker.Start_BGP_Speaker    --amount 3 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --${BGP_TOOL_LOG_LEVEL}
74     Read_And_Fail_If_Prompt_Is_Seen
75
76 Check_Talking_Connection_Is_Established
77     [Documentation]    See TCP (BGP) connection in established state.
78     # This case is separate from the previous one, to resemble structure of the second half of this suite more closely.
79     Check_Speaker_Is_Connected
80     [Teardown]    Utils.Report_Failure_Due_To_Bug    5171
81
82 Check_Talking_Topology_Is_Filled
83     [Documentation]    See new routes in example-ipv4-topology as a proof that synchronization was correct.
84     [Tags]    critical
85     Wait_For_Topology_To_Change_To    ${filled_json}    020_Filled.json
86
87 Kill_Talking_BGP_Speaker
88     [Documentation]    Abort the Python speaker. Also, attempt to stop failing fast.
89     [Tags]    critical
90     [Setup]    SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
91     BGPSpeaker.Kill_BGP_Speaker
92     FailFast.Do_Not_Fail_Fast_From_Now_On
93     # NOTE: It is still possible to remain failing fast, if both previous and this test have failed.
94     [Teardown]    FailFast.Do_Not_Start_Failing_If_This_Failed
95
96 Check_For_Empty_Topology_After_Talking
97     [Documentation]    See example-ipv4-topology empty again.
98     [Tags]    critical
99     Wait_For_Topology_To_Change_To    ${empty_json}    030_Empty.json
100
101 Start_Listening_BGP_Speaker
102     [Documentation]    Start Python speaker in listening mode, verify that the tool does not exit quickly.
103     BGPSpeaker.Start_BGP_Speaker    --amount 3 --listen --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --${BGP_TOOL_LOG_LEVEL}
104     Read_And_Fail_If_Prompt_Is_Seen
105
106 Check_Listening_Connection_Is_Not_Established_Yet
107     [Documentation]    See no TCP connection, as both ODL and tool are in listening mode.
108     Check_Speaker_Is_Not_Connected
109
110 Check_For_Empty_Topology_Before_Listening
111     [Documentation]    Sanity check example-ipv4-topology is still empty.
112     [Tags]    critical
113     Verify_That_Topology_Does_Not_Change_From    ${empty_json}    040_Empty.json
114
115 Reconfigure_ODL_To_Initiate_Connection
116     [Documentation]    Replace BGP peer config module, now with initiate-connection set to true.
117     ${template_as_string}=    BuiltIn.Set_Variable    {'NAME': 'example-bgp-peer', 'IP': '${TOOLS_SYSTEM_IP}', 'HOLDTIME': '${HOLDTIME}', 'PEER_PORT': '${BGP_TOOL_PORT}', 'INITIATE': 'true'}
118     ConfigViaRestconf.Put_Xml_Template_Folder_Config_Via_Restconf    ${BGP_VARIABLES_FOLDER}${/}bgp_peer    ${template_as_string}
119
120 Check_Listening_Connection_Is_Established
121     [Documentation]    See TCP (BGP) connection in established state.
122     Check_Speaker_Is_Connected
123
124 Check_Listening_Topology_Is_Filled
125     [Documentation]    See new routes in example-ipv4-topology as a proof that synchronization was correct.
126     [Tags]    critical
127     Wait_For_Topology_To_Change_To    ${filled_json}    050_Filled.json
128
129 Kill_Listening_BGP_Speaker
130     [Documentation]    Abort the Python speaker. Also, attempt to stop failing fast.
131     [Tags]    critical
132     [Setup]    SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
133     BGPSpeaker.Kill_BGP_Speaker
134     FailFast.Do_Not_Fail_Fast_From_Now_On
135     # NOTE: It is still possible to remain failing fast, if both previous and this test have failed.
136     [Teardown]    FailFast.Do_Not_Start_Failing_If_This_Failed
137
138 Check_For_Empty_Topology_After_Listening
139     [Documentation]    Post-condition: Check example-ipv4-topology is empty again.
140     [Tags]    critical
141     Wait_For_Topology_To_Change_To    ${empty_json}    060_Empty.json
142
143 Start_Listening_BGP_Speaker_Case_2
144     [Documentation]    BGP Speaker introduces 2 prefixes in the first update & another 2 prefixes while the very first is withdrawn in 2nd update
145     BGPSpeaker.Start_BGP_Speaker    --amount 3 --listen --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --prefill=2 --insert=2 --withdraw=1 --updates=single --firstprefix=8.0.0.240 --${BGP_TOOL_LOG_LEVEL}
146     Read_And_Fail_If_Prompt_Is_Seen
147
148 Check_Listening_Connection_Is_Established_Case_2
149     [Documentation]    See TCP (BGP) connection in established state.
150     Check_Speaker_Is_Connected
151
152 Check_Listening_Topology_Is_Filled_Case_2
153     [Documentation]    See new routes in example-ipv4-topology as a proof that synchronization was correct.
154     [Tags]    critical
155     Wait_For_Topology_To_Change_To    ${filled_json}    050_Filled.json
156     [Teardown]    Report_Failure_Due_To_Bug    4409
157
158 Kill_Listening_BGP_Speaker_Case_2
159     [Documentation]    Abort the Python speaker. Also, attempt to stop failing fast.
160     [Tags]    critical
161     [Setup]    SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
162     BGPSpeaker.Kill_BGP_Speaker
163     FailFast.Do_Not_Fail_Fast_From_Now_On
164     # NOTE: It is still possible to remain failing fast, if both previous and this test have failed.
165     [Teardown]    FailFast.Do_Not_Start_Failing_If_This_Failed
166
167 Check_For_Empty_Topology_After_Listening_Case_2
168     [Documentation]    Post-condition: Check example-ipv4-topology is empty again.
169     [Tags]    critical
170     Wait_For_Topology_To_Change_To    ${empty_json}    060_Empty.json
171
172 Start_Listening_BGP_Speaker_Case_3
173     [Documentation]    BGP Speaker introduces 3 prefixes while the first one occures again in the withdrawn list (to be ignored bu controller)
174     BGPSpeaker.Start_BGP_Speaker    --amount 2 --listen --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --prefill=0 --insert=3 --withdraw=1 --updates=single --${BGP_TOOL_LOG_LEVEL}
175     Read_And_Fail_If_Prompt_Is_Seen
176
177 Check_Listening_Connection_Is_Established_Case_3
178     [Documentation]    See TCP (BGP) connection in established state.
179     Check_Speaker_Is_Connected
180
181 Check_Listening_Topology_Is_Filled_Case_3
182     [Documentation]    See new routes in example-ipv4-topology as a proof that synchronization was correct.
183     [Tags]    critical
184     Wait_For_Topology_To_Change_To    ${filled_json}    050_Filled.json
185     [Teardown]    Report_Failure_Due_To_Bug    4634
186
187 Kill_Listening_BGP_Speaker_Case_3
188     [Documentation]    Abort the Python speaker. Also, attempt to stop failing fast.
189     [Tags]    critical
190     [Setup]    SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
191     BGPSpeaker.Kill_BGP_Speaker
192     FailFast.Do_Not_Fail_Fast_From_Now_On
193     # NOTE: It is still possible to remain failing fast, if both previous and this test have failed.
194     [Teardown]    FailFast.Do_Not_Start_Failing_If_This_Failed
195
196 Check_For_Empty_Topology_After_Listening_Case_3
197     [Documentation]    Post-condition: Check example-ipv4-topology is empty again.
198     [Tags]    critical
199     Wait_For_Topology_To_Change_To    ${empty_json}    060_Empty.json
200
201 Delete_Bgp_Peer_Configuration
202     [Documentation]    Revert the BGP configuration to the original state: without any configured peers.
203     ${template_as_string}=    BuiltIn.Set_Variable    {'NAME': 'example-bgp-peer'}
204     ConfigViaRestconf.Delete_Xml_Template_Folder_Config_Via_Restconf    ${BGP_VARIABLES_FOLDER}${/}bgp_peer    ${template_as_string}
205     # TODO: Do we need to check something else?
206
207 *** Keywords ***
208 Setup_Everything
209     [Documentation]    SSH-login to mininet machine, create HTTP session,
210     ...    prepare directories for responses, put Python tool to mininet machine, setup imported resources.
211     SetupUtils.Setup_Utils_For_Setup_And_Teardown
212     SSHLibrary.Set_Default_Configuration    prompt=${TOOLS_SYSTEM_PROMPT}
213     SSHLibrary.Open_Connection    ${TOOLS_SYSTEM_IP}
214     Utils.Flexible_Mininet_Login
215     RequestsLibrary.Create_Session    operational    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}${OPERATIONAL_TOPO_API}    auth=${AUTH}
216     # TODO: Do not include slash in ${OPERATIONAL_TOPO_API}, having it typed here is more readable.
217     # TODO: Alternatively, create variable in Variables which starts with http.
218     # Both TODOs would probably need to update every suite relying on current Variables.
219     OperatingSystem.Remove_Directory    ${EXPECTED_RESPONSES_FOLDER}    recursive=True
220     OperatingSystem.Remove_Directory    ${ACTUAL_RESPONSES_FOLDER}    recursive=True
221     # The previous suite may have been using the same directories.
222     OperatingSystem.Create_Directory    ${EXPECTED_RESPONSES_FOLDER}
223     OperatingSystem.Create_Directory    ${ACTUAL_RESPONSES_FOLDER}
224     SSHLibrary.Put_File    ${CURDIR}/../../../../tools/fastbgp/play.py
225     ConfigViaRestconf.Setup_Config_Via_Restconf
226     KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${CONTROLLER_LOG_LEVEL}
227     KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${CONTROLLER_BGP_LOG_LEVEL} org.opendaylight.bgpcep
228     KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${CONTROLLER_BGP_LOG_LEVEL} org.opendaylight.protocol
229
230 Teardown_Everything
231     [Documentation]    Create and Log the diff between expected and actual responses, make sure Python tool was killed.
232     ...    Tear down imported Resources.
233     ${diff}=    OperatingSystem.Run    diff -dur ${EXPECTED_RESPONSES_FOLDER} ${ACTUAL_RESPONSES_FOLDER}
234     BuiltIn.Log    ${diff}
235     KillPythonTool.Search_And_Kill_Remote_Python    'play\.py'
236     ConfigViaRestconf.Teardown_Config_Via_Restconf
237     RequestsLibrary.Delete_All_Sessions
238     SSHLibrary.Close_All_Connections
239
240 Wait_For_Topology_To_Change_To
241     [Arguments]    ${json_topology}    ${filename}    ${timeout}=10s    ${refresh}=1s
242     [Documentation]    Normalize the expected json topology and save it to ${EXPECTED_RESPONSES_FOLDER}.
243     ...    Wait until Compare_Topology matches. ${ACTUAL_RESPONSES_FOLDER} will hold its last result.
244     ${topology_normalized}=    Normalize_And_Save_Expected_Json    ${json_topology}    ${filename}    ${EXPECTED_RESPONSES_FOLDER}
245     BuiltIn.Wait_Until_Keyword_Succeeds    ${timeout}    ${refresh}    Compare_Topology    ${topology_normalized}    ${filename}
246
247 Verify_That_Topology_Does_Not_Change_From
248     [Arguments]    ${json_topology}    ${filename}    ${timeout}=10s    ${refresh}=1s
249     [Documentation]    Normalize the expected json topology and save it to ${EXPECTED_RESPONSES_FOLDER}.
250     ...    Verify that Compare_Topology keeps passing. ${ACTUAL_RESPONSES_FOLDER} will hold its last result.
251     ${topology_normalized}=    Normalize_And_Save_Expected_Json    ${json_topology}    ${filename}    ${EXPECTED_RESPONSES_FOLDER}
252     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${timeout}    ${refresh}    Compare_Topology    ${topology_normalized}    ${filename}
253
254 Compare_Topology
255     [Arguments]    ${expected_normalized}    ${filename}
256     [Documentation]    Get current example-ipv4-topology as json, normalize it, save to ${ACTUAL_RESPONSES_FOLDER}.
257     ...    Check that status code is 200, check that normalized jsons match exactly.
258     ${response}=    RequestsLibrary.Get Request    operational    topology/example-ipv4-topology
259     BuiltIn.Log    ${response.status_code}
260     BuiltIn.Log    ${response.text}
261     ${actual_normalized}=    Normalize_And_Save_Expected_Json    ${response.text}    ${filename}    ${ACTUAL_RESPONSES_FOLDER}
262     BuiltIn.Should_Be_Equal_As_Strings    ${response.status_code}    200
263     BuiltIn.Should_Be_Equal    ${actual_normalized}    ${expected_normalized}
264
265 Normalize_And_Save_Expected_Json
266     [Arguments]    ${json_text}    ${filename}    ${directory}
267     [Documentation]    Normalize given json using hsf_json library. Log and save the result to given filename under given directory.
268     ${json_normalized}=    hsf_json.Hsf_Json    ${json_text}
269     BuiltIn.Log    ${json_normalized}
270     OperatingSystem.Create_File    ${directory}${/}${filename}    ${json_normalized}
271     # TODO: Should we prepend .json to the filename? When we detect it is not already prepended?
272     [Return]    ${json_normalized}
273
274 Check_Speaker_Is_Not_Connected
275     [Documentation]    Give it a few tries to see zero established connections.
276     BuiltIn.Wait_Until_Keyword_Succeeds    3s    1s    Check_Number_Of_Speaker_Connections    0
277
278 Check_Speaker_Is_Connected
279     [Documentation]    Give it several tries to see exactly one established connection.
280     BuiltIn.Wait_Until_Keyword_Succeeds    5s    1s    Check_Number_Of_Speaker_Connections    1
281
282 Check_Number_Of_Speaker_Connections
283     [Arguments]    ${howmany}
284     [Documentation]    Run netstat in mininet machine and parse it for number of established connections. Check it is ${howmany}.
285     ${output}=    SSHKeywords.Count_Port_Occurences    17900    ESTABLISHED    python
286     BuiltIn.Should_Be_Equal_As_Strings    ${output}    ${howmany}
287
288 Read_And_Fail_If_Prompt_Is_Seen
289     [Documentation]    Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.
290     ${passed}=    BuiltIn.Run_Keyword_And_Return_Status    BuiltIn.Run_Keyword_And_Expect_Error    No match found for '${TOOLS_SYSTEM_PROMPT}' in *.    Read_Text_Before_Prompt
291     BuiltIn.Return_From_Keyword_If    ${passed}
292     BGPSpeaker.Dump_BGP_Speaker_Logs
293     Builtin.Fail    The prompt was seen but it was not expected yet
294
295 Read_Text_Before_Prompt
296     [Documentation]    Log text gathered by SSHLibrary.Read_Until_Prompt.
297     ...    This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.
298     ${text}=    SSHLibrary.Read_Until_Prompt
299     BuiltIn.Log    ${text}