HC Test: SPAN Port Mirroring Suite 39/5839/7
authorjan.hradil <jan.hradil@pantheon.tech>
Thu, 23 Mar 2017 12:16:18 +0000 (13:16 +0100)
committerTibor Frank <tifrank@cisco.com>
Thu, 30 Mar 2017 11:45:03 +0000 (11:45 +0000)
Change-Id: Ideaae09aa0d062460f5dfb3e3732dee67d6a5aea
Signed-off-by: jan.hradil <jan.hradil@pantheon.tech>
resources/libraries/python/honeycomb/HcAPIKwInterfaces.py
resources/libraries/robot/honeycomb/port_mirroring.robot
resources/test_data/honeycomb/spanrx-apihc-apivat.py [new file with mode: 0644]
tests/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot

index f317d06..19ce8f2 100644 (file)
@@ -1635,7 +1635,7 @@ class InterfaceKeywords(object):
                              " of disabled interfaces.".format(interface))
 
     @staticmethod
                              " 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.
 
         """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
         :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.
         """
 
         :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)
         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(
 
         if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
             raise HoneycombError(
index 854da31..81eedb9 100644 (file)
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
 | ...     | WITH NAME | InterfaceAPI
 | Library | resources.libraries.python.telemetry.SPAN
 | 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
 
 *** Keywords ***
 | Honeycomb Configures SPAN on interface
 | | ... | *Arguments:*
 | | ... | - node - information about a DUT node. Type: dictionary
 | | ... | - dst_interface - Mirroring destination interface. Type: string
 | | ... | *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']} \
 | | ...
 | | ... | *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
 | | ...
 | | [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\
 
 | Interface SPAN configuration from Honeycomb should be
 | | [Documentation] | Retrieves interface operational data and verifies that\
 | | [Arguments] | ${node} | ${dst_interface} | @{src_interfaces}
 | | ${data}= | InterfaceAPI.Get interface oper data | ${node} | ${dst_interface}
 | | ${data}= | Set Variable
 | | [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}
 
 | | 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.
 | 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 (file)
index 0000000..3f6a1e6
--- /dev/null
@@ -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
index 46bfc1a..cf1f4b8 100644 (file)
 | Resource | resources/libraries/robot/honeycomb/port_mirroring.robot
 | Resource | resources/libraries/robot/honeycomb/interfaces.robot
 | Resource | resources/libraries/robot/honeycomb/honeycomb.robot
 | 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 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.*
 
 | Documentation | *Honeycomb port mirroring test suite.*
 
-*** Variables ***
-| ${interface1}= | ${node['interfaces']['port1']['name']}
-| ${interface2}= | ${node['interfaces']['port3']['name']}
-| ${interface3}= | local0
-
 *** Test Cases ***
 *** 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
 | | 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}
 | | 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
 | | 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