Add Honeycomb interface management tests (ipv4, ipv6, ethernet, routing)
[csit.git] / resources / libraries / python / IPv6Setup.py
index edd5d2c..c016423 100644 (file)
 
 """Library to set up IPv6 in topology."""
 
-from ssh import SSH
-from ipaddress import IPv6Network
-from topology import NodeType
-from topology import Topology
-from constants import Constants
 from robot.api import logger
+from ipaddress import IPv6Network
+
+from resources.libraries.python.ssh import SSH
+from resources.libraries.python.topology import NodeType, Topology
+from resources.libraries.python.constants import Constants
+from resources.libraries.python.VatExecutor import VatTerminal, VatExecutor
 
 
 class IPv6Networks(object):
     """IPv6 network iterator.
 
-       :param networks: List of the available IPv6 networks.
-       :type networks: list
+    :param networks: List of the available IPv6 networks.
+    :type networks: list
     """
     def __init__(self, networks):
         self._networks = list()
@@ -37,11 +38,11 @@ class IPv6Networks(object):
             raise Exception('No IPv6 networks')
 
     def next_network(self):
-        """Get the next elemnt of the iterator.
+        """Get the next element of the iterator.
 
-           :return: IPv6 network.
-           :rtype: IPv6Network object
-           :raises: StopIteration if there is no more elements.
+        :return: IPv6 network.
+        :rtype: IPv6Network object
+        :raises: StopIteration if there is no more elements.
         """
         if len(self._networks):
             return self._networks.pop()
@@ -55,14 +56,18 @@ class IPv6Setup(object):
     def __init__(self):
         pass
 
-    def nodes_setup_ipv6_addresses(self, nodes, nodes_addr):
-        """Setup IPv6 addresses on all VPP nodes in topology.
+    def nodes_set_ipv6_addresses(self, nodes, nodes_addr):
+        """Set IPv6 addresses on all VPP nodes in topology.
 
-           :param nodes: Nodes of the test topology.
-           :param nodes_addr: Available nodes IPv6 adresses.
-           :type nodes: dict
-           :type nodes_addr: dict
+        :param nodes: Nodes of the test topology.
+        :param nodes_addr: Available nodes IPv6 addresses.
+        :type nodes: dict
+        :type nodes_addr: dict
+        :return: Affected interfaces as list of (node, interface) tuples.
+        :rtype: list
         """
+        interfaces = []
+
         for net in nodes_addr.values():
             for port in net['ports'].values():
                 host = port.get('node')
@@ -76,14 +81,17 @@ class IPv6Setup(object):
                     self.vpp_set_if_ipv6_addr(node, port['if'], port['addr'],
                                               net['prefix'])
 
+                    interfaces.append((node, port['if']))
+        return interfaces
+
     def nodes_clear_ipv6_addresses(self, nodes, nodes_addr):
         """Remove IPv6 addresses from all VPP nodes in topology.
 
-           :param nodes: Nodes of the test topology.
-           :param nodes_addr: Available nodes IPv6 adresses.
-           :type nodes: dict
-           :type nodes_addr: dict
-         """
+        :param nodes: Nodes of the test topology.
+        :param nodes_addr: Available nodes IPv6 addresses.
+        :type nodes: dict
+        :type nodes_addr: dict
+        """
         for net in nodes_addr.values():
             for port in net['ports'].values():
                 host = port.get('node')
@@ -101,14 +109,14 @@ class IPv6Setup(object):
     def linux_set_if_ipv6_addr(node, interface, addr, prefix):
         """Set IPv6 address on linux host.
 
-           :param node: Linux node.
-           :param interface: Node interface.
-           :param addr: IPv6 address.
-           :param prefix: IPv6 address prefix.
-           :type node: dict
-           :type interface: str
-           :type addr: str
-           :type prefix: str
+        :param node: Linux node.
+        :param interface: Node interface.
+        :param addr: IPv6 address.
+        :param prefix: IPv6 address prefix.
+        :type node: dict
+        :type interface: str
+        :type addr: str
+        :type prefix: str
         """
         ssh = SSH()
         ssh.connect(node)
@@ -123,14 +131,14 @@ class IPv6Setup(object):
     def linux_del_if_ipv6_addr(node, interface, addr, prefix):
         """Delete IPv6 address on linux host.
 
-           :param node: Linux node.
-           :param interface: Node interface.
-           :param addr: IPv6 address.
-           :param prefix: IPv6 address prefix.
-           :type node: dict
-           :type interface: str
-           :type addr: str
-           :type prefix: str
+        :param node: Linux node.
+        :param interface: Node interface.
+        :param addr: IPv6 address.
+        :param prefix: IPv6 address prefix.
+        :type node: dict
+        :type interface: str
+        :type addr: str
+        :type prefix: str
         """
         ssh = SSH()
         ssh.connect(node)
@@ -151,35 +159,30 @@ class IPv6Setup(object):
     def vpp_set_if_ipv6_addr(node, interface, addr, prefix):
         """Set IPv6 address on VPP.
 
-           :param node: VPP node.
-           :param interface: Node interface.
-           :param addr: IPv6 address.
-           :param prefix: IPv6 address prefix.
-           :type node: dict
-           :type interface: str
-           :type addr: str
-           :type prefix: str
+        :param node: VPP node.
+        :param interface: Node interface.
+        :param addr: IPv6 address.
+        :param prefix: IPv6 address prefix.
+        :type node: dict
+        :type interface: str
+        :type addr: str
+        :type prefix: str
         """
+        sw_if_index = Topology.get_interface_sw_index(node, interface)
+        with VatTerminal(node) as vat:
+            vat.vat_terminal_exec_cmd_from_template('add_ip_address.vat',
+                                                    sw_if_index=sw_if_index,
+                                                    address=addr,
+                                                    prefix_length=prefix)
+            vat.vat_terminal_exec_cmd_from_template('set_if_state.vat',
+                                                    sw_if_index=sw_if_index,
+                                                    state='admin-up')
+
         ssh = SSH()
         ssh.connect(node)
-
-        cmd = '{c}'.format(c=Constants.VAT_BIN_NAME)
-        cmd_input = 'sw_interface_add_del_address {dev} {ip}/{p}'.format(
-            dev=interface, ip=addr, p=prefix)
-        (ret_code, _, _) = ssh.exec_command_sudo(cmd, cmd_input)
-        if int(ret_code) != 0:
-            raise Exception('VPP sw_interface_add_del_address failed on {h}'
-                            .format(h=node['host']))
-
-        cmd_input = 'sw_interface_set_flags {dev} admin-up'.format(
-            dev=interface)
-        (ret_code, _, _) = ssh.exec_command_sudo(cmd, cmd_input)
-        if int(ret_code) != 0:
-            raise Exception('VPP sw_interface_set_flags failed on {h}'.format(
-                h=node['host']))
-
         cmd_input = 'exec show int'
-        (ret_code, stdout, stderr) = ssh.exec_command_sudo(cmd, cmd_input)
+        (ret_code, stdout, stderr) = ssh.exec_command_sudo(
+            Constants.VAT_BIN_NAME, cmd_input)
         logger.debug('ret: {0}'.format(ret_code))
         logger.debug('stdout: {0}'.format(stdout))
         logger.debug('stderr: {0}'.format(stderr))
@@ -188,78 +191,62 @@ class IPv6Setup(object):
     def vpp_del_if_ipv6_addr(node, interface, addr, prefix):
         """Delete IPv6 address on VPP.
 
-           :param node: VPP node.
-           :param interface: Node interface.
-           :param addr: IPv6 address.
-           :param prefix: IPv6 address prefix.
-           :type node: dict
-           :type interface: str
-           :type addr: str
-           :type prefix: str
+        :param node: VPP node.
+        :param interface: Node interface.
+        :param addr: IPv6 address.
+        :param prefix: IPv6 address prefix.
+        :type node: dict
+        :type interface: str
+        :type addr: str
+        :type prefix: str
         """
-        ssh = SSH()
-        ssh.connect(node)
-
-        cmd = '{c}'.format(c=Constants.VAT_BIN_NAME)
-        cmd_input = 'sw_interface_add_del_address {dev} {ip}/{p} del'.format(
-            dev=interface, ip=addr, p=prefix)
-        (ret_code, _, _) = ssh.exec_command_sudo(cmd, cmd_input)
-        if int(ret_code) != 0:
-            raise Exception(
-                'sw_interface_add_del_address failed on {h}'.
-                format(h=node['host']))
-
-        cmd_input = 'sw_interface_set_flags {dev} admin-down'.format(
-            dev=interface)
-        (ret_code, _, _) = ssh.exec_command_sudo(cmd, cmd_input)
-        if int(ret_code) != 0:
-            raise Exception('VPP sw_interface_set_flags failed on {h}'.format(
-                h=node['host']))
+        sw_if_index = Topology.get_interface_sw_index(node, interface)
+        with VatTerminal(node) as vat:
+            vat.vat_terminal_exec_cmd_from_template('del_ip_address.vat',
+                                                    sw_if_index=sw_if_index,
+                                                    address=addr,
+                                                    prefix_length=prefix)
+            vat.vat_terminal_exec_cmd_from_template('set_if_state.vat',
+                                                    sw_if_index=sw_if_index,
+                                                    state='admin-down')
 
     @staticmethod
-    def vpp_ra_supress_link_layer(node, interface):
-        """Supress ICMPv6 router advertisement message for link scope address
+    def vpp_ra_suppress_link_layer(node, interface):
+        """Suppress ICMPv6 router advertisement message for link scope address.
 
-           :param node: VPP node.
-           :param interface: Interface name.
-           :type node: dict
-           :type interface: str
+        :param node: VPP node.
+        :param interface: Interface name.
+        :type node: dict
+        :type interface: str
         """
-        ssh = SSH()
-        ssh.connect(node)
-
-        cmd = '{c}'.format(c=Constants.VAT_BIN_NAME)
-        cmd_input = 'exec ip6 nd {0} ra-surpress-link-layer'.format(
-            interface)
-        (ret_code, _, _) = ssh.exec_command_sudo(cmd, cmd_input)
-        if int(ret_code) != 0:
-            raise Exception("'{0}' failed on {1}".format(cmd_input,
-                                                         node['host']))
-
-    def vpp_all_ra_supress_link_layer(self, nodes):
-        """Supress ICMPv6 router advertisement message for link scope address
-           on all VPP nodes in the topology
-
-           :param nodes: Nodes of the test topology.
-           :type nodes: dict
+        sw_if_index = Topology.get_interface_sw_index(node, interface)
+        VatExecutor.cmd_from_template(node,
+                                      'sw_interface_ip6nd_ra_config.vat',
+                                      sw_if_id=sw_if_index,
+                                      param='surpress')
+
+    def vpp_all_ra_suppress_link_layer(self, nodes):
+        """Suppress ICMPv6 router advertisement message for link scope address
+        on all VPP nodes in the topology.
+
+        :param nodes: Nodes of the test topology.
+        :type nodes: dict
         """
         for node in nodes.values():
             if node['type'] == NodeType.TG:
                 continue
             for port_k, port_v in node['interfaces'].items():
-                if port_k == 'mgmt':
-                    continue
                 if_name = port_v.get('name')
                 if if_name is None:
                     continue
-                self.vpp_ra_supress_link_layer(node, if_name)
+                self.vpp_ra_suppress_link_layer(node, if_name)
 
     @staticmethod
     def get_link_address(link, nodes_addr):
         """Get link IPv6 address.
 
         :param link: Link name.
-        :param nodes_addr: Available nodes IPv6 adresses.
+        :param nodes_addr: Available nodes IPv6 addresses.
         :type link: str
         :type nodes_addr: dict
         :return: Link IPv6 address.
@@ -275,7 +262,7 @@ class IPv6Setup(object):
         """Get link IPv6 address prefix.
 
         :param link: Link name.
-        :param nodes_addr: Available nodes IPv6 adresses.
+        :param nodes_addr: Available nodes IPv6 addresses.
         :type link: str
         :type nodes_addr: dict
         :return: Link IPv6 address prefix.