Add with-statment support to VatTerminal.
[csit.git] / resources / libraries / python / IPv6Setup.py
index 45a8eba..e04668f 100644 (file)
 
 from ssh import SSH
 from ipaddress import IPv6Network
-from topology import NodeType
-from topology import Topology
+from topology import NodeType, Topology
 from constants import Constants
+from VatExecutor import VatTerminal, VatExecutor
+from robot.api import logger
 
 
 class IPv6Networks(object):
@@ -159,23 +160,24 @@ class IPv6Setup(object):
            :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(
+            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))
 
     @staticmethod
     def vpp_del_if_ipv6_addr(node, interface, addr, prefix):
@@ -190,24 +192,15 @@ class IPv6Setup(object):
            :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):
@@ -218,16 +211,11 @@ class IPv6Setup(object):
            :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']))
+        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_supress_link_layer(self, nodes):
         """Supress ICMPv6 router advertisement message for link scope address
@@ -248,42 +236,33 @@ class IPv6Setup(object):
                 self.vpp_ra_supress_link_layer(node, if_name)
 
     @staticmethod
-    def vpp_ipv6_route_add(node, link, interface, nodes_addr):
-        """Setup IPv6 route on the VPP node.
-
-           :param node: Node to add route on.
-           :param link: Route to following link.
-           :param interface: Route output interface.
-           :param nodes_addr: Available nodes IPv6 adresses.
-           :type node: dict
-           :type link: str
-           :type interface: str
-           :type nodes_addr: dict
+    def get_link_address(link, nodes_addr):
+        """Get link IPv6 address.
+
+        :param link: Link name.
+        :param nodes_addr: Available nodes IPv6 adresses.
+        :type link: str
+        :type nodes_addr: dict
+        :return: Link IPv6 address.
+        :rtype: str
         """
-        ssh = SSH()
-        ssh.connect(node)
-
-        # Get route destination address from link name
         net = nodes_addr.get(link)
         if net is None:
-            raise ValueError('No network for link "{0}"'.format(link))
-        dst_net = '{0}/{1}'.format(net['net_addr'], net['prefix'])
+            raise ValueError('Link "{0}" address not found'.format(link))
+        return net.get('net_addr')
 
-        # Get next-hop address
-        nh_addr = None
-        for net in nodes_addr.values():
-            for port in net['ports'].values():
-                if port['if'] == interface and port['node'] == node['host']:
-                    for nh in net['ports'].values():
-                        if nh['if'] != interface and nh['node'] != node['host']:
-                            nh_addr = nh['addr']
-        if nh_addr is None:
-            raise Exception('next-hop not found')
-
-        cmd_input = 'ip_add_del_route {0} via {1} {2} resolve-attempts 10'. \
-            format(dst_net, nh_addr, interface)
-        (ret_code, _, _) = ssh.exec_command_sudo(Constants.VAT_BIN_NAME,
-                                                 cmd_input)
-        if int(ret_code) != 0:
-            raise Exception("'{0}' failed on {1}".format(cmd_input,
-                                                         node['host']))
+    @staticmethod
+    def get_link_prefix(link, nodes_addr):
+        """Get link IPv6 address prefix.
+
+        :param link: Link name.
+        :param nodes_addr: Available nodes IPv6 adresses.
+        :type link: str
+        :type nodes_addr: dict
+        :return: Link IPv6 address prefix.
+        :rtype: int
+        """
+        net = nodes_addr.get(link)
+        if net is None:
+            raise ValueError('Link "{0}" address not found'.format(link))
+        return net.get('prefix')