blob: b124315e0eaab2d372113a114f6e913f6f3f3097 [file] [log] [blame]
Alex3ebc5632019-04-18 16:47:18 -05001from cfg_checker.common import logger
2from cfg_checker.common.exception import ErrorMappingException
3
4
5class ErrorIndex(object):
6 _area_code = ""
7 _delimiter = ""
8 _index = 0
9 _errors = {}
10 _types = {
11 0: "Unknown error"
12 }
13
14 def __init__(self, area_code, delimiter='-'):
15 self._area_code = area_code
16 self._delimiter = delimiter
17 self._index += 1
18
19 def _format_error_code(self, index):
20 _t = "{:02d}".format(self._errors[index]['type'])
21 _i = "{:04d}".format(index)
22 _fmt = self._delimiter.join([self._area_code, _t, _i])
23 return _fmt
24
25 def _format_error(self, index):
26 # error code
27 _code = self._format_error_code(index)
28 # prepare data as string list
29 _d = self._errors[index]['data']
30 _data = ["{}: {}".format(_k, _v) for _k, _v in _d.iteritems()]
31 # format message
32 _msg = "### {}: {}\n{}".format(
33 _code,
34 self._get_error_type_text(self._errors[index]['type']),
35 "\n".join(_data)
36 )
37 return _msg
38
39 def _get_error_type_text(self, err_type):
40 if err_type not in self._types:
41 raise ErrorMappingException(
42 "type code {} not found".format(err_type)
43 )
44 else:
45 return self._types[err_type]
46
47 def get_error_code(self, index):
48 if index in self._errors.keys():
49 return self._format_error(index)
50 else:
51 raise ErrorMappingException(
52 "no error found for index {}".format(index)
53 )
54
55 def add_error_type(self, err_type, message):
56 if err_type in self._types:
57 raise ErrorMappingException(
58 "type code {} reserved for {}".format(
59 err_type,
60 self._types[err_type]
61 )
62 )
63 else:
64 self._types[err_type] = message
65
66 def add_error(self, err_type, **kwargs):
67 # check error type
68 if err_type not in self._types.keys():
69 logger.error(
70 "Error type not listed: '{}'; unknown used".format(err_type)
71 )
72 err_type = 0
73 _err = {
74 "type": err_type,
75 "data": kwargs
76 }
77 self._errors[self._index] = _err
78 self._index += 1
79
80 def get_errors_total(self):
81 return self._index-1
82
83 def get_indices(self):
84 return self._errors.keys()
85
86 def get_error(self, index):
87 if index in self._errors.keys():
88 return self._format_error(index)
89 else:
90 return "Unknown error index of {}".format(index)
91
92 def get_summary(self, print_zeros=True):
93 # create summary with counts per error type
94 _list = []
95 for _type in self._types.keys():
96 _len = len(
97 filter(
98 lambda i: self._errors[i]['type'] == _type,
99 self._errors
100 )
101 )
102 if _len:
103 _num_str = "{:5d}".format(_len)
104 elif print_zeros:
105 _num_str = "{:>5s}".format("-")
106 else:
107 continue
108 _list.append(
109 "{}: {}".format(
110 _num_str,
111 self._types[_type]
112 )
113 )
114
115 return "\n".join(_list)
116
117 def get_errors_as_list(self):
118 # create list of strings with error messages
119 _list = []
120 for _idx in range(0, self._index - 1):
121 _list.append("{}".format(self.get_error(_idx)))
122
123 return _list