1 # Copyright (c) 2016 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
14 """VPP counters utilities library."""
18 from robot.api import logger
20 from resources.libraries.python.topology import NodeType, Topology
21 from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal
24 class VppCounters(object):
25 """VPP counters utilities."""
28 self._stats_table = None
30 def vpp_nodes_clear_interface_counters(self, nodes):
31 """Clear interface counters on all VPP nodes in topology.
33 :param nodes: Nodes in topology.
36 for node in nodes.values():
37 if node['type'] == NodeType.DUT:
38 self.vpp_clear_interface_counters(node)
41 def vpp_show_errors_verbose(node):
42 """Run "show errors verbose" debug CLI command.
44 :param node: Node to run command on.
48 vat.execute_script("show_errors_verbose.vat", node, json_out=False)
51 def vpp_show_runtime_verbose(node):
52 """Run "show runtime" debug CLI command.
54 :param node: Node to run command on.
58 vat.execute_script("show_runtime_verbose.vat", node, json_out=False)
61 def vpp_show_hardware_detail(node):
62 """Run "show hardware-interfaces detail" debug CLI command.
64 :param node: Node to run command on.
68 vat.execute_script("show_hardware_detail.vat", node, json_out=False)
71 def vpp_clear_interface_counters(node):
72 """Clear interface counters on VPP node.
74 :param node: Node to clear interface counters on.
78 vat.execute_script('clear_interface.vat', node)
79 vat.script_should_have_passed()
81 def vpp_dump_stats_table(self, node):
82 """Dump stats table on VPP node.
84 :param node: Node to dump stats table on.
88 with VatTerminal(node) as vat:
89 vat.vat_terminal_exec_cmd('want_stats enable')
90 for _ in range(0, 12):
91 stats_table = vat.vat_terminal_exec_cmd('dump_stats_table')
92 if_counters = stats_table['interface_counters']
93 if len(if_counters) > 0:
94 self._stats_table = stats_table
99 def vpp_get_ipv4_interface_counter(self, node, interface):
100 return self.vpp_get_ipv46_interface_counter(node, interface, False)
102 def vpp_get_ipv6_interface_counter(self, node, interface):
103 return self.vpp_get_ipv46_interface_counter(node, interface, True)
105 def vpp_get_ipv46_interface_counter(self, node, interface, is_ipv6=True):
106 """Return interface IPv4/IPv6 counter.
108 :param node: Node to get interface IPv4/IPv6 counter on.
109 :param interface: Interface name.
110 :param is_ipv6: Specify IP version.
114 :return: Interface IPv4/IPv6 counter.
117 version = 'ip6' if is_ipv6 else 'ip4'
119 if_index = topo.get_interface_sw_index(node, interface)
121 logger.trace('{i} sw_index not found.'.format(i=interface))
124 if_counters = self._stats_table.get('interface_counters')
125 if if_counters is None or len(if_counters) == 0:
126 logger.trace('No interface counters.')
128 for counter in if_counters:
129 if counter['vnet_counter_type'] == version:
130 data = counter['data']
131 return data[if_index]
132 logger.trace('{i} {v} counter not found.'.format(i=interface,