Module: check_mk
Branch: master
Commit: 7f14640155c0c7e22ab6df6603826aaf5ad026c0
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=7f14640155c0c7…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Tue Oct 23 17:17:20 2018 +0200
Cleaned up Web API call collection registration
* The call collection plugins are now registered using our standard plugin registry
* Add test for correct registration of the collections
Change-Id: I674c14797ce177b0e79ae5402a916d40162ea190
---
cmk/gui/plugins/webapi/__init__.py | 1 +
cmk/gui/plugins/webapi/utils.py | 22 +++++++++++++---------
cmk/gui/plugins/webapi/webapi.py | 15 ++++++++-------
tests/unit/cmk/gui/test_webapi_unit.py | 15 +++++++++++++++
4 files changed, 37 insertions(+), 16 deletions(-)
diff --git a/cmk/gui/plugins/webapi/__init__.py b/cmk/gui/plugins/webapi/__init__.py
index 5a7a2de..073ae07 100644
--- a/cmk/gui/plugins/webapi/__init__.py
+++ b/cmk/gui/plugins/webapi/__init__.py
@@ -42,6 +42,7 @@ __all__ = [ os.path.basename(f)[:-3] for f in modules if f not in [
"__init__.py
from cmk.gui.plugins.webapi.utils import (
APICallCollection,
+ api_call_collection_registry,
api_actions,
validate_request_keys,
validate_host_attributes,
diff --git a/cmk/gui/plugins/webapi/utils.py b/cmk/gui/plugins/webapi/utils.py
index 2258971..0c7b6b6 100644
--- a/cmk/gui/plugins/webapi/utils.py
+++ b/cmk/gui/plugins/webapi/utils.py
@@ -34,6 +34,7 @@ from hashlib import md5
import cmk.gui.config as config
import cmk.gui.watolib as watolib
+import cmk.gui.plugin_registry
from cmk.gui.i18n import _
from cmk.gui.globals import html
from cmk.gui.log import logger
@@ -47,20 +48,23 @@ api_actions = {}
class APICallCollection(object):
__metaclass__ = abc.ABCMeta
- @classmethod
- def all_classes(cls):
- classes = {}
- for subclass in cls.__subclasses__(): # pylint: disable=no-member
- classes[subclass.__name__] = subclass
-
- return classes.values()
-
-
@abc.abstractmethod
def get_api_calls(self):
raise NotImplementedError("This API collection does not register any API
call")
+
+class APICallCollectionRegistry(cmk.gui.plugin_registry.ClassRegistry):
+ def plugin_base_class(self):
+ return APICallCollection
+
+
+ def _register(self, plugin_class):
+ self._entries[plugin_class.__name__] = plugin_class
+
+
+api_call_collection_registry = APICallCollectionRegistry()
+
#.
# .--API Helpers-------------------------------------------------------------.
# | _ _ _ |
diff --git a/cmk/gui/plugins/webapi/webapi.py b/cmk/gui/plugins/webapi/webapi.py
index 7f2dedb..4a7609f 100644
--- a/cmk/gui/plugins/webapi/webapi.py
+++ b/cmk/gui/plugins/webapi/webapi.py
@@ -39,8 +39,9 @@ from cmk.gui.globals import html
from cmk.gui.exceptions import MKUserError, MKAuthException, MKException
from cmk.gui.plugins.userdb.htpasswd import encrypt_password
-from . import (
+from cmk.gui.plugins.webapi import (
APICallCollection,
+ api_call_collection_registry,
api_actions,
validate_request_keys,
validate_host_attributes,
@@ -60,6 +61,7 @@ from . import (
# | |
# +----------------------------------------------------------------------+
+(a)api_call_collection_registry.register
class APICallFolders(APICallCollection):
def get_api_calls(self):
return {
@@ -200,6 +202,7 @@ class APICallFolders(APICallCollection):
# | |
# +----------------------------------------------------------------------+
+(a)api_call_collection_registry.register
class APICallHosts(APICallCollection):
def get_api_calls(self):
return {
@@ -574,6 +577,7 @@ api_actions["edit_users"] = {
# | |
# +----------------------------------------------------------------------+
+(a)api_call_collection_registry.register
class APICallRules(APICallCollection):
def get_api_calls(self):
required_permissions = ["wato.rulesets"] # wato.services ?
@@ -731,6 +735,7 @@ class APICallRules(APICallCollection):
# | |___/ |
# +----------------------------------------------------------------------+
+(a)api_call_collection_registry.register
class APICallHosttags(APICallCollection):
def get_api_calls(self):
required_permissions = ["wato.hosttags"]
@@ -844,6 +849,7 @@ class APICallHosttags(APICallCollection):
# | |
# +----------------------------------------------------------------------+
+(a)api_call_collection_registry.register
class APICallSites(APICallCollection):
def get_api_calls(self):
required_permissions = ["wato.sites"]
@@ -955,11 +961,6 @@ class APICallSites(APICallCollection):
site_mgmt.save_sites(all_sites)
-for api_call_class in APICallCollection.all_classes():
- api_actions.update(api_call_class().get_api_calls())
-
-
-
#.
# .--Other---------------------------------------------------------------.
# | ___ _ _ |
@@ -1080,5 +1081,5 @@ api_actions["activate_changes"] = {
}
-for api_call_class in APICallCollection.all_classes():
+for api_call_class in api_call_collection_registry.values():
api_actions.update(api_call_class().get_api_calls())
diff --git a/tests/unit/cmk/gui/test_webapi_unit.py
b/tests/unit/cmk/gui/test_webapi_unit.py
new file mode 100644
index 0000000..474ff26
--- /dev/null
+++ b/tests/unit/cmk/gui/test_webapi_unit.py
@@ -0,0 +1,15 @@
+
+import cmk.gui.webapi
+
+import cmk.gui.plugins.webapi.utils as webapi_utils
+
+def test_registered_api_call_collections():
+ registered_plugins = sorted(webapi_utils.api_call_collection_registry.keys())
+ assert registered_plugins == [
+ 'APICallFolders',
+ 'APICallHosts',
+ 'APICallHosttags',
+ 'APICallRules',
+ 'APICallSLA',
+ 'APICallSites'
+ ]