X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FMemif.py;h=40178986d87ab0ce66b8eff4667e56c2b775e928;hp=e3cea939ecaa1223d4a7f7030930707874828e71;hb=5a53823d8a6e99072152654ac632bb06a6b467ac;hpb=7bfb36dfd9284bbca10881e31e14108c7d468b7c diff --git a/resources/libraries/python/Memif.py b/resources/libraries/python/Memif.py index e3cea939ec..40178986d8 100644 --- a/resources/libraries/python/Memif.py +++ b/resources/libraries/python/Memif.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Cisco and/or its affiliates. +# Copyright (c) 2019 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -15,7 +15,7 @@ from resources.libraries.python.ssh import SSH from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal -from resources.libraries.python.topology import Topology +from resources.libraries.python.topology import NodeType, Topology class Memif(object): @@ -25,26 +25,39 @@ class Memif(object): pass @staticmethod - def create_memif_interface(node, socket, mid, role='master'): + def create_memif_interface(node, filename, mid, sid, rxq=1, txq=1, + role='slave'): """Create Memif interface on the given node. :param node: Given node to create Memif interface on. - :param socket: Memif interface socket path. + :param filename: Memif interface socket filename. :param mid: Memif interface ID. + :param sid: Socket ID. + :param rxq: Number of RX queues; 0 means do not set. + :param txq: Number of TX queues; 0 means do not set. :param role: Memif interface role [master|slave]. Default is master. :type node: dict - :type socket: str + :type filename: str :type mid: str + :type sid: str + :type rxq: int + :type txq: int :type role: str :returns: SW interface index. :rtype: int :raises ValueError: If command 'create memif' fails. """ + rx_q = 'rx-queues {rxq}'.format(rxq=rxq) if rxq else '' + tx_q = 'tx-queues {txq}'.format(txq=txq) if txq else '' + with VatTerminal(node, json_param=False) as vat: vat.vat_terminal_exec_cmd_from_template( - 'memif_create.vat', - socket=socket, id=mid, role=role) + 'memif_socket_filename_add_del.vat', + add_del='add', id=sid, filename='/tmp/'+filename) + vat.vat_terminal_exec_cmd_from_template( + 'memif_create.vat', id=mid, socket=sid, rx_q=rx_q, tx_q=tx_q, + role=role) if 'sw_if_index' in vat.vat_stdout: try: sw_if_idx = int(vat.vat_stdout.split()[4]) @@ -56,7 +69,8 @@ class Memif(object): Topology.update_interface_name(node, if_key, ifc_name) ifc_mac = Memif.vpp_get_memif_interface_mac(node, sw_if_idx) Topology.update_interface_mac_address(node, if_key, ifc_mac) - Topology.update_interface_memif_socket(node, if_key, socket) + Topology.update_interface_memif_socket(node, if_key, + '/tmp/'+filename) Topology.update_interface_memif_id(node, if_key, mid) Topology.update_interface_memif_role(node, if_key, role) return sw_if_idx @@ -67,6 +81,16 @@ class Memif(object): raise ValueError('Create Memif interface failed on node ' '{}'.format(node['host'])) + @staticmethod + def dump_memif(node): + """Dump Memif data for the given node. + + :param node: Given node to show Memif data on. + :type node: dict + """ + vat = VatExecutor() + vat.execute_script("memif_dump.vat", node, json_out=False) + @staticmethod def show_memif(node): """Show Memif data for the given node. @@ -75,7 +99,18 @@ class Memif(object): :type node: dict """ vat = VatExecutor() - vat.execute_script("memif_dump.vat", node, json_out=False) + vat.execute_script("show_memif.vat", node, json_out=False) + + @staticmethod + def show_memif_on_all_duts(nodes): + """Show Memif data on all DUTs. + + :param nodes: Topology nodes. + :type nodes: dict + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + Memif.show_memif(node) @staticmethod def clear_memif_socks(node, *socks): @@ -113,7 +148,7 @@ class Memif(object): memif_data = memif_data.replace(garbage, '') for line in memif_data.splitlines(): - if line.startswith('Sending') or len(line) == 0: + if not line or line.startswith('Sending'): continue elif line.startswith('memif'): if memif_name: @@ -145,7 +180,7 @@ class Memif(object): :param sw_if_idx: DUT node. :type node: dict :type sw_if_idx: int - :returns: Memif interface name. + :returns: Memif interface name, or None if not found. :rtype: str """ with VatTerminal(node, json_param=False) as vat: @@ -154,7 +189,7 @@ class Memif(object): for item in memif_data: if memif_data[item]['sw_if_index'] == str(sw_if_idx): return item - return None + return None @staticmethod def vpp_get_memif_interface_mac(node, sw_if_idx): @@ -164,7 +199,7 @@ class Memif(object): :param sw_if_idx: DUT node. :type node: dict :type sw_if_idx: int - :returns: Memif interface MAC address. + :returns: Memif interface MAC address, or None if not found. :rtype: str """ with VatTerminal(node, json_param=False) as vat: @@ -173,6 +208,7 @@ class Memif(object): for item in memif_data: if memif_data[item]['sw_if_index'] == str(sw_if_idx): return memif_data[item].get('mac', None) + return None @staticmethod def vpp_get_memif_interface_socket(node, sw_if_idx): @@ -182,7 +218,7 @@ class Memif(object): :param sw_if_idx: DUT node. :type node: dict :type sw_if_idx: int - :returns: Memif interface socket path. + :returns: Memif interface socket path, or None if not found. :rtype: str """ with VatTerminal(node, json_param=False) as vat: @@ -191,6 +227,7 @@ class Memif(object): for item in memif_data: if memif_data[item]['sw_if_index'] == str(sw_if_idx): return memif_data[item].get('socket', None) + return None @staticmethod def vpp_get_memif_interface_id(node, sw_if_idx): @@ -200,7 +237,7 @@ class Memif(object): :param sw_if_idx: DUT node. :type node: dict :type sw_if_idx: int - :returns: Memif interface ID. + :returns: Memif interface ID, or None if not found. :rtype: int """ with VatTerminal(node, json_param=False) as vat: @@ -209,6 +246,7 @@ class Memif(object): for item in memif_data: if memif_data[item]['sw_if_index'] == str(sw_if_idx): return int(memif_data[item].get('id', None)) + return None @staticmethod def vpp_get_memif_interface_role(node, sw_if_idx): @@ -218,7 +256,7 @@ class Memif(object): :param sw_if_idx: DUT node. :type node: dict :type sw_if_idx: int - :returns: Memif interface role. + :returns: Memif interface role, or None if not found. :rtype: int """ with VatTerminal(node, json_param=False) as vat: @@ -227,3 +265,4 @@ class Memif(object): for item in memif_data: if memif_data[item]['sw_if_index'] == str(sw_if_idx): return memif_data[item].get('role', None) + return None