Reformat python libraries.
[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_verbose(node):
42         """Run "show errors verbose" 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_verbose.vat", node, json_out=False)
49
50     @staticmethod
51     def vpp_show_runtime_verbose(node):
52         """Run "show runtime" 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_runtime_verbose.vat", node, json_out=False)
59
60     @staticmethod
61     def vpp_show_hardware_detail(node):
62         """Run "show hardware-interfaces detail" debug CLI command.
63
64         :param node: Node to run command on.
65         :type node: dict
66         """
67         vat = VatExecutor()
68         vat.execute_script("show_hardware_detail.vat", node, json_out=False)
69
70     @staticmethod
71     def vpp_clear_interface_counters(node):
72         """Clear interface counters on VPP node.
73
74         :param node: Node to clear interface counters on.
75         :type node: dict
76         """
77         vat = VatExecutor()
78         vat.execute_script('clear_interface.vat', node)
79         vat.script_should_have_passed()
80
81     def vpp_dump_stats_table(self, node):
82         """Dump stats table on VPP node.
83
84         :param node: Node to dump stats table on.
85         :type node: dict
86         :return: Stats table.
87         """
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
95                     return stats_table
96                 time.sleep(1)
97             return None
98
99     def vpp_get_ipv4_interface_counter(self, node, interface):
100         return self.vpp_get_ipv46_interface_counter(node, interface, False)
101
102     def vpp_get_ipv6_interface_counter(self, node, interface):
103         return self.vpp_get_ipv46_interface_counter(node, interface, True)
104
105     def vpp_get_ipv46_interface_counter(self, node, interface, is_ipv6=True):
106         """Return interface IPv4/IPv6 counter.
107
108         :param node: Node to get interface IPv4/IPv6 counter on.
109         :param interface: Interface name.
110         :param is_ipv6: Specify IP version.
111         :type node: dict
112         :type interface: str
113         :type is_ipv6: bool
114         :return: Interface IPv4/IPv6 counter.
115         :rtype: int
116         """
117         version = 'ip6' if is_ipv6 else 'ip4'
118         topo = Topology()
119         if_index = topo.get_interface_sw_index(node, interface)
120         if if_index is None:
121             logger.trace('{i} sw_index not found.'.format(i=interface))
122             return 0
123
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.')
127             return 0
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,
133                                                          v=version))
134         return 0