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