CSIT-457: Address Honeycomb test failures 45/3545/4
authorselias <samelias@cisco.com>
Mon, 24 Oct 2016 16:15:52 +0000 (18:15 +0200)
committerPeter Mikus <pmikus@cisco.com>
Fri, 4 Nov 2016 08:50:25 +0000 (08:50 +0000)
 - tag all not-implemented features with EXPECTED_FAILING
 - add workarounds for known issues with VAT dump commands
 - replace hardcoded test data with parametrized
 - separate IP neighbor and IP address into two test cases
 - support unordered lists with compare_data_structures keyword

Change-Id: I2c683162325cee720ba496489787fa50e9c72b8c
Signed-off-by: selias <samelias@cisco.com>
14 files changed:
resources/libraries/python/InterfaceUtil.py
resources/libraries/python/honeycomb/HcAPIKwACL.py
resources/libraries/python/honeycomb/HcAPIKwBridgeDomain.py
resources/libraries/python/honeycomb/HcAPIKwInterfaces.py
resources/libraries/robot/honeycomb/access_control_lists.robot
resources/libraries/robot/honeycomb/bridge_domain.robot
resources/libraries/robot/honeycomb/interfaces.robot
resources/libraries/robot/honeycomb/sub_interface.robot
resources/libraries/robot/honeycomb/vxlan_gpe.robot
resources/test_data/honeycomb/sub_interfaces.py
tests/func/honeycomb/010_interface_management.robot
tests/func/honeycomb/031_vxlan_gpe.robot
tests/func/honeycomb/060_sub_interface.robot
tests/func/honeycomb/081_ietf_acl_traffic.robot

index 11600a1..b3d168c 100644 (file)
@@ -262,6 +262,8 @@ class InterfaceUtil(object):
             for item in data:
                 item["netmask"] = convert_ipv4_netmask_prefix(
                     item["prefix_length"])
             for item in data:
                 item["netmask"] = convert_ipv4_netmask_prefix(
                     item["prefix_length"])
+                # VAT returns addresses with reversed byte order (VPP-132)
+                item["ip"] = ".".join(item["ip"].split(".")[::-1])
         return data
 
     @staticmethod
         return data
 
     @staticmethod
index 3758202..8d1746d 100644 (file)
@@ -13,6 +13,7 @@
 
 """This module implements keywords to manipulate ACL data structures using
 Honeycomb REST API."""
 
 """This module implements keywords to manipulate ACL data structures using
 Honeycomb REST API."""
+from robot.api import logger
 
 from resources.libraries.python.topology import Topology
 from resources.libraries.python.HTTPRequest import HTTPCodes
 
 from resources.libraries.python.topology import Topology
 from resources.libraries.python.HTTPRequest import HTTPCodes
@@ -61,9 +62,12 @@ class ACLKeywords(object):
                 delete_honeycomb_data(node, "config_classify_table", path)
 
         if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
                 delete_honeycomb_data(node, "config_classify_table", path)
 
         if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
-            raise HoneycombError(
-                "The configuration of classify table was not successful. "
-                "Status code: {0}.".format(status_code))
+            if data is None and '"error-tag":"data-missing"' in resp:
+                logger.debug("data does not exist in path.")
+            else:
+                raise HoneycombError(
+                    "The configuration of classify table was not successful. "
+                    "Status code: {0}.".format(status_code))
         return resp
 
     @staticmethod
         return resp
 
     @staticmethod
index 38d5324..29a3a0e 100644 (file)
@@ -226,11 +226,9 @@ class BridgeDomainKeywords(object):
         :rtype: dict
         """
 
         :rtype: dict
         """
 
-        path = ("bridge-domains", )
         new_bd = BridgeDomainKeywords._create_bd_structure(bd_name, **kwargs)
         new_bd = BridgeDomainKeywords._create_bd_structure(bd_name, **kwargs)
-        bridge_domain = {"bridge-domain": [new_bd, ]}
-        return BridgeDomainKeywords._set_bd_properties(node, bd_name, path,
-                                                       bridge_domain)
+        bridge_domain = {"bridge-domains": {"bridge-domain": [new_bd, ]}}
+        return BridgeDomainKeywords._configure_bd(node, bd_name, bridge_domain)
 
     @staticmethod
     def add_bd(node, bd_name, **kwargs):
 
     @staticmethod
     def add_bd(node, bd_name, **kwargs):
@@ -270,7 +268,7 @@ class BridgeDomainKeywords(object):
         status_code, resp = HcUtil.\
             put_honeycomb_data(node, "config_bridge_domain", data)
 
         status_code, resp = HcUtil.\
             put_honeycomb_data(node, "config_bridge_domain", data)
 
-        if status_code != HTTPCodes.OK:
+        if status_code not in (HTTPCodes.OK, HTTPCodes.ACCEPTED):
             raise HoneycombError("Not possible to remove all bridge domains. "
                                  "Status code: {0}.".format(status_code))
         return resp
             raise HoneycombError("Not possible to remove all bridge domains. "
                                  "Status code: {0}.".format(status_code))
         return resp
index 506db69..559f64e 100644 (file)
@@ -16,6 +16,8 @@
 The keywords make possible to put and get configuration data and to get
 operational data.
 """
 The keywords make possible to put and get configuration data and to get
 operational data.
 """
+from robot.api import logger
+
 from resources.libraries.python.topology import Topology
 from resources.libraries.python.HTTPRequest import HTTPCodes
 from resources.libraries.python.honeycomb.HoneycombSetup import HoneycombError
 from resources.libraries.python.topology import Topology
 from resources.libraries.python.HTTPRequest import HTTPCodes
 from resources.libraries.python.honeycomb.HoneycombSetup import HoneycombError
@@ -342,13 +344,16 @@ class InterfaceKeywords(object):
 
         path = "/interface/{0}/v3po:l2".format(intf)
 
 
         path = "/interface/{0}/v3po:l2".format(intf)
 
-        status_code, _ = HcUtil.delete_honeycomb_data(
+        status_code, response = HcUtil.delete_honeycomb_data(
             node, "config_vpp_interfaces", path)
 
         if status_code != HTTPCodes.OK:
             node, "config_vpp_interfaces", path)
 
         if status_code != HTTPCodes.OK:
-            raise HoneycombError(
-                "Could not remove bridge domain assignment from interface "
-                "'{0}'. Status code: {1}.".format(interface, status_code))
+            if '"error-tag":"data-missing"' in response:
+                logger.debug("Data does not exist in path.")
+            else:
+                raise HoneycombError(
+                    "Could not remove bridge domain assignment from interface "
+                    "'{0}'. Status code: {1}.".format(interface, status_code))
 
     @staticmethod
     def get_bd_oper_data_from_interface(node, interface):
 
     @staticmethod
     def get_bd_oper_data_from_interface(node, interface):
@@ -1283,15 +1288,19 @@ class InterfaceKeywords(object):
             node, super_interface, path, None)
 
     @staticmethod
             node, super_interface, path, None)
 
     @staticmethod
-    def compare_data_structures(data, ref, ignore=()):
+    def compare_data_structures(data, ref, ignore=(), list_order=True):
         """Checks if data obtained from UUT is as expected.
 
         :param data: Data to be checked.
         :param ref: Referential data used for comparison.
         :param ignore: Dictionary keys to be ignored.
         """Checks if data obtained from UUT is as expected.
 
         :param data: Data to be checked.
         :param ref: Referential data used for comparison.
         :param ignore: Dictionary keys to be ignored.
+        :param list_order: Whether to consider the order of list items\
+        in comparison.
         :type data: dict
         :type ref: dict
         :type ignore: iterable
         :type data: dict
         :type ref: dict
         :type ignore: iterable
+        :type list_order: bool
+
         :raises HoneycombError: If a parameter from referential data is not
         present in operational data or if it has different value.
         """
         :raises HoneycombError: If a parameter from referential data is not
         present in operational data or if it has different value.
         """
@@ -1303,10 +1312,13 @@ class InterfaceKeywords(object):
                 continue
             try:
                 if data[key] != item:
                 continue
             try:
                 if data[key] != item:
-                    errors += ("\nThe value of parameter '{0}' is "
-                               "incorrect. It should be "
-                               "'{1}' but it is '{2}'".
-                               format(key, item, data[key]))
+                    if not list_order and sorted(data[key]) == sorted(item):
+                        pass
+                    else:
+                        errors += ("\nThe value of parameter '{0}' is "
+                                   "incorrect. It should be "
+                                   "'{1}' but it is '{2}'".
+                                   format(key, item, data[key]))
             except KeyError:
                 errors += ("\nThe parameter '{0}' is not present in "
                            "operational data".format(key))
             except KeyError:
                 errors += ("\nThe parameter '{0}' is not present in "
                            "operational data".format(key))
@@ -1394,11 +1406,13 @@ class InterfaceKeywords(object):
 
         data = {
             "v3po:acl": {
 
         data = {
             "v3po:acl": {
-                "l2-acl": {
-                    "classify-table": table_name
-                },
-                "ip4-acl": {
-                    "classify-table": table_name
+                "ingress": {
+                    "ip4-acl": {
+                        "classify-table": table_name
+                    },
+                    "l2-acl": {
+                        "classify-table": table_name
+                    }
                 }
             }
         }
                 }
             }
         }
index 7072f59..a9ea7df 100644 (file)
 | | [Arguments] | ${node} | ${interface} | ${table_name}
 | | ${data}= | InterfaceAPI.Get interface oper data | ${node} | ${interface}
 | | Should be equal
 | | [Arguments] | ${node} | ${interface} | ${table_name}
 | | ${data}= | InterfaceAPI.Get interface oper data | ${node} | ${interface}
 | | Should be equal
-| | ... | ${table_name} | ${data['v3po:acl']['l2-acl']['classify-table']}
+| | ... | ${table_name}
+| | ... | ${data['v3po:acl']['ingress']['l2-acl']['classify-table']}
+| | ... | ${data['v3po:acl']['ingress']['ip4-acl']['classify-table']}
 
 | Interface ACL settings from VAT should be
 | | [Documentation] | Retrieves ACL interface settings from VAT\
 
 | Interface ACL settings from VAT should be
 | | [Documentation] | Retrieves ACL interface settings from VAT\
index 2edf307..a286d11 100644 (file)
 | | ...
 | | ... | \| Honeycomb should show no bridge domains \| ${nodes['DUT1']} \|
 | | [Arguments] | ${node}
 | | ...
 | | ... | \| Honeycomb should show no bridge domains \| ${nodes['DUT1']} \|
 | | [Arguments] | ${node}
-| | ${bd_data}= | Get all BDs oper data | ${node}
-| | Should be empty | ${bd_data}
+| | Run keyword and expect error | *Not possible*Status code: 404*
+| | ... | Get all BDs oper data | ${node}
 
 | VAT should show no bridge domains
 | | [Documentation] | Uses VAT to verify the removal of all bridge domains.
 
 | VAT should show no bridge domains
 | | [Documentation] | Uses VAT to verify the removal of all bridge domains.
index 1ffc2e4..706da54 100644 (file)
@@ -92,7 +92,7 @@
 | | Should be equal | ${vat_state} | ${state}
 
 | Honeycomb sets interface ipv4 address
 | | Should be equal | ${vat_state} | ${state}
 
 | Honeycomb sets interface ipv4 address
-| | [Documentation] | Uses Honeycomb API to change ipv4 configuration\
+| | [Documentation] | Uses Honeycomb API to change ipv4 address\
 | | ... | of the specified interface.
 | | ...
 | | ... | *Arguments:*
 | | ... | of the specified interface.
 | | ...
 | | ... | *Arguments:*
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to set. Type: string
 | | ... | - netmask - subnet mask to set. Type: string
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to set. Type: string
 | | ... | - netmask - subnet mask to set. Type: string
-| | ... | - settings - ipv4 interface settings. Type: dictionary
 | | ...
 | | ... | *Example:*
 | | ...
 | | ...
 | | ... | *Example:*
 | | ...
-| | ... | \| Honeycomb sets interface ipv4 configuration \| ${nodes['DUT1']} \
-| | ... | \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 255.255.255.0 \
-| | ... | \| ${{'enabled': True, 'mtu': 1500}} \|
+| | ... | \| Honeycomb sets interface ipv4 address \| ${nodes['DUT1']} \
+| | ... | \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 255.255.255.0 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${netmask}
 | | [Arguments] | ${node} | ${interface} | ${address} | ${netmask}
-| | ... | ${settings}
 | | interfaceAPI.Add first ipv4 address
 | | ... | ${node} | ${interface} | ${address} | ${netmask}
 | | interfaceAPI.Add first ipv4 address
 | | ... | ${node} | ${interface} | ${address} | ${netmask}
-| | :FOR | ${key} | IN | @{settings.keys()}
-| | | interfaceAPI.Configure interface ipv4
-| | | ... | ${node} | ${interface} | ${key} | ${settings['${key}']}
 
 | Honeycomb sets interface ipv4 address with prefix
 | | [Documentation] | Uses Honeycomb API to assign an ipv4 address to the\
 
 | Honeycomb sets interface ipv4 address with prefix
 | | [Documentation] | Uses Honeycomb API to assign an ipv4 address to the\
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to set. Type: string
 | | ... | - prefix - length of address network prefix. Type: int
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to set. Type: string
 | | ... | - prefix - length of address network prefix. Type: int
-| | ... | - settings - ipv4 interface settings. Type: dictionary
 | | ...
 | | ... | *Example:*
 | | ...
 | | ... | \| Honeycomb sets interface ipv4 address with prefix \
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 24 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
 | | ...
 | | ... | *Example:*
 | | ...
 | | ... | \| Honeycomb sets interface ipv4 address with prefix \
 | | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 24 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | ... | ${settings}
 | | interfaceAPI.Add first ipv4 address
 | | ... | ${node} | ${interface} | ${address} | ${prefix}
 | | interfaceAPI.Add first ipv4 address
 | | ... | ${node} | ${interface} | ${address} | ${prefix}
-| | :FOR | ${key} | IN | @{settings.keys()}
-| | | interfaceAPI.Configure interface ipv4
-| | | ... | ${node} | ${interface} | ${key} | ${settings['${key}']}
 
 
-| Honeycomb adds interface ipv4 neighbor
-| | [Documentation] | Uses Honeycomb API to assign an ipv4 neighbor to the\
-| | ... | specified interface.
-| | ...
-| | ... | *Arguments:*
-| | ... | - node - information about a DUT node. Type: dictionary
-| | ... | - interface - name of an interface on the specified node. Type: string
-| | ... | - fib_address - IP address to add to fib table. Type: string
-| | ... | - fib_mac - MAC address to add to fib table. Type: string
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Honeycomb adds interface ipv4 neighbor \| ${nodes['DUT1']} \
-| | ... | \| GigabitEthernet0/8/0 \| 192.168.0.3 \| 08:00:27:c0:5d:37 \
-| | ... | \| ${{'enabled': True, 'mtu': 1500}} \|
-| | [Arguments] | ${node} | ${interface} | ${fib_address} | ${fib_mac}
-| | interfaceAPI.Add ipv4 neighbor
-| | ... | ${node} | ${interface} | ${fib_address} | ${fib_mac}
-
-| IPv4 config from Honeycomb should be
-| | [Documentation] | Retrieves interface ipv4 configuration through Honeycomb\
+| IPv4 address from Honeycomb should be
+| | [Documentation] | Retrieves interface ipv4 address through Honeycomb\
 | | ... | and compares with state supplied in argument.
 | | ...
 | | ... | *Arguments:*
 | | ... | and compares with state supplied in argument.
 | | ...
 | | ... | *Arguments:*
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to expect. Type: string
 | | ... | - prefix - prefix length to expect. Type: string
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to expect. Type: string
 | | ... | - prefix - prefix length to expect. Type: string
-| | ... | - fib_address - IP address to expect in fib table. Type: string
-| | ... | - fib_mac - MAC address to expect in fib table. Type: string
-| | ... | - settings - ipv4 interface settings to expect. Type: dictionary
 | | ...
 | | ... | *Example:*
 | | ...
 | | ...
 | | ... | *Example:*
 | | ...
-| | ... | \| IPv4 config from Honeycomb should be \| ${nodes['DUT1']} \
+| | ... | \| IPv4 address from Honeycomb should be \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 255.255.255.0 \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 255.255.255.0 \
-| | ... | \| 192.168.0.3 \| 08:00:27:c0:5d:37 \
-| | ... | \| ${{'enabled': True, 'mtu': 1500}} \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | ... | ${fib_address} | ${fib_mac} | ${settings}
 | | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
 | | Should be equal | ${address}
 | | ... | ${api_data['ietf-ip:ipv4']['address'][0]['ip']}
 | | Should be equal | ${prefix}
 | | ... | ${api_data['ietf-ip:ipv4']['address'][0]['prefix-length']}
 | | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
 | | Should be equal | ${address}
 | | ... | ${api_data['ietf-ip:ipv4']['address'][0]['ip']}
 | | Should be equal | ${prefix}
 | | ... | ${api_data['ietf-ip:ipv4']['address'][0]['prefix-length']}
-| | Should be equal | ${fib_address}
-| | ... | ${api_data['ietf-ip:ipv4']['neighbor'][0]['ip']}
-| | Should be equal | ${fib_mac}
-| | ... | ${api_data['ietf-ip:ipv4']['neighbor'][0]['link-layer-address']}
-| | :FOR | ${key} | IN | @{settings.keys()}
-| | | Should be equal
-| | | ... | ${settings['${key}']} | ${api_data['ietf-ip:ipv4']['${key}']}
 
 
-| IPv4 config from VAT should be
-| | [Documentation] | Retrieves interface ipv4 configuration through VAT and\
+| IPv4 address from VAT should be
+| | [Documentation] | Retrieves interface ipv4 address through VAT and\
 | | ... | compares with state supplied in argument.
 | | ...
 | | ... | *Arguments:*
 | | ... | compares with state supplied in argument.
 | | ...
 | | ... | *Arguments:*
 | | ...
 | | ... | *Example:*
 | | ...
 | | ...
 | | ... | *Example:*
 | | ...
-| | ... | \| IPv4 config from VAT should be \| ${nodes['DUT1']} \
+| | ... | \| IPv4 address from VAT should be \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 255.255.255.0 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${netmask}
 | | ${vpp_data}= | interfaceCLI.VPP get interface ip addresses
 | | ... | \| GigabitEthernet0/8/0 \| 192.168.0.2 \| 255.255.255.0 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${netmask}
 | | ${vpp_data}= | interfaceCLI.VPP get interface ip addresses
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
 | | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
 | | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
-| | Should be empty | ${api_data['ietf-ip:ipv4']['address']
+| | Run keyword and expect error | *KeyError: 'ietf-ip:ipv4'
+| | ... | Set Variable | ${api_data['ietf-ip:ipv4']['address']}
 
 | IPv4 address from VAT should be empty
 | | [Documentation] | Retrieves interface ipv4 configuration through VAT and\
 
 | IPv4 address from VAT should be empty
 | | [Documentation] | Retrieves interface ipv4 configuration through VAT and\
 | | ... | \| IPv4 config from VAT should be empty \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
 | | ... | \| IPv4 config from VAT should be empty \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \|
 | | [Arguments] | ${node} | ${interface}
-| | Run keyword and expect error | *No JSON object could be decoded.*
+| | Run keyword and expect error | *No JSON object could be decoded*
 | | ... | InterfaceCLI.VPP get interface ip addresses
 | | ... | ${node} | ${interface} | ipv4
 
 | | ... | InterfaceCLI.VPP get interface ip addresses
 | | ... | ${node} | ${interface} | ipv4
 
-| Honeycomb sets interface ipv6 configuration
-| | [Documentation] | Uses Honeycomb API to change ipv6 configuration\
+| Honeycomb adds interface ipv4 neighbor
+| | [Documentation] | Uses Honeycomb API to assign an ipv4 neighbor to the\
+| | ... | specified interface.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ... | - interface - name of an interface on the specified node. Type: string
+| | ... | - fib_address - IP address to add to fib table. Type: string
+| | ... | - fib_mac - MAC address to add to fib table. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| 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
+| | ... | ${node} | ${interface} | ${fib_address} | ${fib_mac}
+
+| IPv4 neighbor from Honeycomb should be
+| | [Documentation] | Retrieves ipv4 neighbor list through Honeycomb\
+| | and compares with neighbor list supplied in argument.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ... | - interface - name of an interface on the specified node. Type: string
+| | ... | - neighbors - list of ipv4 neighbor dictionaries. Type: list
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| IPv4 neighbor from Honeycomb should be \| ${nodes['DUT1']} \
+| | ... | \| GigabitEthernet0/8/0 \| 192.168.0.4 \| 08:00:27:60:26:ab \|
+| | [Arguments] | ${node} | ${interface} | @{neighbors}
+| | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
+| | ${data_neighbors}= | Set Variable | ${api_data['ietf-ip:ipv4']['neighbor']}
+| | Compare data structures
+| | ... | ${data_neighbors} | ${neighbors} | list_order=${False}
+| | Should be equal | ${neighbor['fib_address']}
+| | ... | ${api_data['ietf-ip:ipv4']['neighbor'][0]['ip']}
+| | Should be equal | ${neighbor['fib_mac']}
+| | ... | ${api_data['ietf-ip:ipv4']['neighbor'][0]['link-layer-address']}
+
+| Honeycomb clears all interface ipv4 neighbors
+| | [Documentation] | Uses Honeycomb API to assign an ipv4 neighbor to the\
+| | ... | specified interface.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ... | - interface - name of an interface on the specified node. Type: string
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Honeycomb clears all interface ipv4 neighbors \| ${nodes['DUT1']} \
+| | ... | \| GigabitEthernet0/8/0 \|
+| | [Arguments] | ${node} | ${interface}
+| | interfaceAPI.clear all ipv4 neighbors | ${node} | ${interface}
+
+| Honeycomb sets interface ipv6 address
+| | [Documentation] | Uses Honeycomb API to change ipv6 address\
 | | ... | of the specified interface.
 | | ...
 | | ... | *Arguments:*
 | | ... | of the specified interface.
 | | ...
 | | ... | *Arguments:*
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to set. Type: string
 | | ... | - prefix - length of subnet prefix to set. Type: string
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to set. Type: string
 | | ... | - prefix - length of subnet prefix to set. Type: string
-| | ... | - fib_address - IP address to add to fib table. Type: string
-| | ... | - fib_mac - MAC address to add to fib table. Type: string
-| | ... | - settings - ipv6 interface settings. Type: dictionary
 | | ...
 | | ... | *Example:*
 | | ...
 | | ...
 | | ... | *Example:*
 | | ...
-| | ... | \| Honeycomb sets interface ipv6 configuration \| ${nodes['DUT1']} \
-| | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \
-| | ... | \| 10::11 \| 08:00:27:c0:5d:37 \| ${{'enabled': True, 'mtu': 1500}} \|
+| | ... | \| Honeycomb sets interface ipv6 address \| ${nodes['DUT1']} \
+| | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | ... | ${fib_address} | ${fib_mac} | ${settings}
 | | interfaceAPI.Add first ipv6 address
 | | ... | ${node} | ${interface} | ${address} | ${prefix}
 | | interfaceAPI.Add first ipv6 address
 | | ... | ${node} | ${interface} | ${address} | ${prefix}
-| | interfaceAPI.Add first ipv6 neighbor
-| | ... | ${node} | ${interface} | ${fib_address} | ${fib_mac}
-| | :FOR | ${key} | IN | @{settings.keys()}
-| | | interfaceAPI.Configure interface ipv6
-| | | ... | ${node} | ${interface} | ${key} | ${settings['${key}']}
 
 
-| IPv6 config from Honeycomb should be
-| | [Documentation] | Retrieves interface ipv6 configuration through Honeycomb\
+| IPv6 address from Honeycomb should be
+| | [Documentation] | Retrieves interface ipv6 address through Honeycomb\
 | | ... | and compares with state supplied in argument.
 | | ...
 | | ... | *Arguments:*
 | | ... | and compares with state supplied in argument.
 | | ...
 | | ... | *Arguments:*
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to expect. Type: string
 | | ... | - prefix - length of subnet prefix to expect. Type: string
 | | ... | - interface - name of an interface on the specified node. Type: string
 | | ... | - address - IP address to expect. Type: string
 | | ... | - prefix - length of subnet prefix to expect. Type: string
-| | ... | - fib_address - IP address to expect in fib table. Type: string
-| | ... | - fib_mac - MAC address to expect in fib table. Type: string
-| | ... | - settings - ipv6 interface settings to expect. Type: dictionary
 | | ...
 | | ... | *Example:*
 | | ...
 | | ...
 | | ... | *Example:*
 | | ...
-| | ... | \| IPv6 config from Honeycomb should be \| ${nodes['DUT1']} \
-| | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \
-| | ... | \| 10::11 \| 08:00:27:c0:5d:37 \| ${{'enabled': True, 'mtu': 1500}} \|
+| | ... | \| IPv6 address from Honeycomb should be \| ${nodes['DUT1']} \
+| | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
-| | ... | ${fib_address} | ${fib_mac} | ${settings}
 | | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
 | | Should be equal | ${address}
 | | ... | ${api_data['ietf-ip:ipv6']['address'][0]['ip']}
 | | Should be equal | ${prefix}
 | | ... | ${api_data['ietf-ip:ipv6']['address'][0]['prefix-length']}
 | | Should be equal | ${fib_address}
 | | ${api_data}= | interfaceAPI.Get interface oper data | ${node} | ${interface}
 | | Should be equal | ${address}
 | | ... | ${api_data['ietf-ip:ipv6']['address'][0]['ip']}
 | | Should be equal | ${prefix}
 | | ... | ${api_data['ietf-ip:ipv6']['address'][0]['prefix-length']}
 | | Should be equal | ${fib_address}
-| | ... | ${api_data['ietf-ip:ipv6']['neighbor'][0]['ip']
-| | Should be equal | ${fib_mac}
-| | ... | ${api_data['ietf-ip:ipv6']['neighbor'][0]['link-layer-address']
-| | :FOR | ${key} | IN | @{settings.keys()}
-| | | Should be equal
-| | ... | ${settings['{key']} | ${api_data['ietf-ip:ipv6']['{$key}']}
 
 
-| IPv6 config from VAT should be
-| | [Documentation] | Retrieves interface ipv6 configuration through VAT and\
+| IPv6 address from VAT should be
+| | [Documentation] | Retrieves interface ipv6 address through VAT and\
 | | ... | compares with state supplied in argument.
 | | ...
 | | ... | *Arguments:*
 | | ... | compares with state supplied in argument.
 | | ...
 | | ... | *Arguments:*
 | | ...
 | | ... | *Example:*
 | | ...
 | | ...
 | | ... | *Example:*
 | | ...
-| | ... | \| IPv6 config from VAT should be \| ${nodes['DUT1']} \
+| | ... | \| IPv6 address from VAT should be \| ${nodes['DUT1']} \
 | | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
 | | ${vpp_data}= | interfaceCLI.VPP get interface ip addresses
 | | ... | \| GigabitEthernet0/8/0 \| 10::10 \| 64 \|
 | | [Arguments] | ${node} | ${interface} | ${address} | ${prefix}
 | | ${vpp_data}= | interfaceCLI.VPP get interface ip addresses
index e4844de..e9b8aeb 100644 (file)
@@ -68,6 +68,7 @@
 | | ${api_data}= | interfaceAPI.Get sub interface oper data
 | | ... | ${node} | ${super_interface} | ${identifier}
 | | interfaceAPI.Compare Data Structures | ${api_data} | ${sub_if_settings}
 | | ${api_data}= | interfaceAPI.Get sub interface oper data
 | | ... | ${node} | ${super_interface} | ${identifier}
 | | interfaceAPI.Compare Data Structures | ${api_data} | ${sub_if_settings}
+| | ... | list_order=${False}
 
 | Sub-interface configuration from Honeycomb should be empty
 | | [Documentation] | Retrieves sub-interface configuration through Honeycomb \
 
 | Sub-interface configuration from Honeycomb should be empty
 | | [Documentation] | Retrieves sub-interface configuration through Honeycomb \
@@ -84,7 +85,7 @@
 | | ...
 | | [Arguments] | ${node} | ${super_interface} | ${identifier}
 | | ...
 | | ...
 | | [Arguments] | ${node} | ${super_interface} | ${identifier}
 | | ...
-| | Run keyword and expect error | *KeyError: 'sub-interface'*
+| | Run keyword and expect error | *KeyError: 'vpp-vlan:sub-interfaces'*
 | | ... | interfaceAPI.Get sub interface oper data
 | | ... | ${node} | ${super_interface} | ${identifier}
 
 | | ... | interfaceAPI.Get sub interface oper data
 | | ... | ${node} | ${super_interface} | ${identifier}
 
 | | [Arguments] | ${node} | ${super_if} | ${identifier} | ${settings}
 | | ${api_data}= | interfaceAPI.Get tag rewrite oper data
 | | ... | ${node} | ${super_if} | ${identifier}
 | | [Arguments] | ${node} | ${super_if} | ${identifier} | ${settings}
 | | ${api_data}= | interfaceAPI.Get tag rewrite oper data
 | | ... | ${node} | ${super_if} | ${identifier}
-| | interfaceAPI.Compare Data Structures | ${api_data} | ${settings}
+| | interfaceAPI.Compare Data Structures
+| | ... | ${api_data} | ${settings} | list_order=${False}
 
 | Rewrite tag from VAT should be
 | | [Documentation] | Retrieves sub-interface configuration through VAT and\
 
 | Rewrite tag from VAT should be
 | | [Documentation] | Retrieves sub-interface configuration through VAT and\
 | | [Arguments] | ${node} | ${super_if} | ${identifier}
 | | ${if_data}= | interfaceAPI.Get sub interface oper data
 | | ... | ${node} | ${super_if} | ${identifier}
 | | [Arguments] | ${node} | ${super_if} | ${identifier}
 | | ${if_data}= | interfaceAPI.Get sub interface oper data
 | | ... | ${node} | ${super_if} | ${identifier}
-| | Run keyword and expect error | *KeyError: 'address'*
+| | Run keyword and expect error | *KeyError: 'ipv4'*
 | | ... | Set Variable | ${if_data['ipv4']['address'][0]['ip']}
 
 | Sub-interface ipv4 address from VAT should be empty
 | | ... | Set Variable | ${if_data['ipv4']['address'][0]['ip']}
 
 | Sub-interface ipv4 address from VAT should be empty
index ef20ed9..14a4910 100644 (file)
 | | ... | ${vat_data['encap_vrf_id']} | ${vxlan_gpe_params['encap-vrf-id']}
 | | Should be equal as strings
 | | ... | ${vat_data['decap_vrf_id']} | ${vxlan_gpe_params['decap-vrf-id']}
 | | ... | ${vat_data['encap_vrf_id']} | ${vxlan_gpe_params['encap-vrf-id']}
 | | Should be equal as strings
 | | ... | ${vat_data['decap_vrf_id']} | ${vxlan_gpe_params['decap-vrf-id']}
-| | Should be equal as strings | ${vat_data['protocol']}
+# VAT dump multiplies protocol value by 16777216
+| | Should be equal as strings | ${vat_data['protocol']/16777216}
 | | ... | ${protocols['${vxlan_gpe_params['next-protocol']}']}
 
 | VxLAN GPE Interface indices from Honeycomb and VAT should correspond
 | | ... | ${protocols['${vxlan_gpe_params['next-protocol']}']}
 
 | VxLAN GPE Interface indices from Honeycomb and VAT should correspond
index 6904b48..a8afb22 100644 (file)
@@ -47,19 +47,19 @@ sub_if_1_oper = {
     "tags": {
         "tag": [
             {
     "tags": {
         "tag": [
             {
-                "index": 1,
+                "index": 0,
                 "dot1q-tag": {
                 "dot1q-tag": {
-                    "tag-type": "dot1q-types:c-vlan",
-                    "vlan-id": "any"
+                    "tag-type": "dot1q-types:s-vlan",
+                    "vlan-id": "100"
                 }
             },
             {
                 }
             },
             {
-                "index": 0,
+                "index": 1,
                 "dot1q-tag": {
                 "dot1q-tag": {
-                    "tag-type": "dot1q-types:s-vlan",
-                    "vlan-id": "100"
+                    "tag-type": "dot1q-types:c-vlan",
+                    "vlan-id": "any"
                 }
                 }
-            }
+            },
         ]
     },
     "match": {
         ]
     },
     "match": {
@@ -97,7 +97,7 @@ tag_rewrite_push = {
             "index": 0,
             "dot1q-tag": {
                 "tag-type": "dot1q-types:s-vlan",
             "index": 0,
             "dot1q-tag": {
                 "tag-type": "dot1q-types:s-vlan",
-                "vlan-id":123
+                "vlan-id": 123
             }
         },
         {
             }
         },
         {
@@ -115,17 +115,17 @@ tag_rewrite_push_oper = {
     "vlan-type": "vpp-vlan:802dot1q",
     "push-tags": [
         {
     "vlan-type": "vpp-vlan:802dot1q",
     "push-tags": [
         {
-            "index": 1,
+            "index": 0,
             "dot1q-tag": {
             "dot1q-tag": {
-                "tag-type": "dot1q-types:c-vlan",
-                "vlan-id": 456
+                "tag-type": "dot1q-types:s-vlan",
+                "vlan-id": 123
             }
         },
         {
             }
         },
         {
-            "index": 0,
+            "index": 1,
             "dot1q-tag": {
             "dot1q-tag": {
-                "tag-type": "dot1q-types:s-vlan",
-                "vlan-id": 123
+                "tag-type": "dot1q-types:c-vlan",
+                "vlan-id": 456
             }
         }
     ]
             }
         }
     ]
@@ -202,19 +202,19 @@ tag_rewrite_translate_1_2_oper = {
     "pop-tags": 1,
     "push-tags": [
         {
     "pop-tags": 1,
     "push-tags": [
         {
-            "index": 1,
+            "index": 0,
             "dot1q-tag": {
             "dot1q-tag": {
-                "tag-type": "dot1q-types:c-vlan",
-                "vlan-id": 222
+                "tag-type": "dot1q-types:s-vlan",
+                "vlan-id": 111
             }
         },
         {
             }
         },
         {
-            "index": 0,
+            "index": 1,
             "dot1q-tag": {
             "dot1q-tag": {
-                "tag-type": "dot1q-types:s-vlan",
-                "vlan-id": 111
+                "tag-type": "dot1q-types:c-vlan",
+                "vlan-id": 222
             }
             }
-        }
+        },
     ]
 }
 
     ]
 }
 
index 2c639c5..b68b082 100644 (file)
@@ -20,7 +20,7 @@
 | ${ipv4_mask}= | 255.255.255.0
 | ${ipv4_prefix}= | ${24}
 | @{ipv4_neighbor}= | 192.168.0.4 | 08:00:27:c0:5d:37
 | ${ipv4_mask}= | 255.255.255.0
 | ${ipv4_prefix}= | ${24}
 | @{ipv4_neighbor}= | 192.168.0.4 | 08:00:27:c0:5d:37
-| &{ipv4_settings}= | enabled=${True} | forwarding=${True} | mtu=${9000}
+| &{ipv4_settings}= | mtu=${9000}
 | @{ipv6_address}= | 10::10 | ${64}
 | @{ipv6_neighbor}= | 10::11 | 08:00:27:c0:5d:37
 | &{ipv6_settings}= | enabled=${True} | forwarding=${True} | mtu=${9000}
 | @{ipv6_address}= | 10::10 | ${64}
 | @{ipv6_neighbor}= | 10::11 | 08:00:27:c0:5d:37
 | &{ipv6_settings}= | enabled=${True} | forwarding=${True} | mtu=${9000}
 | ... | Test suite uses the first interface of the first DUT node.
 
 *** Test Cases ***
 | ... | Test suite uses the first interface of the first DUT node.
 
 *** Test Cases ***
-# TODO: Remove "continue on failure" once VPP bugs (VPP-132, VPP-333) are fixed.
 | Honeycomb configures and reads interface state
 | | [Documentation] | Check if Honeycomb API can modify the admin state of\
 | | ... | VPP interfaces.
 | Honeycomb configures and reads interface state
 | | [Documentation] | Check if Honeycomb API can modify the admin state of\
 | | ... | VPP interfaces.
-| | Given Interface State Is | ${node} | ${interface} | down
+| | Given Interface state from Honeycomb should be
+| | ... | ${node} | ${interface} | down
+| | And Interface state from VAT should be | ${node} | ${interface} | down
 | | When Honeycomb sets interface state | ${node} | ${interface} | up
 | | Then Interface state from Honeycomb should be
 | | ... | ${node} | ${interface} | up
 | | When Honeycomb sets interface state | ${node} | ${interface} | up
 | | Then Interface state from Honeycomb should be
 | | ... | ${node} | ${interface} | up
 | | ... | ${node} | ${interface} | down
 | | And Interface state from VAT should be | ${node} | ${interface} | down
 
 | | ... | ${node} | ${interface} | down
 | | And Interface state from VAT should be | ${node} | ${interface} | down
 
-| Honeycomb modifies interface configuration - ipv4 (netmask)
+| Honeycomb modifies interface IPv4 address with netmask
 | | [Documentation] | Check if Honeycomb API can configure interfaces for ipv4\
 | | ... | with address and netmask provided.
 | | [Documentation] | Check if Honeycomb API can configure interfaces for ipv4\
 | | ... | with address and netmask provided.
+| | Given IPv4 address from Honeycomb should be empty | ${node} | ${interface}
+| | And ipv4 address from VAT should be empty | ${node} | ${interface}
 | | When Honeycomb sets interface ipv4 address | ${node} | ${interface}
 | | When Honeycomb sets interface ipv4 address | ${node} | ${interface}
-| | ... | ${ipv4_address} | ${ipv4_mask} | ${ipv4_settings}
-| | And Honeycomb adds interface ipv4 neighbor
-| | ... | ${node} | ${interface} | @{ipv4_neighbor}
-| | Run Keyword And Continue On Failure
-| | ... | Then IPv4 config from Honeycomb should be
-| | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
-| | ... | @{ipv4_neighbor} | ${ipv4_settings}
-| | Run Keyword And Continue On Failure
-| | ... | And IPv4 config from VAT should be
+| | ... | ${ipv4_address} | ${ipv4_mask}
+| | Then IPv4 address from Honeycomb should be
 | | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
 | | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_mask}
 
 
-| Honeycomb removes ipv4 address from interface
+| Honeycomb removes IPv4 address from interface
 | | [Documentation] | Check if Honeycomb API can remove configured ipv4\
 | | ... | addresses from interface.
 | | [Documentation] | Check if Honeycomb API can remove configured ipv4\
 | | ... | addresses from interface.
-| | Run Keyword And Continue On Failure
-| | ... | Given IPv4 config from Honeycomb should be
-| | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
-| | ... | @{ipv4_neighbor} | ${ipv4_settings}
-| | Run Keyword And Continue On Failure
-| | ... | And IPv4 config from VAT should be
+| | Given IPv4 address from Honeycomb should be
 | | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
 | | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | ${interface} | ${ipv4_address} | ${ipv4_mask}
 | | When Honeycomb removes interface ipv4 addresses | ${node} | ${interface}
 | | Then IPv4 address from Honeycomb should be empty | ${node} | ${interface}
 | | And ipv4 address from VAT should be empty | ${node} | ${interface}
 
 | | When Honeycomb removes interface ipv4 addresses | ${node} | ${interface}
 | | Then IPv4 address from Honeycomb should be empty | ${node} | ${interface}
 | | And ipv4 address from VAT should be empty | ${node} | ${interface}
 
-| Honeycomb modifies interface configuration - ipv4 (prefix)
+| Honeycomb modifies interface IPv4 address with prefix
 | | [Documentation] | Check if Honeycomb API can configure interfaces for ipv4\
 | | ... | with address and prefix provided.
 | | [Teardown] | Honeycomb removes interface ipv4 addresses | ${node}
 | | ... | ${interface}
 | | [Documentation] | Check if Honeycomb API can configure interfaces for ipv4\
 | | ... | with address and prefix provided.
 | | [Teardown] | Honeycomb removes interface ipv4 addresses | ${node}
 | | ... | ${interface}
+| | Given IPv4 address from Honeycomb should be empty | ${node} | ${interface}
+| | And ipv4 address from VAT should be empty | ${node} | ${interface}
 | | When Honeycomb sets interface ipv4 address with prefix
 | | ... | ${node} | ${interface} | ${ipv4_address2} | ${ipv4_prefix}
 | | When Honeycomb sets interface ipv4 address with prefix
 | | ... | ${node} | ${interface} | ${ipv4_address2} | ${ipv4_prefix}
-| | ... | ${ipv4_settings}
-| | And Honeycomb adds interface ipv4 neighbor
-| | ... | ${node} | ${interface} | @{ipv4_neighbor}
-| | Run Keyword And Continue On Failure
-| | ... | Then IPv4 config from Honeycomb should be
-| | ... | ${node} | ${interface} | ${ipv4_address2} | ${ipv4_prefix}
-| | ... | @{ipv4_neighbor}
-| | ... | ${ipv4_settings}
-| | Run Keyword And Continue On Failure
-| | ... | And IPv4 config from VAT should be
+| | Then IPv4 address from Honeycomb should be
 | | ... | ${node} | ${interface} | ${ipv4_address2} | ${ipv4_prefix}
 | | ... | ${node} | ${interface} | ${ipv4_address2} | ${ipv4_prefix}
+| | And IPv4 address from VAT should be
+| | ... | ${node} | ${interface} | ${ipv4_address2} | ${ipv4_mask}
 
 
-| Honeycomb modifies interface configuration - ipv6
+| Honeycomb modifies IPv4 neighbor table
+| | [Documentation] | Check if Honeycomb API can add and remove ARP entries.
+# Feature not implemented
+| | [Tags] | EXPECTED_FAILING
+| | [Teardown] | Honeycomb clears all interface ipv4 neighbors
+| | ... | ${node} | ${interface}
+| | When Honeycomb adds interface ipv4 neighbor
+| | ... | ${node} | ${interface} | @{ipv4_neighbor}
+| | Then IPv4 neighbor from Honeycomb should be
+| | ... | ${node} | ${interface} | @{ipv4_neighbor}
+# VAT dump not available
+
+| Honeycomb modifies interface configuration - IPv6
 | | [Documentation] | Check if Honeycomb API can configure interfaces for ipv6.
 | | [Documentation] | Check if Honeycomb API can configure interfaces for ipv6.
-| | When Honeycomb sets interface ipv6 configuration
-| | ... | ${node} | ${interface} | @{ipv6_address} | @{ipv6_neighbor}
-| | ... | ${ipv6_settings}
-| | Run Keyword And Continue On Failure
-| | ... | Then IPv6 config from Honeycomb should be
-| | ... | ${node} | ${interface} | @{ipv6_address} | @{ipv6_neighbor}
-| | ... | ${ipv6_settings}
-| | Run Keyword And Continue On Failure
-| | ... | And IPv6 config from VAT should be
+# Feature not implemented
+| | [Tags] | EXPECTED_FAILING
+| | When Honeycomb sets interface ipv6 address
+| | ... | ${node} | ${interface} | @{ipv6_address}
+| | Then IPv6 address from Honeycomb should be
+| | ... | ${node} | ${interface} | @{ipv6_address}
+| | And IPv6 address from VAT should be
 | | ... | ${node} | ${interface} | @{ipv6_address}
 
 | Honeycomb modifies interface configuration - ethernet,routing
 | | [Documentation] | Check if Honeycomb API can configure interface ethernet\
 | | ... | and routing settings.
 | | ... | ${node} | ${interface} | @{ipv6_address}
 
 | Honeycomb modifies interface configuration - ethernet,routing
 | | [Documentation] | Check if Honeycomb API can configure interface ethernet\
 | | ... | and routing settings.
+# Feature not implemented
+| | [Tags] | EXPECTED_FAILING
 | | When Honeycomb sets interface ethernet and routing configuration
 | | ... | ${node} | ${interface} | ${ethernet} | ${routing}
 | | Then Interface ethernet and routing configuration from Honeycomb should be
 | | When Honeycomb sets interface ethernet and routing configuration
 | | ... | ${node} | ${interface} | ${ethernet} | ${routing}
 | | Then Interface ethernet and routing configuration from Honeycomb should be
index 54347e5..9c6134b 100644 (file)
@@ -44,7 +44,6 @@
 | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
 
 *** Test Cases ***
 | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
 
 *** Test Cases ***
-# TODO: Remove "continue on failure" once VPP bugs (VPP-217, VPP-156) are fixed.
 | Honeycomb creates VxLAN GPE tunnel
 | | [Documentation] | Check if Honeycomb API can configure a VxLAN GPE tunnel.
 | | ...
 | Honeycomb creates VxLAN GPE tunnel
 | | [Documentation] | Check if Honeycomb API can configure a VxLAN GPE tunnel.
 | | ...
@@ -58,8 +57,7 @@
 | | Then VxLAN GPE configuration from Honeycomb should be
 | | ... | ${node} | ${vxlan_gpe_if1}
 | | ... | ${vxlan_gpe_base_settings} | ${vxlan_gpe_settings}
 | | Then VxLAN GPE configuration from Honeycomb should be
 | | ... | ${node} | ${vxlan_gpe_if1}
 | | ... | ${vxlan_gpe_base_settings} | ${vxlan_gpe_settings}
-| | And run keyword and continue on failure
-| | ... | VxLAN GPE configuration from VAT should be
+| | And VxLAN GPE configuration from VAT should be
 | | ... | ${node} | ${vxlan_gpe_if1} | ${vxlan_gpe_settings}
 | | And VxLAN GPE Interface indices from Honeycomb and VAT should correspond
 | | ... | ${node} | ${vxlan_gpe_if1}
 | | ... | ${node} | ${vxlan_gpe_if1} | ${vxlan_gpe_settings}
 | | And VxLAN GPE Interface indices from Honeycomb and VAT should correspond
 | | ... | ${node} | ${vxlan_gpe_if1}
 | Honeycomb removes VxLAN GPE tunnel
 | | [Documentation] | Check if Honeycomb API can remove VxLAN GPE tunnel.
 | | ...
 | Honeycomb removes VxLAN GPE tunnel
 | | [Documentation] | Check if Honeycomb API can remove VxLAN GPE tunnel.
 | | ...
-| | Run Keyword And Continue On Failure
-| | ... | Given VxLAN GPE configuration from Honeycomb should be
+| | Given VxLAN GPE configuration from Honeycomb should be
 | | ... | ${node} | ${vxlan_gpe_if1}
 | | ... | ${vxlan_gpe_base_settings} | ${vxlan_gpe_settings}
 | | ... | ${node} | ${vxlan_gpe_if1}
 | | ... | ${vxlan_gpe_base_settings} | ${vxlan_gpe_settings}
-| | Run Keyword And Continue On Failure
-| | ... | And VxLAN GPE configuration from VAT should be
+| | VxLAN GPE configuration from VAT should be
 | | ... | ${node} | ${vxlan_gpe_if1} | ${vxlan_gpe_settings}
 | | When Honeycomb removes VxLAN GPE interface
 | | ... | ${node} | ${vxlan_gpe_if1}
 | | ... | ${node} | ${vxlan_gpe_if1} | ${vxlan_gpe_settings}
 | | When Honeycomb removes VxLAN GPE interface
 | | ... | ${node} | ${vxlan_gpe_if1}
 | | Then VxLAN GPE configuration from Honeycomb should be
 | | ... | ${node} | ${vxlan_gpe_if6}
 | | ... | ${vxlan_gpe_base_ipv6_settings2} | ${vxlan_gpe_ipv6_settings2}
 | | Then VxLAN GPE configuration from Honeycomb should be
 | | ... | ${node} | ${vxlan_gpe_if6}
 | | ... | ${vxlan_gpe_base_ipv6_settings2} | ${vxlan_gpe_ipv6_settings2}
-| | And run keyword and continue on failure
-| | ... | VxLAN GPE configuration from VAT should be
+| | And VxLAN GPE configuration from VAT should be
 | | ... | ${node} | ${vxlan_gpe_if6} | ${vxlan_gpe_ipv6_settings2}
 | | And VxLAN GPE Interface indices from Honeycomb and VAT should correspond
 | | ... | ${node} | ${vxlan_gpe_if6}
 | | ... | ${node} | ${vxlan_gpe_if6} | ${vxlan_gpe_ipv6_settings2}
 | | And VxLAN GPE Interface indices from Honeycomb and VAT should correspond
 | | ... | ${node} | ${vxlan_gpe_if6}
index 8f12dd6..5d0d7a3 100644 (file)
 | | ... | ${node} | ${sub_if_name}
 | | When Honeycomb creates sub-interface | ${node} | ${super_if}
 | | ... | ${sub_if_1_match} | ${sub_if_1_tags} | ${sub_if_1_settings}
 | | ... | ${node} | ${sub_if_name}
 | | When Honeycomb creates sub-interface | ${node} | ${super_if}
 | | ... | ${sub_if_1_match} | ${sub_if_1_tags} | ${sub_if_1_settings}
-| | Then run keyword and continue on failure
-| | ... | Sub-interface configuration from Honeycomb should be
+| | Then Sub-interface configuration from Honeycomb should be
 | | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_if_1_oper}
 | | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_if_1_oper}
-| | And run keyword and continue on failure
-| | ... | Sub-interface configuration from VAT should be
+| | And Sub-interface configuration from VAT should be
 | | ... | ${node} | ${sub_if_name} | ${sub_if_1_oper}
 | | And sub-interface indices from Honeycomb and VAT should correspond
 | | ... | ${node} | ${super_if} | ${sub_if_id}
 
 | Honeycomb sets interface and sub-interface up
 | | ... | ${node} | ${sub_if_name} | ${sub_if_1_oper}
 | | And sub-interface indices from Honeycomb and VAT should correspond
 | | ... | ${node} | ${super_if} | ${sub_if_id}
 
 | Honeycomb sets interface and sub-interface up
-| | [Documentation] | Honeycomb changes the state of interface up and then \
-| | ... | changes the state of its sub-interface up, in this order.
+| | [Documentation] | Honeycomb changes the state of interface\
+| | ... | and of its sub-interface to up.
 | | ...
 | | Given interface state from Honeycomb should be
 | | ... | ${node} | ${super_if} | down
 | | And interface state from VAT should be
 | | ... | ${node} | ${super_if} | down
 | | ...
 | | Given interface state from Honeycomb should be
 | | ... | ${node} | ${super_if} | down
 | | And interface state from VAT should be
 | | ... | ${node} | ${super_if} | down
+| | Sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | down | down
+| | Sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | down | down
 | | When Honeycomb sets interface state
 | | ... | ${node} | ${super_if} | up
 | | Then interface state from Honeycomb should be
 | | ... | ${node} | ${super_if} | up
 | | And interface state from VAT should be
 | | ... | ${node} | ${super_if} | up
 | | When Honeycomb sets interface state
 | | ... | ${node} | ${super_if} | up
 | | Then interface state from Honeycomb should be
 | | ... | ${node} | ${super_if} | up
 | | And interface state from VAT should be
 | | ... | ${node} | ${super_if} | up
-| | Given run keyword and continue on failure
-| | ... | Sub-interface state from Honeycomb should be
-| | ... | ${node} | ${super_if} | ${sub_if_id} | down | down
-| | And run keyword and continue on failure
-| | ... | Sub-interface state from VAT should be
-| | ... | ${node} | ${sub_if_name} | down | down
 | | When Honeycomb sets the sub-interface up
 | | ... | ${node} | ${super_if} | ${sub_if_id}
 | | When Honeycomb sets the sub-interface up
 | | ... | ${node} | ${super_if} | ${sub_if_id}
-| | Then run keyword and continue on failure
-| | ... | Sub-interface state from Honeycomb should be
+| | Then Sub-interface state from Honeycomb should be
 | | ... | ${node} | ${super_if} | ${sub_if_id} | up | up
 | | And sub-interface state from VAT should be
 | | ... | ${node} | ${sub_if_name} | up | up
 | | ... | ${node} | ${super_if} | ${sub_if_id} | up | up
 | | And sub-interface state from VAT should be
 | | ... | ${node} | ${sub_if_name} | up | up
 | | ... | ${node} | ${super_if} | up
 | | When Honeycomb sets the sub-interface down
 | | ... | ${node} | ${super_if} | ${sub_if_id}
 | | ... | ${node} | ${super_if} | up
 | | When Honeycomb sets the sub-interface down
 | | ... | ${node} | ${super_if} | ${sub_if_id}
-| | Then sub-interface state from Honeycomb should be
-| | ... | ${node} | ${super_if} | ${sub_if_id} | down | down
-| | And sub-interface state from VAT should be
-| | ... | ${node} | ${sub_if_name} | down | down
-| | And interface state from Honeycomb should be
+| | Then interface state from Honeycomb should be
 | | ... | ${node} | ${super_if} | up
 | | And interface state from VAT should be
 | | ... | ${node} | ${super_if} | up
 | | ... | ${node} | ${super_if} | up
 | | And interface state from VAT should be
 | | ... | ${node} | ${super_if} | up
+| | And sub-interface state from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id} | down | up
+| | And sub-interface state from VAT should be
+| | ... | ${node} | ${sub_if_name} | down | up
 
 | Honeycomb sets interface and sub-interface down
 | | [Documentation] | Honeycomb changes the state of interface down and then \
 
 | Honeycomb sets interface and sub-interface down
 | | [Documentation] | Honeycomb changes the state of interface down and then \
 | | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_if_1_oper}
 | | And sub-interface configuration from VAT should be
 | | ... | ${node} | ${sub_if_name} | ${sub_if_1_oper}
 | | ... | ${node} | ${super_if} | ${sub_if_id} | ${sub_if_1_oper}
 | | And sub-interface configuration from VAT should be
 | | ... | ${node} | ${sub_if_name} | ${sub_if_1_oper}
-| | When Honeycomb creates L2 bridge domain
+| | When Honeycomb creates first L2 bridge domain
 | | ... | ${node} | ${bd_name} | ${bd_settings}
 | | Then bridge domain configuration from Honeycomb should be
 | | ... | ${node} | ${bd_name} | ${bd_settings}
 | | ... | ${node} | ${bd_name} | ${bd_settings}
 | | Then bridge domain configuration from Honeycomb should be
 | | ... | ${node} | ${bd_name} | ${bd_settings}
 | | ... | ${node} | ${sub_if_name}
 | | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
 
 | | ... | ${node} | ${sub_if_name}
 | | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
 
-#TODO: Remove "continue on failure" once VPP bug VPP-132 is fixed.
 | Honeycomb removes sub-interface ipv4 address
 | | [Documentation] | Check if Honeycomb can remove configured ipv4 addresses\
 | | ... | from the sub-interface.
 | Honeycomb removes sub-interface ipv4 address
 | | [Documentation] | Check if Honeycomb can remove configured ipv4 addresses\
 | | ... | from the sub-interface.
index 93a0e70..01dbe57 100644 (file)
 | | Honeycomb sets interface state | ${dut_node} | ${dut_to_tg_if1} | up
 | | Honeycomb sets interface state | ${dut_node} | ${dut_to_tg_if2} | up
 | | Honeycomb sets interface ipv4 address with prefix | ${dut_node}
 | | Honeycomb sets interface state | ${dut_node} | ${dut_to_tg_if1} | up
 | | Honeycomb sets interface state | ${dut_node} | ${dut_to_tg_if2} | up
 | | Honeycomb sets interface ipv4 address with prefix | ${dut_node}
-| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip}
-| | ... | ${prefix_length} | ${if_settings}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
 | | Honeycomb sets interface ipv4 address with prefix | ${dut_node}
 | | Honeycomb sets interface ipv4 address with prefix | ${dut_node}
-| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip}
-| | ... | ${prefix_length} | ${if_settings}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
 # TODO: Configure routes through Honeycomb when implemented.(Honeycomb-58)
 | | Add ARP on DUT
 | | ... | ${node} | ${dut_to_tg_if2} | ${gateway} | ${tg_to_dut_if2_mac}
 # TODO: Configure routes through Honeycomb when implemented.(Honeycomb-58)
 | | Add ARP on DUT
 | | ... | ${node} | ${dut_to_tg_if2} | ${gateway} | ${tg_to_dut_if2_mac}
 | | ... | ${test_data_id} | ${acl_name}
 | | Honeycomb Sets Interface State | ${dut_node} | ${dut_to_tg_if1} | up
 | | Honeycomb Sets Interface State | ${dut_node} | ${dut_to_tg_if2} | up
 | | ... | ${test_data_id} | ${acl_name}
 | | Honeycomb Sets Interface State | ${dut_node} | ${dut_to_tg_if1} | up
 | | Honeycomb Sets Interface State | ${dut_node} | ${dut_to_tg_if2} | up
-| | Honeycomb Creates L2 Bridge Domain
+| | Honeycomb Creates first L2 Bridge Domain
 | | ... | ${dut_node} | ${bd_name} | ${bd_settings}
 | | Honeycomb Adds Interfaces To Bridge Domain
 | | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_to_tg_if2}
 | | ... | ${dut_node} | ${bd_name} | ${bd_settings}
 | | Honeycomb Adds Interfaces To Bridge Domain
 | | ... | ${dut_node} | ${dut_to_tg_if1} | ${dut_to_tg_if2}