HC Test: improve functional suite setup and teardown 57/7257/17
authorselias <samelias@cisco.com>
Wed, 21 Jun 2017 16:52:10 +0000 (18:52 +0200)
committerTibor Frank <tifrank@cisco.com>
Mon, 26 Jun 2017 12:39:32 +0000 (12:39 +0000)
Restart the whole stack (VPP+Honeycomb+-ODL) in between test suites.
Add generic suite setup and suite teardown keywords for all func suites
Re-enable NSH_SFC suite, cleanup test failures

Change-Id: I71025b4ed3a7c4912dcd7b62aedef6082357990c
Signed-off-by: selias <samelias@cisco.com>
43 files changed:
resources/libraries/python/honeycomb/HcAPIKwInterfaces.py
resources/libraries/python/honeycomb/HoneycombSetup.py
resources/libraries/robot/honeycomb/access_control_lists.robot
resources/libraries/robot/honeycomb/bridge_domain.robot
resources/libraries/robot/honeycomb/honeycomb.robot
resources/libraries/robot/honeycomb/interfaces.robot
resources/libraries/robot/honeycomb/l2_fib.robot
resources/libraries/robot/honeycomb/nsh.robot
resources/libraries/robot/honeycomb/persistence.robot
resources/libraries/robot/honeycomb/policer.robot
resources/libraries/robot/honeycomb/port_mirroring.robot
resources/libraries/robot/honeycomb/provider_backbone_bridge.robot
resources/libraries/robot/honeycomb/slaac.robot
resources/libraries/robot/honeycomb/sub_interface.robot
resources/libraries/robot/honeycomb/tap.robot
resources/libraries/robot/honeycomb/vhost_user.robot
resources/libraries/robot/honeycomb/vxlan.robot
resources/libraries/robot/honeycomb/vxlan_gpe.robot
tests/func/honeycomb/__init__.robot
tests/func/honeycomb/mgmt-cfg-acl-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-dhcp-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-int-apihcnc-func.robot
tests/func/honeycomb/mgmt-cfg-int-subint-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-intip4-intip6-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-inttap-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-intvhost-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-l2bd-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-l2fib-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-lisp-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-nsh-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-pbb-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-policer-apihc-func.robot
tests/func/honeycomb/mgmt-cfg-proxyarp-apihc-func.robot
tests/func/honeycomb/mgmt-cfg-proxynd6-apihc-func.robot
tests/func/honeycomb/mgmt-cfg-routing-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-slaac-apihc-func.robot
tests/func/honeycomb/mgmt-cfg-snat44-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-vxlan-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-vxlangpe-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-notif-apihcnc-func.robot
tests/func/honeycomb/mgmt-statepersist-apihc-func.robot

index 1e0b1a5..6f0bdda 100644 (file)
@@ -252,7 +252,7 @@ class InterfaceKeywords(object):
         return InterfaceKeywords._configure_interface(node, interface, new_data)
 
     @staticmethod
-    def set_interface_state(node, interface, state="up"):
+    def honeycomb_set_interface_state(node, interface, state="up"):
         """Set VPP interface state.
 
         The keyword changes the administration state of interface to up or down
@@ -310,7 +310,8 @@ class InterfaceKeywords(object):
         :rtype: bytearray
         """
 
-        return InterfaceKeywords.set_interface_state(node, interface, "up")
+        return InterfaceKeywords.honeycomb_set_interface_state(
+            node, interface, "up")
 
     @staticmethod
     def set_interface_down(node, interface):
@@ -324,7 +325,8 @@ class InterfaceKeywords(object):
         :rtype: bytearray
         """
 
-        return InterfaceKeywords.set_interface_state(node, interface, "down")
+        return InterfaceKeywords.honeycomb_set_interface_state(
+            node, interface, "down")
 
     @staticmethod
     def add_bridge_domain_to_interface(node, interface, bd_name,
@@ -796,7 +798,7 @@ class InterfaceKeywords(object):
             node, interface, path, value)
 
     @staticmethod
-    def create_vxlan_interface(node, interface, **kwargs):
+    def honeycomb_create_vxlan_interface(node, interface, **kwargs):
         """Create a new VxLAN interface.
 
         :param node: Honeycomb node.
@@ -860,7 +862,7 @@ class InterfaceKeywords(object):
         return resp
 
     @staticmethod
-    def configure_interface_vxlan(node, interface, **kwargs):
+    def honeycomb_configure_interface_vxlan(node, interface, **kwargs):
         """Configure VxLAN on the interface.
 
         The keyword configures VxLAN parameters on the given interface. The type
@@ -1052,7 +1054,8 @@ class InterfaceKeywords(object):
             node, interface, path, new_vhost_structure)
 
     @staticmethod
-    def create_sub_interface(node, super_interface, match, tags=None, **kwargs):
+    def honeycomb_create_sub_interface(node, super_interface, match, tags=None,
+                                       **kwargs):
         """Create a new sub-interface.
 
         :param node: Honeycomb node.
index 5026cb4..53130f4 100644 (file)
@@ -59,7 +59,7 @@ class HoneycombSetup(object):
 
         HoneycombSetup.print_environment(nodes)
 
-        logger.console("\nStarting Honeycomb service ...")
+        logger.console("\n(re)Starting Honeycomb service ...")
 
         cmd = "sudo service honeycomb start"
 
@@ -106,41 +106,6 @@ class HoneycombSetup(object):
             raise HoneycombError('Node(s) {0} failed to stop Honeycomb.'.
                                  format(errors))
 
-    @staticmethod
-    def restart_honeycomb_and_vpp_on_duts(*nodes):
-        """Restart the Honeycomb service on specified DUT nodes.
-
-        Use the keyword "Check Honeycomb Startup State" to check when Honeycomb
-        is fully restarted.
-        :param nodes: List of nodes to restart Honeycomb on.
-        :type nodes: list
-        :raises HoneycombError: If Honeycomb failed to restart.
-        """
-        logger.console("\nRestarting Honeycomb service ...")
-
-        cmd = "sudo service honeycomb restart "
-        errors = []
-
-        for node in nodes:
-            if node['type'] == NodeType.DUT:
-                ssh = SSH()
-                ssh.connect(node)
-                (ret_code, _, _) = ssh.exec_command_sudo(cmd)
-                if int(ret_code) != 0:
-                    errors.append(node['host'])
-                try:
-                    DUTSetup.setup_dut(node)
-                except Exception as err:
-                    logger.debug(err)
-                    errors.append(node['host'])
-                    continue
-                logger.info("Restart of Honeycomb and VPP on node {0} is "
-                            "in progress ...".format(node['host']))
-        if errors:
-            raise HoneycombError('Node(s) {0} failed to restart Honeycomb'
-                                 ' and/or VPP.'.
-                                 format(errors))
-
     @staticmethod
     def check_honeycomb_startup_state(*nodes):
         """Check state of Honeycomb service during startup on specified nodes.
@@ -362,16 +327,19 @@ class HoneycombSetup(object):
                                  "node {0}, {1}".format(node, stderr))
 
     @staticmethod
-    def enable_module_features(node, *features):
-        """Configure Honeycomb to use VPP modules that are disabled by default.
+    def manage_honeycomb_features(node, feature, disable=False):
+        """Configure Honeycomb to use features that are disabled by default, or
+        disable previously enabled features.
 
         ..Note:: If the module is not enabled in VPP, Honeycomb will
         be unable to establish VPP connection.
 
         :param node: Honeycomb node.
-        :param features: Features to enable.
+        :param feature: Feature to enable.
+        :param disable: Disable the specified feature instead of enabling it.
         :type node: dict
-        :type features: string
+        :type feature: string
+        :type disable: bool
         :raises HoneycombError: If the configuration could not be changed.
          """
 
@@ -382,23 +350,24 @@ class HoneycombSetup(object):
         ssh = SSH()
         ssh.connect(node)
 
-        for feature in features:
-            if feature in disabled_features.keys():
-                # uncomment by replacing the entire line
-                find = replace = "{0}".format(disabled_features[feature])
-
-                argument = '"/{0}/c\\ {1}"'.format(find, replace)
-                path = "{0}/modules/*module-config"\
-                    .format(Const.REMOTE_HC_DIR)
-                command = "sed -i {0} {1}".format(argument, path)
-
-                (ret_code, _, stderr) = ssh.exec_command_sudo(command)
-                if ret_code != 0:
-                    raise HoneycombError("Failed to modify configuration on "
-                                         "node {0}, {1}".format(node, stderr))
-            else:
-                raise HoneycombError(
-                    "Unrecognized feature {0}.".format(feature))
+        if feature in disabled_features.keys():
+            # uncomment by replacing the entire line
+            find = replace = "{0}".format(disabled_features[feature])
+            if disable:
+                replace = "// {0}".format(find)
+
+            argument = '"/{0}/c\\ {1}"'.format(find, replace)
+            path = "{0}/modules/*module-config"\
+                .format(Const.REMOTE_HC_DIR)
+            command = "sed -i {0} {1}".format(argument, path)
+
+            (ret_code, _, stderr) = ssh.exec_command_sudo(command)
+            if ret_code != 0:
+                raise HoneycombError("Failed to modify configuration on "
+                                     "node {0}, {1}".format(node, stderr))
+        else:
+            raise HoneycombError(
+                "Unrecognized feature {0}.".format(feature))
 
     @staticmethod
     def copy_java_libraries(node):
@@ -438,37 +407,51 @@ class HoneycombSetup(object):
                                      "node {0}, {1}".format(node, stderr))
 
     @staticmethod
-    def configure_odl_client(node, odl_name):
-        """Start ODL client on the specified node.
+    def copy_odl_client(node, odl_name, src_path, dst_path):
+        """Copy ODL Client from source path to destination path.
 
-        Karaf should be located in /mnt/common, and VPP and Honeycomb should
-        already be running, otherwise the start will fail.
-        :param node: Node to start ODL client on.
+        :param node: Honeycomb node.
         :param odl_name: Name of ODL client version to use.
+        :param src_path: Source Path where to find ODl client.
+        :param dst_path: Destination path.
         :type node: dict
         :type odl_name: str
-        :raises HoneycombError: If Honeycomb fails to start.
+        :type src_path: str
+        :type dst_path: str
+        :raises HoneycombError: If the operation fails.
         """
 
-        logger.debug("Copying ODL Client to home dir.")
-
         ssh = SSH()
         ssh.connect(node)
 
-        cmd = "cp -r /mnt/common/*karaf_{name}* ~/karaf".format(name=odl_name)
+        cmd = "cp -r {src}/*karaf_{odl_name}* {dst}".format(
+            src=src_path, odl_name=odl_name, dst=dst_path)
 
-        (ret_code, _, _) = ssh.exec_command_sudo(cmd)
+        ret_code, _, _ = ssh.exec_command(cmd, timeout=30)
         if int(ret_code) != 0:
             raise HoneycombError(
                 "Failed to copy ODL client on node {0}".format(node["host"]))
 
-        logger.console("\nStarting ODL client ...")
+    @staticmethod
+    def setup_odl_client(node, path):
+        """Start ODL client on the specified node.
 
-        cmd = "~/*karaf*/bin/start"
+        Karaf should be located in the provided path, and VPP and Honeycomb
+        should already be running, otherwise the start will fail.
+        :param node: Node to start ODL client on.
+        :param path: Path to ODL client on node.
+        :type node: dict
+        :type path: str
+        :raises HoneycombError: If Honeycomb fails to start.
+        """
 
+        logger.console("\nStarting ODL client ...")
         ssh = SSH()
         ssh.connect(node)
-        (ret_code, _, _) = ssh.exec_command_sudo(cmd)
+
+        cmd = "{path}/*karaf*/bin/start clean".format(path=path)
+        ret_code, _, _ = ssh.exec_command_sudo(cmd)
+
         if int(ret_code) != 0:
             raise HoneycombError('Node {0} failed to start ODL.'.
                                  format(node['host']))
@@ -476,6 +459,31 @@ class HoneycombSetup(object):
             logger.info("Starting the ODL client on node {0} is "
                         "in progress ...".format(node['host']))
 
+    @staticmethod
+    def install_odl_features(node, path, *features):
+        """Install required features on a running ODL client.
+
+        :param node: Honeycomb node.
+        :param path: Path to ODL client on node.
+        :param features: Optional, list of additional features to install.
+        :type node: dict
+        :type path: str
+        :type features: list
+        """
+
+        ssh = SSH()
+        ssh.connect(node)
+
+        cmd = "{path}/*karaf*/bin/client -u karaf feature:install " \
+              "odl-restconf-all odl-netconf-connector-all".format(path=path)
+        for feature in features:
+            cmd += " {0}".format(feature)
+
+        ret_code, _, stderr = ssh.exec_command_sudo(cmd, timeout=120)
+
+        if int(ret_code) != 0:
+            raise HoneycombError("Feature install did not succeed.")
+
     @staticmethod
     def check_odl_startup_state(node):
         """Check the status of ODL client startup.
@@ -537,6 +545,52 @@ class HoneycombSetup(object):
         if status_code == HTTPCodes.OK:
             logger.info("ODL mount point configured successfully.")
         elif status_code == HTTPCodes.CONFLICT:
-            logger.warn("ODL mount point was already configured.")
+            logger.info("ODL mount point was already configured.")
         else:
             raise HoneycombError('Mount point configuration not successful')
+
+    @staticmethod
+    def stop_odl_client(node, path):
+        """Stop ODL client service on the specified node.
+
+        :param node: Node to start ODL client on.
+        :param path: Path to ODL client.
+        :type node: dict
+        :type path: str
+        :raises HoneycombError: If ODL client fails to stop.
+        """
+
+        ssh = SSH()
+        ssh.connect(node)
+
+        cmd = "{0}/*karaf*/bin/stop".format(path)
+
+        ssh = SSH()
+        ssh.connect(node)
+        ret_code, _, _ = ssh.exec_command_sudo(cmd)
+        if int(ret_code) != 0:
+            logger.warn("ODL Client refused to shut down.")
+            cmd = "pkill -f 'karaf'"
+            (ret_code, _, _) = ssh.exec_command_sudo(cmd)
+            if int(ret_code) != 0:
+                raise HoneycombError('Node {0} failed to stop ODL.'.
+                                     format(node['host']))
+
+        logger.info("ODL client service stopped.")
+
+    @staticmethod
+    def stop_vpp_service(node):
+        """Stop VPP service on the specified node.
+
+        :param node: VPP node.
+        :type node: dict
+        :raises RuntimeError: If VPP fails to stop.
+        """
+
+        ssh = SSH()
+        ssh.connect(node)
+        cmd = "service vpp stop"
+        ret_code, _, _ = ssh.exec_command_sudo(cmd)
+        if int(ret_code) != 0:
+            raise RuntimeError("Could not stop VPP service on node {0}".format(
+                node['host']))
index 1d42cf1..3f0b3d0 100644 (file)
@@ -18,7 +18,6 @@
 | Library | resources.libraries.python.InterfaceUtil
 | Library | resources.libraries.python.honeycomb.HcAPIKwACL.ACLKeywords
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 | Documentation | Keywords used to manage ACLs.
 
 *** Keywords ***
@@ -92,7 +91,7 @@
 | | ... | \| Honeycomb enables ACL on interface \| ${nodes['DUT1']} \
 | | ... | \| GigabithEthernet0/8/0 \| table0 \|
 | | [Arguments] | ${node} | ${interface} | ${table_name}
-| | InterfaceAPI.Enable ACL on interface
+| | Enable ACL on interface
 | | ... | ${node} | ${interface} | ${table_name}
 
 | Honeycomb disables ACL on interface
 | | ... | \| Honeycomb disables ACL on interface \| ${nodes['DUT1']} \
 | | ... | \| GigabithEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
-| | InterfaceAPI.Disable ACL on interface | ${node} | ${interface}
+| | Disable ACL on interface | ${node} | ${interface}
 
 | ACL table from Honeycomb should be
 | | [Documentation] | Retrieves ACL table information from Honeycomb\
 | | ... | \| Interface ACL configuration from Honeycomb should be \
 | | ... | \| ${nodes['DUT1']} \| GigabithEthernet0/8/0 \| table0 \|
 | | [Arguments] | ${node} | ${interface} | ${table_name}
-| | ${data}= | InterfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${data}= | Get interface oper data | ${node} | ${interface}
 | | Should be equal
 | | ... | ${table_name}
 | | ... | ${data['vpp-interface-acl:acl']['ingress']['l2-acl']['classify-table']}
 | | ... | \| Interface ACL configuration from Honeycomb should be empty \
 | | ... | \| ${nodes['DUT1']} \| GigabithEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
-| | ${data}= | InterfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${data}= | Get interface oper data | ${node} | ${interface}
 | | Run keyword and expect error | *KeyError: 'vpp-interface-acl:acl'
 | | ... | Set Variable
 | | ... | ${data['vpp-interface-acl:acl']['l2-acl']['classify-table']}
index e680e82..e26c18d 100644 (file)
@@ -15,9 +15,7 @@
 | Library | resources.libraries.python.L2Util
 | Library | resources.libraries.python.honeycomb.HcAPIKwBridgeDomain.BridgeDomainKeywords
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 | Library | resources.libraries.python.InterfaceUtil
-| ...     | WITH NAME | interfaceCLI
 
 *** Keywords ***
 | Honeycomb creates first L2 bridge domain
 | | ... | \| ${{split_horizon_group:2, bvi:False}} \|
 | | [Arguments] | ${node} | ${interface1} | ${interface2} | ${bd_name}
 | | ... | ${settings}
-| | interfaceAPI.Add bridge domain to interface
+| | Add bridge domain to interface
 | | ... | ${node} | ${interface1} | ${bd_name} | &{settings}
-| | interfaceAPI.Add bridge domain to interface
+| | Add bridge domain to interface
 | | ... | ${node} | ${interface2} | ${bd_name} | &{settings}
 
 | Honeycomb should show interfaces assigned to bridge domain
 | | ... | \| bd-04 \| ${{split_horizon_group:2, bvi:False}} \|
 | | [Arguments] | ${node} | ${interface1} | ${interface2} | ${bd_name}
 | | ... | ${settings}
-| | ${if1_data}= | interfaceAPI.Get interface oper data
+| | ${if1_data}= | Get interface oper data
 | | ... | ${node} | ${interface1}
-| | ${if2_data}= | interfaceAPI.Get interface oper data
+| | ${if2_data}= | Get interface oper data
 | | ... | ${node} | ${interface2}
 | | Should be equal | ${if1_data['v3po:l2']['bridge-domain']}
 | | ... | ${if2_data['v3po:l2']['bridge-domain']} | ${bd_name}
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${bd_name} | ${settings}
 | | ...
-| | interfaceAPI.Add bridge domain to interface
+| | Add bridge domain to interface
 | | ... | ${node} | ${interface} | ${bd_name}
 | | ... | ${settings['split-horizon-group']}
 | | ... | ${settings['bridged-virtual-interface']}
 | | ...
 | | [Arguments] | ${node} | ${interface}
 | | ...
-| | ${if_data}= | interfaceAPI.Get BD Oper Data From Interface
+| | ${if_data}= | Get BD Oper Data From Interface
 | | ... | ${node} | ${interface}
 | | Should be empty | ${if_data}
 
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${bd_settings}
 | | ...
-| | ${if_data}= | interfaceAPI.Get BD Oper Data From Interface
+| | ${if_data}= | Get BD Oper Data From Interface
 | | ... | ${node} | ${interface}
-| | interfaceAPI.Compare Data Structures | ${if_data} | ${bd_settings}
+| | Compare Data Structures | ${if_data} | ${bd_settings}
index d14dd2d..603fbfa 100644 (file)
 # limitations under the License.
 
 *** Settings ***
-| Library | resources/libraries/python/honeycomb/HoneycombSetup.py
-| Library | resources/libraries/python/honeycomb/HoneycombUtil.py
-| Library | resources/libraries/python/honeycomb/HcPersistence.py
+| Library | resources.libraries.python.honeycomb.HoneycombSetup
+| Library | resources.libraries.python.honeycomb.HoneycombUtil
+| Library | resources.libraries.python.honeycomb.HcPersistence
+| Library | resources.libraries.python.DUTSetup
+| Library | resources.libraries.python.InterfaceUtil
 
 *** Keywords ***
 | Configure Honeycomb service on DUTs
@@ -85,7 +87,6 @@
 | | ... | \| Restart Honeycomb and VPP and clear persisted configuration \
 | | ... | \| ${nodes['DUT1']} \|
 | | [Arguments] | ${node}
-| | Log | Performing clean restart of Honeycomb and VPP. | console=True
 | | Stop Honeycomb service on DUTs | ${node}
 | | Clear persisted Honeycomb configuration | ${node}
 | | Setup DUT | ${node}
 | | ...
 | | ... | \| Restart Honeycomb and VPP \| ${nodes['DUT1']} \|
 | | [Arguments] | ${node}
-| | Log | Performing clean restart of Honeycomb and VPP. | console=True
-| | Restart Honeycomb and VPP on DUTs | ${node}
-| | Wait until keyword succeeds | 4min | 16sec
-| | ... | Check honeycomb startup state | ${node}
+| | Stop Honeycomb service on DUTs | ${node}
+| | Setup DUT | ${node}
+| | Configure Honeycomb service on DUTs | ${node}
 
 | Archive Honeycomb log file
 | | [Documentation] | Copy honeycomb.log file from Honeycomb node\
 | | ... | to test executor.
+| | ...
 | | ... | *Arguments:*
 | | ... | - node - information about a DUT node. Type: dictionary
 | | ...
 | | Archive Honeycomb log | ${node}
 
 | Configure ODL Client Service On DUT
+| | [Documentation] | Configure and start ODL client, then repeatedly check if
+| | ... | it is running.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ... | - odl_name - Name of ODL client version. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Configure ODL Client Service on DUT \| ${nodes['DUT1']} \
+| | ... | \| carbon-SR1 \|
 | | [Arguments] | ${node} | ${odl_name}
-| | Configure ODL client | ${node} | ${odl_name}
+| | Copy ODL Client | ${node} | ${odl_name} | /mnt/common | /tmp
+| | Setup ODL Client | ${node} | /tmp
+| | Wait until keyword succeeds | 2min | 30sec
+| | ... | Install ODL Features | ${node} | /tmp
 | | Wait until keyword succeeds | 4min | 16sec
 | | ... | Mount Honeycomb on ODL | ${node}
 | | Wait until keyword succeeds | 2min | 16sec
 | | ... | Check ODL startup state | ${node}
 | | Wait until keyword succeeds | 2min | 16sec
 | | ... | Check honeycomb startup state | ${node}
+
+| Configure Honeycomb for functional testing
+| | [Documentation] | Configure Honeycomb with parameters for functional
+| | ... | testing, then start Honeycomb and repeatedly check startup status.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Configure Honeycomb for functional testing \| ${nodes['DUT1']} \|
+| | [Arguments] | ${node}
+| | Configure Restconf binding address | ${node}
+| | Configure Log Level | ${node} | TRACE
+| | Configure Persistence | ${node} | disable
+| | Configure jVPP timeout | ${node} | ${14}
+| | Clear Persisted Honeycomb Configuration | ${node}
+| | Configure Honeycomb service on DUTs | ${node}
+
+| Configure ODL Client for functional testing
+| | [Documentation] | Read external variable HC_ODL. Depending on its
+| | ... | value either: do nothing, or setup ODL client for testing and
+| | ... | create a global variable that modifies Restconf requests to use ODL.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Configure ODL Client for functional testing \| ${nodes['DUT1']} \|
+| | [Arguments] | ${node}
+| | ${use_odl_client}= | Get Variable Value | ${HC_ODL}
+| | Run Keyword If | '${use_odl_client}' != '${NONE}'
+| | ... | Run Keywords
+| | ... | Set Global Variable | ${use_odl_client} | AND
+| | ... | Configure ODL Client Service On DUT | ${node} | ${use_odl_client}
+| | ... | ELSE | Log | Variable HC_ODL is not present. Not using ODL.
+| | ... | level=INFO
+
+| Set Up Honeycomb Functional Test Suite
+| | [Documentation] | Generic test suite setup for Honeycomb functional tests.
+| | ... | Restarts VPP, then enables Honeycomb and optionally ODL, based
+| | ... | on external variable.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Set Up Honeycomb Functional Test Suite \| ${nodes['DUT1']} \|
+| | [Arguments] | ${node}
+| | Setup DUT | ${node}
+| | Configure all TGs for traffic script
+| | Configure Honeycomb for functional testing | ${node}
+| | Configure ODL Client for functional testing | ${node}
+
+| Tear Down Honeycomb Functional Test Suite
+| | [Documentation] | Generic test suite teardown for Honeycomb functional
+| | ... | tests. Stops ODL client (if used), then stops Honeycomb and verifies
+| | ... | that they are both stopped.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Tear Down Honeycomb Functional Test Suite \| ${nodes['DUT1']} \|
+| | [Arguments] | ${node}
+| | ${use_odl_client}= | Get Variable Value | ${HC_ODL}
+| | Run Keyword If | '${use_odl_client}' != '${NONE}'
+| | ... | Run Keywords
+| | ... | Stop ODL Client | ${node} | /tmp
+| | ... | ${use_odl_client}= | Set Variable | ${NONE}
+| | ... | Set Global Variable | ${use_odl_client}
+| | Stop Honeycomb service on DUTs | ${node}
+
+| Enable Honeycomb Feature
+| | [Documentation] | Enable the specified feature in Honeycomb configuration.
+| | ... | Requires a restart of Honeycomb to take effect.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Enable Honeycomb Feature \| ${nodes['DUT1']} \| NSH \|
+| | [arguments] | ${node} | ${feature}
+| | Manage Honeycomb Features | ${node} | ${feature}
+
+| Disable Honeycomb Feature
+| | [Documentation] | Disable the specified feature in Honeycomb configuration.
+| | ... | Requires a restart of Honeycomb to take effect.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Disable Honeycomb Feature \| ${nodes['DUT1']} \| NSH \|
+| | [arguments] | ${node} | ${feature}
+| | Manage Honeycomb Features | ${node} | ${feature} | disable=${True}
\ No newline at end of file
index 95c6ece..461a495 100644 (file)
@@ -13,9 +13,7 @@
 
 *** Settings ***
 | Library | resources.libraries.python.InterfaceUtil
-| ...     | WITH NAME | interfaceCLI
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 | Library | resources.libraries.python.IPv4Util
 | Library | resources.libraries.python.TrafficScriptExecutor
 
@@ -34,7 +32,7 @@
 | | ... | \| Honeycomb configures interface state \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| up \|
 | | [Arguments] | ${node} | ${interface} | ${state}
-| | interfaceAPI.Set interface state | ${node} | ${interface} | ${state}
+| | Honeycomb Set Interface State | ${node} | ${interface} | ${state}
 
 | Interface state from Honeycomb should be
 | | [Documentation] | Retrieves interface admin state through Honeycomb and\
@@ -50,7 +48,7 @@
 | | ... | \| Interface state from Honeycomb should be \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| up \|
 | | [Arguments] | ${node} | ${interface} | ${state}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | ${api_state}= | Set Variable | ${api_data['admin-status']}
 | | Should be equal | ${api_state} | ${state}
 
@@ -71,7 +69,7 @@
 | | ... | \| Interface state from VAT should be \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| up \|
 | | [Arguments] | ${node} | ${interface} | ${state}
-| | ${vat_data}= | InterfaceCLI.VPP get interface data | ${node} | ${interface}
+| | ${vat_data}= | VPP get interface data | ${node} | ${interface}
 | | ${vat_state}= | Set Variable if
 | | ... | ${vat_data['admin_up_down']} == 1 | up | down
 | | Should be equal | ${vat_state} | ${state}
@@ -91,7 +89,7 @@
 | | ... | \| Honeycomb sets interface IPv4 address \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 255.255.255.0 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${netmask}
-| | interfaceAPI.Add first ipv4 address
+| | Add first ipv4 address
 | | ... | ${node} | ${interface} | ${address} | ${netmask}
 
 | Honeycomb sets interface IPv4 address with prefix
 | | ... | \| Honeycomb sets interface IPv4 address with prefix \
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 24 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | interfaceAPI.Add first ipv4 address
+| | Add first ipv4 address
 | | ... | ${node} | ${interface} | ${address} | ${prefix}
 
 | Honeycomb adds interface IPv4 address
 | | ... | \| Honeycomb adds interface IPv4 address \
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 24 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | interfaceAPI.Add ipv4 address
+| | Add ipv4 address
 | | ... | ${node} | ${interface} | ${address} | ${prefix}
 
 | Honeycomb fails to add interface IPv4 address
 | | ... | \| IPv4 address from Honeycomb should be \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.2 \| ${24} \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | ${settings}= | Create Dictionary
 | | ... | ip=${address} | prefix-length=${prefix}
 | | Should contain | ${api_data['ietf-ip:ipv4']['address']} | ${settings}
 | | ... | \| IPv4 address from VAT should be \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.2 \| ${24} \| 255.255.255.0 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix} | ${netmask}
-| | ${vpp_data}= | interfaceCLI.VPP get interface ip addresses
+| | ${vpp_data}= | VPP get interface ip addresses
 | | ... | ${node} | ${interface} | ipv4
 | | ${settings}= | Create Dictionary
 | | ... | ip=${address} | netmask=${netmask} | prefix_length=${prefix}
 | | ... | \| IPv4 address from Honeycomb should be empty\| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Run keyword and expect error | *KeyError:*
 | | ... | Set Variable | ${api_data['ietf-ip:ipv4']['address']}
 
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
 | | Run keyword and expect error | *No JSON object could be decoded*
-| | ... | InterfaceCLI.VPP get interface ip addresses
+| | ... | VPP get interface ip addresses
 | | ... | ${node} | ${interface} | ipv4
 
 | Honeycomb adds interface IPv4 neighbor
 | | ... | \| Honeycomb adds interface IPv4 neighbor \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.3 \| 08:00:27:c0:5d:37 \
 | | [Arguments] | ${node} | ${interface} | ${fib_address} | ${fib_mac}
-| | interfaceAPI.Add ipv4 neighbor
+| | Add ipv4 neighbor
 | | ... | ${node} | ${interface} | ${fib_address} | ${fib_mac}
 
 | IPv4 neighbor from Honeycomb should be
 | | ... | \| IPv4 neighbor from Honeycomb should be \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.4 \| 08:00:27:60:26:ab \|
 | | [Arguments] | ${node} | ${interface} | ${ip_address} | ${mac_address}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | ${settings}= | Create Dictionary
 | | ... | ip=${ip_address} | link-layer-address=${mac_address} | origin=static
 | | Should contain | ${api_data['ietf-ip:ipv4']['neighbor']} | ${settings}
 | | ... | \| Honeycomb clears all interface IPv4 neighbors \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
-| | interfaceAPI.Remove all ipv4 neighbors | ${node} | ${interface}
+| | Remove all ipv4 neighbors | ${node} | ${interface}
 
 | IPv4 neighbor from Honeycomb should be empty
 | | [Documentation] | Retrieves ipv4 neighbor list through Honeycomb\
 | | ... | \| IPv4 neighbor from Honeycomb should be empty \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Run keyword and expect error | *KeyError:*
 | | ... | Set Variable | ${api_data['ietf-ip:ipv4']['neighbor'][0]['ip']}
 
 | | ... | \| Honeycomb sets interface IPv6 address \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | interfaceAPI.Add first ipv6 address
+| | Add first ipv6 address
 | | ... | ${node} | ${interface} | ${address} | ${prefix}
 
 | Honeycomb adds interface IPv6 address
 | | ... | \| Honeycomb adds interface IPv6 address \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | interfaceAPI.Add ipv6 address
+| | Add ipv6 address
 | | ... | ${node} | ${interface} | ${address} | ${prefix}
 
 | Honeycomb fails to add interface IPv6 address
 | | ... | \| IPv6 address from Honeycomb should contain \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | ${settings}= | Create Dictionary
 | | ... | ip=${address} | prefix-length=${prefix}
 | | Should contain | ${api_data['ietf-ip:ipv6']['address']} | ${settings}
 | | ... | \| IPv6 address from VAT should contain \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | ${vpp_data}= | interfaceCLI.VPP get interface ip addresses
+| | ${vpp_data}= | VPP get interface ip addresses
 | | ... | ${node} | ${interface} | ipv6
 | | ${settings}= | Create Dictionary
 | | ... | ip=${address} | prefix_length=${prefix}
 | | ... | \| IPv6 address from Honeycomb should be empty\| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Run keyword and expect error | *KeyError:*
 | | ... | Set Variable | ${api_data['ietf-ip:ipv6']['address']}
 
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
 | | Run keyword and expect error | *No JSON object could be decoded*
-| | ... | InterfaceCLI.VPP get interface ip addresses
+| | ... | VPP get interface ip addresses
 | | ... | ${node} | ${interface} | ipv6
 
 | Honeycomb adds interface IPv6 neighbor
 | | ... | \| Honeycomb adds interface IPv6 neighbor \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.3 \| 08:00:27:c0:5d:37 \|
 | | [Arguments] | ${node} | ${interface} | ${fib_address} | ${fib_mac}
-| | InterfaceAPI.Add ipv6 neighbor
+| | Add ipv6 neighbor
 | | ... | ${node} | ${interface} | ${fib_address} | ${fib_mac}
 
 | IPv6 neighbor from Honeycomb should be
 | | ... | \| IPv6 neighbor from Honeycomb should be \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.4 \| 08:00:27:60:26:ab \|
 | | [Arguments] | ${node} | ${interface} | ${ip_address} | ${mac_address}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | ${settings}= | Create Dictionary
 | | ... | ip=${ip_address} | link-layer-address=${mac_address} | origin=static
 | | Should contain | ${api_data['ietf-ip:ipv6']['neighbor']} | ${settings}
 | | ... | \| Honeycomb clears all interface IPv6 neighbors \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
-| | interfaceAPI.Remove all ipv6 neighbors | ${node} | ${interface}
+| | Remove all ipv6 neighbors | ${node} | ${interface}
 
 | IPv6 neighbor from Honeycomb should be empty
 | | [Documentation] | Retrieves ipv6 neighbor list through Honeycomb\
 | | ... | \| IPv6 neighbor from Honeycomb should be empty \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Run keyword and expect error | *KeyError:*
 | | ... | Set Variable | ${api_data['ietf-ip:ipv6']['neighbor'][0]['ip']}
 
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${{'mtu': 1500}} \
 | | [Arguments] | ${node} | ${interface} | ${ethernet}
 | | :FOR | ${key} | IN | @{ethernet.keys()}
-| | | interfaceAPI.Configure interface ethernet
+| | | Configure interface ethernet
 | | | ... | ${node} | ${interface} | ${key} | ${ethernet['${key}']}
 
 | Interface ethernet Operational Data From Honeycomb Should Be
 | | ... | should be \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \
 | | ... | \| ${{'mtu': 1500}} \|
 | | [Arguments] | ${node} | ${interface} | ${ethernet}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | :FOR | ${key} | IN | @{ethernet.keys()}
 | | | Should be equal
 | | | ... | ${api_data['v3po:ethernet']['${key}']} | ${ethernet['${key}']}
 | | ... | \| Interface ethernet Operational Data From VAT Should Be \
 | | ... | should be \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1500} \|
 | | [Arguments] | ${node} | ${interface} | ${mtu}
-| | ${vat_data}= | InterfaceCLI.VPP get interface data | ${node} | ${interface}
+| | ${vat_data}= | VPP get interface data | ${node} | ${interface}
 | | Should be equal | ${vat_data['mtu']} | ${mtu}
 
 | Honeycomb sets interface VRF ID
 | | ... | \| Honeycomb sets interface VRF ID \
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \| ipv4 \|
 | | [Arguments] | ${node} | ${interface} | ${vrf_id} | ${ip_version}
-| | interfaceAPI.Configure interface routing
+| | Configure interface routing
 | | ... | ${node} | ${interface} | ${ip_version}-vrf-id | ${vrf_id}
 
 | Interface VRF ID from Honeycomb should be
 | | ... | should be \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \
 | | ... | \| ipv4 \|
 | | [Arguments] | ${node} | ${interface} | ${vrf_id} | ${ip_version}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface} |
+| | ${api_data}= | Get interface oper data | ${node} | ${interface} |
 | | Should be equal
 | | ... | ${api_data['v3po:routing']['${ip_version}-vrf-id']} | ${vrf_id}
 
 | | ... | \| Interface VRF ID from VAT should be \
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \|
 | | [Arguments] | ${node} | ${interface} | ${vrf_id}
-| | ${vat_data}= | InterfaceCLI.get interface vrf table
+| | ${vat_data}= | get interface vrf table
 | | ... | ${node} | ${interface}
 | | Should be equal | ${vat_data} | ${vrf_id}
 
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \|
 | | ...
 | | [Arguments] | ${node} | ${interface}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Should be empty | ${api_data}
 
 | Interface Operational Data From VAT Should Be empty
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \|
 | | ...
 | | [Arguments] | ${node} | ${interface} |
-| | ${vat_data}= | InterfaceCLI.VPP get interface data | ${node} | ${interface}
+| | ${vat_data}= | VPP get interface data | ${node} | ${interface}
 | | Should be empty | ${vat_data}
 
 | Interface indices from Honeycomb and VAT should correspond
 | | ...
 | | [Arguments] | ${node} | ${interface}
 | | ...
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
-| | ${vat_data}= | InterfaceCLI.VPP get interface data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
+| | ${vat_data}= | VPP get interface data | ${node} | ${interface}
 | | ${sw_if_index}= | EVALUATE | ${vat_data['sw_if_index']} + 1
 | | Should be equal as strings
 | | ... | ${api_data['if-index']} | ${sw_if_index}
 | | ...
 | | ... | \| Get interface index from oper data \| ${nodes['DUT1']} \| local0 \|
 | | [Arguments] | ${node} | ${interface}
-| | ${data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${data}= | Get interface oper data | ${node} | ${interface}
 | | Return from keyword | ${data['if-index']}
 
 | Honeycomb should show disabled interface in oper data
 | | ... | \| Honeycomb should show disabled interface in oper data \
 | | ... | \| ${nodes['DUT1']} \| ${vx_interface} \|
 | | [Arguments] | ${node} | ${index}
-| | interfaceAPI.check disabled interface | ${node} | ${index}
+| | check disabled interface | ${node} | ${index}
 
 | Honeycomb should not show disabled interface in oper data
 | | [Documentation] | Retrieves list of disabled interfaces\
index e63f299..f90cbff 100644 (file)
@@ -15,7 +15,6 @@
 | Library | resources.libraries.python.L2Util
 | Library | resources.libraries.python.honeycomb.HcAPIKwBridgeDomain.BridgeDomainKeywords
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 
 *** Keywords ***
 | Honeycomb adds L2 FIB entry to bridge domain
@@ -70,7 +69,7 @@
 | | ...
 | | ${l2_fib_data}= | Get L2 FIB Entry | ${node} | ${bd_name}
 | | ... | ${l2_fib_ref_data['phys-address']}
-| | interfaceAPI.Compare Data Structures | ${l2_fib_data} | ${l2_fib_ref_data}
+| | Compare Data Structures | ${l2_fib_data} | ${l2_fib_ref_data}
 
 | Honeycomb removes L2 FIB entry
 | | [Documentation] | Remove the specified L2 FIB entry from the bridge \
 | | ...
 | | ${l2_fib_data}= | Get L2 FIB entry VAT | ${node} | ${bd_index}
 | | ... | ${l2_fib_ref_data['mac']}
-| | interfaceAPI.Compare Data Structures | ${l2_fib_data} | ${l2_fib_ref_data}
+| | Compare Data Structures | ${l2_fib_data} | ${l2_fib_ref_data}
 
 | L2 FIB Table from VAT should be empty
 | | [Documentation] | Check if the L2 FIB table in the specified bridge domain \
index fbb5b89..dfb0c98 100644 (file)
@@ -15,7 +15,6 @@
 | Library | resources.libraries.python.InterfaceUtil
 | Library | resources.libraries.python.honeycomb.HcAPIKwNSH.NSHKeywords
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 | Documentation | Keywords used to test Honeycomb NSH node.
 
 *** Keywords ***
index 6fe439a..17bacd1 100644 (file)
@@ -13,8 +13,7 @@
 
 *** Settings ***
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
-| Library | resources/libraries/python/honeycomb/HcPersistence.py
+| Library | resources.libraries.python.honeycomb.HcPersistence
 | Resource | resources/libraries/robot/honeycomb/honeycomb.robot
 | Resource | resources/libraries/robot/honeycomb/interfaces.robot
 | Resource | resources/libraries/robot/honeycomb/vxlan.robot
 | | ... | ${node} | ${interface} | ${sub_if_id} | ${tag_rewrite_pop_1_oper}
 | | Rewrite tag from VAT should be
 | | ... | ${node} | ${sub_if_name} | ${tag_rewrite_pop_1_VAT}
-| | ${data_conf}= | InterfaceAPI.Get all interfaces cfg data | ${node}
-| | ${data_oper}= | InterfaceAPI.Get all interfaces oper data | ${node}
+| | ${data_conf}= | Get all interfaces cfg data | ${node}
+| | ${data_oper}= | Get all interfaces oper data | ${node}
 | | Compare interface lists | ${data_conf} | ${data_oper}
 
 | Honeycomb and VPP should have default configuration
index 4319b27..17191c5 100644 (file)
@@ -14,7 +14,6 @@
 *** Settings ***
 | Resource | resources/libraries/robot/traffic.robot
 | Library | resources.libraries.python.honeycomb.Routing.RoutingKeywords
-| ...     | WITH NAME | RoutingKeywordsAPI
 | Variables | resources/test_data/honeycomb/policer_variables.py
 | Documentation | Keywords used to test Policer using Honeycomb.
 
index 63fbcea..64faa5e 100644 (file)
@@ -13,7 +13,6 @@
 
 *** Settings ***
 | 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
@@ -39,7 +38,7 @@
 | | ... | \| {'iface-ref': 'local0', 'state': 'both'}] \|
 | | ...
 | | [Arguments] | ${node} | ${dst_interface} | @{src_interfaces}
-| | InterfaceAPI.Configure interface SPAN
+| | Configure interface SPAN
 | | ... | ${node} | ${dst_interface} | ${src_interfaces}
 
 | Interface SPAN Operational Data From Honeycomb Should Be
@@ -58,7 +57,7 @@
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| GigabitEthernet0/9/0 \|
 | | ...
 | | [Arguments] | ${node} | ${dst_interface} | @{src_interfaces}
-| | ${data}= | InterfaceAPI.Get interface oper data | ${node} | ${dst_interface}
+| | ${data}= | Get interface oper data | ${node} | ${dst_interface}
 | | ${data}= | Set Variable
 | | ... | ${data['v3po:span']['mirrored-interfaces']['mirrored-interface']}
 | | Sort list | ${data}
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \|
 | | ...
 | | [Arguments] | ${node} | ${dst_interface}
-| | InterfaceAPI.Configure interface SPAN | ${node} | ${dst_interface}
+| | Configure interface SPAN | ${node} | ${dst_interface}
 
 | Interface SPAN Operational Data from Honeycomb should not exist
 | | [Documentation] | Retrieves interface operational data and verifies that\
 | | ...
 | | ... | \|
 | | [Arguments] | ${node} | ${dst_interface}
-| | ${data}= | InterfaceAPI.Get interface oper data | ${node} | ${dst_interface}
+| | ${data}= | Get interface oper data | ${node} | ${dst_interface}
 | | Run keyword and expect error | *KeyError* | Set Variable
 | | ... | ${data['span']['mirrored-interfaces']['mirrored-interface']}
 
 | | ... | \| {'iface-ref': 'local0', 'state': 'both'}] \|
 | | ...
 | | [Arguments] | ${node} | ${dst_interface} | ${index} | @{src_interfaces}
-| | InterfaceAPI.Configure sub interface SPAN
+| | Configure sub interface SPAN
 | | ... | ${node} | ${dst_interface} | ${index} | ${src_interfaces}
 
 | Sub-Interface SPAN Operational Data from Honeycomb should be
 | | ... | \| GigabitEthernet0/9/0 \|
 | | ...
 | | [Arguments] | ${node} | ${dst_interface} | ${index} | @{src_interfaces}
-| | ${data}= | InterfaceAPI.Get sub interface oper data
+| | ${data}= | Get sub interface oper data
 | | ... | ${node} | ${dst_interface} | ${index}
 | | ${data}= | Set Variable
 | | ... | ${data['subinterface-span:span-state']['mirrored-interfaces']['mirrored-interface']}
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \|
 | | ...
 | | [Arguments] | ${node} | ${dst_interface} | ${index}
-| | InterfaceAPI.Configure sub interface SPAN
+| | Configure sub interface SPAN
 | | ... | ${node} | ${dst_interface} | ${index}
 
 | Sub-Interface SPAN Operational Data from Honeycomb should not exist
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \|
 | | ....
 | | [Arguments] | ${node} | ${dst_interface} | ${index}
-| | ${data}= | InterfaceAPI.Get sub interface oper data
+| | ${data}= | Get sub interface oper data
 | | ... | ${node} | ${dst_interface} | ${index}
 | | Run keyword and expect error | *KeyError* | Set Variable
 | | ... | ${data['subinterface-span:span-state']['mirrored-interfaces']['mirrored-interface']}
\ No newline at end of file
index 92145f8..130e184 100644 (file)
@@ -13,7 +13,6 @@
 
 *** Settings ***
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | IfAPI
 
 *** Keywords ***
 | Honeycomb creates PBB sub-interface
@@ -33,8 +32,8 @@
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${params}
 | | ...
-| | IfAPI.Set Interface Up | ${node} | ${super_if}
-| | IfAPI.Create PBB Sub Interface
+| | Set Interface Up | ${node} | ${super_if}
+| | Create PBB Sub Interface
 | | ... | ${node} | ${super_if} | ${params}
 
 | Honeycomb removes PBB sub-interface
@@ -71,7 +70,7 @@
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${params}
 | | ...
-| | IfAPI.Set Interface Up | ${node} | ${super_if}
+| | Set Interface Up | ${node} | ${super_if}
 | | Run keyword and expect error | *HoneycombError*not successful*.
-| | ... | IfAPI.Create PBB Sub Interface
+| | ... | Create PBB Sub Interface
 | | ... | ${node} | ${super_if} | ${params}
index 966f95f..1304c2b 100644 (file)
 | | ...
 | | [Arguments] | ${node} | ${interface}
 | | Honeycomb removes SLAAC configuration | ${node} | ${interface}
-| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | down
+| | And Honeycomb configures interface state | ${node} | ${interface} | down
 | | Honeycomb removes interface IPv6 addresses | ${node} | ${interface}
index 4b93de9..69eb900 100644 (file)
 
 *** Settings ***
 | Library | resources.libraries.python.InterfaceUtil
-| ...     | WITH NAME | interfaceCLI
 | Library | resources.libraries.python.L2Util
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 | Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
 | Documentation | Keywords used to manipulate sub-interfaces.
 
@@ -43,7 +41,7 @@
 | | [Arguments] | ${node} | ${super_interface}
 | | ... | ${match} | ${tags} | ${sub_interface_settings}
 | | ...
-| | interfaceAPI.Create sub interface | ${node} | ${super_interface}
+| | Honeycomb Create sub interface | ${node} | ${super_interface}
 | | ... | ${match} | ${tags} | &{sub_interface_settings}
 
 | Sub-interface Operational Data From Honeycomb Should Be
@@ -65,9 +63,9 @@
 | | [Arguments] | ${node} | ${super_interface} | ${identifier}
 | | ... | ${sub_if_settings}
 | | ...
-| | ${api_data}= | interfaceAPI.Get sub interface oper data
+| | ${api_data}= | Get sub interface oper data
 | | ... | ${node} | ${super_interface} | ${identifier}
-| | interfaceAPI.Compare Data Structures | ${api_data} | ${sub_if_settings}
+| | Compare Data Structures | ${api_data} | ${sub_if_settings}
 
 | Sub-interface Operational Data From Honeycomb Should Be empty
 | | [Documentation] | Retrieves sub-interface configuration through Honeycomb \
@@ -85,7 +83,7 @@
 | | [Arguments] | ${node} | ${super_interface} | ${identifier}
 | | ...
 | | Run keyword and expect error | *KeyError: 'vpp-vlan:sub-interfaces'*
-| | ... | interfaceAPI.Get sub interface oper data
+| | ... | Get sub interface oper data
 | | ... | ${node} | ${super_interface} | ${identifier}
 
 | Sub-interface state from Honeycomb should be
 | | [Arguments] | ${node} | ${super_interface} | ${identifier}
 | | ... | ${admin_state} | ${oper_state}
 | | ...
-| | ${api_data}= | interfaceAPI.Get sub interface oper data
+| | ${api_data}= | Get sub interface oper data
 | | ... | ${node} | ${super_interface} | ${identifier}
 | | Should be equal | ${api_data['admin-status']} | ${admin_state}
 | | Should be equal | ${api_data['oper-status']} | ${oper_state}
 | | ...
 | | [Arguments] | ${node} | ${sub_interface} | ${sub_interface_settings}
 | | ...
-| | ${vat_data}= | InterfaceCLI.VPP get interface data
+| | ${vat_data}= | VPP get interface data
 | | ... | ${node} | ${sub_interface}
 | | Should be equal as strings | ${vat_data['sub_id']}
 | | ... | ${sub_interface_settings['identifier']}
 | | ...
 | | [Arguments] | ${node} | ${sub_interface} | ${admin_state} | ${oper_state}
 | | ...
-| | ${vat_data}= | InterfaceCLI.VPP get interface data
+| | ${vat_data}= | VPP get interface data
 | | ... | ${node} | ${sub_interface}
 | | Run keyword if | '${admin_state}' == 'down'
 | | ... | Should be equal as strings | ${vat_data['admin_up_down']} | 0
 | | ...
 | | [Arguments] | ${node} | ${super_interface} | ${identifier}
 | | ...
-| | ${api_data}= | interfaceAPI.Get sub interface oper data
+| | ${api_data}= | Get sub interface oper data
 | | ... | ${node} | ${super_interface} | ${identifier}
-| | ${vat_data}= | InterfaceCLI.VPP get interface data
+| | ${vat_data}= | VPP get interface data
 | | ... | ${node} | ${super_interface}.${identifier}
 | | ${sw_if_index}= | EVALUATE | ${vat_data['sw_if_index']} + 1
 | | Should be equal as strings
 | | ...
 | | [Arguments] | ${node} | ${super_interface} | ${identifier}
 | | ...
-| | interfaceAPI.Set sub interface state
+| | Set sub interface state
 | | ... | ${node} | ${super_interface} | ${identifier} | up
 
 | Honeycomb sets the sub-interface down
 | | ...
 | | [Arguments] | ${node} | ${super_interface} | ${identifier}
 | | ...
-| | interfaceAPI.Set sub interface state
+| | Set sub interface state
 | | ... | ${node} | ${super_interface} | ${identifier} | down
 
 | Honeycomb fails to set sub-interface up
 | | [Arguments] | ${node} | ${super_interface} | ${identifier}
 | | ...
 | | Run keyword and expect error | *HoneycombError: * was not successful. * 500.
-| | ... | interfaceAPI.Set sub interface state
+| | ... | Set sub interface state
 | | ... | ${node} | ${super_interface} | ${identifier} | up
 
 | Honeycomb adds sub-interface to bridge domain
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${identifier} | ${sub_bd_setings}
 | | ...
-| | interfaceAPI.Add bridge domain to sub interface
+| | Add bridge domain to sub interface
 | | ... | ${node} | ${super_if} | ${identifier} | ${sub_bd_setings}
 
 | Sub-interface bridge domain Operational Data From Honeycomb Should Be
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${identifier} | ${settings}
 | | ...
-| | ${if_data}= | interfaceAPI.Get BD data from sub interface
+| | ${if_data}= | Get BD data from sub interface
 | | ... | ${node} | ${super_if} | ${identifier}
 | | Should be equal | ${if_data['bridge-domain']}
 | | ... | ${settings['bridge-domain']}
 | | [Arguments] | ${node} | ${super_if}
 | | ...
 | | Run keyword and expect error | *HoneycombError:*not successful. * code: 500.
-| | ... | interfaceAPI.Remove all sub interfaces
+| | ... | Remove all sub interfaces
 | | ... | ${node} | ${super_if}
 
 | Honeycomb configures tag rewrite
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${identifier} | ${settings}
 | | ...
-| | interfaceAPI.Configure tag rewrite
+| | Configure tag rewrite
 | | ... | ${node} | ${super_if} | ${identifier} | ${settings}
 
 | Rewrite tag from Honeycomb should be empty
 | | [Arguments] | ${node} | ${super_if} | ${identifier}
 | | ...
 | | Run keyword and expect error | *Hon*Error*oper*does not contain*tag-rewrite*
-| | ... | interfaceAPI.Get tag rewrite oper data
+| | ... | Get tag rewrite oper data
 | | ... | ${node} | ${super_if} | ${identifier}
 
 | Rewrite tag from Honeycomb should be
 | | ... | \| ${tag_rewrite_push_oper} \|
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${identifier} | ${settings}
-| | ${api_data}= | interfaceAPI.Get tag rewrite oper data
+| | ${api_data}= | Get tag rewrite oper data
 | | ... | ${node} | ${super_if} | ${identifier}
-| | interfaceAPI.Compare Data Structures
+| | Compare Data Structures
 | | ... | ${api_data} | ${settings}
 
 | Rewrite tag from VAT should be
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0.1 \| ${rw_params} \|
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${rw_settings}
-| | ${vat_data}= | InterfaceCLI.VPP get interface data | ${node} | ${interface}
-| | interfaceAPI.Compare Data Structures | ${vat_data} | ${rw_settings}
+| | ${vat_data}= | VPP get interface data | ${node} | ${interface}
+| | Compare Data Structures | ${vat_data} | ${rw_settings}
 
 | Honeycomb fails to set wrong rewrite tag
 | | [Documentation] | Honeycomb tries to set wrong rewrite tag and expects\
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${identifier} | ${settings}
 | | Run keyword and expect error | *HoneycombError: * was not successful. *00.
-| | ... | interfaceAPI.Configure tag rewrite
+| | ... | Configure tag rewrite
 | | ... | ${node} | ${super_if} | ${identifier} | ${settings}
 
 | Honeycomb sets sub-interface ipv4 address
 | | ... | \| 192.168.0.2 \| ${24} \|
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${identifier} | ${address} | ${prefix}
-| | ${if_data}= | interfaceAPI.Get sub interface oper data
+| | ${if_data}= | Get sub interface oper data
 | | ... | ${node} | ${super_if} | ${identifier}
 | | Should be equal
 | | ... | ${if_data['ipv4']['address'][0]['ip']} | ${address}
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0.1 \|
 | | ...
 | | [Arguments] | ${node} | ${sub_interface} | ${address} | ${prefix}
-| | ${data}= | interfaceCLI.VPP get interface ip addresses
+| | ${data}= | VPP get interface ip addresses
 | | ... | ${node} | ${sub_interface} | ipv4
 | | Should be equal | ${data[0]['ip']} | ${address}
 | | Should be equal | ${data[0]['prefix_length']} | ${prefix}
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \|
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${identifier}
-| | ${if_data}= | interfaceAPI.Get sub interface oper data
+| | ${if_data}= | Get sub interface oper data
 | | ... | ${node} | ${super_if} | ${identifier}
 | | Run keyword and expect error | *KeyError: 'ipv4'*
 | | ... | Set Variable | ${if_data['ipv4']['address'][0]['ip']}
 | | ...
 | | [Arguments] | ${node} | ${sub_interface}
 | | Run keyword and expect error | *No JSON object could be decoded*
-| | ... | interfaceCLI.VPP get interface ip addresses
+| | ... | VPP get interface ip addresses
 | | ... | ${node} | ${sub_interface} | ipv4
 
 | Honeycomb sets sub-interface ipv6 address
 | | ... | \| 10::10 \| ${64} \|
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${identifier} | ${address} | ${prefix}
-| | ${if_data}= | interfaceAPI.Get sub interface oper data
+| | ${if_data}= | Get sub interface oper data
 | | ... | ${node} | ${super_if} | ${identifier}
 | | ${settings}= | Create Dictionary
 | | ... | ip=${address} | prefix-length=${prefix}
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0.1 \|
 | | ...
 | | [Arguments] | ${node} | ${sub_interface} | ${address} | ${prefix}
-| | ${data}= | interfaceCLI.VPP get interface ip addresses
+| | ${data}= | VPP get interface ip addresses
 | | ... | ${node} | ${sub_interface} | ipv6
 | | Should be equal | ${data[0]['ip']} | ${address}
 | | Should be equal | ${data[0]['prefix_length']} | ${prefix}
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \|
 | | ...
 | | [Arguments] | ${node} | ${super_if} | ${identifier}
-| | ${if_data}= | interfaceAPI.Get sub interface oper data
+| | ${if_data}= | Get sub interface oper data
 | | ... | ${node} | ${super_if} | ${identifier}
 | | Run keyword and expect error | *KeyError: 'ipv6'*
 | | ... | Set Variable | ${if_data['ipv6']['address'][0]['ip']}
 | | ...
 | | [Arguments] | ${node} | ${sub_interface}
 | | Run keyword and expect error | *No JSON object could be decoded*
-| | ... | interfaceCLI.VPP get interface ip addresses
+| | ... | VPP get interface ip addresses
 | | ... | ${node} | ${sub_interface} | ipv6
index 1a045d1..0d5585b 100644 (file)
@@ -13,9 +13,7 @@
 
 *** Settings ***
 | Library | resources.libraries.python.InterfaceUtil
-| ...     | WITH NAME | interfaceCLI
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 | Documentation | Keywords used to manipulate TAP interfaces.
 
 *** Keywords ***
@@ -33,7 +31,7 @@
 | | ... | 'mac':'08:00:27:60:26:ab', 'device-instance':3}} \|
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
-| | interfaceAPI.Create TAP interface | ${node} | ${interface}
+| | Create TAP interface | ${node} | ${interface}
 | | ... | &{settings}
 
 | Honeycomb configures TAP interface
@@ -50,7 +48,7 @@
 | | ... | 'mac':'08:00:27:60:26:ab', 'device-instance':3}} \|
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
-| | interfaceAPI.Configure interface TAP | ${node} | ${interface}
+| | Configure interface TAP | ${node} | ${interface}
 | | ... | &{settings}
 
 | Honeycomb removes TAP interface
@@ -65,7 +63,7 @@
 | | ... | \| Honeycomb removes TAP interface \
 | | ... | \| ${nodes['DUT1']} \| tap_int1 \|
 | | [Arguments] | ${node} | ${interface}
-| | interfaceAPI.Delete interface | ${node} | ${interface}
+| | Delete interface | ${node} | ${interface}
 
 | TAP Operational Data From Honeycomb Should Be
 | | [Documentation] | Retrieves interface TAP configuration through Honeycomb\
@@ -83,7 +81,7 @@
 | | ... | 'mac':'08:00:27:60:26:ab', 'device-instance':3}} \|
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | ${api_tap}= | Set Variable | ${api_data['v3po:tap']}
 | | Should be equal | ${api_tap['tap-name']} | ${settings['tap-name']}
 | | ${api_mac}= | Set Variable | ${api_data['phys-address']}
 | | ... | \| ${nodes['DUT1']} \| tap_int1 \|
 | | ...
 | | [Arguments] | ${node} | ${interface}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Run keyword and expect error | *KeyError: 'v3po:tap' | Set Variable
 | | ... | ${api_data['v3po:tap']}
 
index b0941ed..0c66299 100644 (file)
@@ -13,9 +13,7 @@
 
 *** Settings ***
 | Library | resources.libraries.python.InterfaceUtil
-| ...     | WITH NAME | interfaceCLI
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 | Documentation | Keywords used to manipulate vhost-user unterfaces.
 
 *** Keywords ***
@@ -33,7 +31,7 @@
 | | ... | \| ${nodes['DUT1']} \| vhost_test \| ${vhost_user_settings} \|
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
-| | interfaceAPI.Create vhost user interface | ${node} | ${interface}
+| | Create vhost user interface | ${node} | ${interface}
 | | ... | &{settings}
 
 | Honeycomb removes vhost-user interface
@@ -48,7 +46,7 @@
 | | ... | \| ${nodes['DUT1']} \| vhost_test \|
 | | ...
 | | [Arguments] | ${node} | ${interface}
-| | interfaceAPI.Delete interface | ${node} | ${interface}
+| | Delete interface | ${node} | ${interface}
 
 | Honeycomb configures vhost-user interface
 | | [Documentation] | Configure a vhost-user interface using Honeycomb API.
@@ -64,7 +62,7 @@
 | | ... | \| ${nodes['DUT1']} \| vhost_test \| ${new_vhost_user_settings} \|
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
-| | interfaceAPI.Configure interface vhost user | ${node} | ${interface}
+| | Configure interface vhost user | ${node} | ${interface}
 | | ... | &{settings}
 
 | Vhost-user Operational Data From Honeycomb Should Be
@@ -82,7 +80,7 @@
 | | ... | \| ${nodes['DUT1']} \| vhost_test \| ${vhost_user_settings} \|
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | ${api_vhost}= | Set Variable | ${api_data['v3po:vhost-user']}
 | | :FOR | ${key} | IN | @{settings.keys()}
 | | | Should be equal | ${api_vhost['${key}']} | ${settings['${key}']}
 | | ... | \| ${nodes['DUT1']} \| vhost_test \|
 | | ...
 | | [Arguments] | ${node} | ${interface}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Run keyword and expect error | *KeyError: 'v3po:vhost-user'
 | | ... | Should be empty | ${api_data['v3po:vhost-user']}
 
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
 | | Run Keyword And Expect Error | HoneycombError: * Status code: 500.
-| | ... | interfaceAPI.Configure interface vhost user | ${node} | ${interface}
+| | ... | Configure interface vhost user | ${node} | ${interface}
 | | ... | &{settings}
 
 | Honeycomb fails setting invalid vhost-user configuration
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
 | | Run Keyword And Expect Error | HoneycombError: * Status code: 400.
-| | ... | interfaceAPI.Configure interface vhost user | ${node} | ${interface}
+| | ... | Configure interface vhost user | ${node} | ${interface}
 | | ... | &{settings}
index b3bf083..ed21d19 100644 (file)
@@ -13,9 +13,7 @@
 
 *** Settings ***
 | Library | resources.libraries.python.InterfaceUtil
-| ...     | WITH NAME | interfaceCLI
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 
 *** Keywords ***
 | Honeycomb sets interface VxLAN configuration
@@ -32,7 +30,7 @@
 | | ... | 'dst':'192.168.0.3', 'vni':5, 'encap-vrf-id':0}} \|
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
-| | interfaceAPI.Create VxLAN interface | ${node} | ${interface}
+| | Honeycomb Create VxLAN interface | ${node} | ${interface}
 | | ... | &{settings}
 
 | Honeycomb removes VxLAN tunnel settings
@@ -47,7 +45,7 @@
 | | ...
 | | ... | \| Honeycomb removes VxLAN tunnel \| ${nodes['DUT1']} \| vxlan_01 \|
 | | [Arguments] | ${node} | ${interface}
-| | interfaceAPI.Delete interface | ${node} | ${interface}
+| | Delete interface | ${node} | ${interface}
 
 | VxLAN Operational Data From Honeycomb Should Be
 | | [Documentation] | Retrieves interface VxLAN configuration through Honeycomb\
@@ -65,7 +63,7 @@
 | | ... | 'dst':'192.168.0.3', 'vni':5, 'encap-vrf-id':0}} \|
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | ${api_vxlan}= | Set Variable | ${api_data['v3po:vxlan']}
 | | :FOR | ${key} | IN | @{settings.keys()}
 | | | Should be equal | ${api_vxlan['${key}']} | ${settings['${key}']}
 | | ... | \|${nodes['DUT1']} \| vxlan_01 \|
 | | ...
 | | [Arguments] | ${node} | ${interface}
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Run keyword and expect error | *KeyError: 'v3po:vxlan' | Set Variable
 | | ... | ${api_data['v3po:vxlan']}
 
 | | ...
 | | [Arguments] | ${node} | ${interface} | ${settings}
 | | Run Keyword And Expect Error | HoneycombError: * Status code: 500.
-| | ... | interfaceAPI.Configure interface vxlan
+| | ... | Honeycomb Configure interface vxlan
 | | ... | ${node} | ${interface} | &{settings}
 
 | Honeycomb fails setting invalid VxLAN configuration
 | | [Arguments] | ${node} | ${interface} | ${settings_list}
 | | :FOR | ${settings} | IN | @{settings_list}
 | | | Run Keyword And Expect Error | HoneycombError: * Status code: 500.
-| | | ... | interfaceAPI.Create VxLAN interface
+| | | ... | Honeycomb Create VxLAN interface
 | | | ... | ${node} | ${interface} | &{settings}
index 6384061..2f2cfc5 100644 (file)
@@ -13,9 +13,7 @@
 
 *** Settings ***
 | Library | resources.libraries.python.InterfaceUtil
-| ...     | WITH NAME | interfaceCLI
 | Library | resources.libraries.python.honeycomb.HcAPIKwInterfaces.InterfaceKeywords
-| ...     | WITH NAME | InterfaceAPI
 
 *** Variables ***
 # Translation table used to convert values received from Honeycomb to values
@@ -46,7 +44,7 @@
 | | [Arguments] | ${node} | ${interface}
 | | ... | ${base_settings} | ${vxlan_gpe_settings}
 | | ...
-| | interfaceAPI.Create VxLAN GPE interface
+| | Create VxLAN GPE interface
 | | ... | ${node} | ${interface} | &{base_settings} | &{vxlan_gpe_settings}
 
 | Honeycomb removes VxLAN GPE interface
@@ -64,7 +62,7 @@
 | | ...
 | | [Arguments] | ${node} | ${interface}
 | | ...
-| | interfaceAPI.Delete interface | ${node} | ${interface}
+| | Delete interface | ${node} | ${interface}
 
 | VxLAN GPE Operational Data From Honeycomb Should Be
 | | [Documentation] | Uses Honeycomb API to get operational data about the\
@@ -85,7 +83,7 @@
 | | [Arguments] | ${node} | ${interface}
 | | ... | ${base_settings} | ${vxlan_gpe_settings}
 | | ...
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Should be equal as strings
 | | ... | ${api_data['name']} | ${base_settings['name']}
 | | Should be equal as strings
 | | ...
 | | [Arguments] | ${node} | ${interface}
 | | ...
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | ${vat_data}= | VxLAN GPE Dump | ${node} | ${interface}
 | | ${sw_if_index}= | EVALUATE | ${vat_data['sw_if_index']} + 1
 | | Should be equal as strings
 | | ...
 | | [Arguments] | ${node} | ${interface}
 | | ...
-| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${api_data}= | Get interface oper data | ${node} | ${interface}
 | | Should be empty | ${api_data}
 
 | VxLAN GPE Operational Data From VAT Should Be empty
 | | ... | ${base_settings} | ${vxlan_gpe_settings}
 | | ...
 | | Run keyword and expect error | *HoneycombError*not successful. * code: *00.
-| | ... | interfaceAPI.Create VxLAN GPE interface
+| | ... | Create VxLAN GPE interface
 | | ... | ${node} | ${interface} | &{base_settings} | &{vxlan_gpe_settings}
index 3f79a6a..fff6097 100644 (file)
 | Resource | resources/libraries/robot/honeycomb/honeycomb.robot
 | ...
 | Suite Setup | Run Keywords | Configure all DUTs before test | AND
-| ... | Configure Honeycomb for testing | ${node} | AND
-| ... | Configure ODL Client for testing | ${node} | AND
-| ... | Set Global Variable | ${node}
+| ... | Set Global Variable | ${node} | AND
+| ... | Stop Honeycomb service on DUTs | ${node}
 | ...
 | Suite Teardown | Archive Honeycomb log file | ${node}
-
-*** Keywords ***
-| Configure Honeycomb for testing
-| | [Arguments] | ${node}
-| | Configure Restconf binding address | ${node}
-| | Enable Module Features | ${node}
-| | Configure Log Level | ${node} | TRACE
-| | Configure Persistence | ${node} | disable
-| | Configure jVPP timeout | ${node} | ${14}
-| | Clear Persisted Honeycomb Configuration | ${node}
-| | Configure Honeycomb service on DUTs | ${node}
-
-| Configure ODL Client for testing
-| | [Arguments] | ${node}
-| | ${use_odl_client}= | Get Variable Value | ${HC_ODL}
-| | Run Keyword If | '${use_odl_client}' != '${NONE}'
-| | ... | Run Keywords
-| | ... | Set Global Variable | ${use_odl_client} | AND
-| | ... | Configure ODL Client Service On DUT | ${node} | ${use_odl_client}
-| | ... | ELSE | Log | Variable HC_ODL is not present. Not using ODL.
-| | ... | level=INFO
index b18b111..f66eef8 100644 (file)
@@ -21,7 +21,9 @@
 | Resource | resources/libraries/robot/honeycomb/access_control_lists.robot
 | Variables | resources/test_data/honeycomb/acl.py
 | ...
-| Suite Teardown | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Documentation | *Honeycomb access control lists test suite.*
 | ...
index fba37e6..d73334e 100644 (file)
@@ -28,9 +28,9 @@
 | ...
 | Documentation | *Honeycomb DHCP relay test suite.*
 | ...
-| Test Setup | Clear Packet Trace on All DUTs | ${nodes}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
 | ...
-| Suite Teardown | Restart Honeycomb and VPP | ${node}
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 
index 3e3c64f..6989d35 100644 (file)
 | ...
 | Force Tags | HC_FUNC | HC_REST_ONLY
 | ...
-| Suite Teardown | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
+| ...
 
 *** Variables ***
 | ${interface}= | ${node['interfaces']['port1']['name']}
index f766eb2..45ffd93 100644 (file)
 | Resource | resources/libraries/robot/honeycomb/interfaces.robot
 | Variables | resources/test_data/honeycomb/sub_interfaces.py
 | ...
-| Suite Setup | Add Interface local0 To Topology | ${node}
+| Suite Setup | Run Keywords
+| ... | Set Up Honeycomb Functional Test Suite | ${node} | AND
+| ... | Add Interface local0 To Topology | ${node}
 | ...
-| Suite Teardown | Restart Honeycomb and VPP | ${node}
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 | ...
index 03160e0..804c067 100644 (file)
@@ -25,7 +25,9 @@
 | ...
 | Force Tags | HC_FUNC
 | ...
-| Suite Teardown | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Documentation | *Honeycomb interface management test suite.*
 
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if1} | ${dut_to_tg_if1_mac}
 
-| TC11: Honeycomb fails to configure two IPv4 addresses from the same subnet
-| | [Documentation] | Check if Honeycomb can configure two IPv4 addresses in\
-| | ... | the same subnet onto a single interface. It should not be possible.
-| | ...
-| | [Teardown] | Honeycomb removes interface IPv4 addresses | ${node}
-| | ... | ${interface}
-| | ...
-| | [Tags] | EXPECTED_FAILING
-| | ...
-# VPP API does not configure the second address, but returns success. VPP-649
-| | When Honeycomb sets interface IPv4 address with prefix
-| | ... | ${node} | ${interface} | 192.168.0.1 | ${9}
-| | Then Honeycomb fails to add interface IPv4 address
-| | ... | ${node} | ${interface} | 192.168.0.2 | ${9}
-| | And Honeycomb fails to add interface IPv4 address
-| | ... | ${node} | ${interface} | 192.232.0.2 | ${9}
-
-| TC12: Honeycomb fails to configure two IPv6 addresses from the same subnet
-| | [Documentation] | Check if Honeycomb can configure two IPv6 addresses in\
-| | ... | the same subnet onto a single interface. It should not be possible.
-| | ...
-| | [Tags] | EXPECTED_FAILING
-| | ...
-# VPP API does not configure the second address, but returns success. VPP-649
-| | [Teardown] | Honeycomb removes interface IPv6 addresses | ${node}
-| | ... | ${interface}
-| | When Honeycomb sets interface IPv6 address
-| | ... | ${node} | ${interface} | 10::FF10 | ${64}
-| | Then Honeycomb fails to add interface IPv6 address
-| | ... | ${node} | ${interface} | 10::FF11 | ${64}
-| | And Honeycomb fails to add interface IPv6 address
-| | ... | ${node} | ${interface} | 10::FFFF | ${64}
-
-| TC13: Honeycomb can configure unnumbered interface
+| TC11: Honeycomb can configure unnumbered interface
 | | [Documentation] | Check if Honeycomb can configure an unnumbered interface\
 | | ... | on a physical interface, borrowing the IP address of 'local0'.
 | | ...
 | | ... | ${node} | ${interface} | ${ipv4_address}
 | | ... | ${ipv4_prefix} | ${ipv4_mask}
 
-| TC14: Honeycomb removes interface unnumbered configuration
+| TC12: Honeycomb removes interface unnumbered configuration
 | | [Documentation] | Check if Honeycomb can remove unnumbered configuration\
 | | ... | from an interface.
 | | ...
 | | ... | ${ipv4_prefix} | ${ipv4_mask}
 | | And IPv4 address from Honeycomb should be empty | ${node} | ${interface}
 | | And ipv4 address from VAT should be empty | ${node} | ${interface}
+
+| TC13: Honeycomb fails to configure two IPv4 addresses from the same subnet
+| | [Documentation] | Check if Honeycomb can configure two IPv4 addresses in\
+| | ... | the same subnet onto a single interface. It should not be possible.
+| | ...
+| | [Teardown] | Honeycomb removes interface IPv4 addresses | ${node}
+| | ... | ${interface}
+| | ...
+| | [Tags] | EXPECTED_FAILING
+| | ...
+# VPP API does not configure the second address, but returns success. VPP-649
+| | When Honeycomb sets interface IPv4 address with prefix
+| | ... | ${node} | ${interface} | 192.168.0.1 | ${9}
+| | Then Honeycomb fails to add interface IPv4 address
+| | ... | ${node} | ${interface} | 192.168.0.2 | ${9}
+| | And Honeycomb fails to add interface IPv4 address
+| | ... | ${node} | ${interface} | 192.232.0.2 | ${9}
+
+| TC14: Honeycomb fails to configure two IPv6 addresses from the same subnet
+| | [Documentation] | Check if Honeycomb can configure two IPv6 addresses in\
+| | ... | the same subnet onto a single interface. It should not be possible.
+| | ...
+| | [Tags] | EXPECTED_FAILING
+| | ...
+# VPP API does not configure the second address, but returns success. VPP-649
+| | [Teardown] | Honeycomb removes interface IPv6 addresses | ${node}
+| | ... | ${interface}
+| | When Honeycomb sets interface IPv6 address
+| | ... | ${node} | ${interface} | 10::FF10 | ${64}
+| | Then Honeycomb fails to add interface IPv6 address
+| | ... | ${node} | ${interface} | 10::FF11 | ${64}
+| | And Honeycomb fails to add interface IPv6 address
+| | ... | ${node} | ${interface} | 10::FFFF | ${64}
index 74d99a9..f35384c 100644 (file)
@@ -29,8 +29,9 @@
 | ...
 | Force Tags | HC_FUNC
 | ...
-| Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Documentation | *Honeycomb TAP management test suite.*
 
index 64136bc..4a2a763 100644 (file)
@@ -29,8 +29,9 @@
 | ...
 | Force Tags | HC_FUNC
 | ...
-| Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Documentation | *Honeycomb vhost-user interface management test suite.*
 
index e6287e7..6955167 100644 (file)
 | Resource | resources/libraries/robot/honeycomb/interfaces.robot
 | Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
 | ...
-| Suite Teardown | Run keywords
-| ... | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
-| ... | AND | Honeycomb removes all bridge domains | ${node} | @{interfaces}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 | ...
index 184f361..2073b9b 100644 (file)
 | ...
 | Documentation | *Honeycomb L2 FIB management test suite.*
 | ...
-| Suite Setup | Run keywords | Set test interface down
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
 | ...
-| Suite Teardown | Run keywords
-| ... | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
-| ... | AND
-| ... | Honeycomb removes all bridge domains
-| ... | ${node} | ${interface} | ${interface2}
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force tags | HC_FUNC
 
index 42f5a84..83634bf 100644 (file)
@@ -30,8 +30,9 @@
 | ...
 | Documentation | *Honeycomb Lisp test suite.*
 | ...
-| Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 
index 03ccc32..9270b98 100644 (file)
 | ...
 | Documentation | *Honeycomb NSH test suite.*
 | ...
-| Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
-# disabled pending NSH version 17.04
-#| Force Tags | honeycomb_sanity | honeycomb_odl
+| Suite Setup | Run Keywords
+| ... | Enable Honeycomb Feature | ${node} | NSH | AND
+| ... | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Run Keywords
+| ... | Tear Down Honeycomb Functional Test Suite | ${node} | AND
+| ... | Disable Honeycomb Feature | ${node} | NSH
+| ...
+| Force Tags | honeycomb_sanity | honeycomb_odl
 
 *** Test Cases ***
 | TC01: Honeycomb can configure NSH entry
index a049325..fb9e49e 100644 (file)
@@ -22,8 +22,9 @@
 | ...
 | Documentation | *Honeycomb provider backbone bridge test suite.*
 | ...
-| Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 
index a365f54..d9a3933 100644 (file)
 | ...
 | Test Setup | Clear Packet Trace on All DUTs | ${nodes}
 | ...
-| Suite Teardown | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Documentation | *Honeycomb access control lists test suite for ACL plugin.*
 | ...
-| Force Tags | HC_FUNC
+# Failing due to HC2VPP-173: cannot clean up ACLs in test teardown
+| Force Tags | HC_FUNC | EXPECTED_FAILING
 
 *** Test Cases ***
 | TC01: ACL MAC filtering through plugin-acl node - bridged
 | | And Honeycomb Assigns plugin-acl Chain To Interface
 | | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_macip}
 | | ... | ingress | macip=${True}
-| | Then Send TCP or UDP packet and verify received packet | ${tg_node} | ${src_ip} | ${dst_ip}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | TCP | ${src_port} | ${dst_port}
 | | And Run Keyword And Expect Error | TCP/UDP Rx timeout
-| | ... | Send TCP or UDP packet and verify received packet | ${tg_node} | ${src_ip} | ${dst_ip}
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${classify_src}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | TCP | ${src_port} | ${dst_port}
 | | And Run Keyword And Expect Error | TCP/UDP Rx timeout
-| | ... | Send TCP or UDP packet and verify received packet | ${tg_node} | ${src_ip} | ${dst_ip}
+| | ... | Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${classify_src2}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | TCP | ${src_port} | ${dst_port}
 | | ... | ${dut_node} | ${acl_name_mixed} | ${acl_settings}
 | | And Honeycomb Assigns plugin-acl Chain To Interface
 | | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_mixed} | ingress
-| | Then Send TCP or UDP packet and verify received packet | ${tg_node} | ${src_ip} | ${dst_ip}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | TCP | ${src_port} | ${dst_port}
 | | ... | ${dut_node} | ${acl_name_icmp} | ${acl_settings}
 | | And Honeycomb Assigns plugin-acl Chain To Interface
 | | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_icmp} | ingress
-| | Then Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${icmp_type} | ${icmp_code}
-| | Then Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${classify_type} | ${icmp_code}
 | | And Run Keyword And Expect Error | ICMP echo Rx timeout
-| | ... | Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | ... | Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${dut_node} | ${acl_name_icmpv6} | ${acl_settings}
 | | And Honeycomb Assigns plugin-acl Chain To Interface
 | | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_icmpv6} | ingress
-| | Then Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${icmp_type} | ${icmp_code}
-| | Then Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${classify_type} | ${icmp_code}
 | | And Run Keyword And Expect Error | ICMP echo Rx timeout
-| | ... | Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | ... | Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
 | | And Import Variables | resources/test_data/honeycomb/plugin_acl.py
 | | ... | L3_IP6 | ${acl_name_l3_ip6}
-| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
-| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2} | up
+| | And Honeycomb configures interface state
+| | ... | ${dut_node} | ${dut_to_tg_if1} | up
+| | And Honeycomb configures interface state
+| | ... | ${dut_node} | ${dut_to_tg_if2} | up
 | | And Honeycomb sets interface IPv6 address | ${dut_node}
 | | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
 | | And Honeycomb sets interface IPv6 address | ${dut_node}
 | | ... | ${dut_node} | ${acl_name_mixed} | ${acl_settings}
 | | And Honeycomb Assigns plugin-acl Chain To Interface
 | | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_mixed} | ingress
-| | Then Send TCP or UDP packet and verify received packet | ${tg_node} | ${src_ip} | ${dst_ip}
+| | Then Send TCP or UDP packet and verify received packet | ${tg_node}
+| | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | TCP | ${src_port} | ${dst_port}
 | | ... | ${dut_node} | ${acl_name_icmp} | ${acl_settings}
 | | And Honeycomb Assigns plugin-acl Chain To Interface
 | | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_icmp} | ingress
-| | Then Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${icmp_type} | ${icmp_code}
-| | Then Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${classify_type} | ${icmp_code}
 | | And Run Keyword And Expect Error | ICMP echo Rx timeout
-| | ... | Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | ... | Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
 | | And Import Variables | resources/test_data/honeycomb/plugin_acl.py
 | | ... | icmpv6 | ${acl_name_icmpv6}
-| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if1} | up
-| | And Honeycomb configures interface state | ${dut_node} | ${dut_to_tg_if2} | up
+| | And Honeycomb configures interface state
+| | ... | ${dut_node} | ${dut_to_tg_if1} | up
+| | And Honeycomb configures interface state
+| | ... | ${dut_node} | ${dut_to_tg_if2} | up
 | | And Honeycomb sets interface IPv6 address | ${dut_node}
 | | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
 | | And Honeycomb sets interface IPv6 address | ${dut_node}
 | | ... | ${dut_node} | ${acl_name_icmpv6} | ${acl_settings}
 | | And Honeycomb Assigns plugin-acl Chain To Interface
 | | ... | ${dut_node} | ${dut_to_tg_if1} | ${acl_name_icmpv6} | ingress
-| | Then Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${icmp_type} | ${icmp_code}
-| | Then Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | Then Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
 | | ... | ${classify_type} | ${icmp_code}
 | | And Run Keyword And Expect Error | ICMP echo Rx timeout
-| | ... | Send ICMP packet with type and code and verify received packet | ${tg_node}
+| | ... | Send ICMP packet with type and code and verify received packet
+| | ... | ${tg_node}
 | | ... | ${src_ip} | ${dst_ip}
 | | ... | ${tg_to_dut_if1} | ${tg_to_dut_if1_mac}
 | | ... | ${tg_to_dut_if2} | ${dut_to_tg_if1_mac}
index 1fe4847..7afffad 100644 (file)
@@ -30,9 +30,9 @@
 | Library | resources.libraries.python.Trace
 | Variables | resources/test_data/honeycomb/policer_variables.py
 | ...
-| Suite Teardown
-| ... | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 | ...
 | | ... | ${node} | ${interface} | ${acl_tables['hc_acl_table']['name']}
 
 | TC06: VPP policer 2R3C Color-aware marks packet
+# Pending rework
+| | [Tags] | EXPECTED_FAILING
 | | [Documentation]
 | | ... | [Top] TG=DUT1.
 | | ... | [Ref] RFC2474, RFC2698.
 | | And Honeycomb adds interface IPv4 neighbor
 | | ... | ${dut_node} | ${dut_to_tg_if2} | ${tg_to_dut_if2_ip}
 | | ... | ${tg_to_dut_if2_mac}
-| | And interfaceCLI.VPP Node Interfaces Ready Wait | ${dut_node}
+| | And VPP Node Interfaces Ready Wait | ${dut_node}
 | | Then Honeycomb Send packet and verify marking | ${tg_node}
 | | ... | ${tg_to_dut_if1}
 | | ... | ${tg_to_dut_if2} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_mac}
index 26f73b0..5e162a3 100644 (file)
@@ -31,9 +31,9 @@
 | Resource | resources/libraries/robot/traffic.robot
 | Library | resources.libraries.python.Trace
 | ...
-| Suite Teardown
-| ... | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 | ...
index 6c718e7..6b69f5b 100644 (file)
@@ -35,9 +35,9 @@
 | Resource | resources/libraries/robot/dhcp_proxy.robot
 | Library | resources.libraries.python.Trace
 | ...
-| Test Setup | Clear Packet Trace on All DUTs | ${nodes}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
 | ...
-| Suite Teardown | Restart Honeycomb And VPP | ${node}
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 | ...
index be151c3..acf203b 100644 (file)
@@ -24,7 +24,9 @@
 | ...
 | Test Setup | Clear Packet Trace on All DUTs | ${nodes}
 | ...
-| Suite Teardown | Restart Honeycomb And VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Test Teardown | Honeycomb routing test teardown | ${node} | ${table}
 | ...
index c5533c2..b621e17 100644 (file)
@@ -23,9 +23,9 @@
 | Resource | resources/libraries/robot/testing_path.robot
 | Resource | resources/libraries/robot/traffic.robot
 | ...
-| Suite Teardown
-| ... | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 | ...
@@ -39,7 +39,7 @@
 | | ...
 | | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
 | | ... | ${interface}
-| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
 | | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
 | | ... | ${address} | ${prefix}
 | | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data}
@@ -62,7 +62,7 @@
 | | ...
 | | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
 | | ... | ${interface}
-| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
 | | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
 | | ... | ${address} | ${prefix}
 | | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data}
@@ -77,7 +77,7 @@
 | | ...
 | | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
 | | ... | ${interface}
-| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
 | | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
 | | ... | ${address} | ${prefix}
 | | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data_01}
@@ -92,7 +92,7 @@
 | | ...
 | | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
 | | ... | ${interface}
-| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
 | | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
 | | ... | ${address} | ${prefix}
 | | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data_02}
 | | ...
 | | Given SLAAC Operational Data From Honeycomb Should Be empty | ${node}
 | | ... | ${interface}
-| | And InterfaceAPI.Set Interface State | ${node} | ${interface} | up
+| | And Honeycomb Configures Interface State | ${node} | ${interface} | up
 | | And Honeycomb sets interface IPv6 address | ${node} | ${interface}
 | | ... | ${address} | ${prefix}
 | | When Honeycomb configures SLAAC | ${node} | ${interface} | ${slaac_data_03}
 | | ... | ${interface} | ${slaac_data_03}
 
 | TC07: DUT retransmits RA on IPv6 enabled interface after a set interval
+# Traffic test failing in VIRL
+| | [Tags] | EXPECTED_FAILING
 | | [Documentation]
 | | ... | [Top] TG-DUT1-DUT2-TG.
 | | ... | [Cfg] On DUT1 configure IPv6 interface on the link to TG.
index 3c6be39..c281d95 100644 (file)
@@ -22,8 +22,9 @@
 | ...
 | Documentation | *Honeycomb NAT test suite.*
 | ...
-| Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Force Tags | HC_FUNC
 
index e7fe2eb..a24d355 100644 (file)
 | ...
 | Force Tags | HC_FUNC
 | ...
-| Suite Setup | Add Interface local0 To Topology | ${node}
+| Suite Setup | Run Keywords
+| ... | Set Up Honeycomb Functional Test Suite | ${node} | AND
+| ... | Add Interface local0 To Topology | ${node}
 | ...
-| Suite Teardown | Restart Honeycomb and VPP | ${node}
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Documentation | *Honeycomb port mirroring test suite.*
 
 | | ... | ${node} | ${interface2} | ${settings_if2}
 
 | TC07: DUT mirrors IPv4 packets from one interface to another
+# Pending rework
+| | [Tags] | EXPECTED_FAILING
 | | [Documentation]
 | | ... | [Top] TG=DUT1
 | | ... | [Cfg] (using Honeycomb) On DUT1 configure IPv4 address and set SPAN\
 | | ... | ${tg_to_dut_if1_ip} | ${tg_to_dut_if1_mac}
 | | ${settings_5}= | create dictionary | state=both
 | | ... | iface-ref=${dut_to_tg_if1}
-| | And InterfaceCLI.All Vpp Interfaces Ready Wait | ${nodes}
+| | And All Vpp Interfaces Ready Wait | ${nodes}
 | | When Honeycomb configures SPAN on interface
 | | ... | ${node} | ${dut_to_tg_if2} | ${settings_5}
 | | Then Send Packet And Check Received Copies | ${tg_node}
 | | Then Sub-Interface SPAN Operational Data from Honeycomb should be
 | | ... | ${node} | ${interface2} | ${1} | ${settings_if2}
 
-| TC14: DUT mirrors IPv4 packets from one interface to another
+| TC14: DUT mirrors IPv4 packets from an interface to a sub-interface
+# Pending rework
+| | [Tags] | EXPECTED_FAILING
 | | [Documentation]
 | | ... | [Top] TG=DUT1
 | | ... | [Cfg] (using Honeycomb) On DUT1 configure IPv4 address and set SPAN\
 | | ... | ${tg_to_dut_if2_ip} | ${tg_to_dut_if2_mac}
 | | ${settings_5}= | create dictionary | state=both
 | | ... | iface-ref=${dut_to_tg_if2}
-| | And InterfaceCLI.All Vpp Interfaces Ready Wait | ${nodes}
+| | And All Vpp Interfaces Ready Wait | ${nodes}
 | | When Honeycomb Configures SPAN on sub-interface
 | | ... | ${node} | ${dut_to_tg_if1} | ${1} | ${settings_5}
 | | Then Send Packet And Check Received Copies | ${tg_node}
index 7d0f5af..74c1810 100644 (file)
@@ -35,8 +35,9 @@
 | ...
 | Force Tags | HC_FUNC
 | ...
-| Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
 | Documentation | *Honeycomb VxLAN management test suite.*
 
index 8dd884a..9f1cd86 100644 (file)
 | ...
 | Documentation | *Honeycomb VxLAN-GPE management test suite.*
 | ...
-#| Force Tags | HC_FUNC
+| Suite Setup | Set Up Honeycomb Functional Test Suite | ${node}
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
-| Suite Setup | Restart Honeycomb and VPP | ${node}
+# Disabled due to VPP-875: Configuring VxLAN GPE tunnel crashes VPP
+#| Force Tags | HC_FUNC
 
 *** Test Cases ***
 | TC01: Honeycomb creates VxLAN GPE tunnel
index 2f834ac..b943d78 100644 (file)
 | Resource | resources/libraries/robot/honeycomb/tap.robot
 | Resource | resources/libraries/robot/honeycomb/notifications.robot
 | ...
-| Suite Setup | Run keywords
-| ... | Honeycomb configures interface state
-| ... | ${node} | ${interface} | down | AND
-| ... | Honeycomb creates TAP interface
-| ... | ${node} | ${tap_interface} | ${tap_settings}
-| ...
 | Documentation | *Honeycomb notifications test suite.*
 | ...
-| Force Tags | HC_FUNC
+| Suite Setup | Set Up Honeycomb Notifications Functional Test Suite
+| ...
+| Suite Teardown | Tear Down Honeycomb Functional Test Suite | ${node}
 | ...
-| Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb and VPP | ${node}
+| Force Tags | HC_FUNC
 
 *** Test Cases ***
 | TC01: Honeycomb sends notification on interface state change
 | | And Notification listener should be established | ${node}
 | | When Honeycomb removes TAP interface | ${node} | ${tap_interface}
 | | Then Honeycomb should send interface deleted notification | ${tap_interface}
+
+*** Keywords ***
+| Set Up Honeycomb Notifications Functional Test Suite
+| | Set Up Honeycomb Functional Test Suite | ${node}
+| | Honeycomb configures interface state
+| | ... | ${node} | ${interface} | down
+| | Honeycomb creates TAP interface
+| | ... | ${node} | ${tap_interface} | ${tap_settings}
\ No newline at end of file
index 90ed077..4277c91 100644 (file)
@@ -39,7 +39,8 @@
 | | [Documentation] | Checks if Honeycomb maintains configuration after both\
 | | ... | Restart Honeycomb and VPP.
 | | ...
-| | [Tags] | HC_FUNC
+# Failing due to HC2VPP-47
+| | [Tags] | HC_FUNC | EXPECTED_FAILING
 | | ...
 | | [Teardown]
 | | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}