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