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