Bug 9294:
[integration/test.git] / csit / suites / bgpcep / bgpuser / bgp_app_peer_basic.robot
1 *** Settings ***
2 Documentation     Basic tests for BGP application peer.
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 ...               Test suite performs basic BGP functional test cases for
11 ...               BGP application peer operations and checks for IP4 topology updates
12 ...               and updates towards BGP peer as follows:
13 ...
14 ...               Test case 1: Initial BGP peer connection with pre-filled topology (Bug 4714),
15 ...               POST and simple DELETE requests used.
16 ...               BGP_Application_Peer_Post_3_Initial_Routes,
17 ...               Check_Example-IPv4-Topology_Is_Filled_With_3_Routes,
18 ...               Connect_BGP_Peer,
19 ...               BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes,
20 ...               BGP_Application_Peer_Delete_3_Initial_Routes,
21 ...               Check_Example-IPv4-Topology_Is_Empty,
22 ...               Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes,
23 ...               Stop_BGP_Peer.
24 ...
25 ...               Test case 2: PUT and DELETE all routes requests while BGP peer is connected.
26 ...               Reconnect_BGP_Peer,
27 ...               BGP_Application_Peer_Put_3_Routes,
28 ...               Check_Example-IPv4-Topology_Is_Filled_With_3_Routes,
29 ...               BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes,
30 ...               BGP_Application_Peer_Delete_All_Routes,
31 ...               Check_Example-IPv4-Topology_Is_Empty,
32 ...               BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes,
33 ...               Stop_BGP_Peer.
34 ...
35 ...               Test case 3: Repeated BGP peer re-connection with pre-filled topology.
36 ...               BGP_Application_Peer_Put_3_Routes,
37 ...               Check_Example-IPv4-Topology_Is_Filled_With_3_Routes,
38 ...               Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes,
39 ...               BGP_Application_Peer_Delete_All_Routes,
40 ...               Check_Example-IPv4-Topology_Is_Empty,
41 ...               BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes,
42 ...               Stop_BGP_Peer.
43 ...
44 ...               Brief description how to configure BGP application peer and
45 ...               how to use restconf application peer interface:
46 ...               https://wiki.opendaylight.org/view/BGP_LS_PCEP:User_Guide#BGP_Application_Peer
47 ...               https://wiki.opendaylight.org/view/BGP_LS_PCEP:Programmer_Guide#BGP
48 ...               Covered bugs:
49 ...               Bug 4714 - No routes from loc-rib are advertised to newly connected peer
50 Suite Setup       Setup_Everything
51 Suite Teardown    Teardown_Everything
52 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
53 Test Teardown     FailFast.Start_Failing_Fast_If_This_Failed
54 Library           OperatingSystem
55 Library           SSHLibrary    timeout=10s
56 Library           RequestsLibrary
57 Library           ${CURDIR}/../../../libraries/norm_json.py
58 Variables         ${CURDIR}/../../../variables/Variables.py
59 Variables         ${CURDIR}/../../../variables/bgpuser/variables.py    ${TOOLS_SYSTEM_IP}    ${ODL_STREAM}
60 Resource          ${CURDIR}/../../../libraries/BGPcliKeywords.robot
61 Resource          ${CURDIR}/../../../libraries/BGPSpeaker.robot
62 Resource          ${CURDIR}/../../../libraries/TemplatedRequests.robot
63 Resource          ${CURDIR}/../../../libraries/FailFast.robot
64 Resource          ${CURDIR}/../../../libraries/KillPythonTool.robot
65 Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
66 Resource          ${CURDIR}/../../../libraries/SSHKeywords.robot
67 Resource          ${CURDIR}/../../../libraries/WaitForFailure.robot
68 Resource          ${CURDIR}/../../../libraries/CompareStream.robot
69
70 *** Variables ***
71 ${ACTUAL_RESPONSES_FOLDER}    ${TEMPDIR}/actual
72 ${EXPECTED_RESPONSES_FOLDER}    ${TEMPDIR}/expected
73 ${BGP_VARIABLES_FOLDER}    ${CURDIR}/../../../variables/bgpuser/
74 ${TOOLS_SYSTEM_PROMPT}    ${DEFAULT_LINUX_PROMPT}
75 ${HOLDTIME}       180
76 ${BGP_PEER_LOG_LEVEL}    debug
77 ${BGP_APP_PEER_LOG_LEVEL}    debug
78 ${ODL_LOG_LEVEL}    INFO
79 ${ODL_BGP_LOG_LEVEL}    DEFAULT
80 ${BGP_PEER_COMMAND}    python play.py --amount 0 --myip=${TOOLS_SYSTEM_IP} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --peerport=${ODL_BGP_PORT} --${BGP_PEER_LOG_LEVEL}
81 ${BGP_PEER_OPTIONS}    ${EMPTY}
82 ${BGP_APP_PEER_ID}    ${ODL_SYSTEM_IP}
83 ${BGP_APP_PEER_POST_COMMAND}    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command post --count 3 --prefix 8.0.1.0 --prefixlen 28 --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM}
84 ${BGP_APP_PEER_PUT_COMMAND}    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command put --count 3 --prefix 8.0.1.0 --prefixlen 28 --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM}
85 ${BGP_APP_PEER_DELETE_COMMAND}    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command delete --count 3 --prefix 8.0.1.0 --prefixlen 28 --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM}
86 ${BGP_APP_PEER_DELETE_ALL_COMMAND}    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command delete-all --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM}
87 ${BGP_APP_PEER_GET_COMMAND}    python bgp_app_peer.py --host ${ODL_SYSTEM_IP} --port ${RESTCONFPORT} --command get --${BGP_APP_PEER_LOG_LEVEL} --stream=${ODL_STREAM}
88 ${BGP_APP_PEER_OPTIONS}    &>/dev/null
89 ${BGP_APP_PEER_TIMEOUT}    30s
90 ${BGP_PEER_APP_NAME}    example-bgp-peer-app
91 ${CONFIG_SESSION}    session
92 ${RIB_INSTANCE}    example-bgp-rib
93 ${PROTOCOL_OPENCONFIG}    ${RIB_INSTANCE}
94 ${DEVICE_NAME}    controller-config
95 ${BGP_PEER_NAME}    example-bgp-peer
96 ${RIB_INSTANCE}    example-bgp-rib
97
98 *** Test Cases ***
99 Reconfigure_ODL_To_Accept_BGP_Peer_Connection
100     [Documentation]    Configure BGP peer module with initiate-connection set to false.
101     [Tags]    critical
102     &{mapping}    Create Dictionary    DEVICE_NAME=${DEVICE_NAME}    BGP_NAME=${BGP_PEER_NAME}    IP=${TOOLS_SYSTEM_IP}    HOLDTIME=${HOLDTIME}    PEER_PORT=${BGP_TOOL_PORT}
103     ...    INITIATE=false    BGP_RIB=${RIB_INSTANCE}    PASSIVE_MODE=true    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}    RIB_INSTANCE_NAME=${RIB_INSTANCE}
104     TemplatedRequests.Put_As_Xml_Templated    ${BGP_VARIABLES_FOLDER}${/}bgp_peer    mapping=${mapping}    session=${CONFIG_SESSION}
105
106 Reconfigure_ODL_To_Accept_BGP_Application_Peer
107     [Documentation]    Configure BGP application peer module.
108     [Tags]    critical
109     &{mapping}    Create Dictionary    DEVICE_NAME=${DEVICE_NAME}    NAME=${BGP_PEER_APP_NAME}    RIB_INSTANCE_NAME=${RIB_INSTANCE}    IP=${BGP_APP_PEER_ID}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
110     TemplatedRequests.Put_As_Xml_Templated    ${BGP_VARIABLES_FOLDER}${/}bgp_application_peer    mapping=${mapping}    session=${CONFIG_SESSION}
111
112 Check_For_Empty_Example-IPv4-Topology
113     [Documentation]    Sanity check example-ipv4-topology is up but empty.
114     [Tags]    critical
115     Wait_For_Topology_To_Change_To    ${empty_json}    000_Empty.json    timeout=120s
116
117 TC1_BGP_Application_Peer_Post_3_Initial_Routes
118     [Documentation]    Start BGP application peer tool and give it ${BGP_APP_PEER_TIMEOUT}
119     [Tags]    critical
120     Switch_To_BGP_Application_Peer_Console
121     Start_Console_Tool    ${BGP_APP_PEER_POST_COMMAND} ${scritp_uri_opt}    ${BGP_APP_PEER_OPTIONS}
122     Wait_Until_Console_Tool_Finish    ${BGP_APP_PEER_TIMEOUT}
123     Store_File_To_Workspace    bgp_app_peer.log    bgp_app_peer_initial_post_tc1.log
124
125 TC1_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes
126     [Documentation]    See new routes in example-ipv4-topology as a proof that synchronization was correct.
127     [Tags]    critical
128     Wait_For_Topology_To_Change_To    ${filled_json}    010_Filled.json
129
130 TC1_Connect_BGP_Peer
131     [Documentation]    Start BGP peer tool
132     [Tags]    critical
133     Switch_To_BGP_Peer_Console
134     Start_Console_Tool    ${BGP_PEER_COMMAND}    ${BGP_PEER_OPTIONS}
135     Read_And_Fail_If_Prompt_Is_Seen
136
137 TC1_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes
138     [Documentation]    Check incomming updates for new routes
139     [Tags]    critical
140     Switch_To_BGP_Peer_Console
141     BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received:    3
142     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received: 8.0.1.0/28    1
143     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received: 8.0.1.16/28    1
144     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received: 8.0.1.32/28    1
145     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received:    0
146     [Teardown]    Report_Failure_Due_To_Bug    4714
147
148 TC1_BGP_Application_Peer_Delete_3_Initial_Routes
149     [Documentation]    Start BGP application peer tool and give him ${BGP_APP_PEER_TIMEOUT}
150     [Tags]    critical
151     Switch_To_BGP_Application_Peer_Console
152     Start_Console_Tool    ${BGP_APP_PEER_DELETE_COMMAND} ${scritp_uri_opt}    ${BGP_APP_PEER_OPTIONS}
153     Wait_Until_Console_Tool_Finish    ${BGP_APP_PEER_TIMEOUT}
154     Store_File_To_Workspace    bgp_app_peer.log    bgp_app_peer_delete_tc1.log
155
156 TC1_Check_Example-IPv4-Topology_Is_Empty
157     [Documentation]    See new routes are deleted.
158     [Tags]    critical
159     Wait_For_Topology_To_Change_To    ${empty_json}    011_Empty.json
160
161 TC1_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes
162     [Documentation]    Check incomming updates for new routes
163     [Tags]    critical
164     Switch_To_BGP_Peer_Console
165     BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received:    3
166     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received: 8.0.1.0/28    1
167     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received: 8.0.1.16/28    1
168     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received: 8.0.1.32/28    1
169     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received:    3
170     [Teardown]    Report_Failure_Due_To_Bug    4714
171
172 TC1_Stop_BGP_Peer
173     [Documentation]    Stop BGP peer tool
174     [Tags]    critical
175     Switch_To_BGP_Peer_Console
176     Stop_Console_Tool
177     Store_File_To_Workspace    bgp_peer.log    bgp_peer_tc1.log
178
179 TC2_Reconnect_BGP_Peer
180     [Documentation]    Start BGP peer tool
181     [Tags]    critical
182     Switch_To_BGP_Peer_Console
183     Start_Console_Tool    ${BGP_PEER_COMMAND}    ${BGP_PEER_OPTIONS}
184     Read_And_Fail_If_Prompt_Is_Seen
185     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received:    0
186     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received:    0
187
188 TC2_BGP_Application_Peer_Put_3_Routes
189     [Documentation]    Start BGP application peer tool and give him ${BGP_APP_PEER_TIMEOUT}
190     [Tags]    critical
191     Switch_To_BGP_Application_Peer_Console
192     Start_Console_Tool    ${BGP_APP_PEER_PUT_COMMAND} ${scritp_uri_opt}    ${BGP_APP_PEER_OPTIONS}
193     Wait_Until_Console_Tool_Finish    ${BGP_APP_PEER_TIMEOUT}
194     Store_File_To_Workspace    bgp_app_peer.log    bgp_app_peer_put_tc2.log
195
196 TC2_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes
197     [Documentation]    See new routes in example-ipv4-topology as a proof that synchronization was correct.
198     [Tags]    critical
199     Wait_For_Topology_To_Change_To    ${filled_json}    020_Filled.json
200
201 TC2_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes
202     [Documentation]    Check incomming updates for new routes
203     [Tags]    critical
204     Switch_To_BGP_Peer_Console
205     BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received:    3
206     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received: 8.0.1.0/28    1
207     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received: 8.0.1.16/28    1
208     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received: 8.0.1.32/28    1
209     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received:    0
210
211 TC2_BGP_Application_Peer_Delete_All_Routes
212     [Documentation]    Start BGP application peer tool and give him ${BGP_APP_PEER_TIMEOUT}
213     [Tags]    critical
214     Switch_To_BGP_Application_Peer_Console
215     Start_Console_Tool    ${BGP_APP_PEER_DELETE_ALL_COMMAND} ${scritp_uri_opt}    ${BGP_APP_PEER_OPTIONS}
216     Wait_Until_Console_Tool_Finish    ${BGP_APP_PEER_TIMEOUT}
217     Store_File_To_Workspace    bgp_app_peer.log    bgp_app_peer_delete_all_tc2.log
218
219 TC2_Check_Example-IPv4-Topology_Is_Empty
220     [Documentation]    See new routes are deleted.
221     [Tags]    critical
222     Wait_For_Topology_To_Change_To    ${empty_json}    021_Empty.json
223
224 TC2_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes
225     [Documentation]    Check incomming updates for new routes
226     [Tags]    critical
227     Switch_To_BGP_Peer_Console
228     BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received:    3
229     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received: 8.0.1.0/28    1
230     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received: 8.0.1.16/28    1
231     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received: 8.0.1.32/28    1
232     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received:    3
233
234 TC2_Stop_BGP_Peer
235     [Documentation]    Stop BGP peer tool
236     [Tags]    critical
237     Switch_To_BGP_Peer_Console
238     Stop_Console_Tool
239     Store_File_To_Workspace    bgp_peer.log    bgp_peer_tc2.log
240
241 TC3_BGP_Application_Peer_Put_3_Routes
242     [Documentation]    Start BGP application peer tool and give him ${BGP_APP_PEER_TIMEOUT}
243     [Tags]    critical
244     Switch_To_BGP_Application_Peer_Console
245     Start_Console_Tool    ${BGP_APP_PEER_PUT_COMMAND} ${scritp_uri_opt}    ${BGP_APP_PEER_OPTIONS}
246     Wait_Until_Console_Tool_Finish    ${BGP_APP_PEER_TIMEOUT}
247     Store_File_To_Workspace    bgp_app_peer.log    bgp_app_peer_put_tc3.log
248
249 TC3_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes
250     [Documentation]    See new routes in example-ipv4-topology as a proof that synchronization was correct.
251     [Tags]    critical
252     Wait_For_Topology_To_Change_To    ${filled_json}    030_Filled.json
253
254 TC3_Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes
255     [Documentation]    Start BGP peer tool
256     [Tags]    critical
257     Switch_To_BGP_Peer_Console
258     Start_Console_Tool    ${BGP_PEER_COMMAND}    ${BGP_PEER_OPTIONS}
259     Read_And_Fail_If_Prompt_Is_Seen
260     BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received:    3
261     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received:    3
262     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received: 8.0.1.0/28    1
263     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received: 8.0.1.16/28    1
264     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received: 8.0.1.32/28    1
265     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received:    0
266
267 TC3_BGP_Application_Peer_Delete_All_Routes
268     [Documentation]    Start BGP application peer tool and give him ${BGP_APP_PEER_TIMEOUT}
269     [Tags]    critical
270     Switch_To_BGP_Application_Peer_Console
271     Start_Console_Tool    ${BGP_APP_PEER_DELETE_ALL_COMMAND} ${scritp_uri_opt}    ${BGP_APP_PEER_OPTIONS}
272     Wait_Until_Console_Tool_Finish    ${BGP_APP_PEER_TIMEOUT}
273     Store_File_To_Workspace    bgp_app_peer.log    bgp_app_peer_delete_all_tc3.log
274
275 TC3_Check_Example-IPv4-Topology_Is_Empty
276     [Documentation]    See new routes are deleted.
277     [Tags]    critical
278     Wait_For_Topology_To_Change_To    ${empty_json}    031_Empty.json
279
280 TC3_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes
281     [Documentation]    Check incomming updates for new routes
282     [Tags]    critical
283     Switch_To_BGP_Peer_Console
284     BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received:    3
285     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received: 8.0.1.0/28    1
286     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received: 8.0.1.16/28    1
287     Check_File_For_Word_Count    bgp_peer.log    withdrawn_prefix_received: 8.0.1.32/28    1
288     Check_File_For_Word_Count    bgp_peer.log    nlri_prefix_received:    3
289
290 TC3_Stop_BGP_Peer
291     [Documentation]    Stop BGP peer tool
292     [Tags]    critical
293     Switch_To_BGP_Peer_Console
294     Stop_Console_Tool
295     Store_File_To_Workspace    bgp_peer.log    bgp_peer_tc3.log
296
297 Delete_Bgp_Peer_Configuration
298     [Documentation]    Revert the BGP configuration to the original state: without any configured peers.
299     [Tags]    critical
300     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    BGP_NAME=${BGP_PEER_NAME}    IP=${TOOLS_SYSTEM_IP}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
301     TemplatedRequests.Delete_Templated    ${BGP_VARIABLES_FOLDER}${/}bgp_peer    mapping=${mapping}    session=${CONFIG_SESSION}
302
303 Delete_Bgp_Application_Peer_Configuration
304     [Documentation]    Revert the BGP configuration to the original state: without any configured peers.
305     [Tags]    critical
306     &{mapping}    BuiltIn.Create_Dictionary    DEVICE_NAME=${DEVICE_NAME}    NAME=${BGP_PEER_APP_NAME}    IP=${ODL_SYSTEM_IP}    BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}
307     TemplatedRequests.Delete_Templated    ${BGP_VARIABLES_FOLDER}${/}bgp_application_peer    mapping=${mapping}    session=${CONFIG_SESSION}
308
309 *** Keywords ***
310 Setup_Everything
311     [Documentation]    Initialize SetupUtils. SSH-login to mininet machine, create HTTP session,
312     ...    prepare directories for responses, put Python tool to mininet machine, setup imported resources.
313     SetupUtils.Setup_Utils_For_Setup_And_Teardown
314     SSHLibrary.Set_Default_Configuration    prompt=${TOOLS_SYSTEM_PROMPT}
315     Open_BGP_Peer_Console
316     SSHKeywords.Require_Python
317     SSHKeywords.Assure_Library_Ipaddr    target_dir=.
318     SSHLibrary.Put_File    ${CURDIR}/../../../../tools/fastbgp/play.py
319     Open_BGP_Aplicationp_Peer_Console
320     SSHLibrary.Put_File    ${CURDIR}/../../../../tools/fastbgp/bgp_app_peer.py
321     SSHLibrary.Put_File    ${CURDIR}/../../../../tools/fastbgp/ipv4-routes-template.xml*
322     OperatingSystem.Remove_Directory    ${EXPECTED_RESPONSES_FOLDER}    recursive=True
323     OperatingSystem.Remove_Directory    ${ACTUAL_RESPONSES_FOLDER}    recursive=True
324     # The previous suite may have been using the same directories.
325     OperatingSystem.Create_Directory    ${EXPECTED_RESPONSES_FOLDER}
326     OperatingSystem.Create_Directory    ${ACTUAL_RESPONSES_FOLDER}
327     RequestsLibrary.Create_Session    operational    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}${OPERATIONAL_TOPO_API}    auth=${AUTH}
328     RequestsLibrary.Create_Session    ${CONFIG_SESSION}    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}    auth=${AUTH}
329     KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${ODL_LOG_LEVEL}
330     KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.bgpcep
331     KarafKeywords.Execute_Controller_Karaf_Command_On_Background    log:set ${ODL_BGP_LOG_LEVEL} org.opendaylight.protocol
332     ${scritp_uri_opt}=    Set Variable    --uri config/bgp-rib:application-rib/${ODL_SYSTEM_IP}/tables/bgp-types:ipv4-address-family/bgp-types:unicast-subsequent-address-family/bgp-inet:ipv4-routes
333     BuiltIn.Set_Suite_Variable    ${scritp_uri_opt}
334
335 Teardown_Everything
336     [Documentation]    Create and Log the diff between expected and actual responses, make sure Python tool was killed.
337     ...    Tear down imported Resources.
338     ${diff}=    OperatingSystem.Run    diff -dur ${EXPECTED_RESPONSES_FOLDER} ${ACTUAL_RESPONSES_FOLDER}
339     BuiltIn.Log    ${diff}
340     KillPythonTool.Search_And_Kill_Remote_Python    'play\.py'
341     KillPythonTool.Search_And_Kill_Remote_Python    'bgp_app_peer\.py'
342     RequestsLibrary.Delete_All_Sessions
343     SSHLibrary.Close_All_Connections
344
345 Open_BGP_Peer_Console
346     [Documentation]    Create a session for BGP peer.
347     SSHLibrary.Open_Connection    ${TOOLS_SYSTEM_IP}    alias=bgp_peer_console
348     SSHKeywords.Flexible_Mininet_Login
349
350 Open_BGP_Aplicationp_Peer_Console
351     [Documentation]    Create a session for BGP peer.
352     SSHLibrary.Open_Connection    ${TOOLS_SYSTEM_IP}    alias=bgp_app_peer_console
353     SSHKeywords.Flexible_Mininet_Login
354
355 Switch_To_BGP_Peer_Console
356     SSHLibrary.Switch Connection    bgp_peer_console
357
358 Switch_To_BGP_Application_Peer_Console
359     SSHLibrary.Switch Connection    bgp_app_peer_console
360
361 Wait_For_Topology_To_Change_To
362     [Arguments]    ${json_topology}    ${filename}    ${timeout}=10s    ${refresh}=1s
363     [Documentation]    Normalize the expected json topology and save it to ${EXPECTED_RESPONSES_FOLDER}.
364     ...    Wait until Compare_Topology matches. ${ACTUAL_RESPONSES_FOLDER} will hold its last result.
365     ${topology_normalized}=    Normalize_And_Save_Expected_Json    ${json_topology}    ${filename}    ${EXPECTED_RESPONSES_FOLDER}
366     BuiltIn.Wait_Until_Keyword_Succeeds    ${timeout}    ${refresh}    Compare_Topology    ${topology_normalized}    ${filename}
367
368 Verify_That_Topology_Does_Not_Change_From
369     [Arguments]    ${json_topology}    ${filename}    ${timeout}=10s    ${refresh}=1s
370     [Documentation]    Normalize the expected json topology and save it to ${EXPECTED_RESPONSES_FOLDER}.
371     ...    Verify that Compare_Topology keeps passing. ${ACTUAL_RESPONSES_FOLDER} will hold its last result.
372     ${topology_normalized}=    Normalize_And_Save_Expected_Json    ${json_topology}    ${filename}    ${EXPECTED_RESPONSES_FOLDER}
373     WaitForFailure.Verify_Keyword_Does_Not_Fail_Within_Timeout    ${timeout}    ${refresh}    Compare_Topology    ${topology_normalized}    ${filename}
374
375 Compare_Topology
376     [Arguments]    ${expected_normalized}    ${filename}
377     [Documentation]    Get current example-ipv4-topology as json, normalize it, save to ${ACTUAL_RESPONSES_FOLDER}.
378     ...    Check that status code is 200, check that normalized jsons match exactly.
379     ${response}=    RequestsLibrary.Get Request    operational    topology/example-ipv4-topology
380     BuiltIn.Log    ${response.status_code}
381     BuiltIn.Log    ${response.text}
382     ${actual_normalized}=    Normalize_And_Save_Expected_Json    ${response.text}    ${filename}    ${ACTUAL_RESPONSES_FOLDER}
383     BuiltIn.Should_Be_Equal_As_Strings    ${response.status_code}    200
384     BuiltIn.Should_Be_Equal    ${expected_normalized}    ${actual_normalized}
385
386 Normalize_And_Save_Expected_Json
387     [Arguments]    ${json_text}    ${filename}    ${directory}
388     [Documentation]    Normalize given json using norm_json library. Log and save the result to given filename under given directory.
389     ${json_normalized}=    norm_json.normalize_json_text    ${json_text}
390     BuiltIn.Log    ${json_normalized}
391     OperatingSystem.Create_File    ${directory}${/}${filename}    ${json_normalized}
392     # TODO: Should we prepend .json to the filename? When we detect it is not already prepended?
393     [Return]    ${json_normalized}