grafana 0.8.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +8 -3
  3. data/lib/_logging.rb_ +55 -0
  4. data/lib/grafana.rb +1 -1
  5. data/lib/grafana/admin.rb +2 -1
  6. data/lib/grafana/alerts.rb +338 -14
  7. data/lib/grafana/annotations.rb +284 -9
  8. data/lib/grafana/auth.rb +150 -0
  9. data/lib/grafana/client.rb +81 -5
  10. data/lib/grafana/dashboard.rb +99 -7
  11. data/lib/grafana/dashboard_permissions.rb +132 -0
  12. data/lib/grafana/dashboard_versions.rb +101 -5
  13. data/lib/grafana/datasource.rb +34 -38
  14. data/lib/grafana/folder.rb +198 -0
  15. data/lib/grafana/folder_and_dashboard_search.rb +57 -0
  16. data/lib/grafana/folder_permissions.rb +155 -0
  17. data/lib/grafana/logging.rb +55 -0
  18. data/lib/grafana/login.rb +93 -49
  19. data/lib/grafana/network.rb +130 -101
  20. data/lib/grafana/organization.rb +2 -1
  21. data/lib/grafana/organizations.rb +15 -6
  22. data/lib/grafana/playlist.rb +594 -0
  23. data/lib/grafana/preferences.rb +122 -0
  24. data/lib/grafana/tags.rb +16 -0
  25. data/lib/grafana/teams.rb +364 -0
  26. data/lib/grafana/tools.rb +42 -9
  27. data/lib/grafana/user.rb +6 -2
  28. data/lib/grafana/users.rb +19 -11
  29. data/lib/grafana/validator.rb +47 -2
  30. data/lib/grafana/version.rb +3 -3
  31. metadata +16 -39
  32. data/doc/Array.html +0 -200
  33. data/doc/Boolean.html +0 -122
  34. data/doc/FalseClass.html +0 -132
  35. data/doc/Grafana.html +0 -172
  36. data/doc/Hash.html +0 -212
  37. data/doc/Logging.html +0 -326
  38. data/doc/Object.html +0 -286
  39. data/doc/Time.html +0 -200
  40. data/doc/TrueClass.html +0 -132
  41. data/doc/_index.html +0 -380
  42. data/doc/class_list.html +0 -51
  43. data/doc/file.README.html +0 -117
  44. data/doc/file_list.html +0 -56
  45. data/doc/frames.html +0 -17
  46. data/doc/index.html +0 -117
  47. data/doc/method_list.html +0 -747
  48. data/doc/top-level-namespace.html +0 -112
  49. data/lib/logging.rb +0 -35
@@ -1,29 +1,125 @@
1
1
 
2
2
  module Grafana
3
3
 
4
- # http://docs.grafana.org/http_api/annotations/
4
+ # http://docs.grafana.org/http_api/dashboard_versions
5
5
  #
6
6
  module DashboardVersions
7
7
 
8
8
  # Get all dashboard versions
9
9
  # http://docs.grafana.org/http_api/dashboard_versions/#get-all-dashboard-versions
10
10
  # GET /api/dashboards/id/:dashboardId/versions
11
- def dashboard_all_versions( params ); end
11
+ #
12
+ #
13
+ #
14
+ #
15
+ #
16
+ #
17
+ def dashboard_all_versions( params )
18
+
19
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
20
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
21
+
22
+ # v, mv = version.values
23
+ # return { 'status' => 404, 'message' => format( 'dashboard has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
24
+
25
+ dashboard_id = validate( params, required: true , var: 'dashboard_id', type: Integer )
26
+ start = validate( params, required: false, var: 'start' , type: Integer )
27
+ limit = validate( params, required: false, var: 'limit' , type: Integer )
28
+
29
+ api = []
30
+ api << format( 'start=%s', start ) unless( start.nil? )
31
+ api << format( 'limit=%s', limit ) unless( limit.nil? )
32
+ api = api.join( '&' )
33
+
34
+ endpoint = format('/api/dashboards/id/%s/versions?%s', dashboard_id, api)
35
+ get(endpoint)
36
+ end
12
37
 
13
38
  # Get dashboard version
14
39
  # http://docs.grafana.org/http_api/dashboard_versions/#get-dashboard-version
15
40
  # GET /api/dashboards/id/:dashboardId/versions/:id
16
- def dashboard_version( params ); end
41
+ def dashboard_version( params )
42
+
43
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
44
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
45
+
46
+ v, mv = version.values
47
+ return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
48
+
49
+ dashboard_id = validate( params, required: true, var: 'dashboard_id', type: Integer )
50
+ version = validate( params, required: true, var: 'version' , type: Integer )
51
+
52
+ endpoint = format('/api/dashboards/id/%s/versions/%s', dashboard_id, version)
53
+
54
+ r = get(endpoint)
55
+
56
+ r['message'] = format('no dashboard version \'%s\' for dashboard \'%s\' found', version, dashboard_id) if(r.dig('status') == 404)
57
+ r['message'] = format('no dashboard version \'%s\' for dashboard \'%s\' found', version, dashboard_id) if(r.dig('status') == 500)
58
+ r
59
+ end
17
60
 
18
61
  # Restore dashboard
19
62
  # http://docs.grafana.org/http_api/dashboard_versions/#restore-dashboard
20
63
  # POST /api/dashboards/id/:dashboardId/restore
21
- def restore_dashboard( params ); end
64
+ def restore_dashboard( params )
65
+
66
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
67
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
68
+
69
+ # v, mv = version.values
70
+ # return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
71
+
72
+ dashboard_id = validate( params, required: true, var: 'dashboard_id', type: Integer )
73
+ version = validate( params, required: true, var: 'version' , type: Integer )
74
+
75
+ endpoint = format('/api/dashboards/id/%s/restore', dashboard_id)
76
+
77
+ payload = {
78
+ version: version
79
+ }
80
+
81
+ post(endpoint, payload.to_json)
82
+ end
22
83
 
23
84
  # Compare dashboard versions
24
85
  # http://docs.grafana.org/http_api/dashboard_versions/#compare-dashboard-versions
25
86
  # POST /api/dashboards/calculate-diff
26
- def compare_dashboard_version( params ); end
87
+ def compare_dashboard_version( params )
88
+
89
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
90
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
91
+
92
+ base = validate( params, required: true , var: 'base' , type: Hash )
93
+ new = validate( params, required: true , var: 'new' , type: Hash )
94
+ diff_type = validate( params, required: false, var: 'diff_type', type: String ) || 'json'
95
+
96
+ base_dashboard_id = validate( base, required: true , var: 'dashboard_id', type: Integer )
97
+ base_dashboard_version = validate( base, required: true , var: 'version' , type: Integer )
98
+ new_dashboard_id = validate( new , required: true , var: 'dashboard_id', type: Integer )
99
+ new_dashboard_version = validate( new , required: true , var: 'version' , type: Integer )
100
+
101
+ valid_diff_type = %w[json basic]
102
+
103
+ r = validate_hash(diff_type, valid_diff_type)
104
+
105
+ return r unless(r == true)
106
+
107
+ payload = {
108
+ base: {
109
+ dashboardId: base_dashboard_id,
110
+ version: base_dashboard_version
111
+ },
112
+ new: {
113
+ dashboardId: new_dashboard_id,
114
+ version: new_dashboard_version
115
+ },
116
+ diffType: diff_type
117
+ }
118
+
119
+ endpoint = '/api/dashboards/calculate-diff'
120
+
121
+ post(endpoint, payload.to_json)
122
+ end
27
123
 
28
124
  end
29
125
 
@@ -44,7 +44,9 @@ module Grafana
44
44
  #
45
45
  def datasource( datasource_id )
46
46
 
47
- raise ArgumentError.new(format('wrong type. user \'datasource_id\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', datasource_id.class.to_s)) if( datasource_id.is_a?(String) && datasource_id.is_a?(Integer) )
47
+ if( datasource_id.is_a?(String) && datasource_id.is_a?(Integer) )
48
+ raise ArgumentError.new(format('wrong type. \'datasource_id\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', datasource_id.class.to_s))
49
+ end
48
50
  raise ArgumentError.new('missing \'datasource_id\'') if( datasource_id.size.zero? )
49
51
 
50
52
  if(datasource_id.is_a?(String))
@@ -105,27 +107,31 @@ module Grafana
105
107
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
106
108
  raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
107
109
 
108
- name = validate( params, required: true, var: 'name' )
109
- organisation = validate( params, required: false, var: 'organisation' )
110
- type = validate( params, required: false, var: 'type', type: String )
111
- new_name = validate( params, required: false, var: 'new_name', type: String )
112
- database = validate( params, required: false, var: 'database', type: String )
113
- access = validate( params, required: false, var: 'access', type: String ) || 'proxy'
114
- default = validate( params, required: false, var: 'default', type: Boolean ) || false
115
- user = validate( params, required: false, var: 'user', type: String )
116
- password = validate( params, required: false, var: 'password', type: String )
117
- url = validate( params, required: false, var: 'url', type: String )
118
- json_data = validate( params, required: false, var: 'json_data', type: Hash )
119
- ba_user = validate( params, required: false, var: 'basic_user', type: String )
120
- ba_password = validate( params, required: false, var: 'basic_password', type: String )
121
- basic_auth = false
122
- basic_auth = true unless( ba_user.nil? && ba_password.nil? )
123
- org_id = nil
124
-
125
- raise ArgumentError.new(format('wrong type. user \'name\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', name.class.to_s)) if( name.is_a?(String) && name.is_a?(Integer) )
126
-
110
+ name = validate( params, required: true , var: 'name' )
111
+ organisation = validate( params, required: false, var: 'organisation' )
112
+ type = validate( params, required: false, var: 'type', type: String )
113
+ new_name = validate( params, required: false, var: 'new_name', type: String )
114
+ database = validate( params, required: false, var: 'database', type: String )
115
+ access = validate( params, required: false, var: 'access', type: String ) || 'proxy'
116
+ default = validate( params, required: false, var: 'default', type: Boolean ) || false
117
+ user = validate( params, required: false, var: 'user', type: String )
118
+ password = validate( params, required: false, var: 'password', type: String )
119
+ url = validate( params, required: false, var: 'url', type: String )
120
+ json_data = validate( params, required: false, var: 'json_data', type: Hash )
121
+ ba_user = validate( params, required: false, var: 'basic_user', type: String )
122
+ ba_password = validate( params, required: false, var: 'basic_password', type: String )
123
+ basic_auth = false
124
+ basic_auth = true unless( ba_user.nil? && ba_password.nil? )
125
+ org_id = nil
126
+
127
+ if( name.is_a?(String) && name.is_a?(Integer) )
128
+ raise ArgumentError.new(format('wrong type. \'name\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', name.class.to_s))
129
+ end
127
130
  if( organisation )
128
- raise ArgumentError.new(format('wrong type. user \'organisation\' must be an String (for an Organisation name) or an Integer (for an Organisation Id), given \'%s\'', organisation.class.to_s)) if( organisation.is_a?(String) && organisation.is_a?(Integer) )
131
+ if( organisation.is_a?(String) && organisation.is_a?(Integer) )
132
+ raise ArgumentError.new(format('wrong type. \'organisation\' must be an String (for an Organisation name) or an Integer (for an Organisation Id), given \'%s\'', organisation.class.to_s))
133
+ end
134
+
129
135
  org = organization( organisation )
130
136
  org_id = org.dig('id')
131
137
 
@@ -170,7 +176,7 @@ module Grafana
170
176
  endpoint = format('/api/datasources/%d', datasource_id )
171
177
 
172
178
  @logger.debug("Updating data source Id #{datasource_id} (GET #{endpoint})") if @debug
173
- logger.debug(payload.to_json) if(@debug)
179
+ # logger.debug(payload.to_json) if(@debug)
174
180
 
175
181
  put( endpoint, payload.to_json )
176
182
  end
@@ -180,10 +186,8 @@ module Grafana
180
186
  # @param [Hash] params
181
187
  # @option params [String] type Datasource Type - (required) (grafana graphite cloudwatch elasticsearch prometheus influxdb mysql opentsdb postgres)
182
188
  # @option params [String] name Datasource Name - (required)
183
- # @option params [String] database Datasource Database - (required)
184
189
  # @option params [String] access (proxy) Acess Type - (required) (proxy or direct)
185
190
  # @option params [Boolean] default (false)
186
- # @option params [String] password
187
191
  # @option params [String] url Datasource URL - (required)
188
192
  # @option params [Hash] json_data
189
193
  # @option params [Hash] json_secure
@@ -194,7 +198,6 @@ module Grafana
194
198
  # params = {
195
199
  # name: 'graphite',
196
200
  # type: 'graphite',
197
- # database: 'graphite',
198
201
  # url: 'http://localhost:8080'
199
202
  # }
200
203
  # create_datasource(params)
@@ -202,7 +205,6 @@ module Grafana
202
205
  # params = {
203
206
  # name: 'graphite',
204
207
  # type: 'graphite',
205
- # database: 'graphite',
206
208
  # default: true,
207
209
  # url: 'http://localhost:8080',
208
210
  # json_data: { graphiteVersion: '1.1' }
@@ -231,13 +233,11 @@ module Grafana
231
233
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
232
234
  raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
233
235
 
234
- type = validate( params, required: true, var: 'type', type: String )
235
- name = validate( params, required: true, var: 'name', type: String )
236
- database = validate( params, required: true, var: 'database', type: String )
236
+ type = validate( params, required: true , var: 'type', type: String )
237
+ name = validate( params, required: true , var: 'name', type: String )
237
238
  access = validate( params, required: false, var: 'access', type: String ) || 'proxy'
238
239
  default = validate( params, required: false, var: 'default', type: Boolean ) || false
239
- password = validate( params, required: false, var: 'password', type: String )
240
- url = validate( params, required: true, var: 'url', type: String )
240
+ url = validate( params, required: true , var: 'url', type: String )
241
241
  json_data = validate( params, required: false, var: 'json_data', type: Hash )
242
242
  json_secure = validate( params, required: false, var: 'json_secure', type: Hash )
243
243
  ba_user = validate( params, required: false, var: 'basic_user', type: String )
@@ -262,14 +262,8 @@ module Grafana
262
262
  jsonData: json_data,
263
263
  secureJsonData: json_secure
264
264
  }
265
-
266
265
  payload.reject!{ |_k, v| v.nil? }
267
266
 
268
- if( @debug )
269
- logger.debug("Creating data source: #{name} (database: #{database})")
270
- logger.debug( payload.to_json )
271
- end
272
-
273
267
  endpoint = '/api/datasources'
274
268
  post(endpoint, payload.to_json)
275
269
  end
@@ -286,7 +280,9 @@ module Grafana
286
280
  #
287
281
  def delete_datasource( datasource_id )
288
282
 
289
- raise ArgumentError.new(format('wrong type. user \'datasource_id\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', datasource_id.class.to_s)) if( datasource_id.is_a?(String) && datasource_id.is_a?(Integer) )
283
+ if( datasource_id.is_a?(String) && datasource_id.is_a?(Integer) )
284
+ raise ArgumentError.new(format('wrong type. \'datasource_id\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', datasource_id.class.to_s))
285
+ end
290
286
  raise ArgumentError.new('missing \'datasource_id\'') if( datasource_id.size.zero? )
291
287
 
292
288
  if(datasource_id.is_a?(String))
@@ -0,0 +1,198 @@
1
+ module Grafana
2
+
3
+ # http://docs.grafana.org/http_api/folder/#folder-api
4
+ #
5
+ module Folder
6
+
7
+ # Get all folders
8
+ # GET /api/folders
9
+ # Returns all folders that the authenticated user has permission to view.
10
+ #
11
+ # @example
12
+ # folders
13
+ #
14
+ # @return [Hash]
15
+ #
16
+ def folders
17
+
18
+ v, mv = version.values
19
+ return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
20
+
21
+ endpoint = '/api/folders'
22
+ @logger.debug("Getting all folders (GET #{endpoint})") if @debug
23
+ get(endpoint)
24
+ end
25
+
26
+ # Get folder by uid
27
+ # GET /api/folders/:uid
28
+ #
29
+ # Will return the folder given the folder uid.
30
+ #
31
+ # Get folder by id
32
+ # GET /api/folders/:id
33
+ #
34
+ # Will return the folder identified by id.
35
+ def folder( folder_uid )
36
+
37
+ raise ArgumentError.new(format('wrong type. user \'folder_uid\' must be an String (for an Folder Uid) or an Integer (for an Folder Id), given \'%s\'', folder_uid.class.to_s)) \
38
+ if( folder_uid.is_a?(String) && folder_uid.is_a?(Integer) )
39
+ raise ArgumentError.new('missing \'folder_uid\'') if( folder_uid.size.zero? )
40
+
41
+ v, mv = version.values
42
+ return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
43
+
44
+ if(folder_uid.is_a?(Integer))
45
+
46
+ f = folders
47
+ f = JSON.parse(f) if(f.is_a?(String))
48
+
49
+ status = f.dig('status')
50
+ return f if( status != 200 )
51
+
52
+ f = f.dig('message').detect {|x| x['id'] == folder_uid }
53
+
54
+ return { 'status' => 404, 'message' => format( 'No Folder \'%s\' found', folder_uid) } if( folder_uid.nil? )
55
+
56
+ folder_uid = f.dig('uid') unless(f.nil?)
57
+
58
+ return { 'status' => 404, 'message' => format( 'No Folder \'%s\' found', folder_uid) } if( folder_uid.is_a?(Integer) )
59
+ end
60
+
61
+ return { 'status' => 404, 'message' => format( 'The uid can have a maximum length of 40 characters, but it is %s characters long', folder_uid.length) } \
62
+ if( folder_uid.is_a?(String) && folder_uid.length > 40 )
63
+ return { 'status' => 404, 'message' => format( 'No Folder \'%s\' found', folder_uid) } if( folder_uid.nil? )
64
+
65
+ endpoint = format( '/api/folders/%s', folder_uid )
66
+
67
+ @logger.debug("Getting folder by Id #{folder_uid} (GET #{endpoint})") if @debug
68
+ get(endpoint)
69
+ end
70
+
71
+ # Create folder
72
+ # POST /api/folders
73
+ #
74
+ # Creates a new folder.
75
+ # JSON Body schema:
76
+ #
77
+ # uid - Optional unique identifier.
78
+ # title - The title of the folder.
79
+ def create_folder( params )
80
+
81
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
82
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
83
+
84
+ v, mv = version.values
85
+ return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
86
+
87
+ title = validate( params, required: false, var: 'title', type: String )
88
+ uid = validate( params, required: true , var: 'uid' , type: String )
89
+
90
+ return { 'status' => 404, 'message' => format( 'The uid can have a maximum length of 40 characters. \'%s\' given', uid.length) } if( uid.length > 40 )
91
+
92
+ data = {
93
+ uid: uid,
94
+ title: title
95
+ }
96
+ data.reject!{ |_, y| y.nil? }
97
+
98
+ payload = data.deep_string_keys
99
+
100
+ endpoint = '/api/folders'
101
+
102
+ @logger.debug("create folder #{title} (GET #{endpoint})") if @debug
103
+ logger.debug(payload.to_json) if(@debug)
104
+
105
+ post( endpoint, payload.to_json )
106
+ end
107
+
108
+ # Update folder
109
+ # PUT /api/folders/:uid
110
+ #
111
+ # schould be fail, when the version are not incremented
112
+ # overwrite helps
113
+ #
114
+ # Updates an existing folder identified by uid.
115
+ # JSON Body schema:
116
+ #
117
+ # - uid - Provide another unique identifier than stored to change the unique identifier.
118
+ # - title - The title of the folder.
119
+ # - version - Provide the current version to be able to update the folder. Not needed if overwrite=true.
120
+ # - overwrite - Set to true if you want to overwrite existing folder with newer version.
121
+ def update_folder( params )
122
+
123
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
124
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
125
+
126
+ v, mv = version.values
127
+ return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
128
+
129
+ uid = validate( params, required: true , var: 'uid' , type: String )
130
+ title = validate( params, required: true , var: 'title' , type: String )
131
+ new_uid = validate( params, required: false, var: 'new_uid' , type: String )
132
+ version = validate( params, required: false, var: 'version' , type: Integer )
133
+ overwrite = validate( params, required: false, var: 'overwrite', type: Boolean ) || false
134
+
135
+ existing_folder = folder( uid )
136
+ return { 'status' => 404, 'message' => format( 'No Folder \'%s\' found', uid) } if( existing_folder.dig('status') != 200 )
137
+
138
+ unless( new_uid.nil? )
139
+ existing_folder = folder( new_uid )
140
+ return { 'status' => 404, 'message' => format( 'Folder \'%s\' found', uid) } if( existing_folder.dig('status') == 200 )
141
+ end
142
+
143
+ payload = {
144
+ title: title,
145
+ uid: new_uid,
146
+ version: version,
147
+ overwrite: overwrite
148
+ }
149
+ payload.reject!{ |_, y| y.nil? }
150
+
151
+ @logger.debug("Updating folder with Uid #{uid}") if @debug
152
+
153
+ endpoint = format( '/api/folders/%s', uid )
154
+
155
+ put( endpoint, payload.to_json )
156
+ end
157
+
158
+
159
+ # Delete folder
160
+ # DELETE /api/folders/:uid
161
+ #
162
+ # Deletes an existing folder identified by uid together with all dashboards stored in the folder, if any.
163
+ # This operation cannot be reverted.
164
+ def delete_folder( folder_uid )
165
+
166
+ raise ArgumentError.new(format('wrong type. user \'folder_uid\' must be an String (for an Folder Uid) or an Integer (for an Folder Id), given \'%s\'', folder_uid.class.to_s)) \
167
+ if( folder_uid.is_a?(String) && folder_uid.is_a?(Integer) )
168
+ raise ArgumentError.new('missing \'folder_uid\'') if( folder_uid.size.zero? )
169
+
170
+ v, mv = version.values
171
+ return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
172
+
173
+ if(folder_uid.is_a?(Integer))
174
+
175
+ fldrs = folders
176
+
177
+ fldrs = JSON.parse(fldrs) if(fldrs.is_a?(String))
178
+ status = fldrs.dig('status')
179
+
180
+ return fldrs if( status != 200 )
181
+
182
+ fldrs.dig('message').each do |d|
183
+ folder_uid = d.dig('uid').to_s
184
+ end
185
+ end
186
+
187
+ return { 'status' => 404, 'message' => format( 'No User \'%s\' found', folder_uid) } if( folder_uid.nil? )
188
+
189
+ endpoint = format( '/api/folders/%s', folder_uid )
190
+
191
+ @logger.debug("deleting folder by uid #{folder_uid} (GET #{endpoint})") if @debug
192
+ delete(endpoint)
193
+ end
194
+
195
+
196
+ end
197
+ end
198
+