6b2265db2770ac5f5c7a1732846848a5792c0008
[csit.git] / resources / libraries / python / VppCounters.py
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:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
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.
13
14 """VPP counters utilities library."""
15
16 import time
17
18 from robot.api import logger
19
20 from resources.libraries.python.topology import NodeType, Topology
21 from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal
22
23
24 class VppCounters(object):
25     """VPP counters utilities."""
26
27     def __init__(self):
28         self._stats_table = None
29
30     def vpp_nodes_clear_interface_counters(self, nodes):
31         """Clear interface counters on all VPP nodes in topology.
32
33         :param nodes: Nodes in topology.
34         :type nodes: dict
35         """
36         for node in nodes.values():
37             if node['type'] == NodeType.DUT:
38                 self.vpp_clear_interface_counters(node)
39
40     @staticmethod
41     def vpp_show_errors(node):
42         """Run "show errors" debug CLI command.
43
44         :param node: Node to run command on.
45         :type node: dict
46         """
47         vat = VatExecutor()
48         vat.execute_script("show_errors.vat", node, json_out=False)
49
50     @staticmethod
51     def vpp_show_errors_verbose(node):
52         """Run "show errors verbose" debug CLI command.
53
54         :param node: Node to run command on.
55         :type node: dict
56         """
57         vat = VatExecutor()
58         vat.execute_script("show_errors_verbose.vat", node, json_out=False)
59
60     @staticmethod
61     def vpp_show_errors_on_all_duts(nodes, verbose=False):
62         """Show errors on all DUTs.
63
64         :param nodes: VPP nodes
65         :param verbose: If True show verbose output.
66         :type nodes: dict
67         :type verbose: bool
68         """
69
70         for node in nodes.values():
71             if node['type'] == NodeType.DUT:
72                 if verbose:
73                     VppCounters.vpp_show_errors_verbose(node)
74                 else:
75                     VppCounters.vpp_show_errors(node)
76
77     @staticmethod
78     def vpp_show_runtime(node):
79         """Run "show runtime" CLI command.
80
81         :param node: Node to run command on.
82         :type node: dict
83         """
84         vat = VatExecutor()
85         vat.execute_script("show_runtime.vat", node, json_out=False)
86
87     @staticmethod
88     def vpp_show_runtime_verbose(node):
89         """Run "show runtime verbose" CLI command.
90
91         :param node: Node to run command on.
92         :type node: dict
93         """
94         vat = VatExecutor()
95         vat.execute_script("show_runtime_verbose.vat", node, json_out=False)
96
97     @staticmethod
98     def vpp_show_hardware_detail(node):
99         """Run "show hardware-interfaces detail" debug CLI command.
100
101         :param node: Node to run command on.
102         :type node: dict
103         """
104         vat = VatExecutor()
105         vat.execute_script("show_hardware_detail.vat", node, json_out=False)
106
107     @staticmethod
108     def vpp_clear_runtime(node):
109         """Run "clear runtime" CLI command.
110
111         :param node: Node to run command on.
112         :type node: dict
113         """
114         vat = VatExecutor()
115         vat.execute_script("clear_runtime.vat", node, json_out=False)
116
117     @staticmethod
118     def vpp_clear_interface_counters(node):
119         """Clear interface counters on VPP node.
120
121         :param node: Node to clear interface counters on.
122         :type node: dict
123         """
124         vat = VatExecutor()
125         vat.execute_script('clear_interface.vat', node)
126         vat.script_should_have_passed()
127
128     @staticmethod
129     def vpp_clear_hardware_counters(node):
130         """Clear interface hardware counters on VPP node.
131
132         :param node: Node to clear hardware counters on.
133         :type node: dict
134         """
135         vat = VatExecutor()
136         vat.execute_script('clear_hardware.vat', node)
137         vat.script_should_have_passed()
138
139     @staticmethod
140     def vpp_clear_errors_counters(node):
141         """Clear errors counters on VPP node.
142
143         :param node: Node to clear errors counters on.
144         :type node: dict
145         """
146         vat = VatExecutor()
147         vat.execute_script('clear_errors.vat', node)
148         vat.script_should_have_passed()
149
150     def vpp_dump_stats_table(self, node):
151         """Dump stats table on VPP node.
152
153         :param node: Node to dump stats table on.
154         :type node: dict
155         :returns: Stats table.
156         """
157         with VatTerminal(node) as vat:
158             vat.vat_terminal_exec_cmd('want_stats enable')
159             for _ in range(0, 12):
160                 stats_table = vat.vat_terminal_exec_cmd('dump_stats_table')
161                 if_counters = stats_table['interface_counters']
162                 if len(if_counters) > 0:
163                     self._stats_table = stats_table
164                     return stats_table
165                 time.sleep(1)
166             return None
167
168     def vpp_get_ipv4_interface_counter(self, node, interface):
169         """
170
171         :param node: Node to get interface IPv4 counter on.
172         :param interface: Interface name.
173         :type node: dict
174         :type interface: str
175         :returns: Interface IPv4 counter.
176         :rtype: int
177         """
178         return self.vpp_get_ipv46_interface_counter(node, interface, False)
179
180     def vpp_get_ipv6_interface_counter(self, node, interface):
181         """
182
183         :param node: Node to get interface IPv6 counter on.
184         :param interface: Interface name.
185         :type node: dict
186         :type interface: str
187         :returns: Interface IPv6 counter.
188         :rtype: int
189         """
190         return self.vpp_get_ipv46_interface_counter(node, interface, True)
191
192     def vpp_get_ipv46_interface_counter(self, node, interface, is_ipv6=True):
193         """Return interface IPv4/IPv6 counter.
194
195         :param node: Node to get interface IPv4/IPv6 counter on.
196         :param interface: Interface name.
197         :param is_ipv6: Specify IP version.
198         :type node: dict
199         :type interface: str
200         :type is_ipv6: bool
201         :returns: Interface IPv4/IPv6 counter.
202         :rtype: int
203         """
204         version = 'ip6' if is_ipv6 else 'ip4'
205         topo = Topology()
206         if_index = topo.get_interface_sw_index(node, interface)
207         if if_index is None:
208             logger.trace('{i} sw_index not found.'.format(i=interface))
209             return 0
210
211         if_counters = self._stats_table.get('interface_counters')
212         if if_counters is None or len(if_counters) == 0:
213             logger.trace('No interface counters.')
214             return 0
215         for counter in if_counters:
216             if counter['vnet_counter_type'] == version:
217                 data = counter['data']
218                 return data[if_index]
219         logger.trace('{i} {v} counter not found.'.format(i=interface,
220                                                          v=version))
221         return 0

©2016 FD.io a Linux Foundation Collaborative Project. All Rights Reserved.
Linux Foundation is a registered trademark of The Linux Foundation. Linux is a registered trademark of Linus Torvalds.
Please see our privacy policy and terms of use.