CSIT-184: Add Honeycomb sub-interface ipv4 tests 27/1827/9
authorselias <samelias@cisco.com>
Thu, 30 Jun 2016 14:29:25 +0000 (16:29 +0200)
committerMatej Klotton <mklotton@cisco.com>
Mon, 11 Jul 2016 12:33:38 +0000 (12:33 +0000)
 - add tests for sub-interface ipv4 support
 - add keywords and methods used in tests

Change-Id: I98af193a4c4f0d3822eb9637f01acead37accb8c
Signed-off-by: selias <samelias@cisco.com>
resources/libraries/python/InterfaceUtil.py
resources/libraries/python/honeycomb/HcAPIKwInterfaces.py
resources/libraries/robot/honeycomb/sub_interface.robot
tests/suites/honeycomb/060_sub_interface.robot
tests/suites/honeycomb/resources/sub_interfaces.py

index ace4453..2e44e91 100644 (file)
@@ -227,7 +227,7 @@ class InterfaceUtil(object):
          Note: A single interface may have multiple IP addresses assigned.
          :rtype: list
         """
          Note: A single interface may have multiple IP addresses assigned.
          :rtype: list
         """
-        sw_if_index = Topology.get_interface_sw_index(node, interface)
+        sw_if_index = InterfaceUtil.get_sw_if_index(node, interface)
 
         with VatTerminal(node) as vat:
             response = vat.vat_terminal_exec_cmd_from_template(
 
         with VatTerminal(node) as vat:
             response = vat.vat_terminal_exec_cmd_from_template(
index ec928a7..4feb22e 100644 (file)
@@ -308,7 +308,7 @@ class InterfaceKeywords(object):
         :param node: Honeycomb node.
         :param interface: The name of interface.
         :type interface: str
         :param node: Honeycomb node.
         :param interface: The name of interface.
         :type interface: str
-        :type param: str
+        :type node: dict
         :return: Operational data about bridge domain settings in the
         interface.
         :rtype: dict
         :return: Operational data about bridge domain settings in the
         interface.
         :rtype: dict
@@ -390,6 +390,7 @@ class InterfaceKeywords(object):
         :type network: str or int
         :return: Content of response.
         :rtype: bytearray
         :type network: str or int
         :return: Content of response.
         :rtype: bytearray
+        :raises HoneycombError: If the provided netmask or prefix is not valid.
         """
 
         path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4")
         """
 
         path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4")
@@ -417,6 +418,7 @@ class InterfaceKeywords(object):
         :type network: str or int
         :return: Content of response.
         :rtype: bytearray
         :type network: str or int
         :return: Content of response.
         :rtype: bytearray
+        :raises HoneycombError: If the provided netmask or prefix is not valid.
         """
 
         path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4",
         """
 
         path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4",
@@ -1156,6 +1158,71 @@ class InterfaceKeywords(object):
             raise HoneycombError("The operational data does not contain "
                                  "information about the tag-rewrite.")
 
             raise HoneycombError("The operational data does not contain "
                                  "information about the tag-rewrite.")
 
+    @staticmethod
+    def add_ipv4_address_to_sub_interface(node, super_interface, identifier,
+                                          ip_addr, network):
+        """Add an ipv4 address to the specified sub-interface, with the provided
+        netmask or network prefix length. Any existing ipv4 addresses on the
+        sub-interface will be replaced.
+
+        :param node: Honeycomb node.
+        :param super_interface: Super interface.
+        :param identifier: The ID of sub-interface.
+        :param ip_addr: IPv4 address to be set.
+        :param network: Network mask or network prefix length.
+        :type node: dict
+        :type super_interface: str
+        :type identifier: int
+        :type ip_addr: str
+        :type network: str or int
+        :return: Content of response.
+        :rtype: bytearray
+        :raises HoneycombError: If the provided netmask or prefix is not valid.
+        """
+
+        path = ("interfaces",
+                ("interface", "name", super_interface),
+                "vpp-vlan:sub-interfaces",
+                ("sub-interface", "identifier", int(identifier)),
+                "ipv4")
+
+        if isinstance(network, basestring):
+            address = {"address": [{"ip": ip_addr, "netmask": network}, ]}
+
+        elif isinstance(network, int) and 0 < network < 33:
+            address = {"address": [{"ip": ip_addr, "prefix-length": network}, ]}
+
+        else:
+            raise HoneycombError("{0} is not a valid netmask or prefix length."
+                                 .format(network))
+
+        return InterfaceKeywords._set_interface_properties(
+            node, super_interface, path, address)
+
+    @staticmethod
+    def remove_all_ipv4_addresses_from_sub_interface(node, super_interface,
+                                                     identifier):
+        """Remove all ipv4 addresses from the specified sub-interface.
+
+        :param node: Honeycomb node.
+        :param super_interface: Super interface.
+        :param identifier: The ID of sub-interface.
+        :type node: dict
+        :type super_interface: str
+        :type identifier: int
+        :return: Content of response.
+        :rtype: bytearray
+        """
+
+        path = ("interfaces",
+                ("interface", "name", super_interface),
+                "vpp-vlan:sub-interfaces",
+                ("sub-interface", "identifier", int(identifier)),
+                "ipv4", "address")
+
+        return InterfaceKeywords._set_interface_properties(
+            node, super_interface, path, None)
+
     @staticmethod
     def compare_data_structures(data, ref):
         """Checks if data obtained from UUT is as expected.
     @staticmethod
     def compare_data_structures(data, ref):
         """Checks if data obtained from UUT is as expected.
index bdadad8..e4844de 100644 (file)
 | | ...
 | | ${sw_if_index}= | interfaceCLI.Get sw if index | ${node} | ${sub_interface}
 | | L2 tag rewrite | ${node} | ${sw_if_index} | disable
 | | ...
 | | ${sw_if_index}= | interfaceCLI.Get sw if index | ${node} | ${sub_interface}
 | | L2 tag rewrite | ${node} | ${sw_if_index} | disable
+
+| Honeycomb sets sub-interface ipv4 address
+| | [Documentation] | Uses Honeycomb API to configure an ipv4 address on the\
+| | ... | spcified sub-interface. Replaces any existing ipv4 addresses.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - super_if - Super-interface. Type: string
+| | ... | - identifier - Sub-interface ID. Type: integer or string
+| | ... | - address - IPv4 address to set. Type: string
+| | ... | - prefix - IPv4 network prefix length to set. Type: integer
+| | ...
+| | ... | *Example:*
+| | ... | \| | Honeycomb sets sub-interface ipv4 address\
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \
+| | ... | \| 192.168.0.2 \| ${24} \|
+| | ...
+| | [Arguments] | ${node} | ${super_if} | ${identifier} | ${address} | ${prefix}
+| | Add ipv4 address to sub_interface
+| | ... | ${node} | ${super_if} | ${identifier} | ${address} | ${prefix}
+
+| Sub-interface ipv4 address from Honeycomb should be
+| | [Documentation] | Uses Honeycomb API to verify ipv4 address configuration\
+| | ... | on the specified sub-interface.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - super_if - Super-interface. Type: string
+| | ... | - identifier - Sub-interface ID. Type: integer or string
+| | ... | - address - IPv4 address to expect. Type: string
+| | ... | - prefix - IPv4 network prefix length to expect. Type: integer
+| | ...
+| | ... | *Example:*
+| | ... | \| sub-interface ipv4 address from Honeycomb should be\
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \
+| | ... | \| 192.168.0.2 \| ${24} \|
+| | ...
+| | [Arguments] | ${node} | ${super_if} | ${identifier} | ${address} | ${prefix}
+| | ${if_data}= | interfaceAPI.Get sub interface oper data
+| | ... | ${node} | ${super_if} | ${identifier}
+| | Should be equal
+| | ... | ${if_data['ipv4']['address'][0]['ip']} | ${address}
+| | Should be equal
+| | ... | ${if_data['ipv4']['address'][0]['prefix-length']} | ${prefix}
+
+| Sub-interface ipv4 address from VAT should be
+| | [Documentation] | Uses VAT to verify ipv4 address configuration\
+| | ... | on the specified sub-interface.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - sub_interface - Name of an sub-interface on the specified node.\
+| | ... | Type: string
+| | ... | - address - IPv4 address to expect. Type: string
+| | ... | - prefix - IPv4 network prefix length to expect. Type: integer
+| | ...
+| | ... | *Example:*
+| | ... | \| sub-interface ipv4 address from VAT should be\
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0.1 \|
+| | ...
+| | [Arguments] | ${node} | ${sub_interface} | ${address} | ${prefix}
+| | ${data}= | VPP get interface ip addresses
+| | ... | ${node} | ${sub_interface} | ipv4
+| | Should be equal | ${data[0]['ip']} | ${address}
+#TODO: update based on resolution of bug https://jira.fd.io/browse/VPP-132
+| | Should be equal | ${data[0]['prefix_length']} | ${prefix}
+
+| Honeycomb removes all sub-interface ipv4 addresses
+| | [Documentation] | Uses Honeycomb API to remove all configured ipv4\
+| | ... | addresses from the sub-interface.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - super_if - Super-interface. Type: string
+| | ... | - identifier - Sub-interface ID. Type: integer or string
+| | ...
+| | ... | *Example:*
+| | ... | \| Honeycomb removes all sub-interface ipv4 addresses\
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \|
+| | ...
+| | [Arguments] | ${node} | ${super_if} | ${identifier}
+| | Remove all ipv4 addresses from sub_interface
+| | ... | ${node} | ${super_if} | ${identifier}
+
+| Sub-interface ipv4 address from Honeycomb should be empty
+| | [Documentation] | Uses Honeycomb API to verify that ipv4 address\
+| | ... | configuration on the specified sub-interface is empty.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - super_if - Super-interface. Type: string
+| | ... | - identifier - Sub-interface ID. Type: integer or string
+| | ...
+| | ... | *Example:*
+| | ... | \| sub-interface ipv4 address from Honeycomb should be empty\
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0 \| ${1} \|
+| | ...
+| | [Arguments] | ${node} | ${super_if} | ${identifier}
+| | ${if_data}= | interfaceAPI.Get sub interface oper data
+| | ... | ${node} | ${super_if} | ${identifier}
+| | Run keyword and expect error | *KeyError: 'address'*
+| | ... | Set Variable | ${if_data['ipv4']['address'][0]['ip']}
+
+| Sub-interface ipv4 address from VAT should be empty
+| | [Documentation] | Uses VAT to verify that ipv4 address\
+| | ... | configuration on the specified sub-interface is empty.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Information about a DUT node. Type: dictionary
+| | ... | - sub_interface - Name of an sub-interface on the specified node.\
+| | ... | Type: string
+| | ...
+| | ... | *Example:*
+| | ... | \| sub-interface ipv4 address from VAT should be empty\
+| | ... | \| ${nodes['DUT1']} \| GigabitEthernet0/8/0.1 \|
+| | ...
+| | [Arguments] | ${node} | ${sub_interface}
+| | Run keyword and expect error | *No JSON object could be decoded*
+| | ... | VPP get interface ip addresses | ${node} | ${sub_interface} | ipv4
index 8f43a52..595bbde 100644 (file)
 | | And rewrite tag from VAT should be
 | | ... | ${node} | ${sub_if_name} | ${tag_rewrite_disabled_VAT}
 
 | | And rewrite tag from VAT should be
 | | ... | ${node} | ${sub_if_name} | ${tag_rewrite_disabled_VAT}
 
+| Honeycomb configures sub-interface ipv4 address
+| | [Documentation] | Check if Honeycomb can configure an ipv4 address on the\
+| | ... | sub-interface.
+| | ...
+| | Given sub-interface ipv4 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv4 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+| | When Honeycomb sets sub-interface ipv4 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | Then sub-interface ipv4 address from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And sub-interface ipv4 address from VAT should be
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+
+| Honeycomb removes sub-interface ipv4 address
+| | [Documentation] | Check if Honeycomb can remove configured ipv4 addresses\
+| | ... | from the sub-interface.
+| | ...
+| | Given sub-interface ipv4 address from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And sub-interface ipv4 address from VAT should be
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | When Honeycomb removes all sub-interface ipv4 addresses
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | Then sub-interface ipv4 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv4 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+
+| Honeycomb modifies existing sub-interface ipv4 address
+| | [Documentation] | Check if Honeycomb can modify an ipv4 address already\
+| | ... | configured on the sub-interface.
+| | [Teardown] | Honeycomb removes all sub-interface ipv4 addresses
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | Given sub-interface ipv4 address from Honeycomb should be empty
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | And sub-interface ipv4 address from VAT should be empty
+| | ... | ${node} | ${sub_if_name}
+| | When Honeycomb sets sub-interface ipv4 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4['address']} | ${ipv4['prefix-length']}
+| | And Honeycomb sets sub-interface ipv4 address
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4_2['address']} | ${ipv4_2['prefix-length']}
+| | Then sub-interface ipv4 address from Honeycomb should be
+| | ... | ${node} | ${super_if} | ${sub_if_id}
+| | ... | ${ipv4_2['address']} | ${ipv4_2['prefix-length']}
+| | And sub-interface ipv4 address from VAT should be
+| | ... | ${node} | ${sub_if_name}
+| | ... | ${ipv4_2['address']} | ${ipv4_2['prefix-length']}
+
 *** Keywords ***
 | Set super and sub interfaces up
 | | [Documentation] | Honeycomb sets super-interface and sub-interface up, in \
 *** Keywords ***
 | Set super and sub interfaces up
 | | [Documentation] | Honeycomb sets super-interface and sub-interface up, in \
index e4acd00..6904b48 100644 (file)
@@ -275,3 +275,13 @@ tag_rewrite_translate_1_2_wrong = {
         }
     ]
 }
         }
     ]
 }
+
+# IP addresses configured on sub-interface during tests
+ipv4 = {
+    "address": "192.168.0.4",
+    "netmask": "255.255.255.0",
+    "prefix-length": 24}
+ipv4_2 = {
+    "address": "192.168.0.5",
+    "netmask": "255.255.0.0",
+    "prefix-length": 16}