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 Stop BGP Processes On Node
75 [Arguments] ${node_ip}
76 [Documentation] To stop the bgpd , qthriftd processes on specific node given by user.
77 Utils.Run Command On Remote System ${node_ip} sudo pkill -f bgpd
78 Utils.Run Command On Remote System ${node_ip} sudo pkill -f zrpcd
80 Show Quagga Configuration On ODL
81 [Arguments] ${odl_ip} ${rd}
82 [Documentation] Show quagga config from ODL
83 Create Quagga Telnet Session ${odl_ip} bgpd sdncbgpc
84 Execute Command On Quagga Telnet Session show running-config
85 Execute Command On Quagga Telnet Session show bgp neighbors
86 Execute Command On Quagga Telnet Session show ip bgp vrf ${rd}
87 Execute Command On Quagga Telnet Session exit
90 Create Quagga Telnet Session
91 [Arguments] ${ip} ${user} ${password}
92 [Documentation] Create telnet session for Quagga
93 ${conn_id}= Open_Connection_To_Tools_System ip_address=${ip}
94 Switch Connection ${conn_id}
95 ${output} = Write telnet localhost ${user}
96 ${output} = Read Until Password:
97 ${output} = Write ${password}
99 ${output} = Write terminal length 512
102 Execute Command On Quagga Telnet Session
103 [Arguments] ${command}
104 [Documentation] Execute command on Quagga telnet session(session should exist) and returns the output.
105 SSHLibrary.Write ${command}
106 ${output} = SSHLibrary.Read
110 Configure BGP And Add Neighbor On DCGW
111 [Arguments] ${dcgw_ip} ${as_id} ${router_id} ${neighbor_ip} ${vrf_name} ${rd}
113 [Documentation] Configure BGP and add neighbor on the dcgw
114 Create Quagga Telnet Session ${dcgw_ip} bgpd sdncbgpc
115 Execute Command On Quagga Telnet Session configure terminal
116 Execute Command On Quagga Telnet Session router bgp ${as_id}
117 Execute Command On Quagga Telnet Session bgp router-id ${router_id}
118 Execute Command On Quagga Telnet Session redistribute static
119 Execute Command On Quagga Telnet Session redistribute connected
120 Execute Command On Quagga Telnet Session neighbor ${neighbor_ip} send-remote-as ${as_id}
121 Execute Command On Quagga Telnet Session vrf ${vrf_name}
122 Execute Command On Quagga Telnet Session rd ${rd}
123 Execute Command On Quagga Telnet Session rt import ${rd}
124 Execute Command On Quagga Telnet Session rt export ${rd}
125 Execute Command On Quagga Telnet Session exit
126 Execute Command On Quagga Telnet Session address-family vpnv4 unicast
127 Execute Command On Quagga Telnet Session network ${loopback_ip}/32 rd ${rd} tag ${as_id}
128 Execute Command On Quagga Telnet Session neighbor ${neighbor_ip} activate
129 Execute Command On Quagga Telnet Session end
130 Execute Command On Quagga Telnet Session show running-config
131 Execute Command On Quagga Telnet Session exit
133 Add Loopback Interface On DCGW
134 [Arguments] ${dcgw_ip} ${loopback_name} ${loopback_ip} ${user}=zebra ${password}=zebra
135 [Documentation] Add loopback interface on DCGW
136 Create Quagga Telnet Session ${dcgw_ip} ${user} ${password}
137 Execute Command On Quagga Telnet Session enable
138 Execute Command On Quagga Telnet Session ${password}
139 Execute Command On Quagga Telnet Session configure terminal
140 Execute Command On Quagga Telnet Session interface ${loopback_name}
141 Execute Command On Quagga Telnet Session ip address ${loopback_ip}/32
142 Execute Command On Quagga Telnet Session exit
143 Execute Command On Quagga Telnet Session end
144 Execute Command On Quagga Telnet Session show running-config
145 Execute Command On Quagga Telnet Session exit
147 Execute Show Command On Quagga
148 [Arguments] ${dcgw_ip} ${cmd} ${user}=bgpd ${password}=sdncbgpc
149 [Documentation] Execute command on quagga and returns the ouput.
150 Create Quagga Telnet Session ${dcgw_ip} ${user} ${password}
151 ${output} = Execute Command On Quagga Telnet Session ${cmd}
153 Execute Command On quagga Telnet Session exit
156 Verify BGP Neighbor Status On Quagga
157 [Arguments] ${dcgw_ip} ${neighbor_ip}
158 [Documentation] Verify bgp neighbor status on quagga
159 ${output} = Execute Show Command On quagga ${dcgw_ip} show bgp neighbors ${neighbor_ip}
161 Should Contain ${output} BGP state = Established
163 Verify Routes On Quagga
164 [Arguments] ${dcgw_ip} ${rd} ${ip_list}
165 [Documentation] Verify routes on quagga
166 ${output} = Execute Show Command On quagga ${dcgw_ip} show ip bgp vrf ${rd}
168 : FOR ${ip} IN @{ip_list}
169 \ Should Contain ${output} ${ip}
171 Delete BGP Config On Quagga
172 [Arguments] ${dcgw_ip} ${bgp_id} ${user}=bgpd ${password}=sdncbgpc
173 [Documentation] Delete BGP Config on Quagga
174 Create Quagga Telnet Session ${dcgw_ip} ${user} ${password}
175 Execute Command On Quagga Telnet Session configure terminal
176 Execute Command On Quagga Telnet Session no router bgp ${bgp_id}
177 Execute Command On Quagga Telnet Session end
178 ${output} = Execute Command On Quagga Telnet Session show running-config
179 Execute Command On Quagga Telnet Session exit
183 [Arguments] ${dcgw_ip} ${as_id} ${vpn_name} ${rd}
184 [Documentation] Creating L3VPN on DCGW
185 BgpOperations.Create Quagga Telnet Session ${dcgw_ip} bgpd sdncbgpc
186 BgpOperations.Execute Command On Quagga Telnet Session configure terminal
187 BgpOperations.Execute Command On Quagga Telnet Session router bgp ${as_id}
188 BgpOperations.Execute Command On Quagga Telnet Session vrf ${vpn_name}
189 BgpOperations.Execute Command On Quagga Telnet Session rd ${rd}
190 BgpOperations.Execute Command On Quagga Telnet Session rt export ${rd}
191 BgpOperations.Execute Command On Quagga Telnet Session rt import ${rd}
192 BgpOperations.Execute Command On Quagga Telnet Session end
195 [Arguments] ${dcgw_ip} ${as_id} @{vpns}
196 [Documentation] Deleting L3VPN on DCGW
197 BgpOperations.Create Quagga Telnet Session ${dcgw_ip} bgpd sdncbgpc
198 BgpOperations.Execute Command On Quagga Telnet Session configure terminal
199 BgpOperations.Execute Command On Quagga Telnet Session router bgp ${as_id}
200 : FOR ${vpn} IN @{vpns}
201 \ BgpOperations.Execute Command On Quagga Telnet Session no vrf ${vpn}
202 BgpOperations.Execute Command On Quagga Telnet Session end
205 [Arguments] ${dcgw_ip} ${vpn_name} ${rd}
206 [Documentation] Verify L3VPN vrf name and rd value on DCGW
207 ${output} = BgpOperations.Execute Show Command On Quagga ${dcgw_ip} show running-config
208 BuiltIn.Should Contain ${output} vrf ${vpn_name}
209 BuiltIn.Should Contain ${output} rd ${rd}
212 [Arguments] ${dcgw_ip} ${rd} ${network_ip} ${label}
213 [Documentation] Add routes on DCGW
214 BgpOperations.Create Quagga Telnet Session ${dcgw_ip} bgpd sdncbgpc
215 BgpOperations.Execute Command On Quagga Telnet Session configure terminal
216 BgpOperations.Execute Command On Quagga Telnet Session router bgp ${AS_ID}
217 BgpOperations.Execute Command On Quagga Telnet Session address-family vpnv4 unicast
218 BgpOperations.Execute Command On Quagga Telnet Session network ${network_ip}/32 rd ${rd} tag ${label}
219 BgpOperations.Execute Command On Quagga Telnet Session end
221 Create BGP Configuration On ODL
222 [Arguments] &{Kwargs}
223 [Documentation] Associate the created L3VPN to a network-id received as dictionary argument
224 TemplatedRequests.Post_As_Json_Templated folder=${VAR_BASE_BGP}/create_bgp mapping=${Kwargs} session=session
226 AddNeighbor To BGP Configuration On ODL
227 [Arguments] &{Kwargs}
228 [Documentation] Associate the created L3VPN to a network-id received as dictionary argument
229 TemplatedRequests.Post_As_Json_Templated folder=${VAR_BASE_BGP}/addNeighbor_bgp mapping=${Kwargs} session=session
231 Get BGP Configuration On ODL
232 [Arguments] ${odl_session}
233 [Documentation] Get bgp configuration
234 ${resp} = RequestsLibrary.Get Request ${odl_session} ${CONFIG_API}/ebgp:bgp/
236 [Return] ${resp.content}
238 Delete BGP Configuration On ODL
239 [Arguments] ${odl_session}
240 [Documentation] Delete BGP
241 ${resp} = RequestsLibrary.Delete Request ${odl_session} ${CONFIG_API}/ebgp:bgp/
243 Should Be Equal As Strings ${resp.status_code} 200
244 [Return] ${resp.content}
246 Create External Tunnel Endpoint Configuration
247 [Arguments] &{Kwargs}
248 [Documentation] Create Tunnel End point
249 TemplatedRequests.Post_As_Json_Templated folder=${VAR_BASE_BGP}/create_etep mapping=${Kwargs} session=session
251 Delete External Tunnel Endpoint Configuration
252 [Arguments] &{Kwargs}
253 [Documentation] Delete Tunnel End point
254 TemplatedRequests.Post_As_Json_Templated folder=${VAR_BASE_BGP}/delete_etep mapping=${Kwargs} session=session
256 Get External Tunnel Endpoint Configuration
258 [Documentation] Get bgp configuration
259 ${resp} = RequestsLibrary.Get Request session ${CONFIG_API}/itm:dc-gateway-ip-list/dc-gateway-ip/${ip}/
261 [Return] ${resp.content}
264 [Documentation] Create and Log the diff between expected and actual responses, make sure Python tool was killed.
265 ... Tear down imported Resources.
266 KillPythonTool.Search_And_Kill_Remote_Python 'play\.py'
267 RequestsLibrary.Delete_All_Sessions
268 SSHLibrary.Close_All_Connections
270 Check_Example_Bgp_Rib_Content
271 [Arguments] ${session} ${substr} ${error_message}=${JSONKEYSTR} not found, but expected.
272 [Documentation] Check the example-bgp-rib content for string
273 ${response}= RequestsLibrary.Get Request ${session} ${BGP_RIB_URI}
274 BuiltIn.Log ${response.status_code}
275 BuiltIn.Log ${response.text}
276 BuiltIn.Should_Contain ${response.text} ${substr} ${error_message} values=False
278 Check_Example_Bgp_Rib_Does_Not_Contain
279 [Arguments] ${session} ${substr} ${error_message}=${JSONKEYSTR} found, but not expected.
280 [Documentation] Check the example-bgp-rib does not contain the string
281 ${response}= RequestsLibrary.Get Request ${session} ${BGP_RIB_URI}
282 BuiltIn.Log ${response.status_code}
283 BuiltIn.Log ${response.text}
284 BuiltIn.Should_Not_Contain ${response.text} ${substr} ${error_message} values=False
286 Check_Example_IPv4_Topology_Content
287 [Arguments] ${session} ${string_to_check}=${EMPTY}
288 [Documentation] Check the example-ipv4-topology content for string
289 ${response}= RequestsLibrary.Get Request ${session} ${BGP_TOPOLOGY_URI}
290 BuiltIn.Log ${response.status_code}
291 BuiltIn.Log ${response.text}
292 BuiltIn.Should_Contain ${response.text} ${string_to_check}
294 Check_Example_IPv4_Topology_Does_Not_Contain
295 [Arguments] ${session} ${string_to_check}
296 [Documentation] Check the example-ipv4-topology does not contain the string
297 ${response}= RequestsLibrary.Get Request ${session} ${BGP_TOPOLOGY_URI}
298 BuiltIn.Log ${response.status_code}
299 BuiltIn.Log ${response.text}
300 BuiltIn.Should_Not_Contain ${response.text} ${string_to_check}
302 Bmp_Monitor_Precondition
303 [Arguments] ${session}
304 [Documentation] Verify example-bmp-monitor presence in bmp-monitors
305 &{mapping} BuiltIn.Create_Dictionary TOOL_IP=${TOOLS_SYSTEM_IP}
306 BuiltIn.Wait_Until_Keyword_Succeeds 6x 10s TemplatedRequests.Get_As_Json_Templated folder=${BGP_BMP_FEAT_DIR} mapping=${mapping} verify=True
307 ... session=${session}
309 Bmp_Monitor_Postcondition
310 [Arguments] ${session}
311 [Documentation] Verifies if example-bmp-monitor data contains one peer.
312 ${routes_line} = CompareStream.Set_Variable_If_At_Least_Neon ${NEW_IPV4_ROUTES_LINE} ${OLD_IPV4_ROUTES_LINE}
313 &{mapping} BuiltIn.Create_Dictionary TOOL_IP=${TOOLS_SYSTEM_IP} ROUTES_LINE=${routes_line}
314 ${output} BuiltIn.Wait_Until_Keyword_Succeeds 10x 5s TemplatedRequests.Get_As_Json_Templated folder=${BGP_BMP_DIR} mapping=${mapping}
315 ... session=${session} verify=True
316 BuiltIn.Log ${output}
319 [Arguments] ${totest} ${dir} ${remove}=True
320 ${announce_hex} = OperatingSystem.Get_File ${dir}/${totest}/announce_${totest}.hex
321 ${announce_hex} = String.Remove_String ${announce_hex} \n
322 ${withdraw_hex} = OperatingSystem.Get_File ${dir}/${totest}/withdraw_${totest}.hex
323 ${withdraw_hex} = String.Remove_String ${withdraw_hex} \n
324 BuiltIn.Run_Keyword_If '${remove}' == 'True' BgpRpcClient.play_clean
325 TemplatedRequests.Post_As_Xml_Templated ${dir}/${totest}/app mapping=${APP_PEER} session=${CONFIG_SESSION}
326 ${update} BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s Get_Update_Message
327 Verify_Two_Hex_Messages_Are_Equal ${update} ${announce_hex}
328 BgpRpcClient.play_clean
329 Remove_Configured_Routes ${totest} ${dir}
330 ${update} BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s Get_Update_Message
331 Verify_Two_Hex_Messages_Are_Equal ${update} ${withdraw_hex}
332 [Teardown] Remove_Configured_Routes ${totest} ${dir}
335 [Arguments] ${totest} ${dir} ${ipv}=ipv4
336 ${as_path} = CompareStream.Set_Variable_If_At_Least_Neon ${NEW_AS_PATH} ${OLD_AS_PATH}
337 &{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}
338 &{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}
339 &{loc_rib} BuiltIn.Create_Dictionary PATH=loc-rib BGP_RIB=${RIB_NAME} AS_PATH=${as_path}
340 ${announce_hex} = OperatingSystem.Get_File ${dir}/${totest}/announce_${totest}.hex
341 ${withdraw_hex} = OperatingSystem.Get_File ${dir}/${totest}/withdraw_${totest}.hex
342 BgpRpcClient.play_clean
343 BgpRpcClient.play_send ${announce_hex}
344 BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${adj_rib_in} session=${CONFIG_SESSION}
346 BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${effective_rib_in} session=${CONFIG_SESSION}
348 BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${loc_rib} session=${CONFIG_SESSION}
350 BgpRpcClient.play_send ${withdraw_hex}
351 BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/empty_routes/${ipv} mapping=${loc_rib} session=${CONFIG_SESSION}
353 [Teardown] BgpRpcClient.play_send ${withdraw_hex}
355 Play_To_Odl_Non_Removal_Template
356 [Arguments] ${totest} ${dir} ${ipv}=ipv4
357 ${announce_hex} = OperatingSystem.Get_File ${dir}/${totest}/announce_${totest}.hex
358 BgpRpcClient.play_clean
359 BgpRpcClient.play_send ${announce_hex}
360 ${as_path} = CompareStream.Set_Variable_If_At_Least_Neon ${NEW_AS_PATH} ${OLD_AS_PATH}
361 &{loc_rib} BuiltIn.Create_Dictionary PATH=loc-rib BGP_RIB=${RIB_NAME} AS_PATH=${as_path}
362 BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${loc_rib} session=${CONFIG_SESSION}
366 [Documentation] Returns hex update message.
367 ${update} = BgpRpcClient.play_get
368 BuiltIn.Should_Not_Be_Equal ${update} ${Empty}
371 Remove_Configured_Routes
372 [Arguments] ${totest} ${dir}
373 [Documentation] Removes the route if present.
374 BuiltIn.Run_Keyword_And_Ignore_Error TemplatedRequests.Delete_Templated ${dir}/${totest}/app mapping=${APP_PEER} session=${CONFIG_SESSION}
376 Verify_Two_Hex_Messages_Are_Equal
377 [Arguments] ${hex_1} ${hex_2}
378 [Documentation] Verifies two hex messages are equal even in case, their arguments are misplaced.
379 ... Compares length of the hex messages and sums hex messages arguments as integers and compares results.
380 ${len_1} = BuiltIn.Get_Length ${hex_1}
381 ${len_2} = BuiltIn.Get_Length ${hex_2}
382 BuiltIn.Should_Be_Equal ${len_1} ${len_2}
383 ${sum_1} = Sum_Hex_Message_Arguments_To_Integer ${hex_1}
384 ${sum_2} = Sum_Hex_Message_Arguments_To_Integer ${hex_2}
385 BuiltIn.Should_Be_Equal ${sum_1} ${sum_2}
387 Sum_Hex_Message_Arguments_To_Integer
388 [Arguments] ${hex_string}
389 [Documentation] Converts hex message arguments to integers and sums them up and returns the sum.
390 ${final_sum} = BuiltIn.Evaluate sum(map(lambda x: int(x, 16), re.compile('[a-f\d]{2}').findall('${hex_string}'[32:]))) modules=re
391 [Return] ${final_sum}