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