*** Settings ***
Documentation This library contains keywords related to the BGP functionality.
Library SSHLibrary
-Resource Utils.robot
+Library String
+Library BgpRpcClient.py ${TOOLS_SYSTEM_IP}
Resource ../variables/Variables.robot
+Resource CompareStream.robot
+Resource Utils.robot
+Resource KillPythonTool.robot
Resource TemplatedRequests.robot
*** Variables ***
-${VAR_BASE_BGP} ${CURDIR}/../variables/bgpfunctional
${BGP_BMP_DIR} ${CURDIR}/../variables/bgpfunctional/bmp_basic/filled_structure
${BGP_BMP_FEAT_DIR} ${CURDIR}/../variables/bgpfunctional/bmp_basic/empty_structure
+${BGP_RIB_URI} ${OPERATIONAL_API}/bgp-rib:bgp-rib/rib/example-bgp-rib
+${BGP_TOPOLOGY_URI} ${OPERATIONAL_TOPO_API}/topology/example-ipv4-topology
+${VAR_BASE_BGP} ${CURDIR}/../variables/bgpfunctional
+${RIB_NAME} example-bgp-rib
+${OLD_AS_PATH} \n"as-path": {},
+${NEW_AS_PATH} ${EMPTY}
+&{APP_PEER} IP=${ODL_SYSTEM_IP} BGP_RIB=${RIB_NAME}
+${NEW_IPV4_ROUTES_LINE} ${EMPTY}
+${OLD_IPV4_ROUTES_LINE} \n"bgp-inet:ipv4-routes": {},
+${BGP_CONFIG_SERVER_CMD} bgp-connect -h ${ODL_SYSTEM_IP} -p 7644 add
*** Keywords ***
Start Quagga Processes On ODL
Write Commands Until Expected Prompt netstat -nap | grep 7644 ${DEFAULT_LINUX_PROMPT_STRICT}
Close Connection
+Restart BGP Processes On ODL
+ [Arguments] ${odl_ip}
+ [Documentation] To restart the bgpd , qthriftd processes on ODL VM
+ ${conn_id} = Open_Connection_To_ODL_System ip_address=${odl_ip}
+ Switch Connection ${conn_id}
+ Write Commands Until Expected Prompt sudo pkill -f bgpd ${DEFAULT_LINUX_PROMPT_STRICT}
+ Start Quagga Processes On ODL ${odl_ip}
+
Start Quagga Processes On DCGW
[Arguments] ${dcgw_ip}
[Documentation] To start the zrpcd, bgpd,and zebra processes on DCGW
Write Commands Until Expected Prompt ps -ef | grep zebra ${DEFAULT_LINUX_PROMPT_STRICT}
Write Commands Until Expected Prompt netstat -nap | grep 7644 ${DEFAULT_LINUX_PROMPT_STRICT}
+Restart BGP Processes On DCGW
+ [Arguments] ${dcgw_ip}
+ [Documentation] To Restart the zrpcd, bgpd and zebra processes on DCGW
+ ${dcgw_conn_id} = Open_Connection_To_Tools_System ip_address=${dcgw_ip}
+ Switch Connection ${dcgw_conn_id}
+ Write Commands Until Expected Prompt sudo pkill -f bgpd ${DEFAULT_LINUX_PROMPT_STRICT}
+ Start Quagga Processes On DCGW ${dcgw_ip}
+
+Stop BGP Processes On Node
+ [Arguments] ${node_ip}
+ [Documentation] To stop the bgpd , qthriftd processes on specific node given by user.
+ Utils.Run Command On Remote System ${node_ip} sudo pkill -f bgpd
+ Utils.Run Command On Remote System ${node_ip} sudo pkill -f zrpcd
+
Show Quagga Configuration On ODL
[Arguments] ${odl_ip} ${rd}
[Documentation] Show quagga config from ODL
Log ${output}
Should Contain ${output} BGP state = Established
+Setup BGP Peering On ODL
+ [Arguments] ${odl_ip} ${as_id} ${nbr_ip}
+ [Documentation] Setup BGP peering between ODL and given neighbor IP.
+ ... Configuring and starting BGP on ODL node with given AS number
+ ... Adding and verifying BGP neighbor
+ KarafKeywords.Issue Command On Karaf Console ${BGP_CONFIG_SERVER_CMD}
+ BgpOperations.Create BGP Configuration On ODL localas=${as_id} routerid=${odl_ip}
+ BgpOperations.AddNeighbor To BGP Configuration On ODL remoteas=${as_id} neighborAddr=${nbr_ip}
+ ${output} = BgpOperations.Get BGP Configuration On ODL session
+ BuiltIn.Should Contain ${output} ${nbr_ip}
+
+Setup BGP Peering On DCGW
+ [Arguments] ${dcgw_ip} ${as_id} ${nbr_ip} ${vrf_name} ${rd} ${loopback_ip}
+ [Documentation] Setup BGP peering between DCGW and given neighbor IP.
+ ... Configuring,adding neighbor on DCGW node and verifying BGP neighbor.
+ BgpOperations.Configure BGP And Add Neighbor On DCGW ${dcgw_ip} ${as_id} ${dcgw_ip} ${nbr_ip} ${vrf_name} ${rd}
+ ... ${loopback_ip}
+ ${output} = BgpOperations.Execute Show Command On Quagga ${dcgw_ip} ${RUN_CONFIG}
+ BuiltIn.Should Contain ${output} ${nbr_ip}
+
Verify Routes On Quagga
[Arguments] ${dcgw_ip} ${rd} ${ip_list}
[Documentation] Verify routes on quagga
Execute Command On Quagga Telnet Session exit
[Return] ${output}
+Create L3VPN on DCGW
+ [Arguments] ${dcgw_ip} ${as_id} ${vpn_name} ${rd}
+ [Documentation] Creating L3VPN on DCGW
+ BgpOperations.Create Quagga Telnet Session ${dcgw_ip} bgpd sdncbgpc
+ BgpOperations.Execute Command On Quagga Telnet Session configure terminal
+ BgpOperations.Execute Command On Quagga Telnet Session router bgp ${as_id}
+ BgpOperations.Execute Command On Quagga Telnet Session vrf ${vpn_name}
+ BgpOperations.Execute Command On Quagga Telnet Session rd ${rd}
+ BgpOperations.Execute Command On Quagga Telnet Session rt export ${rd}
+ BgpOperations.Execute Command On Quagga Telnet Session rt import ${rd}
+ BgpOperations.Execute Command On Quagga Telnet Session end
+
+Delete L3VPN on DCGW
+ [Arguments] ${dcgw_ip} ${as_id} @{vpns}
+ [Documentation] Deleting L3VPN on DCGW
+ BgpOperations.Create Quagga Telnet Session ${dcgw_ip} bgpd sdncbgpc
+ BgpOperations.Execute Command On Quagga Telnet Session configure terminal
+ BgpOperations.Execute Command On Quagga Telnet Session router bgp ${as_id}
+ : FOR ${vpn} IN @{vpns}
+ \ BgpOperations.Execute Command On Quagga Telnet Session no vrf ${vpn}
+ BgpOperations.Execute Command On Quagga Telnet Session end
+
+Verify L3VPN On DCGW
+ [Arguments] ${dcgw_ip} ${vpn_name} ${rd}
+ [Documentation] Verify L3VPN vrf name and rd value on DCGW
+ ${output} = BgpOperations.Execute Show Command On Quagga ${dcgw_ip} show running-config
+ BuiltIn.Should Contain ${output} vrf ${vpn_name}
+ BuiltIn.Should Contain ${output} rd ${rd}
+
+Add Routes On DCGW
+ [Arguments] ${dcgw_ip} ${rd} ${network_ip} ${label}
+ [Documentation] Add routes on DCGW
+ BgpOperations.Create Quagga Telnet Session ${dcgw_ip} bgpd sdncbgpc
+ BgpOperations.Execute Command On Quagga Telnet Session configure terminal
+ BgpOperations.Execute Command On Quagga Telnet Session router bgp ${AS_ID}
+ BgpOperations.Execute Command On Quagga Telnet Session address-family vpnv4 unicast
+ BgpOperations.Execute Command On Quagga Telnet Session network ${network_ip}/32 rd ${rd} tag ${label}
+ BgpOperations.Execute Command On Quagga Telnet Session end
+
Create BGP Configuration On ODL
[Arguments] &{Kwargs}
[Documentation] Associate the created L3VPN to a network-id received as dictionary argument
SSHLibrary.Close_All_Connections
Check_Example_Bgp_Rib_Content
- [Arguments] ${substr} ${error_message}=${JSONKEYSTR} not found, but expected.
+ [Arguments] ${session} ${substr} ${error_message}=${JSONKEYSTR} not found, but expected.
[Documentation] Check the example-bgp-rib content for string
- ${response}= RequestsLibrary.Get Request operational bgp-rib:bgp-rib/rib/example-bgp-rib
+ ${response}= RequestsLibrary.Get Request ${session} ${BGP_RIB_URI}
BuiltIn.Log ${response.status_code}
BuiltIn.Log ${response.text}
BuiltIn.Should_Contain ${response.text} ${substr} ${error_message} values=False
Check_Example_Bgp_Rib_Does_Not_Contain
- [Arguments] ${substr} ${error_message}=${JSONKEYSTR} found, but not expected.
+ [Arguments] ${session} ${substr} ${error_message}=${JSONKEYSTR} found, but not expected.
[Documentation] Check the example-bgp-rib does not contain the string
- ${response}= RequestsLibrary.Get Request operational bgp-rib:bgp-rib/rib/example-bgp-rib
+ ${response}= RequestsLibrary.Get Request ${session} ${BGP_RIB_URI}
BuiltIn.Log ${response.status_code}
BuiltIn.Log ${response.text}
BuiltIn.Should_Not_Contain ${response.text} ${substr} ${error_message} values=False
Check_Example_IPv4_Topology_Content
- [Arguments] ${string_to_check}=${EMPTY}
+ [Arguments] ${session} ${string_to_check}=${EMPTY}
[Documentation] Check the example-ipv4-topology content for string
- ${response}= RequestsLibrary.Get Request operational topology/example-ipv4-topology
+ ${response}= RequestsLibrary.Get Request ${session} ${BGP_TOPOLOGY_URI}
BuiltIn.Log ${response.status_code}
BuiltIn.Log ${response.text}
BuiltIn.Should_Contain ${response.text} ${string_to_check}
Check_Example_IPv4_Topology_Does_Not_Contain
- [Arguments] ${string_to_check}
+ [Arguments] ${session} ${string_to_check}
[Documentation] Check the example-ipv4-topology does not contain the string
- ${response}= RequestsLibrary.Get Request operational topology/example-ipv4-topology
+ ${response}= RequestsLibrary.Get Request ${session} ${BGP_TOPOLOGY_URI}
BuiltIn.Log ${response.status_code}
BuiltIn.Log ${response.text}
BuiltIn.Should_Not_Contain ${response.text} ${string_to_check}
Bmp_Monitor_Postcondition
[Arguments] ${session}
[Documentation] Verifies if example-bmp-monitor data contains one peer.
- &{mapping} BuiltIn.Create_Dictionary TOOL_IP=${TOOLS_SYSTEM_IP}
+ ${routes_line} = CompareStream.Set_Variable_If_At_Least_Neon ${NEW_IPV4_ROUTES_LINE} ${OLD_IPV4_ROUTES_LINE}
+ &{mapping} BuiltIn.Create_Dictionary TOOL_IP=${TOOLS_SYSTEM_IP} ROUTES_LINE=${routes_line}
${output} BuiltIn.Wait_Until_Keyword_Succeeds 10x 5s TemplatedRequests.Get_As_Json_Templated folder=${BGP_BMP_DIR} mapping=${mapping}
... session=${session} verify=True
BuiltIn.Log ${output}
+
+Odl_To_Play_Template
+ [Arguments] ${totest} ${dir} ${remove}=True
+ ${announce_hex} = OperatingSystem.Get_File ${dir}/${totest}/announce_${totest}.hex
+ ${announce_hex} = String.Remove_String ${announce_hex} \n
+ ${withdraw_hex} = OperatingSystem.Get_File ${dir}/${totest}/withdraw_${totest}.hex
+ ${withdraw_hex} = String.Remove_String ${withdraw_hex} \n
+ BuiltIn.Run_Keyword_If '${remove}' == 'True' BgpRpcClient.play_clean
+ TemplatedRequests.Post_As_Xml_Templated ${dir}/${totest}/app mapping=${APP_PEER} session=${CONFIG_SESSION}
+ ${update} BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s Get_Update_Message
+ Verify_Two_Hex_Messages_Are_Equal ${update} ${announce_hex}
+ BgpRpcClient.play_clean
+ Remove_Configured_Routes ${totest} ${dir}
+ ${update} BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s Get_Update_Message
+ Verify_Two_Hex_Messages_Are_Equal ${update} ${withdraw_hex}
+ [Teardown] Remove_Configured_Routes ${totest} ${dir}
+
+Play_To_Odl_Template
+ [Arguments] ${totest} ${dir} ${ipv}=ipv4
+ ${as_path} = CompareStream.Set_Variable_If_At_Least_Neon ${NEW_AS_PATH} ${OLD_AS_PATH}
+ &{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}
+ &{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}
+ &{loc_rib} BuiltIn.Create_Dictionary PATH=loc-rib BGP_RIB=${RIB_NAME} AS_PATH=${as_path}
+ ${announce_hex} = OperatingSystem.Get_File ${dir}/${totest}/announce_${totest}.hex
+ ${withdraw_hex} = OperatingSystem.Get_File ${dir}/${totest}/withdraw_${totest}.hex
+ BgpRpcClient.play_clean
+ BgpRpcClient.play_send ${announce_hex}
+ BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${adj_rib_in} session=${CONFIG_SESSION}
+ ... verify=True
+ BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${effective_rib_in} session=${CONFIG_SESSION}
+ ... verify=True
+ BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${loc_rib} session=${CONFIG_SESSION}
+ ... verify=True
+ BgpRpcClient.play_send ${withdraw_hex}
+ BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/empty_routes/${ipv} mapping=${loc_rib} session=${CONFIG_SESSION}
+ ... verify=True
+ [Teardown] BgpRpcClient.play_send ${withdraw_hex}
+
+Play_To_Odl_Non_Removal_Template
+ [Arguments] ${totest} ${dir} ${ipv}=ipv4
+ ${announce_hex} = OperatingSystem.Get_File ${dir}/${totest}/announce_${totest}.hex
+ BgpRpcClient.play_clean
+ BgpRpcClient.play_send ${announce_hex}
+ ${as_path} = CompareStream.Set_Variable_If_At_Least_Neon ${NEW_AS_PATH} ${OLD_AS_PATH}
+ &{loc_rib} BuiltIn.Create_Dictionary PATH=loc-rib BGP_RIB=${RIB_NAME} AS_PATH=${as_path}
+ BuiltIn.Wait_Until_Keyword_Succeeds 3x 2s TemplatedRequests.Get_As_Json_Templated ${dir}/${totest}/rib mapping=${loc_rib} session=${CONFIG_SESSION}
+ ... verify=True
+
+Get_Update_Message
+ [Documentation] Returns hex update message.
+ ${update} = BgpRpcClient.play_get
+ BuiltIn.Should_Not_Be_Equal ${update} ${Empty}
+ [Return] ${update}
+
+Remove_Configured_Routes
+ [Arguments] ${totest} ${dir}
+ [Documentation] Removes the route if present.
+ BuiltIn.Run_Keyword_And_Ignore_Error TemplatedRequests.Delete_Templated ${dir}/${totest}/app mapping=${APP_PEER} session=${CONFIG_SESSION}
+
+Verify_Two_Hex_Messages_Are_Equal
+ [Arguments] ${hex_1} ${hex_2}
+ [Documentation] Verifies two hex messages are equal even in case, their arguments are misplaced.
+ ... Compares length of the hex messages and sums hex messages arguments as integers and compares results.
+ ${len_1} = BuiltIn.Get_Length ${hex_1}
+ ${len_2} = BuiltIn.Get_Length ${hex_2}
+ BuiltIn.Should_Be_Equal ${len_1} ${len_2}
+ ${sum_1} = Sum_Hex_Message_Arguments_To_Integer ${hex_1}
+ ${sum_2} = Sum_Hex_Message_Arguments_To_Integer ${hex_2}
+ BuiltIn.Should_Be_Equal ${sum_1} ${sum_2}
+
+Sum_Hex_Message_Arguments_To_Integer
+ [Arguments] ${hex_string}
+ [Documentation] Converts hex message arguments to integers and sums them up and returns the sum.
+ ${final_sum} = BuiltIn.Evaluate sum(map(lambda x: int(x, 16), re.compile('[a-f\d]{2}').findall('${hex_string}'[32:]))) modules=re
+ [Return] ${final_sum}