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