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