Add two new keywords to BGP library.
[integration/test.git] / csit / libraries / BgpOperations.robot
1 *** Settings ***
2 Documentation     This library contains keywords related to the BGP functionality.
3 Library           SSHLibrary
4 Library           String
5 Library           BgpRpcClient.py    ${TOOLS_SYSTEM_IP}
6 Resource          ../variables/Variables.robot
7 Resource          CompareStream.robot
8 Resource          Utils.robot
9 Resource          KillPythonTool.robot
10 Resource          TemplatedRequests.robot
11
12 *** Variables ***
13 ${BGP_BMP_DIR}    ${CURDIR}/../variables/bgpfunctional/bmp_basic/filled_structure
14 ${BGP_BMP_FEAT_DIR}    ${CURDIR}/../variables/bgpfunctional/bmp_basic/empty_structure
15 ${BGP_RIB_URI}    ${OPERATIONAL_API}/bgp-rib:bgp-rib/rib/example-bgp-rib
16 ${BGP_TOPOLOGY_URI}    ${OPERATIONAL_TOPO_API}/topology/example-ipv4-topology
17 ${VAR_BASE_BGP}    ${CURDIR}/../variables/bgpfunctional
18 ${RIB_NAME}       example-bgp-rib
19 ${OLD_AS_PATH}    \n"as-path": {},
20 ${NEW_AS_PATH}    ${EMPTY}
21 &{APP_PEER}       IP=${ODL_SYSTEM_IP}    BGP_RIB=${RIB_NAME}
22 ${NEW_IPV4_ROUTES_LINE}    ${EMPTY}
23 ${OLD_IPV4_ROUTES_LINE}    \n"bgp-inet:ipv4-routes": {},
24 ${BGP_CONFIG_SERVER_CMD}    bgp-connect -h ${ODL_SYSTEM_IP} -p 7644 add
25
26 *** Keywords ***
27 Start Quagga Processes On ODL
28     [Arguments]    ${odl_ip}
29     [Documentation]    To start the zrpcd processes on ODL VM
30     ${conn_id}=    Open_Connection_To_ODL_System    ip_address=${odl_ip}
31     Switch Connection    ${conn_id}
32     Write Commands Until Expected Prompt    cd /opt/quagga/etc/    ${DEFAULT_LINUX_PROMPT_STRICT}
33     Write Commands Until Expected Prompt    sudo cp zebra.conf.sample zebra.conf    ${DEFAULT_LINUX_PROMPT_STRICT}
34     Write Commands Until Expected Prompt    sudo /opt/quagga/etc/init.d/zrpcd start    ${DEFAULT_LINUX_PROMPT_STRICT}
35     Write Commands Until Expected Prompt    ps -ef | grep zrpcd    ${DEFAULT_LINUX_PROMPT_STRICT}
36     Write Commands Until Expected Prompt    netstat -nap | grep 7644    ${DEFAULT_LINUX_PROMPT_STRICT}
37     Close Connection
38
39 Restart BGP Processes On ODL
40     [Arguments]    ${odl_ip}
41     [Documentation]    To restart the bgpd , qthriftd processes on ODL VM
42     ${conn_id} =    Open_Connection_To_ODL_System    ip_address=${odl_ip}
43     Switch Connection    ${conn_id}
44     Write Commands Until Expected Prompt    sudo pkill -f bgpd    ${DEFAULT_LINUX_PROMPT_STRICT}
45     Start Quagga Processes On ODL    ${odl_ip}
46
47 Start Quagga Processes On DCGW
48     [Arguments]    ${dcgw_ip}
49     [Documentation]    To start the zrpcd, bgpd,and zebra processes on DCGW
50     ${dcgw_conn_id} =    Open_Connection_To_Tools_System    ip_address=${dcgw_ip}
51     Switch Connection    ${dcgw_conn_id}
52     Write Commands Until Expected Prompt    cd /opt/quagga/etc/    ${DEFAULT_LINUX_PROMPT_STRICT}
53     Write Commands Until Expected Prompt    sudo cp zebra.conf.sample zebra.conf    ${DEFAULT_LINUX_PROMPT_STRICT}
54     Write Commands Until Expected Prompt    sudo /opt/quagga/etc/init.d/zrpcd start    ${DEFAULT_LINUX_PROMPT_STRICT}
55     Write Commands Until Expected Prompt    ps -ef | grep zrpcd    ${DEFAULT_LINUX_PROMPT_STRICT}
56     Write Commands Until Expected Prompt    cd /opt/quagga/sbin/    ${DEFAULT_LINUX_PROMPT_STRICT}
57     ${output} =    Write    sudo ./bgpd &
58     ${output} =    Read Until    pid
59     Log    ${output}
60     ${output} =    Write    sudo ./zebra &
61     ${output} =    Read
62     Log    ${output}
63     Write Commands Until Expected Prompt    ps -ef | grep bgpd    ${DEFAULT_LINUX_PROMPT_STRICT}
64     Write Commands Until Expected Prompt    ps -ef | grep zebra    ${DEFAULT_LINUX_PROMPT_STRICT}
65     Write Commands Until Expected Prompt    netstat -nap | grep 7644    ${DEFAULT_LINUX_PROMPT_STRICT}
66
67 Restart BGP Processes On DCGW
68     [Arguments]    ${dcgw_ip}
69     [Documentation]    To Restart the zrpcd, bgpd and zebra processes on DCGW
70     ${dcgw_conn_id} =    Open_Connection_To_Tools_System    ip_address=${dcgw_ip}
71     Switch Connection    ${dcgw_conn_id}
72     Write Commands Until Expected Prompt    sudo pkill -f bgpd    ${DEFAULT_LINUX_PROMPT_STRICT}
73     Start Quagga Processes On DCGW    ${dcgw_ip}
74
75 Stop BGP Processes On Node
76     [Arguments]    ${node_ip}
77     [Documentation]    To stop the bgpd , qthriftd processes on specific node given by user.
78     Utils.Run Command On Remote System    ${node_ip}    sudo pkill -f bgpd
79     Utils.Run Command On Remote System    ${node_ip}    sudo pkill -f zrpcd
80
81 Show Quagga Configuration On ODL
82     [Arguments]    ${odl_ip}    ${rd}
83     [Documentation]    Show quagga config from ODL
84     Create Quagga Telnet Session    ${odl_ip}    bgpd    sdncbgpc
85     Execute Command On Quagga Telnet Session    show running-config
86     Execute Command On Quagga Telnet Session    show bgp neighbors
87     Execute Command On Quagga Telnet Session    show ip bgp vrf ${rd}
88     Execute Command On Quagga Telnet Session    exit
89     Close Connection
90
91 Create Quagga Telnet Session
92     [Arguments]    ${ip}    ${user}    ${password}
93     [Documentation]    Create telnet session for Quagga
94     ${conn_id}=    Open_Connection_To_Tools_System    ip_address=${ip}
95     Switch Connection    ${conn_id}
96     ${output} =    Write    telnet localhost ${user}
97     ${output} =    Read Until    Password:
98     ${output} =    Write    ${password}
99     ${output} =    Read
100     ${output} =    Write    terminal length 512
101     ${output} =    Read
102
103 Execute Command On Quagga Telnet Session
104     [Arguments]    ${command}
105     [Documentation]    Execute command on Quagga telnet session(session should exist) and returns the output.
106     SSHLibrary.Write    ${command}
107     ${output} =    SSHLibrary.Read
108     Log    ${output}
109     [Return]    ${output}
110
111 Configure BGP And Add Neighbor On DCGW
112     [Arguments]    ${dcgw_ip}    ${as_id}    ${router_id}    ${neighbor_ip}    ${vrf_name}    ${rd}
113     ...    ${loopback_ip}
114     [Documentation]    Configure BGP and add neighbor on the dcgw
115     Create Quagga Telnet Session    ${dcgw_ip}    bgpd    sdncbgpc
116     Execute Command On Quagga Telnet Session    configure terminal
117     Execute Command On Quagga Telnet Session    router bgp ${as_id}
118     Execute Command On Quagga Telnet Session    bgp router-id ${router_id}
119     Execute Command On Quagga Telnet Session    redistribute static
120     Execute Command On Quagga Telnet Session    redistribute connected
121     Execute Command On Quagga Telnet Session    neighbor ${neighbor_ip} send-remote-as ${as_id}
122     Execute Command On Quagga Telnet Session    vrf ${vrf_name}
123     Execute Command On Quagga Telnet Session    rd ${rd}
124     Execute Command On Quagga Telnet Session    rt import ${rd}
125     Execute Command On Quagga Telnet Session    rt export ${rd}
126     Execute Command On Quagga Telnet Session    exit
127     Execute Command On Quagga Telnet Session    address-family vpnv4 unicast
128     Execute Command On Quagga Telnet Session    network ${loopback_ip}/32 rd ${rd} tag ${as_id}
129     Execute Command On Quagga Telnet Session    neighbor ${neighbor_ip} activate
130     Execute Command On Quagga Telnet Session    end
131     Execute Command On Quagga Telnet Session    show running-config
132     Execute Command On Quagga Telnet Session    exit
133
134 Add Loopback Interface On DCGW
135     [Arguments]    ${dcgw_ip}    ${loopback_name}    ${loopback_ip}    ${user}=zebra    ${password}=zebra
136     [Documentation]    Add loopback interface on DCGW
137     Create Quagga Telnet Session    ${dcgw_ip}    ${user}    ${password}
138     Execute Command On Quagga Telnet Session    enable
139     Execute Command On Quagga Telnet Session    ${password}
140     Execute Command On Quagga Telnet Session    configure terminal
141     Execute Command On Quagga Telnet Session    interface ${loopback_name}
142     Execute Command On Quagga Telnet Session    ip address ${loopback_ip}/32
143     Execute Command On Quagga Telnet Session    exit
144     Execute Command On Quagga Telnet Session    end
145     Execute Command On Quagga Telnet Session    show running-config
146     Execute Command On Quagga Telnet Session    exit
147
148 Execute Show Command On Quagga
149     [Arguments]    ${dcgw_ip}    ${cmd}    ${user}=bgpd    ${password}=sdncbgpc
150     [Documentation]    Execute command on quagga and returns the ouput.
151     Create Quagga Telnet Session    ${dcgw_ip}    ${user}    ${password}
152     ${output} =    Execute Command On Quagga Telnet Session    ${cmd}
153     Log    ${output}
154     Execute Command On quagga Telnet Session    exit
155     [Return]    ${output}
156
157 Verify BGP Neighbor Status On Quagga
158     [Arguments]    ${dcgw_ip}    ${neighbor_ip}
159     [Documentation]    Verify bgp neighbor status on quagga
160     ${output} =    Execute Show Command On quagga    ${dcgw_ip}    show bgp neighbors ${neighbor_ip}
161     Log    ${output}
162     Should Contain    ${output}    BGP state = Established
163
164 Setup BGP Peering On ODL
165     [Arguments]    ${odl_ip}    ${as_id}    ${nbr_ip}
166     [Documentation]    Setup BGP peering between ODL and given neighbor IP.
167     ...    Configuring and starting BGP on ODL node with given AS number
168     ...    Adding and verifying BGP neighbor
169     KarafKeywords.Issue Command On Karaf Console    ${BGP_CONFIG_SERVER_CMD}
170     BgpOperations.Create BGP Configuration On ODL    localas=${as_id}    routerid=${odl_ip}
171     BgpOperations.AddNeighbor To BGP Configuration On ODL    remoteas=${as_id}    neighborAddr=${nbr_ip}
172     ${output} =    BgpOperations.Get BGP Configuration On ODL    session
173     BuiltIn.Should Contain    ${output}    ${nbr_ip}
174
175 Setup BGP Peering On DCGW
176     [Arguments]    ${dcgw_ip}    ${as_id}    ${nbr_ip}    ${vrf_name}    ${rd}    ${loopback_ip}
177     [Documentation]    Setup BGP peering between DCGW and given neighbor IP.
178     ...    Configuring,adding neighbor on DCGW node and verifying BGP neighbor.
179     BgpOperations.Configure BGP And Add Neighbor On DCGW    ${dcgw_ip}    ${as_id}    ${dcgw_ip}    ${nbr_ip}    ${vrf_name}    ${rd}
180     ...    ${loopback_ip}
181     ${output} =    BgpOperations.Execute Show Command On Quagga    ${dcgw_ip}    ${RUN_CONFIG}
182     BuiltIn.Should Contain    ${output}    ${nbr_ip}
183
184 Verify Routes On Quagga
185     [Arguments]    ${dcgw_ip}    ${rd}    ${ip_list}
186     [Documentation]    Verify routes on quagga
187     ${output} =    Execute Show Command On quagga    ${dcgw_ip}    show ip bgp vrf ${rd}
188     Log    ${output}
189     : FOR    ${ip}    IN    @{ip_list}
190     \    Should Contain    ${output}    ${ip}
191
192 Delete BGP Config On Quagga
193     [Arguments]    ${dcgw_ip}    ${bgp_id}    ${user}=bgpd    ${password}=sdncbgpc
194     [Documentation]    Delete BGP Config on Quagga
195     Create Quagga Telnet Session    ${dcgw_ip}    ${user}    ${password}
196     Execute Command On Quagga Telnet Session    configure terminal
197     Execute Command On Quagga Telnet Session    no router bgp ${bgp_id}
198     Execute Command On Quagga Telnet Session    end
199     ${output} =    Execute Command On Quagga Telnet Session    show running-config
200     Execute Command On Quagga Telnet Session    exit
201     [Return]    ${output}
202
203 Create L3VPN on DCGW
204     [Arguments]    ${dcgw_ip}    ${as_id}    ${vpn_name}    ${rd}
205     [Documentation]    Creating L3VPN on DCGW
206     BgpOperations.Create Quagga Telnet Session    ${dcgw_ip}    bgpd    sdncbgpc
207     BgpOperations.Execute Command On Quagga Telnet Session    configure terminal
208     BgpOperations.Execute Command On Quagga Telnet Session    router bgp ${as_id}
209     BgpOperations.Execute Command On Quagga Telnet Session    vrf ${vpn_name}
210     BgpOperations.Execute Command On Quagga Telnet Session    rd ${rd}
211     BgpOperations.Execute Command On Quagga Telnet Session    rt export ${rd}
212     BgpOperations.Execute Command On Quagga Telnet Session    rt import ${rd}
213     BgpOperations.Execute Command On Quagga Telnet Session    end
214
215 Delete L3VPN on DCGW
216     [Arguments]    ${dcgw_ip}    ${as_id}    @{vpns}
217     [Documentation]    Deleting L3VPN on DCGW
218     BgpOperations.Create Quagga Telnet Session    ${dcgw_ip}    bgpd    sdncbgpc
219     BgpOperations.Execute Command On Quagga Telnet Session    configure terminal
220     BgpOperations.Execute Command On Quagga Telnet Session    router bgp ${as_id}
221     : FOR    ${vpn}    IN    @{vpns}
222     \    BgpOperations.Execute Command On Quagga Telnet Session    no vrf ${vpn}
223     BgpOperations.Execute Command On Quagga Telnet Session    end
224
225 Verify L3VPN On DCGW
226     [Arguments]    ${dcgw_ip}    ${vpn_name}    ${rd}
227     [Documentation]    Verify L3VPN vrf name and rd value on DCGW
228     ${output} =    BgpOperations.Execute Show Command On Quagga    ${dcgw_ip}    show running-config
229     BuiltIn.Should Contain    ${output}    vrf ${vpn_name}
230     BuiltIn.Should Contain    ${output}    rd ${rd}
231
232 Add Routes On DCGW
233     [Arguments]    ${dcgw_ip}    ${rd}    ${network_ip}    ${label}
234     [Documentation]    Add routes on DCGW
235     BgpOperations.Create Quagga Telnet Session    ${dcgw_ip}    bgpd    sdncbgpc
236     BgpOperations.Execute Command On Quagga Telnet Session    configure terminal
237     BgpOperations.Execute Command On Quagga Telnet Session    router bgp ${AS_ID}
238     BgpOperations.Execute Command On Quagga Telnet Session    address-family vpnv4 unicast
239     BgpOperations.Execute Command On Quagga Telnet Session    network ${network_ip}/32 rd ${rd} tag ${label}
240     BgpOperations.Execute Command On Quagga Telnet Session    end
241
242 Create BGP Configuration On ODL
243     [Arguments]    &{Kwargs}
244     [Documentation]    Associate the created L3VPN to a network-id received as dictionary argument
245     TemplatedRequests.Post_As_Json_Templated    folder=${VAR_BASE_BGP}/create_bgp    mapping=${Kwargs}    session=session
246
247 AddNeighbor To BGP Configuration On ODL
248     [Arguments]    &{Kwargs}
249     [Documentation]    Associate the created L3VPN to a network-id received as dictionary argument
250     TemplatedRequests.Post_As_Json_Templated    folder=${VAR_BASE_BGP}/addNeighbor_bgp    mapping=${Kwargs}    session=session
251
252 Get BGP Configuration On ODL
253     [Arguments]    ${odl_session}
254     [Documentation]    Get bgp configuration
255     ${resp} =    RequestsLibrary.Get Request    ${odl_session}    ${CONFIG_API}/ebgp:bgp/
256     Log    ${resp.content}
257     [Return]    ${resp.content}
258
259 Delete BGP Configuration On ODL
260     [Arguments]    ${odl_session}
261     [Documentation]    Delete BGP
262     ${resp} =    RequestsLibrary.Delete Request    ${odl_session}    ${CONFIG_API}/ebgp:bgp/
263     Log    ${resp.content}
264     Should Be Equal As Strings    ${resp.status_code}    200
265     [Return]    ${resp.content}
266
267 Create External Tunnel Endpoint Configuration
268     [Arguments]    &{Kwargs}
269     [Documentation]    Create Tunnel End point
270     TemplatedRequests.Post_As_Json_Templated    folder=${VAR_BASE_BGP}/create_etep    mapping=${Kwargs}    session=session
271
272 Delete External Tunnel Endpoint Configuration
273     [Arguments]    &{Kwargs}
274     [Documentation]    Delete Tunnel End point
275     TemplatedRequests.Post_As_Json_Templated    folder=${VAR_BASE_BGP}/delete_etep    mapping=${Kwargs}    session=session
276
277 Get External Tunnel Endpoint Configuration
278     [Arguments]    ${ip}
279     [Documentation]    Get bgp configuration
280     ${resp} =    RequestsLibrary.Get Request    session    ${CONFIG_API}/itm:dc-gateway-ip-list/dc-gateway-ip/${ip}/
281     Log    ${resp.content}
282     [Return]    ${resp.content}
283
284 Teardown_Everything
285     [Documentation]    Create and Log the diff between expected and actual responses, make sure Python tool was killed.
286     ...    Tear down imported Resources.
287     KillPythonTool.Search_And_Kill_Remote_Python    'play\.py'
288     RequestsLibrary.Delete_All_Sessions
289     SSHLibrary.Close_All_Connections
290
291 Check_Example_Bgp_Rib_Content
292     [Arguments]    ${session}    ${substr}    ${error_message}=${JSONKEYSTR} not found, but expected.
293     [Documentation]    Check the example-bgp-rib content for string
294     ${response}=    RequestsLibrary.Get Request    ${session}    ${BGP_RIB_URI}
295     BuiltIn.Log    ${response.status_code}
296     BuiltIn.Log    ${response.text}
297     BuiltIn.Should_Contain    ${response.text}    ${substr}    ${error_message}    values=False
298
299 Check_Example_Bgp_Rib_Does_Not_Contain
300     [Arguments]    ${session}    ${substr}    ${error_message}=${JSONKEYSTR} found, but not expected.
301     [Documentation]    Check the example-bgp-rib does not contain the string
302     ${response}=    RequestsLibrary.Get Request    ${session}    ${BGP_RIB_URI}
303     BuiltIn.Log    ${response.status_code}
304     BuiltIn.Log    ${response.text}
305     BuiltIn.Should_Not_Contain    ${response.text}    ${substr}    ${error_message}    values=False
306
307 Check_Example_IPv4_Topology_Content
308     [Arguments]    ${session}    ${string_to_check}=${EMPTY}
309     [Documentation]    Check the example-ipv4-topology content for string
310     ${response}=    RequestsLibrary.Get Request    ${session}    ${BGP_TOPOLOGY_URI}
311     BuiltIn.Log    ${response.status_code}
312     BuiltIn.Log    ${response.text}
313     BuiltIn.Should_Contain    ${response.text}    ${string_to_check}
314
315 Check_Example_IPv4_Topology_Does_Not_Contain
316     [Arguments]    ${session}    ${string_to_check}
317     [Documentation]    Check the example-ipv4-topology does not contain the string
318     ${response}=    RequestsLibrary.Get Request    ${session}    ${BGP_TOPOLOGY_URI}
319     BuiltIn.Log    ${response.status_code}
320     BuiltIn.Log    ${response.text}
321     BuiltIn.Should_Not_Contain    ${response.text}    ${string_to_check}
322
323 Bmp_Monitor_Precondition
324     [Arguments]    ${session}
325     [Documentation]    Verify example-bmp-monitor presence in bmp-monitors
326     &{mapping}    BuiltIn.Create_Dictionary    TOOL_IP=${TOOLS_SYSTEM_IP}
327     BuiltIn.Wait_Until_Keyword_Succeeds    6x    10s    TemplatedRequests.Get_As_Json_Templated    folder=${BGP_BMP_FEAT_DIR}    mapping=${mapping}    verify=True
328     ...    session=${session}
329
330 Bmp_Monitor_Postcondition
331     [Arguments]    ${session}
332     [Documentation]    Verifies if example-bmp-monitor data contains one peer.
333     ${routes_line} =    CompareStream.Set_Variable_If_At_Least_Neon    ${NEW_IPV4_ROUTES_LINE}    ${OLD_IPV4_ROUTES_LINE}
334     &{mapping}    BuiltIn.Create_Dictionary    TOOL_IP=${TOOLS_SYSTEM_IP}    ROUTES_LINE=${routes_line}
335     ${output}    BuiltIn.Wait_Until_Keyword_Succeeds    10x    5s    TemplatedRequests.Get_As_Json_Templated    folder=${BGP_BMP_DIR}    mapping=${mapping}
336     ...    session=${session}    verify=True
337     BuiltIn.Log    ${output}
338
339 Odl_To_Play_Template
340     [Arguments]    ${totest}    ${dir}    ${remove}=True
341     ${announce_hex} =    OperatingSystem.Get_File    ${dir}/${totest}/announce_${totest}.hex
342     ${announce_hex} =    String.Remove_String    ${announce_hex}    \n
343     ${withdraw_hex} =    OperatingSystem.Get_File    ${dir}/${totest}/withdraw_${totest}.hex
344     ${withdraw_hex} =    String.Remove_String    ${withdraw_hex}    \n
345     BuiltIn.Run_Keyword_If    '${remove}' == 'True'    BgpRpcClient.play_clean
346     TemplatedRequests.Post_As_Xml_Templated    ${dir}/${totest}/app    mapping=${APP_PEER}    session=${CONFIG_SESSION}
347     ${update}    BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    Get_Update_Message
348     Verify_Two_Hex_Messages_Are_Equal    ${update}    ${announce_hex}
349     BgpRpcClient.play_clean
350     Remove_Configured_Routes    ${totest}    ${dir}
351     ${update}    BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    Get_Update_Message
352     Verify_Two_Hex_Messages_Are_Equal    ${update}    ${withdraw_hex}
353     [Teardown]    Remove_Configured_Routes    ${totest}    ${dir}
354
355 Play_To_Odl_Template
356     [Arguments]    ${totest}    ${dir}    ${ipv}=ipv4
357     ${as_path} =    CompareStream.Set_Variable_If_At_Least_Neon    ${NEW_AS_PATH}    ${OLD_AS_PATH}
358     &{adj_rib_in}    BuiltIn.Create_Dictionary    PATH=peer/bgp:%2F%2F${TOOLS_SYSTEM_IP}/adj-rib-in    BGP_RIB=${RIB_NAME}    AS_PATH=${as_path}
359     &{effective_rib_in}    BuiltIn.Create_Dictionary    PATH=peer/bgp:%2F%2F${TOOLS_SYSTEM_IP}/effective-rib-in    BGP_RIB=${RIB_NAME}    AS_PATH=${as_path}
360     &{loc_rib}    BuiltIn.Create_Dictionary    PATH=loc-rib    BGP_RIB=${RIB_NAME}    AS_PATH=${as_path}
361     ${announce_hex} =    OperatingSystem.Get_File    ${dir}/${totest}/announce_${totest}.hex
362     ${withdraw_hex} =    OperatingSystem.Get_File    ${dir}/${totest}/withdraw_${totest}.hex
363     BgpRpcClient.play_clean
364     BgpRpcClient.play_send    ${announce_hex}
365     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/${totest}/rib    mapping=${adj_rib_in}    session=${CONFIG_SESSION}
366     ...    verify=True
367     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/${totest}/rib    mapping=${effective_rib_in}    session=${CONFIG_SESSION}
368     ...    verify=True
369     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/${totest}/rib    mapping=${loc_rib}    session=${CONFIG_SESSION}
370     ...    verify=True
371     BgpRpcClient.play_send    ${withdraw_hex}
372     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/empty_routes/${ipv}    mapping=${loc_rib}    session=${CONFIG_SESSION}
373     ...    verify=True
374     [Teardown]    BgpRpcClient.play_send    ${withdraw_hex}
375
376 Play_To_Odl_Non_Removal_Template
377     [Arguments]    ${totest}    ${dir}    ${ipv}=ipv4
378     ${announce_hex} =    OperatingSystem.Get_File    ${dir}/${totest}/announce_${totest}.hex
379     BgpRpcClient.play_clean
380     BgpRpcClient.play_send    ${announce_hex}
381     ${as_path} =    CompareStream.Set_Variable_If_At_Least_Neon    ${NEW_AS_PATH}    ${OLD_AS_PATH}
382     &{loc_rib}    BuiltIn.Create_Dictionary    PATH=loc-rib    BGP_RIB=${RIB_NAME}    AS_PATH=${as_path}
383     BuiltIn.Wait_Until_Keyword_Succeeds    3x    2s    TemplatedRequests.Get_As_Json_Templated    ${dir}/${totest}/rib    mapping=${loc_rib}    session=${CONFIG_SESSION}
384     ...    verify=True
385
386 Get_Update_Message
387     [Documentation]    Returns hex update message.
388     ${update} =    BgpRpcClient.play_get
389     BuiltIn.Should_Not_Be_Equal    ${update}    ${Empty}
390     [Return]    ${update}
391
392 Remove_Configured_Routes
393     [Arguments]    ${totest}    ${dir}
394     [Documentation]    Removes the route if present.
395     BuiltIn.Run_Keyword_And_Ignore_Error    TemplatedRequests.Delete_Templated    ${dir}/${totest}/app    mapping=${APP_PEER}    session=${CONFIG_SESSION}
396
397 Verify_Two_Hex_Messages_Are_Equal
398     [Arguments]    ${hex_1}    ${hex_2}
399     [Documentation]    Verifies two hex messages are equal even in case, their arguments are misplaced.
400     ...    Compares length of the hex messages and sums hex messages arguments as integers and compares results.
401     ${len_1} =    BuiltIn.Get_Length    ${hex_1}
402     ${len_2} =    BuiltIn.Get_Length    ${hex_2}
403     BuiltIn.Should_Be_Equal    ${len_1}    ${len_2}
404     ${sum_1} =    Sum_Hex_Message_Arguments_To_Integer    ${hex_1}
405     ${sum_2} =    Sum_Hex_Message_Arguments_To_Integer    ${hex_2}
406     BuiltIn.Should_Be_Equal    ${sum_1}    ${sum_2}
407
408 Sum_Hex_Message_Arguments_To_Integer
409     [Arguments]    ${hex_string}
410     [Documentation]    Converts hex message arguments to integers and sums them up and returns the sum.
411     ${final_sum} =    BuiltIn.Evaluate    sum(map(lambda x: int(x, 16), re.compile('[a-f\d]{2}').findall('${hex_string}'[32:])))    modules=re
412     [Return]    ${final_sum}