add custom exceptions to "charts" module, catch them in create()
lgz committed
Oct 18, 2017 at 23:05 UTC
29bd09a8aa121f21fbab7c40a2a164a1b58eca7b
2 files changed
+45
-27
python.d/python_modules/bases/FrameworkServices/SimpleService.py
+21
-6
@@ -10,7 +10,7 @@ try:
10
except ImportError:
11
from time import sleep, time
12
13
-from bases.charts import Charts, create_runtime_chart
13
+from bases.charts import Charts, ChartError, create_runtime_chart
14
from bases.collection import OldVersionCompatibility, safe_print
15
from bases.loggers import PythonDLimitedLogger
16
@@ -110,22 +110,37 @@ class SimpleService(Thread, PythonDLimitedLogger, OldVersionCompatibility, objec
110
chart_config = self.definitions.get(chart_name)
111
112
if not chart_config:
113
- self.debug("create() chart '{chart_name}' not in definitions. "
113
+ self.debug("create() => [NOT ADDED] chart '{chart_name}' not in definitions. "
114
"Skipping it.".format(chart_name=chart_name))
115
continue
116
117
# create chart
118
chart_params = [chart_name] + chart_config['options']
119
- self.charts.add_chart(params=chart_params)
119
+ try:
120
+ self.charts.add_chart(params=chart_params)
121
+ except ChartError as error:
122
+ self.error("create() => [NOT ADDED] (chart '{chart}': {error})".format(chart=chart_name,
123
+ error=error))
124
+ continue
125
126
# add dimensions to chart
127
for dimension in chart_config['lines']:
123
- self.charts[chart_name].add_dimension(dimension)
128
+ try:
129
+ self.charts[chart_name].add_dimension(dimension)
130
+ except ChartError as error:
131
+ self.error("create() => [NOT ADDED] (dimension '{dimension}': {error})".format(dimension=dimension,
132
+ error=error))
133
+ continue
134
135
# add variables to chart
136
if 'variables' in chart_config:
137
for variable in chart_config['variables']:
128
- self.charts[chart_name].add_variable(variable)
138
+ try:
139
+ self.charts[chart_name].add_variable(variable)
140
+ except ChartError as error:
141
+ self.error("create() => [NOT ADDED] (variable '{var}': {error})".format(var=variable,
142
+ error=error))
143
+ continue
144
145
del self.order
146
del self.definitions
@@ -197,7 +212,7 @@ class SimpleService(Thread, PythonDLimitedLogger, OldVersionCompatibility, objec
212
for chart in self.charts.penalty_exceeded(penalty_max=CHART_OBSOLETE_PENALTY):
213
safe_print(chart.obsolete())
214
del self.charts[chart.params['id']]
200
- self.error('chart "{0}" was removed due to non updating'.format(chart.name))
215
+ self.error("chart '{0}' was removed due to non updating".format(chart.name))
216
217
for chart in self.charts:
218
dimension_updated, variables_updated = str(), str()
python.d/python_modules/bases/charts.py
+24
-21
@@ -53,12 +53,16 @@ class ChartError(Exception):
53
"""Base-class for all exceptions raised by this module"""
54
55
56
-class DuplicateChartError(ChartError):
57
- """Raised when user re-adds a chart that has already been added"""
56
+class DuplicateItemError(ChartError):
57
+ """Occurs when user re-adds a chart or a dimension that has already been added"""
58
59
60
-class DuplicateDimensionError(ChartError):
61
- """Raised when user re-adds a dimension that has already been added"""
60
+class ItemTypeError(ChartError):
61
+ """Occurs when user passes value of wrong type to Chart, Dimension or ChartVariable class"""
62
+
63
+
64
+class ItemValueError(ChartError):
65
+ """Occurs when user passes inappropriate value to Chart, Dimension or ChartVariable class"""
66
67
68
class Charts:
@@ -120,7 +124,7 @@ class Charts:
124
params = [self.job_name()] + params
125
chart_id = params[1]
126
if chart_id in self.charts:
123
- raise DuplicateChartError('{chart} already in charts'.format(chart=chart_id))
127
+ raise DuplicateItemError("'{chart}' already in charts".format(chart=chart_id))
128
else:
129
new_chart = Chart(params)
130
new_chart.params['update_every'] = self.update_every
@@ -137,9 +141,9 @@ class Chart:
141
:param params: <list>
142
"""
143
if not isinstance(params, list):
140
- raise TypeError("'chart' must be a list type")
144
+ raise ItemTypeError("'chart' must be a list type")
145
if not len(params) >= 8:
142
- raise ValueError('invalid value for "chart", must be {0}'.format(CHART_PARAMS))
146
+ raise ItemValueError("invalid value for 'chart', must be {0}".format(CHART_PARAMS))
147
148
self.params = dict(zip(CHART_PARAMS, (p or str() for p in params)))
149
self.name = '{type}.{id}'.format(type=self.params['type'],
@@ -175,26 +179,25 @@ class Chart:
179
:param dimension: <list>
180
:return:
181
"""
178
- if dimension[0] in [repr(d) for d in self.dimensions]:
179
- raise DuplicateDimensionError('{dimension} already in {chart} dimensions'.format(dimension=dimension[0],
180
- chart=self.name))
182
+ dim = Dimension(dimension)
183
+
184
+ if dim.params['id'] in self:
185
+ raise DuplicateItemError("'{dimension}' already in '{chart}' dimensions".format(dimension=dim.params['id'],
186
+ chart=self.name))
187
self.dimensions.append(Dimension(dimension))
188
+ return dim
189
190
def add_dimension_and_push_chart(self, dimension):
191
"""
192
:param dimension: <list>
193
:return:
194
"""
188
- if dimension[0] in [repr(d) for d in self.dimensions]:
189
- raise DuplicateDimensionError('{dimension} already in {chart} dimensions'.format(dimension=dimension[0],
190
- chart=self.name))
191
- dimension = Dimension(dimension)
192
- self.dimensions.append(dimension)
193
- safe_print(self.create(dimension))
195
+ dim = self.add_dimension(dimension)
196
+ safe_print(self.create(dim))
197
198
def create(self, dimension=None):
199
"""
197
- :param dimension: <list>
200
+ :param dimension: Dimension
201
:return:
202
"""
203
chart = CHART_CREATE.format(**self.params)
@@ -226,9 +229,9 @@ class Dimension:
229
:param params: <list>
230
"""
231
if not isinstance(params, list):
229
- raise TypeError("'dimension' must be a list type")
232
+ raise ItemTypeError("'dimension' must be a list type")
233
if not params:
231
- raise ValueError('invalid value for "dimension", must be {0}'.format(DIMENSION_PARAMS))
234
+ raise ItemValueError("invalid value for 'dimension', must be {0}".format(DIMENSION_PARAMS))
235
236
self.params = dict(zip(DIMENSION_PARAMS, (p or str() for p in params)))
237
self.params['name'] = self.params.get('name') or self.params['id']
@@ -263,9 +266,9 @@ class ChartVariable:
266
:param params: <list>
267
"""
268
if not isinstance(params, list):
266
- raise TypeError("'variable' must be a list type")
269
+ raise ItemTypeError("'variable' must be a list type")
270
if not params:
268
- raise ValueError('invalid value for "variable", must be: {0}'.format(VARIABLE_PARAMS))
271
+ raise ItemValueError("invalid value for 'variable' must be: {0}".format(VARIABLE_PARAMS))
272
273
self.params = dict(zip(VARIABLE_PARAMS, params))
274
self.params.setdefault('value', None)