2 Documentation This library contains keywords related to the BGP functionality.
5 Library BgpRpcClient.py ${TOOLS_SYSTEM_IP}
6 Resource ../variables/Variables.robot
7 Resource CompareStream.robot
9 Resource KillPythonTool.robot
10 Resource TemplatedRequests.robot
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
27 Start Quagga Processes On ODL
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}
39 Restart BGP Processes On ODL
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}
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
60 ${output} = Write sudo ./zebra &
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}
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}
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
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
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}
100 ${output} = Write terminal length 512
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
111 Configure BGP And Add Neighbor On DCGW
112 [Arguments] ${dcgw_ip} ${as_id} ${router_id} ${neighbor_ip} ${vrf_name} ${rd}
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
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
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}
154 Execute Command On quagga Telnet Session exit
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}
162 Should Contain ${output} BGP state = Established
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}
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}
181 ${output} = BgpOperations.Execute Show Command On Quagga ${dcgw_ip} ${RUN_CONFIG}
182 BuiltIn.Should Contain ${output} ${nbr_ip}
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}
189 : FOR ${ip} IN @{ip_list}
190 \ Should Contain ${output} ${ip}
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
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
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
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}
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
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
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
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/
257 [Return] ${resp.content}
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/
264 Should Be Equal As Strings ${resp.status_code} 200
265 [Return] ${resp.content}
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
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
277 Get External Tunnel Endpoint Configuration
279 [Documentation] Get bgp configuration
280 ${resp} = RequestsLibrary.Get Request session ${CONFIG_API}/itm:dc-gateway-ip-list/dc-gateway-ip/${ip}/
282 [Return] ${resp.content}
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
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
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
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}
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}
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}
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}
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}
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}
367 BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${effective_rib_in} session=${CONFIG_SESSION}
369 BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${loc_rib} session=${CONFIG_SESSION}
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}
374 [Teardown] BgpRpcClient.play_send ${withdraw_hex}
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}
387 [Documentation] Returns hex update message.
388 ${update} = BgpRpcClient.play_get
389 BuiltIn.Should_Not_Be_Equal ${update} ${Empty}
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}
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}
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}