X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FIPv6Setup.py;h=c016423f32ad98165266c1976170875d0dad2120;hp=edd5d2cc6e3f778268e210056f493f8940ce86ac;hb=c478afc5aec0161cc66e837c1ab919542b68ebbc;hpb=8f285166faf13156a4f7c70adac9a7e20549268f diff --git a/resources/libraries/python/IPv6Setup.py b/resources/libraries/python/IPv6Setup.py index edd5d2cc6e..c016423f32 100644 --- a/resources/libraries/python/IPv6Setup.py +++ b/resources/libraries/python/IPv6Setup.py @@ -13,19 +13,20 @@ """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.