Module: check_mk
Branch: master
Commit: b062546aa4df778a60b35e8a422b02309f72a588
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=b062546aa4df77…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Tue Oct 23 09:21:43 2018 +0200
Cleaned up metricometer renderer registration
* Metricometer renderer are now registered using our standard plugin registry
* Made MetricometerRenderer an ABC
Change-Id: I9b6154ade026ab631138b6853d7275d09fdd6de2
---
cmk/gui/metrics.py | 53 +++++++++++++++++++++++++------------
cmk/gui/plugins/views/perfometer.py | 4 +--
tests/unit/cmk/gui/test_metrics.py | 11 ++++++++
3 files changed, 49 insertions(+), 19 deletions(-)
diff --git a/cmk/gui/metrics.py b/cmk/gui/metrics.py
index 5641da1..909f350 100644
--- a/cmk/gui/metrics.py
+++ b/cmk/gui/metrics.py
@@ -33,6 +33,8 @@
# unit_name: The ID of a unit, e.g. "%"
# unit: The definition-dict of a unit like in unit_info
# graph_template: Template for a graph. Essentially a dict with the key
"metrics"
+
+import abc
import math
import string
import json
@@ -47,6 +49,7 @@ import cmk.gui.config as config
import cmk.gui.sites as sites
import cmk.gui.i18n
import cmk.gui.pages
+import cmk.gui.plugin_registry
from cmk.gui.i18n import _
from cmk.gui.globals import html
@@ -338,29 +341,21 @@ class Perfometers(object):
class MetricometerRenderer(object):
+ __metaclass__ = abc.ABCMeta
+
"""Abstract base class for all metricometer
renderers"""
@classmethod
def type_name(cls):
raise NotImplementedError()
- @classmethod
- def get_renderer(cls, perfometer, translated_metrics):
- subclasses = cls.__subclasses__() # pylint: disable=no-member
-
- for subclass in subclasses:
- if subclass.type_name() == perfometer["type"]:
- return subclass(perfometer, translated_metrics)
-
- raise NotImplementedError(_("Invalid perfometer type: %s") %
perfometer["type"])
-
-
def __init__(self, perfometer, translated_metrics):
super(MetricometerRenderer, self).__init__()
self._perfometer = perfometer
self._translated_metrics = translated_metrics
+ @abc.abstractmethod
def get_stack(self):
"""Return a list of perfometer elements
@@ -391,11 +386,13 @@ class MetricometerRenderer(object):
return self._get_type_label()
+ @abc.abstractmethod
def _get_type_label(self):
"""Returns the label for this perfometer type"""
raise NotImplementedError()
+ @abc.abstractmethod
def get_sort_number(self):
"""Returns the number to sort this perfometer with compared to the
other
performeters in the current performeter sort group"""
@@ -403,6 +400,25 @@ class MetricometerRenderer(object):
+class MetricometerRendererRegistry(cmk.gui.plugin_registry.ClassRegistry):
+ def plugin_base_class(self):
+ return MetricometerRenderer
+
+
+ def _register(self, plugin_class):
+ self._entries[plugin_class.type_name()] = plugin_class
+
+
+ def get_renderer(self, perfometer, translated_metrics):
+ subclass = self[perfometer["type"]]
+ return subclass(perfometer, translated_metrics)
+
+
+
+renderer_registry = MetricometerRendererRegistry()
+
+
+(a)renderer_registry.register
class MetricometerRendererLogarithmic(MetricometerRenderer):
@classmethod
def type_name(cls):
@@ -451,6 +467,7 @@ class MetricometerRendererLogarithmic(MetricometerRenderer):
+(a)renderer_registry.register
class MetricometerRendererLinear(MetricometerRenderer):
@classmethod
def type_name(cls):
@@ -503,6 +520,7 @@ class MetricometerRendererLinear(MetricometerRenderer):
+(a)renderer_registry.register
class MetricometerRendererStacked(MetricometerRenderer):
@classmethod
def type_name(cls):
@@ -512,7 +530,7 @@ class MetricometerRendererStacked(MetricometerRenderer):
def get_stack(self):
stack = []
for sub_perfometer in self._perfometer["perfometers"]:
- renderer = MetricometerRenderer.get_renderer(sub_perfometer,
self._translated_metrics)
+ renderer = renderer_registry.get_renderer(sub_perfometer,
self._translated_metrics)
sub_stack = renderer.get_stack()
stack.append(sub_stack[0])
@@ -523,7 +541,7 @@ class MetricometerRendererStacked(MetricometerRenderer):
def _get_type_label(self):
sub_labels = []
for sub_perfometer in self._perfometer["perfometers"]:
- renderer = MetricometerRenderer.get_renderer(sub_perfometer,
self._translated_metrics)
+ renderer = renderer_registry.get_renderer(sub_perfometer,
self._translated_metrics)
sub_label = renderer.get_label()
if sub_label:
@@ -538,11 +556,12 @@ class MetricometerRendererStacked(MetricometerRenderer):
def get_sort_number(self):
"""Use the number of the first stack element."""
sub_perfometer = self._perfometer["perfometers"][0]
- renderer = MetricometerRenderer.get_renderer(sub_perfometer,
self._translated_metrics)
+ renderer = renderer_registry.get_renderer(sub_perfometer,
self._translated_metrics)
return renderer.get_sort_number()
+(a)renderer_registry.register
class MetricometerRendererDual(MetricometerRenderer):
@classmethod
def type_name(cls):
@@ -560,7 +579,7 @@ class MetricometerRendererDual(MetricometerRenderer):
def get_stack(self):
content = []
for nr, sub_perfometer in enumerate(self._perfometer["perfometers"]):
- renderer = MetricometerRenderer.get_renderer(sub_perfometer,
self._translated_metrics)
+ renderer = renderer_registry.get_renderer(sub_perfometer,
self._translated_metrics)
sub_stack = renderer.get_stack()
if len(sub_stack) != 1:
@@ -577,7 +596,7 @@ class MetricometerRendererDual(MetricometerRenderer):
def _get_type_label(self):
sub_labels = []
for sub_perfometer in self._perfometer["perfometers"]:
- renderer = MetricometerRenderer.get_renderer(sub_perfometer,
self._translated_metrics)
+ renderer = renderer_registry.get_renderer(sub_perfometer,
self._translated_metrics)
sub_label = renderer.get_label()
if sub_label:
@@ -597,7 +616,7 @@ class MetricometerRendererDual(MetricometerRenderer):
"""
sub_sort_numbers = []
for sub_perfometer in self._perfometer["perfometers"]:
- renderer = MetricometerRenderer.get_renderer(sub_perfometer,
self._translated_metrics)
+ renderer = renderer_registry.get_renderer(sub_perfometer,
self._translated_metrics)
sub_sort_numbers.append(renderer.get_sort_number())
return max(*sub_sort_numbers)
diff --git a/cmk/gui/plugins/views/perfometer.py b/cmk/gui/plugins/views/perfometer.py
index 7342b76..f6adc56 100644
--- a/cmk/gui/plugins/views/perfometer.py
+++ b/cmk/gui/plugins/views/perfometer.py
@@ -98,7 +98,7 @@ class Perfometer(object):
if not perfometer_definition:
return None, None
- renderer = metrics.MetricometerRenderer.get_renderer(perfometer_definition,
self._translated_metrics)
+ renderer = metrics.renderer_registry.get_renderer(perfometer_definition,
self._translated_metrics)
return renderer.get_label(), render_metricometer(renderer.get_stack())
@@ -179,7 +179,7 @@ class Perfometer(object):
if not perfometer_definition:
return None
- renderer = metrics.MetricometerRenderer.get_renderer(perfometer_definition,
self._translated_metrics)
+ renderer = metrics.renderer_registry.get_renderer(perfometer_definition,
self._translated_metrics)
return renderer.get_sort_number()
diff --git a/tests/unit/cmk/gui/test_metrics.py b/tests/unit/cmk/gui/test_metrics.py
new file mode 100644
index 0000000..6b1ca45
--- /dev/null
+++ b/tests/unit/cmk/gui/test_metrics.py
@@ -0,0 +1,11 @@
+
+import cmk.gui.metrics as metrics
+
+def test_registered_renderers():
+ registered_plugins = sorted(metrics.renderer_registry.keys())
+ assert registered_plugins == [
+ 'dual',
+ 'linear',
+ 'logarithmic',
+ 'stacked'
+ ]