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(node):
42 """Run "show errors" debug CLI command.
44 :param node: Node to run command on.
48 vat.execute_script("show_errors.vat", node, json_out=False)
51 def vpp_show_errors_verbose(node):
52 """Run "show errors verbose" debug CLI command.
54 :param node: Node to run command on.
58 vat.execute_script("show_errors_verbose.vat", node, json_out=False)
61 def vpp_show_runtime(node):
62 """Run "show runtime" CLI command.
64 :param node: Node to run command on.
68 vat.execute_script("show_runtime.vat", node, json_out=False)
71 def vpp_show_runtime_verbose(node):
72 """Run "show runtime verbose" CLI command.
74 :param node: Node to run command on.
78 vat.execute_script("show_runtime_verbose.vat", node, json_out=False)
81 def vpp_show_hardware_detail(node):
82 """Run "show hardware-interfaces detail" debug CLI command.
84 :param node: Node to run command on.
88 vat.execute_script("show_hardware_detail.vat", node, json_out=False)
91 def vpp_clear_runtime(node):
92 """Run "clear runtime" CLI command.
94 :param node: Node to run command on.
98 vat.execute_script("clear_runtime.vat", node, json_out=False)
101 def vpp_clear_interface_counters(node):
102 """Clear interface counters on VPP node.
104 :param node: Node to clear interface counters on.
108 vat.execute_script('clear_interface.vat', node)
109 vat.script_should_have_passed()
112 def vpp_clear_hardware_counters(node):
113 """Clear interface hardware counters on VPP node.
115 :param node: Node to clear hardware counters on.
119 vat.execute_script('clear_hardware.vat', node)
120 vat.script_should_have_passed()
123 def vpp_clear_errors_counters(node):
124 """Clear errors counters on VPP node.
126 :param node: Node to clear errors counters on.
130 vat.execute_script('clear_errors.vat', node)
131 vat.script_should_have_passed()
133 def vpp_dump_stats_table(self, node):
134 """Dump stats table on VPP node.
136 :param node: Node to dump stats table on.
138 :return: Stats table.
140 with VatTerminal(node) as vat:
141 vat.vat_terminal_exec_cmd('want_stats enable')
142 for _ in range(0, 12):
143 stats_table = vat.vat_terminal_exec_cmd('dump_stats_table')
144 if_counters = stats_table['interface_counters']
145 if len(if_counters) > 0:
146 self._stats_table = stats_table
151 def vpp_get_ipv4_interface_counter(self, node, interface):
152 return self.vpp_get_ipv46_interface_counter(node, interface, False)
154 def vpp_get_ipv6_interface_counter(self, node, interface):
155 return self.vpp_get_ipv46_interface_counter(node, interface, True)
157 def vpp_get_ipv46_interface_counter(self, node, interface, is_ipv6=True):
158 """Return interface IPv4/IPv6 counter.
160 :param node: Node to get interface IPv4/IPv6 counter on.
161 :param interface: Interface name.
162 :param is_ipv6: Specify IP version.
166 :return: Interface IPv4/IPv6 counter.
169 version = 'ip6' if is_ipv6 else 'ip4'
171 if_index = topo.get_interface_sw_index(node, interface)
173 logger.trace('{i} sw_index not found.'.format(i=interface))
176 if_counters = self._stats_table.get('interface_counters')
177 if if_counters is None or len(if_counters) == 0:
178 logger.trace('No interface counters.')
180 for counter in if_counters:
181 if counter['vnet_counter_type'] == version:
182 data = counter['data']
183 return data[if_index]
184 logger.trace('{i} {v} counter not found.'.format(i=interface,