11import logging
22
3+ from grafana_client .client import GrafanaClientError
4+
35from .base import Base
46
57
@@ -9,60 +11,83 @@ def __init__(self, client):
911 self .client = client
1012 self .logger = logging .getLogger (__name__ )
1113
12- def get_installed_plugins (self ):
14+ def list (self ):
1315 """
14- :return:
16+ Return list of all installed plugins.
1517 """
1618 path = "/plugins?embedded=0"
1719 r = self .client .GET (path )
1820 return r
1921
20- def install_plugin (self , pluginId , version , errors = "raise" ):
22+ def by_id (self , plugin_id ):
23+ """
24+ Return single plugin item selected by plugin identifier.
25+ """
26+ plugins = self .list ()
27+ return get_plugin_by_id (plugin_list = plugins , plugin_id = plugin_id )
28+
29+ def install (self , plugin_id , version = None , errors = "raise" ):
2130 """
22- : return:
31+ Install a 3rd-party plugin from the plugin store.
2332 """
2433 try :
25- path = "/plugins/%s/install" % pluginId
26- r = self .client .POST (path , json = {"version" : version })
34+ path = "/plugins/%s/install" % plugin_id
35+ # Unfortunately, this endpoint may respond with an empty JSON,
36+ # which needs compensation, because it does not decode well.
37+ r = self .client .POST (path , json = {"version" : version }, accept_empty_json = True )
2738 return r
39+ except GrafanaClientError as ex :
40+ # Ignore `Client Error 409: Plugin already installed`.
41+ if "409" not in str (ex ):
42+ raise
2843 except Exception as ex :
2944 if errors == "raise" :
3045 raise
3146 elif errors == "ignore" :
32- self .logger .info (f"Skipped installing plugin { pluginId } : { ex } " )
47+ self .logger .warning (f"Problem installing plugin { plugin_id } : { ex } " )
3348 else :
3449 raise ValueError (f"error={ errors } is invalid" )
3550 return None
3651
37- def uninstall_plugin (self , pluginId , errors = "raise" ):
52+ def uninstall (self , plugin_id , errors = "raise" ):
3853 """
39- : return:
54+ Uninstall a 3rd-party plugin from the Grafana instance.
4055 """
4156 try :
42- path = "/plugins/%s/uninstall" % pluginId
57+ path = "/plugins/%s/uninstall" % plugin_id
4358 r = self .client .POST (path )
4459 return r
4560 except Exception as ex :
4661 if errors == "raise" :
4762 raise
4863 elif errors == "ignore" :
49- self .logger .info (f"Skipped uninstalling plugin { pluginId } : { ex } " )
64+ self .logger .warning (f"Problem uninstalling plugin { plugin_id } : { ex } " )
5065 else :
5166 raise ValueError (f"error={ errors } is invalid" )
5267 return None
5368
54- def health_check_plugin (self , pluginId ):
69+ def health (self , plugin_id ):
5570 """
56- :return:
71+ Run a health check probe on the designated plugin.
5772 """
58- path = "/plugins/%s/health" % pluginId
73+ path = "/plugins/%s/health" % plugin_id
5974 r = self .client .GET (path )
6075 return r
6176
62- def get_plugin_metrics (self , pluginId ):
77+ def metrics (self , plugin_id ):
6378 """
64- : return:
79+ Inquire metrics of the designated plugin.
6580 """
66- path = "/plugins/%s/metrics" % pluginId
81+ path = "/plugins/%s/metrics" % plugin_id
6782 r = self .client .GET (path )
6883 return r
84+
85+
86+ def get_plugin_by_id (plugin_list , plugin_id ):
87+ """
88+ Helper function to filter plugin list by identifier.
89+ """
90+ try :
91+ return next (item for item in plugin_list if item ["id" ] == plugin_id )
92+ except StopIteration :
93+ raise KeyError (f"Plugin not found: { plugin_id } " )
0 commit comments