2 Documentation This library contains keywords related to the BGP functionality.
5 Library BgpRpcClient.py ${TOOLS_SYSTEM_IP}
6 Resource ../variables/Variables.robot
8 Resource KillPythonTool.robot
9 Resource TemplatedRequests.robot
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}
24 Start Quagga Processes On ODL
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}
36 Restart BGP Processes On ODL
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}
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
57 ${output} = Write sudo ./zebra &
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}
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}
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
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}
91 ${output} = Write terminal length 512
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
102 Configure BGP And Add Neighbor On DCGW
103 [Arguments] ${dcgw_ip} ${as_id} ${router_id} ${neighbor_ip} ${vrf_name} ${rd}
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
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
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}
145 Execute Command On quagga Telnet Session exit
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}
153 Should Contain ${output} BGP state = Established
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}
160 : FOR ${ip} IN @{ip_list}
161 \ Should Contain ${output} ${ip}
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
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
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
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}
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
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
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
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/
228 [Return] ${resp.content}
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/
235 Should Be Equal As Strings ${resp.status_code} 200
236 [Return] ${resp.content}
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
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
248 Get External Tunnel Endpoint Configuration
250 [Documentation] Get bgp configuration
251 ${resp} = RequestsLibrary.Get Request session ${CONFIG_API}/itm:dc-gateway-ip-list/dc-gateway-ip/${ip}/
253 [Return] ${resp.content}
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
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
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
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}
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}
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}
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}
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}
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}
333 BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${EFFECTIVE_RIB_IN} session=${CONFIG_SESSION}
335 BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${LOC_RIB} session=${CONFIG_SESSION}
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}
340 [Teardown] BgpRpcClient.play_send ${withdraw_hex}
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}
351 [Documentation] Returns hex update message.
352 ${update} = BgpRpcClient.play_get
353 BuiltIn.Should_Not_Be_Equal ${update} ${Empty}
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}
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}
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}