diff options
4 files changed, 186 insertions, 51 deletions
diff --git a/resources/libraries/python/honeycomb/HcAPIKwInterfaces.py b/resources/libraries/python/honeycomb/HcAPIKwInterfaces.py index f317d06a69..19ce8f26c8 100644 --- a/resources/libraries/python/honeycomb/HcAPIKwInterfaces.py +++ b/resources/libraries/python/honeycomb/HcAPIKwInterfaces.py @@ -1635,7 +1635,7 @@ class InterfaceKeywords(object): " of disabled interfaces.".format(interface)) @staticmethod - def configure_interface_span(node, dst_interface, *src_interfaces): + def configure_interface_span(node, dst_interface, src_interfaces=None): """Configure SPAN port mirroring on the specified interfaces. If no source interface is provided, SPAN will be disabled. @@ -1644,29 +1644,35 @@ class InterfaceKeywords(object): :param src_interfaces: List of interfaces to mirror packets from. :type node: dict :type dst_interface: str - :type src_interfaces: list of str + :type src_interfaces: list of dict :returns: Content of response. :rtype: bytearray :raises HoneycombError: If SPAN could not be configured. """ - interface = dst_interface.replace("/", "%2F") + interface = Topology.convert_interface_reference( + node, dst_interface, "name") + interface = interface.replace("/", "%2F") path = "/interface/" + interface + "/span" if not src_interfaces: status_code, _ = HcUtil.delete_honeycomb_data( node, "config_vpp_interfaces", path) - - data = { - "span": { - "mirrored-interfaces": { - "mirrored-interface": src_interfaces + else: + for src_interface in src_interfaces: + src_interface["iface-ref"] = Topology.\ + convert_interface_reference( + node, src_interface["iface-ref"], "name") + data = { + "span": { + "mirrored-interfaces": { + "mirrored-interface": src_interfaces + } } } - } - status_code, _ = HcUtil.put_honeycomb_data( - node, "config_vpp_interfaces", data, path) + status_code, _ = HcUtil.put_honeycomb_data( + node, "config_vpp_interfaces", data, path) if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED): raise HoneycombError( diff --git a/resources/libraries/robot/honeycomb/port_mirroring.robot b/resources/libraries/robot/honeycomb/port_mirroring.robot index 854da311e9..81eedb944e 100644 --- a/resources/libraries/robot/honeycomb/port_mirroring.robot +++ b/resources/libraries/robot/honeycomb/port_mirroring.robot @@ -15,6 +15,10 @@ | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords | ... | WITH NAME | InterfaceAPI | Library | resources.libraries.python.telemetry.SPAN +| Library | resources.libraries.python.InterfaceUtil +| Library | resources.libraries.python.IPv4Util +| Library | resources.libraries.python.IPv4Setup +| Library | resources.libraries.python.Trace *** Keywords *** | Honeycomb Configures SPAN on interface @@ -24,17 +28,19 @@ | | ... | *Arguments:* | | ... | - node - information about a DUT node. Type: dictionary | | ... | - dst_interface - Mirroring destination interface. Type: string -| | ... | - src_interfaces - Mirroring source interfaces. Type: Argument list -\ -| | ... | any number of strings +| | ... | - src_interfaces - Mirroring source interfaces. Type: list \ +| | ... | of dictionaries | | ... | | ... | *Example:* | | ... | | ... | \| Honeycomb Configures SPAN on interface \| ${nodes['DUT1']} \ -| | ... | \| GigabitEthernet0/8/0 \| GigabitEthernet0/9/0 \| +| | ... | \| GigabitEthernet0/8/0 \| [{'iface-ref': 'GigabitEthernet0/10/0', \ +| | ... | \| 'state': 'transmit'}, \ +| | ... | \| {'iface-ref': 'local0', 'state': 'both'}] \| | | ... | | [Arguments] | ${node} | ${dst_interface} | @{src_interfaces} | | InterfaceAPI.Configure interface SPAN -| | ... | ${node} | ${dst_interface} | @{src_interfaces} +| | ... | ${node} | ${dst_interface} | ${src_interfaces} | Interface SPAN configuration from Honeycomb should be | | [Documentation] | Retrieves interface operational data and verifies that\ @@ -54,11 +60,28 @@ | | [Arguments] | ${node} | ${dst_interface} | @{src_interfaces} | | ${data}= | InterfaceAPI.Get interface oper data | ${node} | ${dst_interface} | | ${data}= | Set Variable -| | ... | ${data['span']['mirrored-interfaces']['mirrored-interface']} +| | ... | ${data['v3po:span']['mirrored-interfaces']['mirrored-interface']} | | Sort list | ${data} | | Sort list | ${src_interfaces} | | Lists should be equal | ${data} | ${src_interfaces} +| Interface SPAN configuration from Honeycomb should be empty +| | [Documentation] | Checks whether SPAN configuration from Honeycomb is empty. +| | ... +| | ... | *Arguments:* +| | ... | - node - Information about a DUT node. Type: dictionary +| | ... | - dst_interface - Mirroring destination interface. Type: string +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Interface SPAN configuration from Honeycomb should be empty \ +| | ... | \| ${node} \| GigabitEthernetO/8/0 \| +| | ... +| | [Arguments] | ${node} | ${dst_interface} +| | ${data}= | Get interface oper data | ${node} | ${dst_interface} +| | Variable should not exist +| | ... | ${data['v3po:span']['mirrored-interfaces']['mirrored-interface']} + | Interface SPAN configuration from VAT should be | | [Documentation] | Retrieves SPAN configuration from VAT dump and verifies\ | | ... | that SPAN mirroring is configured with the provided interfaces. diff --git a/resources/test_data/honeycomb/spanrx-apihc-apivat.py b/resources/test_data/honeycomb/spanrx-apihc-apivat.py new file mode 100644 index 0000000000..3f6a1e6a00 --- /dev/null +++ b/resources/test_data/honeycomb/spanrx-apihc-apivat.py @@ -0,0 +1,65 @@ +# Copyright (c) 2016 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. + +"""Test variables for SPAN port mirroring test suite.""" + + +def get_variables(node, + interface1, + interface2, + interface3 + ): + """Create and return a dictionary of test variables. + + :param node: Honeycomb node. + :param interface1: Name of an interface. + :param interface2: Name of an interface. + :param interface3: Name of an interface. + :type node: dict + :type interface1: string + :type interface2: string + :type interface3: string + + :returns: Dictionary of test variables - settings for Honeycomb's + SPAN port mirroring suite. + :rtype: dict + """ + variables = { + "interface1": interface1, + "interface2": interface2, + "interface3": interface3, + "settings_1": { + "state": "receive", + "iface-ref": interface2, + }, + + "settings_2": { + "state": "transmit", + "iface-ref": interface2, + }, + + "settings_3": { + "state": "both", + "iface-ref": interface2, + }, + + "settings_4": { + "state": "both", + "iface-ref": interface3, + }, + + "tg_to_dut_if1_ip": "192.168.1.1", + "dut_to_tg_if1_ip": "192.168.1.2", + "prefix": 24, + } + return variables diff --git a/tests/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot b/tests/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot index 46bfc1a3d5..cf1f4b880f 100644 --- a/tests/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot +++ b/tests/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot @@ -16,48 +16,89 @@ | Resource | resources/libraries/robot/honeycomb/port_mirroring.robot | Resource | resources/libraries/robot/honeycomb/interfaces.robot | Resource | resources/libraries/robot/honeycomb/honeycomb.robot -# Test suite out of date since https://gerrit.fd.io/r/4272 -# | Force Tags | honeycomb_sanity +| Resource | resources/libraries/robot/testing_path.robot +| Resource | resources/libraries/robot/telemetry/span.robot +| Variables | resources/test_data/honeycomb/spanrx-apihc-apivat.py +| ... | ${node} | ${node['interfaces']['port1']['name']} +| ... | ${node['interfaces']['port3']['name']} | local0 +| Force Tags | honeycomb_sanity | Suite Setup | Add Interface local0 To Topology | ${node} -| Suite Teardown | Run Keyword If Any Tests Failed -| | ... | Restart Honeycomb and VPP | ${node} +| Suite Teardown | Restart Honeycomb and VPP | ${node} | Documentation | *Honeycomb port mirroring test suite.* -*** Variables *** -| ${interface1}= | ${node['interfaces']['port1']['name']} -| ${interface2}= | ${node['interfaces']['port3']['name']} -| ${interface3}= | local0 - *** Test Cases *** -# TODO: Add verification once operational data is available (HONEYCOMB-306) -| TC01: Honeycomb can configure SPAN on an interface -| | [Documentation] | Honeycomb configures SPAN on interface and verifies/ -| | ... | against VPP SPAN dump. -| | Given SPAN configuration from VAT should not exist -| | ... | ${node} +| TC01: Honeycomb can configure SPAN on an interface receive +| | [Documentation] | Honeycomb configures SPAN on interface and verifies +| | ... | against VPP SPAN dump in state receive. +| | ... +| | When Honeycomb Configures SPAN on interface +| | ... | ${node} | ${interface1} | ${settings_1} +| | Then Interface SPAN configuration from Honeycomb should be +| | ... | ${node} | ${interface1} | ${settings_1} + +| TC02: Honeycomb can configure SPAN on an interface transmit +| | [Documentation] | Honeycomb configures SPAN on interface and verifies +| | ... | against VPP SPAN dump in state transmit. +| | ... +| | When Honeycomb Configures SPAN on interface +| | ... | ${node} | ${interface1} | ${settings_2} +| | Then Interface SPAN configuration from Honeycomb should be +| | ... | ${node} | ${interface1} | ${settings_2} + +| TC03: Honeycomb can configure SPAN on an interface both +| | [Documentation] | Honeycomb configures SPAN on interface and verifies +| | ... | against VPP SPAN dump in state both. +| | ... +| | When Honeycomb Configures SPAN on interface +| | ... | ${node} | ${interface1} | ${settings_3} +| | Then Interface SPAN configuration from Honeycomb should be +| | ... | ${node} | ${interface1} | ${settings_3} + +| TC04: Honeycomb can configure SPAN on two interfaces +| | [Documentation] | Honeycomb configures SPAN on interface and verifies +| | ... | against VPP SPAN dump in state both. +| | ... | | When Honeycomb Configures SPAN on interface -| | ... | ${node} | ${interface1} | ${interface2} -| | Then Interface SPAN configuration from VAT should be -| | ... | ${node} | ${interface1} | ${interface2} +| | ... | ${node} | ${interface1} | ${settings_2} | ${settings_4} +| | Then Interface SPAN configuration from Honeycomb should be +| | ... | ${node} | ${interface1} | ${settings_2} | ${settings_4} -| TC02: Honeycomb can disable SPAN on interface -| | [Documentation] | Honeycomb removes existing SPAN configuration\ -| | ... | on interface and verifies against VPP SPAN dump. -| | Given Interface SPAN configuration from VAT should be -| | ... | ${node} | ${interface1} | ${interface2} +| TC05: Honeycomb can disable SPAN on interface +| | [Documentation] | Honeycomb removes existing SPAN configuration +| | ... | on interface. +| | ... +| | Given Interface SPAN configuration from Honeycomb should be +| | ... | ${node} | ${interface1} | ${settings_2} | ${settings_4} | | When Honeycomb removes interface SPAN configuration | | ... | ${node} | ${interface1} -| | Then SPAN configuration from VAT should not exist -| | ... | ${node} +| | Then Interface SPAN configuration from Honeycomb should be empty +| | ... | ${node} | ${interface1} -| TC03: Honeycomb can configure SPAN on one interface to mirror two interfaces -| | [Documentation] | Honeycomb configures SPAN on interface, mirroring\ -| | ... | two interfaces at the same time. Then verifies against VPP SPAN dump. -| | [Teardown] | Honeycomb removes interface SPAN configuration -| | ... | ${node} | ${interface1} -| | Given SPAN configuration from VAT should not exist -| | ... | ${node} +| TC06: DUT mirrors IPv4 packets from one interface to another +| | [TearDown] | Show Packet Trace on All DUTs | ${nodes} +| | [Documentation] +| | ... | [Top] TG=DUT1 +| | ... | [Cfg] (using Honeycomb) On DUT1 configure IPv4 address and set SPAN\ +| | ... | mirroring from one DUT interface to the other. +| | ... | [Ver] Make TG send an ARP packet to DUT through one interface,\ +| | ... | then receive a copy of sent packet and of DUT's ARP reply\ +| | ... | on the second interface. +| | ... +| | Path for 2-node testing is set +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | Honeycomb sets interface state | ${dut_node} | ${dut_to_tg_if1} | up +| | Honeycomb sets interface state | ${dut_node} | ${dut_to_tg_if2} | up +| | Honeycomb sets interface ipv4 address with prefix | ${dut_node} +| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix} +| | Add ARP on DUT +| | ... | ${node} | ${dut_to_tg_if1} | ${tg_to_dut_if1_ip} +| | ... | ${tg_to_dut_if1_mac} +| | ${settings_5}= | create dictionary | state=both +| | ... | iface-ref=${dut_to_tg_if1} +| | InterfaceCLI.All Vpp Interfaces Ready Wait | ${nodes} | | When Honeycomb Configures SPAN on interface -| | ... | ${node} | ${interface1} | ${interface2} | ${interface3} -| | Then Interface SPAN configuration from VAT should be -| | ... | ${node} | ${interface1} | ${interface2} | ${interface3} +| | ... | ${node} | ${dut_to_tg_if2} | ${settings_5} +| | Then Send Packet And Check Received Copies | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac} +| | ... | ${dut_to_tg_if1_mac} | ${tg_to_dut_if2} +| | ... | ${tg_to_dut_if1_ip} | ${dut_to_tg_if1_ip} | ICMP |