X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FIPv6Setup.py;h=598905735a5ad0894a8a02af6d165b1cb30d7377;hp=45a8eba58dab6fff3de93f9ef43179dc271794a4;hb=3121b691debad27fcea1c6e2031e4a2544e42fbf;hpb=33499c81c94c2d3baef9d3e9f061cd76ef86fa74 diff --git a/resources/libraries/python/IPv6Setup.py b/resources/libraries/python/IPv6Setup.py index 45a8eba58d..598905735a 100644 --- a/resources/libraries/python/IPv6Setup.py +++ b/resources/libraries/python/IPv6Setup.py @@ -15,9 +15,10 @@ 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): @@ -54,14 +55,19 @@ 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 + :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') @@ -75,6 +81,9 @@ 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. @@ -159,23 +168,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 +200,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 +219,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 +244,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')