X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=tests%2Fvpp%2Ffunc%2Fhoneycomb%2Fmgmt-cfg-bgp-apihc-func.robot;fp=tests%2Fvpp%2Ffunc%2Fhoneycomb%2Fmgmt-cfg-bgp-apihc-func.robot;h=8f74280610cf783671fe9ea81464c4c6f1068aa0;hb=56dd61dee872da788e578129eed48a3158a5b566;hp=0000000000000000000000000000000000000000;hpb=2b8547bc50fd06ea936f096794b8c2a5e09c5f8b;p=csit.git diff --git a/tests/vpp/func/honeycomb/mgmt-cfg-bgp-apihc-func.robot b/tests/vpp/func/honeycomb/mgmt-cfg-bgp-apihc-func.robot new file mode 100644 index 0000000000..8f74280610 --- /dev/null +++ b/tests/vpp/func/honeycomb/mgmt-cfg-bgp-apihc-func.robot @@ -0,0 +1,365 @@ +# Copyright (c) 2017 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +*** Variables *** +# Interface to run tests on. +| ${interface}= | ${node['interfaces']['port1']['name']} +| ${dut1_to_tg_ip}= | 192.168.0.1 +| ${tg_to_dut1_ip}= | 192.168.0.2 +| ${dut1_to_dut2_ip}= | 192.168.1.1 +| ${dut2_to_dut1_ip}= | 192.168.1.2 +| ${bgp_port}= | ${179} +| ${bgp_as_number}= | ${37} +| ${prefix}= | ${24} + +*** Settings *** +| Library | resources.libraries.python.honeycomb.IPv6Management +| Resource | resources/libraries/robot/shared/default.robot +| Resource | resources/libraries/robot/honeycomb/honeycomb.robot +| Resource | resources/libraries/robot/honeycomb/interfaces.robot +| Resource | resources/libraries/robot/honeycomb/bgp.robot +| Resource | resources/libraries/robot/honeycomb/routing.robot +| Resource | resources/libraries/robot/shared/testing_path.robot +| Resource | resources/libraries/robot/honeycomb/ipv6_control.robot +| Variables | resources/test_data/honeycomb/bgp.py +| ... +| Suite Setup | Run Keywords +| ... | Enable Honeycomb Feature | ${node} | BGP | AND +| ... | Configure BGP Module | ${node} | ${dut1_to_tg_ip} +| ... | ${bgp_port} | ${bgp_as_number} | AND +| ... | Set Up Honeycomb Functional Test Suite | ${node} +| ... +| Suite Teardown | Run Keywords +| ... | Tear Down Honeycomb Functional Test Suite | ${nodes['DUT1']} | AND +| ... | Stop Honeycomb service on DUTs | ${nodes['DUT2']} | AND +| ... | Unconfigure IPv4 Management Interfaces | AND +| ... | Disable Honeycomb Feature | ${node} | BGP | AND +| ... | Disable Honeycomb Feature | ${nodes['DUT2']} | BGP +| ... +| Force Tags | HC_FUNC +| ... +| Documentation | *Honeycomb BGP management test suite.* + +*** Test Cases *** +| TC01: Honeycomb configures BGP peer - Internal +| | [Documentation] | Check if Honeycomb can configure an internal BGP peer. +| | ... +| | When Honeycomb adds BGP peer +| | ... | ${node} | ${address_internal} | ${peer_internal} +| | Then BGP peer from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${peer_internal} + +| TC02: Honeycomb removes peer configuration +| | [Documentation] | Check if Honeycomb can remove a configured BGP peer. +| | ... +| | Given BGP peer from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${peer_internal} +| | When Honeycomb removes BGP peer | ${node} | ${address_internal} +| | Then No BGP peers should be configured | ${node} + +| TC03: Honeycomb updates existing BGP peer - Internal +| | [Documentation] | Check if Honeycomb can update an existing BGP peer. +| | ... +| | [Teardown] | Honeycomb removes BGP peer | ${node} | ${address_internal} +| | ... +| | Given No BGP peers should be configured | ${node} +| | When Honeycomb adds BGP peer +| | ... | ${node} | ${address_internal} | ${peer_internal} +| | And Honeycomb adds BGP peer +| | ... | ${node} | ${address_internal} | ${peer_internal_update} +| | Then BGP peer from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${peer_internal_update} + +| TC04: Honeycomb configures BGP peer - Application +| | [Documentation] | Check if Honeycomb can configure an application BGP peer. +| | ... +| | [Teardown] | Honeycomb removes BGP peer | ${node} | ${address_application} +| | ... +| | Given No BGP peers should be configured | ${node} +| | When Honeycomb adds BGP peer +| | ... | ${node} | ${address_application} | ${peer_application} +| | Then BGP peer from Honeycomb should be +| | ... | ${node} | ${address_application} | ${peer_application} + +| TC05: Honeycomb configures a second BGP peer +| | [Documentation] | Check if Honeycomb can configure more than one BGP peer. +| | ... +| | [Teardown] | Run Keywords +| | ... | Honeycomb removes BGP peer | ${node} | ${address_internal} | AND +| | ... | Honeycomb removes BGP peer | ${node} | ${address_internal2} +| | ... +| | Given No BGP peers should be configured | ${node} +| | When Honeycomb adds BGP peer +| | ... | ${node} | ${address_internal} | ${peer_internal} +| | And Honeycomb adds BGP peer +| | ... | ${node} | ${address_internal2} | ${peer_internal2} +| | Then BGP peer from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${peer_internal} +| | And BGP peer from Honeycomb should be +| | ... | ${node} | ${address_internal2} | ${peer_internal2} + +| TC06: Honeycomb configures IPv4 route using BGP +| | [Documentation] | Check if Honeycomb can configure a BGP route under a peer. +| | ... +| | Given Honeycomb adds BGP peer +| | ... | ${node} | ${address_internal} | ${peer_internal} +| | When Honeycomb configures BGP route +| | ... | ${node} | ${address_internal} | ${route_data_ipv4} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 +| | Then BGP Route from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${route_data_ipv4} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 + +| TC07: Honeycomb removes IPv4 route configuration +| | [Documentation] | Check if Honeycomb can remove a configured BGP route. +| | ... +| | Given BGP peer from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${peer_internal} +| | And BGP Route from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${route_data_ipv4} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 +| | When Honeycomb removes BGP route | ${node} | ${address_internal} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 +| | Then No BGP Routes Should be Configured +| | ... | ${node} | ${address_internal} | ipv4 + +| TC08: Honeycomb updates existing IPv4 route using BGP +| | [Documentation] | Check if Honeycomb can update an existing BGP route. +| | ... +| | [Teardown] | Honeycomb removes BGP route | ${node} | ${address_internal} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 +| | ... +| | Given BGP peer from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${peer_internal} +| | And No BGP Routes Should be Configured +| | ... | ${node} | ${address_internal} | ipv4 +| | When Honeycomb configures BGP route +| | ... | ${node} | ${address_internal} | ${route_data_ipv4} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 +| | And Honeycomb configures BGP route +| | ... | ${node} | ${address_internal} | ${route_data_ipv4_update} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 +| | Then BGP Route from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${route_data_ipv4_update} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 + +| TC09: Honeycomb configures a second IPv4 route +| | [Documentation] | Check if Honeycomb can configure more than one BGP route. +| | ... +| | [Teardown] | Run Keywords +| | ... | Honeycomb removes BGP route | ${node} | ${address_internal} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 | AND +| | ... | Honeycomb removes BGP route | ${node} | ${address_internal} +| | ... | ${route_address_ipv4_2} | ${route_id_ipv4_2} | ipv4 | AND +| | ... | Honeycomb removes BGP peer | ${node} | ${address_internal} +| | ... +| | Given BGP peer from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${peer_internal} +| | When Honeycomb configures BGP route +| | ... | ${node} | ${address_internal} | ${route_data_ipv4} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 +| | And Honeycomb configures BGP route +| | ... | ${node} | ${address_internal} | ${route_data_ipv4_2} +| | ... | ${route_address_ipv4_2} | ${route_id_ipv4_2} | ipv4 +| | Then BGP Route from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${route_data_ipv4} +| | ... | ${route_address_ipv4} | ${route_id_ipv4} | ipv4 +| | And BGP Route from Honeycomb should be +| | ... | ${node} | ${address_internal} | ${route_data_ipv4_2} +| | ... | ${route_address_ipv4_2} | ${route_id_ipv4_2} | ipv4 + +| TC10: Honeycomb sends BGP OPEN messages to configured peer +| | [Documentation] +| | ... | [top] TG-DUT1-TG. +| | ... | [enc] Eth-IPv4-TCP-BGP. +| | ... | [cfg] On DUT1 give Honeycomb control over the data-plane interface +| | ... | connected to TG. Configure a BGP peer with the address of TG. +| | ... | [ver] Open a TCP listener on TG on the BGP port and listen for BGP +| | ... | OPEN message. On receive, verify message fields. +| | ... +| | [Setup] | Run Keywords +| | ... | Configure BGP Module | ${node} | ${dut1_to_dut2_ip} +| | ... | ${bgp_port} | ${bgp_as_number} | AND +| | ... | Configure IPv4 Management Interface +| | [Teardown] | Honeycomb removes BGP peer | ${dut1_node} | ${address_internal} +| | When Honeycomb adds BGP peer +| | ... | ${dut1_node} | ${address_internal} | ${peer_internal} +| | Then Receive BGP OPEN message +| | ... | ${tg_node} | ${tg_to_dut1_ip} | ${dut1_to_dut2_ip} +| | ... | ${bgp_port} | ${bgp_as_number} | ${holdtime_internal} + +| TC11: Honeycomb shows connected peer in operational data +| | [Documentation] +| | ... | [top] TG-DUT1-DUT2-TG. +| | ... | [enc] Eth-IPv4-TCP-BGP. +| | ... | [cfg] On DUT1 and DUT2 give Honeycomb control over the data-plane +| | ... | interfaces connecting DUT1 ad DUT2. Configure BGP peers on DUT1 +| | ... | and DUT2 with each other's IP address. +| | ... | [ver] Using Restconf, verify that Honeycomb on each DUT has the +| | ... | other DUT's entry in operational data. +| | ... +| | When Honeycomb adds BGP peer +| | ... | ${dut1_node} | ${dut2_to_dut1_ip} | ${dut2_peer} +| | And Honeycomb adds BGP peer +| | ... | ${dut2_node} | ${dut1_to_dut2_ip} | ${dut1_peer} +| | Sleep | 5s | Wait for BGP connection. Retry timer is 5 seconds. +| | Then Peer operational data from Honeycomb should be +| | ... | ${dut1_node} | ${dut2_to_dut1_ip} +| | And Peer operational data from Honeycomb should be +| | ... | ${dut2_node} | ${dut1_to_dut2_ip} + +| TC12: Honeycomb sends IPv4 BGP route to connected peer +| | [Documentation] +| | ... | [top] TG-DUT1-DUT2-TG. +| | ... | [enc] Eth-IPv4-TCP-BGP. +| | ... | [cfg] On DUT1 and DUT2 give Honeycomb control over the data-plane +| | ... | interfaces connecting DUT1 ad DUT2. Configure BGP peers on DUT1 +| | ... | and DUT2 with each other's IP address. On DUT2 configure a static +| | ... | IPv4 route using Honeycomb's BGP module. +| | ... | [ver] Verify that the route is present in BGP +| | ... | local RIB and VPP's routing table on each DUT. +| | ... +| | Given Peer operational data from Honeycomb should be +| | ... | ${dut1_node} | ${dut2_to_dut1_ip} +| | And Peer operational data from Honeycomb should be +| | ... | ${dut2_node} | ${dut1_to_dut2_ip} +| | When Honeycomb adds BGP peer +| | ... | ${dut2_node} | ${address_application} | ${peer_application} +| | And Honeycomb configures BGP route +| | ... | ${dut2_node} | ${address_application} | ${dut1_route} +| | ... | ${dut1_route_address} | ${dut1_route_id} | ipv4 +| | And Sleep | 5s | Wait for route advertisement. Retry timer is 5 seconds. +| | Then Routing data from Honeycomb should contain +| | ... | ${dut1_node} | learned-protocol-0 | ipv4 | ${route_operational} +| | And Routing data from Honeycomb should contain +| | ... | ${dut2_node} | learned-protocol-0 | ipv4 | ${route_operational} +| | And BGP Loc-RIB table should include | ${dut1_node} | ${rib_operational} +| | And BGP Loc-RIB table should include | ${dut2_node} | ${rib_operational} + +| TC13: Honeycomb sends IPv6 BGP route to connected peer +| | [Documentation] +| | ... | [top] TG-DUT1-DUT2-TG. +| | ... | [enc] Eth-IPv4-TCP-BGP. +| | ... | [cfg] On DUT1 and DUT2 give Honeycomb control over the data-plane +| | ... | interfaces connecting DUT1 ad DUT2. Configure BGP peers on DUT1 +| | ... | and DUT2 with each other's IP address. On DUT2 configure a static +| | ... | IPv6 route using Honeycomb's BGP module. +| | ... | [ver] Verify that the route is present in BGP +| | ... | local RIB and VPP's routing table on each DUT. +| | ... +# HONEYCOMB-403: Missing writers for IPv6 BGP route +| | [Tags] | EXPECTED_FAILING +| | Given Peer operational data from Honeycomb should be +| | ... | ${dut1_node} | ${dut2_to_dut1_ip} +| | And Peer operational data from Honeycomb should be +| | ... | ${dut2_node} | ${dut1_to_dut2_ip} +| | And Honeycomb adds BGP peer +| | ... | ${dut2_node} | ${address_application} | ${peer_application} +| | And Honeycomb configures BGP route +| | ... | ${dut2_node} | ${address_application} | ${dut1_route_ip6} +| | ... | ${dut1_route_ip6_address} | ${dut1_route_ip6_id} | ipv6 +| | And Sleep | 5s | Wait for route advertisement. Retry timer is 5 seconds. +| | Then Routing data from Honeycomb should contain +| | ... | ${dut1_node} | learned-protocol-0 | ipv6 | ${route_ip6_operational} +| | And Routing data from Honeycomb should contain +| | ... | ${dut2_node} | learned-protocol-0 | ipv6 | ${route_ip6_operational} +| | And BGP Loc-RIB table should include | ${dut1_node} | ${rib_ip6_operational} +| | And BGP Loc-RIB table should include | ${dut2_node} | ${rib_ip6_operational} + +#TODO: Add tests once implemented in HC: +# IPv6 neighbor, L2VPN, L3VPN, linkstate, route reflector, and more + +*** Keywords *** +| Configure IPv4 Management Interface +| | [Documentation] | Change one of VPP's data-plane interfaces on DUT into\ +| | ... | a control-plane interface that Honeycomb can listen on. Setup IP\ +| | ... | addresses on the link, create suite variables for traffic trests, set +| | ... | static ARP entries, then restart VPP and Honeycomb to apply changes. +| | ... +| | Configure path in 3-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']} +| | ${interface}= | Get Interface Name | ${dut1_node} | ${dut1_to_tg} +| | Set Suite Variable | ${interface} +| | Set Suite Variable | ${tg_node} +| | Set Suite Variable | ${dut1_node} +| | Set Suite Variable | ${dut2_node} +| | Set Suite Variable | ${dut1_to_tg} +| | Stop VPP service on DUT | ${dut1_node} +| | Stop VPP service on DUT | ${dut2_node} +| | Stop Honeycomb Service on DUTs | ${dut1_node} +| | Stop Honeycomb Service on DUTs | ${dut2_node} +| | Convert data-plane interface to control-plane +| | ... | ${dut1_node} | ${dut1_to_tg} +| | Convert data-plane interface to control-plane +| | ... | ${dut1_node} | ${dut1_to_dut2} +| | Convert data-plane interface to control-plane +| | ... | ${dut2_node} | ${dut2_to_dut1} +| | Sleep | 5sec | Wait until OS reclaims the interfaces. +| | ${tg_to_dut1_name}= | Get Interface Name by MAC +| | ... | ${tg_node} | ${tg_to_dut1_mac} +| | ${dut1_to_tg_name}= | Get Interface Name by MAC +| | ... | ${dut1_node} | ${dut1_to_tg_mac} +| | ${dut1_to_dut2_name}= | Get Interface Name by MAC +| | ... | ${dut1_node} | ${dut1_to_dut2_mac} +| | ${dut2_to_dut1_name}= | Get Interface Name by MAC +| | ... | ${dut2_node} | ${dut2_to_dut1_mac} +| | Set Suite Variable | ${dut1_to_tg_name} +| | Set Suite Variable | ${tg_to_dut1_name} +| | Set Suite Variable | ${dut1_to_dut2_name} +| | Set Suite Variable | ${dut2_to_dut1_name} +| | Set management interface address +| | ... | ${tg_node} | ${tg_to_dut1_name} +| | ... | ${tg_to_dut1_ip} | ${prefix} +| | Set management interface address +| | ... | ${dut1_node} | ${dut1_to_tg_name} +| | ... | ${dut1_to_tg_ip} | ${prefix} +| | Set management interface address +| | ... | ${dut1_node} | ${dut1_to_dut2_name} +| | ... | ${dut1_to_dut2_ip} | ${prefix} +| | Set management interface address +| | ... | ${dut2_node} | ${dut2_to_dut1_name} +| | ... | ${dut2_to_dut1_ip} | ${prefix} +| | Set Static ARP | ${tg_node} | ${dut1_to_tg_ip} | ${dut1_to_tg_mac} +| | Set Static ARP | ${dut1_node} | ${tg_to_dut1_ip} | ${tg_to_dut1_mac} +| | Set Static ARP | ${dut1_node} | ${dut2_to_dut1_ip} | ${dut2_to_dut1_mac} +| | Set Static ARP | ${dut2_node} | ${dut1_to_dut2_ip} | ${dut1_to_dut2_mac} +| | Enable Honeycomb Feature | ${dut2_node} | BGP +| | Configure BGP Module | ${dut1_node} | ${dut1_to_dut2_ip} +| | ... | ${bgp_port} | ${bgp_as_number} +| | Configure BGP Module | ${dut2_node} | ${dut2_to_dut1_ip} +| | ... | ${bgp_port} | ${bgp_as_number} +| | Start VPP service on DUT | ${dut1_node} +| | Start VPP service on DUT | ${dut2_node} +| | Configure Honeycomb service on DUTs | ${dut1_node} +| | Set Up Honeycomb Functional Test Suite | ${dut2_node} + +| Unconfigure IPv4 Management Interfaces +| | [Documentation] | Remove all IP addresses from the interface. +| | ... +| | Clear Interface Configuration | ${tg_node} | ${tg_to_dut1_name} +| | Clear Interface Configuration | ${dut1_node} | ${dut1_to_tg_name} +| | Clear Interface Configuration | ${dut1_node} | ${dut1_to_dut2_name} +| | Clear Interface Configuration | ${dut2_node} | ${dut2_to_dut1_name} + +| Set BGP Suite Variables +| | Configure path in 3-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']} +| | Set Suite Variable | ${interface} +| | Set Suite Variable | ${tg_node} +| | Set Suite Variable | ${dut1_node} +| | Set Suite Variable | ${dut2_node} +| | Set Suite Variable | ${dut1_to_tg} +| | Set Suite Variable | ${dut1_to_tg_name} +| | Set Suite Variable | ${tg_to_dut1_name} +| | Set Suite Variable | ${dut1_to_dut2_name} +| | Set Suite Variable | ${dut2_to_dut1_name}