1
1
import logging
2
2
3
+ from grafana_client .client import GrafanaClientError
4
+
3
5
from .base import Base
4
6
5
7
@@ -9,60 +11,83 @@ def __init__(self, client):
9
11
self .client = client
10
12
self .logger = logging .getLogger (__name__ )
11
13
12
- def get_installed_plugins (self ):
14
+ def list (self ):
13
15
"""
14
- :return:
16
+ Return list of all installed plugins.
15
17
"""
16
18
path = "/plugins?embedded=0"
17
19
r = self .client .GET (path )
18
20
return r
19
21
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" ):
21
30
"""
22
- : return:
31
+ Install a 3rd-party plugin from the plugin store.
23
32
"""
24
33
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 )
27
38
return r
39
+ except GrafanaClientError as ex :
40
+ # Ignore `Client Error 409: Plugin already installed`.
41
+ if "409" not in str (ex ):
42
+ raise
28
43
except Exception as ex :
29
44
if errors == "raise" :
30
45
raise
31
46
elif errors == "ignore" :
32
- self .logger .info (f"Skipped installing plugin { pluginId } : { ex } " )
47
+ self .logger .warning (f"Problem installing plugin { plugin_id } : { ex } " )
33
48
else :
34
49
raise ValueError (f"error={ errors } is invalid" )
35
50
return None
36
51
37
- def uninstall_plugin (self , pluginId , errors = "raise" ):
52
+ def uninstall (self , plugin_id , errors = "raise" ):
38
53
"""
39
- : return:
54
+ Uninstall a 3rd-party plugin from the Grafana instance.
40
55
"""
41
56
try :
42
- path = "/plugins/%s/uninstall" % pluginId
57
+ path = "/plugins/%s/uninstall" % plugin_id
43
58
r = self .client .POST (path )
44
59
return r
45
60
except Exception as ex :
46
61
if errors == "raise" :
47
62
raise
48
63
elif errors == "ignore" :
49
- self .logger .info (f"Skipped uninstalling plugin { pluginId } : { ex } " )
64
+ self .logger .warning (f"Problem uninstalling plugin { plugin_id } : { ex } " )
50
65
else :
51
66
raise ValueError (f"error={ errors } is invalid" )
52
67
return None
53
68
54
- def health_check_plugin (self , pluginId ):
69
+ def health (self , plugin_id ):
55
70
"""
56
- :return:
71
+ Run a health check probe on the designated plugin.
57
72
"""
58
- path = "/plugins/%s/health" % pluginId
73
+ path = "/plugins/%s/health" % plugin_id
59
74
r = self .client .GET (path )
60
75
return r
61
76
62
- def get_plugin_metrics (self , pluginId ):
77
+ def metrics (self , plugin_id ):
63
78
"""
64
- : return:
79
+ Inquire metrics of the designated plugin.
65
80
"""
66
- path = "/plugins/%s/metrics" % pluginId
81
+ path = "/plugins/%s/metrics" % plugin_id
67
82
r = self .client .GET (path )
68
83
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