blob: d0abcfe81845193b2e8eafbeac392cc52789cadf [file] [log] [blame]
Steve McIntyre30bf4db2014-08-12 18:08:22 +01001#! /usr/bin/python
2
3# Copyright 2014 Linaro Limited
Steve McIntyre6103e982014-09-18 23:37:54 +01004
Steve McIntyre30bf4db2014-08-12 18:08:22 +01005#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19# MA 02110-1301, USA.
20
21import time
22import logging
23
Steve McIntyre96f2c652015-02-12 04:25:55 +000024class SwitchErrors:
25 """ Error logging and statistics class """
26
27 def __init__(self):
28 self.errors_in = 0
29 self.errors_out = 0
30
31 def __repr__(self):
Steve McIntyrea67473a2015-02-12 08:26:33 +000032 return "<SwitchErrors: errors_in: %d, errors_out: %d>" % (self.errors_in, self.errors_out)
Steve McIntyre96f2c652015-02-12 04:25:55 +000033
34 # For now, just count the error. Later on we might add stats and
35 # analysis
36 def log_error_in(self, text):
37 self.errors_in += 1
38
39 # For now, just count the error. Later on we might add stats and
40 # analysis
41 def log_error_out(self, text):
42 self.errors_out += 1
43
Steve McIntyre30bf4db2014-08-12 18:08:22 +010044class SwitchDriver(object):
Steve McIntyre366046f2014-08-18 18:57:03 +010045
Steve McIntyre30bf4db2014-08-12 18:08:22 +010046 connection = None
47 hostname = ""
Steve McIntyre366046f2014-08-18 18:57:03 +010048 serial_number = ''
49
Steve McIntyre9936d002014-10-01 15:54:10 +010050 _allowed_port_modes = [ "trunk", "access" ]
Steve McIntyre366046f2014-08-18 18:57:03 +010051 _ports = []
52 _prompt_name = ''
Steve McIntyre30bf4db2014-08-12 18:08:22 +010053
Steve McIntyre2396f622015-07-14 15:35:03 +010054 def __init__ (self, switch_hostname, debug):
55
56 if debug:
57 # Configure logging for pexpect output if we have debug
58 # enabled
59
60 # get the logger
61 self.logger = logging.getLogger(switch_hostname)
62
63 # give the logger the methods required by pexpect
64 self.logger.write = self._log_write
65 self.logger.flush = self._log_do_nothing
66
67 else:
68 self.logger = None
69
Steve McIntyre5fa22652015-04-01 18:01:45 +010070 def dump_list(self, data):
Steve McIntyre30bf4db2014-08-12 18:08:22 +010071 i = 0
Steve McIntyre2b4c07b2014-12-22 16:10:04 +000072 for line in data:
Steve McIntyre30bf4db2014-08-12 18:08:22 +010073 print "%d: \"%s\"" % (i, line)
74 i += 1
75
76 def _delay(self):
77 time.sleep(0.5)
78
Steve McIntyre366046f2014-08-18 18:57:03 +010079 # List the capabilities of the switch (and driver) - some things
80 # make no sense to abstract. Returns a dict of strings, each one
81 # describing an extra feature that that higher levels may care
82 # about
Steve McIntyre9b09b9d2014-09-24 15:08:10 +010083 def switch_get_capabilities(self):
Steve McIntyre366046f2014-08-18 18:57:03 +010084 return self._capabilities
85
86 # List the names of all the ports on the switch
Steve McIntyre9b09b9d2014-09-24 15:08:10 +010087 def switch_get_port_names(self):
Steve McIntyre366046f2014-08-18 18:57:03 +010088 return self._ports
89
90 def _is_port_name_valid(self, name):
Steve McIntyre366046f2014-08-18 18:57:03 +010091 for port in self._ports:
92 if name == port:
93 return True
94 return False
95
96 def _is_port_mode_valid(self, mode):
Steve McIntyre366046f2014-08-18 18:57:03 +010097 for allowed in self._allowed_port_modes:
98 if allowed == mode:
99 return True
100 return False
101
Steve McIntyre2396f622015-07-14 15:35:03 +0100102 # Wrappers to adapt logging for pexpect when we've configured on a
103 # switch.
104 # This will be the method called by the pexpect object to write a
105 # log message
106 def _log_write(self, *args, **kwargs):
107 # ignore other parameters, pexpect only uses one arg
108 content = args[0]
109
110 if content in [' ', '', '\n', '\r', '\r\n']:
111 return # don't log empty lines
112
113 # Split the output into multiple lines so we get a
114 # well-formatted logfile
115 for line in content.split('\r\n'):
116 logging.info(line)
117
118 # This is the flush method for pexpect
119 def _log_do_nothing(self):
120 pass
121