grafana 0.8.2 → 0.8.5

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.
@@ -107,7 +107,6 @@ module Grafana
107
107
  raise ArgumentError.new(format('wrong type. \'open_timeout\' must be an Integer, given \'%s\'', @open_timeout.class.to_s)) unless( @open_timeout.is_a?(Integer) )
108
108
 
109
109
  protocoll = ssl == true ? 'https' : 'http'
110
- raise ArgumentError.new(format('wrong \'protocoll\'. only \'http\' or \'https\' allowed, given \'%s\'', protocoll)) if( %w[http https].include?(protocoll.downcase) == false )
111
110
 
112
111
  @url = format( '%s://%s:%d%s', protocoll, host, port, url_path )
113
112
  end
@@ -7,14 +7,17 @@ module Grafana
7
7
 
8
8
 
9
9
  # Get dashboard
10
- # GET /api/dashboards/db/:slug
10
+ #
11
+ # @example
12
+ # dashboard('dashboard for many foo')
13
+ #
14
+ # @return [String]
15
+ #
11
16
  def dashboard( name )
12
17
 
13
18
  raise ArgumentError.new(format('wrong type. \'name\' must be an String, given \'%s\'', name.class.to_s)) unless( name.is_a?(String) )
14
19
  raise ArgumentError.new('missing name') if( name.size.zero? )
15
20
 
16
- # raise ArgumentError.new('name must be an String') unless( name.is_a?(String) )
17
-
18
21
  endpoint = format( '/api/dashboards/db/%s', slug(name) )
19
22
 
20
23
  @logger.debug( "Attempting to get dashboard (GET /api/dashboards/db/#{name})" ) if @debug
@@ -23,38 +26,70 @@ module Grafana
23
26
  end
24
27
 
25
28
  # Create / Update dashboard
29
+ #
30
+ # @param [Hash] params
31
+ # @option params [Hash] dashboard
32
+ # @option params [Boolean] overwrite (true)
33
+ #
34
+ # @example
35
+ # params = {
36
+ # dashboard: {
37
+ # id: null,
38
+ # title: 'Production Overview',
39
+ # tags: [ 'templated' ],
40
+ # timezone": 'browser',
41
+ # rows: [
42
+ # {
43
+ # }
44
+ # ],
45
+ # 'schemaVersion': 6,
46
+ # 'version': 0
47
+ # },
48
+ # overwrite: false
49
+ # }
50
+ # create_dashboard( params )
51
+ #
52
+ # @return [Hash]
53
+ #
26
54
  # POST /api/dashboards/db
27
55
  def create_dashboard( params )
28
56
 
29
- raise ArgumentError.new(format('wrong type. params must be an Hash, given %s', params.class.to_s ) ) unless( params.is_a?(Hash) )
57
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
58
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
59
+
60
+ dashboard = validate( params, required: true, var: 'dashboard', type: Hash )
61
+ overwrite = validate( params, required: false, var: 'overwrite', type: Boolean ) || true
30
62
 
31
- title = params.dig(:title)
32
- dashboard = params.dig(:dashboard)
63
+ dashboard = regenerate_template_ids( dashboard )
33
64
 
34
- # raise ArgumentError.new('missing title') if( title.nil? )
35
- raise ArgumentError.new('missing dashboard') if( dashboard.nil? )
36
- raise ArgumentError.new(format('wrong type. dashboard must be an Hash, given %s', dashboard.class.to_s ) ) unless( dashboard.is_a?(Hash) )
65
+ db = JSON.parse( dashboard ) if( dashboard.is_a?(String) )
66
+ title = db.dig('dashboard','title')
37
67
 
38
68
  endpoint = '/api/dashboards/db'
39
- # title = slug(title)
40
69
 
41
- # dashboard = JSON.parse( dashboard ) if( dashboard.is_a?(String) )
42
- dashboard = regenerate_template_ids( dashboard )
43
-
44
- if( title.nil? )
45
- db = JSON.parse( dashboard ) if( dashboard.is_a?(String) )
46
- title = db.dig('dashboard','title')
47
- end
70
+ payload = {
71
+ dashboard: db.dig('dashboard'),
72
+ overwrite: overwrite
73
+ }
74
+ payload.reject!{ |_k, v| v.nil? }
48
75
 
49
76
  @logger.debug("Creating dashboard: #{title} (POST /api/dashboards/db)") if @debug
50
77
 
51
- post( endpoint, dashboard )
78
+ post( endpoint, payload.to_json )
52
79
  end
53
80
 
54
81
  # Delete dashboard
55
- # DELETE /api/dashboards/db/:slug
82
+ #
83
+ # @example
84
+ # delete_dashboard('dashboard for many foo')
85
+ #
86
+ # @return [Hash]
87
+ #
56
88
  def delete_dashboard( name )
57
89
 
90
+ raise ArgumentError.new(format('wrong type. \'name\' must be an String, given \'%s\'', name.class.to_s)) unless( name.is_a?(String) )
91
+ raise ArgumentError.new('missing name') if( name.size.zero? )
92
+
58
93
  endpoint = format( '/api/dashboards/db/%s', slug(name) )
59
94
 
60
95
  @logger.debug("Deleting dashboard #{slug(name)} (DELETE #{endpoint})") if @debug
@@ -63,7 +98,12 @@ module Grafana
63
98
  end
64
99
 
65
100
  # Gets the home dashboard
66
- # GET /api/dashboards/home
101
+ #
102
+ # @example
103
+ # home_dashboard
104
+ #
105
+ # @return [Hash]
106
+ #
67
107
  def home_dashboard
68
108
 
69
109
  endpoint = '/api/dashboards/home'
@@ -74,7 +114,12 @@ module Grafana
74
114
  end
75
115
 
76
116
  # Tags for Dashboard
77
- # GET /api/dashboards/tags
117
+ #
118
+ # @example
119
+ # dashboard_tags
120
+ #
121
+ # @return [Hash]
122
+ #
78
123
  def dashboard_tags
79
124
 
80
125
  endpoint = '/api/dashboards/tags'
@@ -85,29 +130,30 @@ module Grafana
85
130
  end
86
131
 
87
132
  # Search Dashboards
88
- # GET /api/search/
89
133
  #
90
- # searchDashboards( { :tags => host } )
91
- # searchDashboards( { :tags => [ host, 'tag1' ] } )
92
- # searchDashboards( { :tags => [ 'tag2' ] } )
93
- # searchDashboards( { :query => title } )
94
- # searchDashboards( { :starred => true } )
95
- def search_dashboards( params = {} )
134
+ # @example
135
+ # searchDashboards( tags: host )
136
+ # searchDashboards( tags: [ host, 'tag1' ] )
137
+ # searchDashboards( tags: [ 'tag2' ] )
138
+ # searchDashboards( query: title )
139
+ # searchDashboards( starred: true )
140
+ #
141
+ # @return [Hash]
142
+ #
143
+ def search_dashboards( params )
96
144
 
97
145
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
98
146
 
99
- query = params.dig(:query)
100
- starred = params.dig(:starred)
101
- tags = params.dig(:tags)
102
- api = []
147
+ query = validate( params, required: false, var: 'query', type: String )
148
+ starred = validate( params, required: false, var: 'starred', type: Boolean )
149
+ tags = validate( params, required: false, var: 'tags' )
103
150
 
151
+ api = []
104
152
  api << format( 'query=%s', CGI.escape( query ) ) unless query.nil?
105
153
  api << format( 'starred=%s', starred ? 'true' : 'false' ) unless( starred.nil? )
106
154
 
107
155
  unless( tags.nil? )
108
-
109
156
  tags = tags.join( '&tag=' ) if( tags.is_a?( Array ) )
110
-
111
157
  api << format( 'tag=%s', tags )
112
158
  end
113
159
 
@@ -120,7 +166,13 @@ module Grafana
120
166
  get( endpoint )
121
167
  end
122
168
 
123
-
169
+ # import Dashboards from directory
170
+ #
171
+ # @example
172
+ # import_dashboards_from_directory( '/tmp/dashboards' )
173
+ #
174
+ # @return [Hash]
175
+ #
124
176
  def import_dashboards_from_directory( directory )
125
177
 
126
178
  raise ArgumentError.new('directory must be an String') unless( directory.is_a?(String) )
@@ -135,10 +187,9 @@ module Grafana
135
187
 
136
188
  dashboard = File.read( f )
137
189
  dashboard = JSON.parse( dashboard )
138
- title = dashboard.dig('dashboard','title') || f
139
190
 
140
191
  result[f.to_s] ||= {}
141
- result[f.to_s] = create_dashboard( title: title, dashboard: dashboard )
192
+ result[f.to_s] = create_dashboard( dashboard: dashboard )
142
193
  end
143
194
 
144
195
  result
@@ -20,12 +20,7 @@ module Grafana
20
20
 
21
21
  datasources = get( endpoint )
22
22
 
23
- if datasources.nil? || datasources.dig('status').to_i != 200
24
- return {
25
- 'status' => 404,
26
- 'message' => 'No Datasources found'
27
- }
28
- end
23
+ return { 'status' => 404, 'message' => 'No Datasources found' } if( datasources.nil? || datasources == false || datasources.dig('status').to_i != 200 )
29
24
 
30
25
  datasources = datasources.dig('message')
31
26
 
@@ -39,6 +34,8 @@ module Grafana
39
34
 
40
35
  # Get a single datasources by Id or Name
41
36
  #
37
+ # @param [Mixed] datasource_id Datasource Name (String) or Datasource Id (Integer)
38
+ #
42
39
  # @example
43
40
  # datasource( 1 )
44
41
  # datasource( 'foo' )
@@ -55,12 +52,7 @@ module Grafana
55
52
  datasource_id = data.keys.first if( data )
56
53
  end
57
54
 
58
- if( datasource_id.nil? )
59
- return {
60
- 'status' => 404,
61
- 'message' => format( 'No Datasource \'%s\' found', datasource_id)
62
- }
63
- end
55
+ return { 'status' => 404, 'message' => format( 'No Datasource \'%s\' found', datasource_id) } if( datasource_id.nil? )
64
56
 
65
57
  raise format('DataSource Id can not be 0') if( datasource_id.zero? )
66
58
 
@@ -82,14 +74,29 @@ module Grafana
82
74
  # merge an current existing datasource configuration with the new values
83
75
  #
84
76
  # @param [Hash] params
85
- # @option params [Hash] data
86
- # @option params [Mixed] datasource Datasource Name (String) or Datasource Id (Integer)
77
+ # @option params [Mixed] name Name or Id of the current existing Datasource (required)
78
+ # @option params [Mixed] organisation Name or Id of an existing Organisation
79
+ # @option params [String] type Datasource Type - (required) (grafana graphite cloudwatch elasticsearch prometheus influxdb mysql opentsdb postgres)
80
+ # @option params [String] new_name New Datasource Name
81
+ # @option params [String] database Datasource Database
82
+ # @option params [String] access (proxy) Acess Type
83
+ # @option params [Boolean] default (false)
84
+ # @option params [String] user
85
+ # @option params [String] password
86
+ # @option params [String] url Datasource URL
87
+ # @option params [Hash] json_data
88
+ # @option params [String] basic_user
89
+ # @option params [String] basic_password
87
90
  #
88
91
  # @example
89
- # update_datasource(
90
- # datasource: 'graphite',
91
- # data: { url: 'http://localhost:2003' }
92
- # )
92
+ # params = {
93
+ # name: 'graphite',
94
+ # new_name: 'influx',
95
+ # organisation: 'Main Org.',
96
+ # type: 'influxdb',
97
+ # url: 'http://localhost:8090'
98
+ # }
99
+ # update_datasource( params )
93
100
  #
94
101
  # @return [Hash]
95
102
  #
@@ -98,22 +105,70 @@ module Grafana
98
105
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
99
106
  raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
100
107
 
101
- data = validate( params, required: true, var: 'data', type: Hash )
102
- datasource = validate( params, required: true, var: 'datasource' )
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) )
103
126
 
104
- raise ArgumentError.new(format('wrong type. user \'datasource\' must be an String (for an Datasource name) or an Integer (for an Datasource Id), given \'%s\'', datasource.class.to_s)) if( datasource.is_a?(String) && datasource.is_a?(Integer) )
127
+ 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) )
129
+ org = organization( organisation )
130
+ org_id = org.dig('id')
105
131
 
106
- existing_ds = datasource(datasource)
132
+ return { 'status' => 404, 'message' => format('Organization \'%s\' not found', organization) } if( org.nil? || org.dig('status').to_i != 200 )
133
+ end
107
134
 
135
+ existing_ds = datasource(name)
108
136
  existing_ds.reject! { |x| x == 'status' }
109
137
  existing_ds = existing_ds.deep_string_keys
110
-
111
138
  datasource_id = existing_ds.dig('id')
112
139
 
140
+ return { 'status' => 404, 'message' => format('No Datasource \'%s\' found', name) } if( datasource_id.nil? )
141
+
142
+ raise format('Data Source Id can not be 0') if( datasource_id.zero? )
143
+
144
+ unless( type.nil? )
145
+ valid_types = %w[grafana graphite cloudwatch elasticsearch prometheus influxdb mysql opentsdb postgres]
146
+ raise ArgumentError.new(format('wrong datasource type. only %s allowed, given \%s\'', valid_types.join(', '), type)) if( valid_types.include?(type.downcase) == false )
147
+ end
148
+
149
+ data = {
150
+ id: datasource_id,
151
+ orgId: org_id,
152
+ name: new_name,
153
+ type: type,
154
+ access: access,
155
+ url: url,
156
+ password: password,
157
+ user: user,
158
+ database: database,
159
+ basicAuth: basic_auth,
160
+ basicAuthUser: ba_user,
161
+ basicAuthPassword: ba_user,
162
+ isDefault: default,
163
+ jsonData: json_data
164
+ }
165
+ data.reject!{ |_k, v| v.nil? }
166
+
113
167
  payload = data.deep_string_keys
114
168
  payload = existing_ds.merge(payload).deep_symbolize_keys
115
169
 
116
170
  endpoint = format('/api/datasources/%d', datasource_id )
171
+
117
172
  @logger.debug("Updating data source Id #{datasource_id} (GET #{endpoint})") if @debug
118
173
  logger.debug(payload.to_json) if(@debug)
119
174
 
@@ -128,7 +183,6 @@ module Grafana
128
183
  # @option params [String] database Datasource Database - (required)
129
184
  # @option params [String] access (proxy) Acess Type - (required) (proxy or direct)
130
185
  # @option params [Boolean] default (false)
131
- # @option params [String] user
132
186
  # @option params [String] password
133
187
  # @option params [String] url Datasource URL - (required)
134
188
  # @option params [Hash] json_data
@@ -182,7 +236,6 @@ module Grafana
182
236
  database = validate( params, required: true, var: 'database', type: String )
183
237
  access = validate( params, required: false, var: 'access', type: String ) || 'proxy'
184
238
  default = validate( params, required: false, var: 'default', type: Boolean ) || false
185
- user = validate( params, required: false, var: 'user', type: String )
186
239
  password = validate( params, required: false, var: 'password', type: String )
187
240
  url = validate( params, required: true, var: 'url', type: String )
188
241
  json_data = validate( params, required: false, var: 'json_data', type: Hash )
@@ -241,12 +294,7 @@ module Grafana
241
294
  datasource_id = data.keys.first if( data )
242
295
  end
243
296
 
244
- if( datasource_id.nil? )
245
- return {
246
- 'status' => 404,
247
- 'message' => format( 'No Datasource \'%s\' found', datasource_id)
248
- }
249
- end
297
+ return { 'status' => 404, 'message' => format( 'No Datasource \'%s\' found', datasource_id) } if( datasource_id.nil? )
250
298
 
251
299
  raise format('Data Source Id can not be 0') if( datasource_id.zero? )
252
300
 
@@ -64,9 +64,15 @@ module Grafana
64
64
  response_code = response.code.to_i
65
65
  raise RestClient::BadRequest
66
66
  else
67
- logger.error( response.code )
68
- logger.error( response.body )
69
- response.return! # (request, result)
67
+ # logger.error( response.code )
68
+ # logger.error( response.body )
69
+
70
+ body = JSON.parse(response.body) if(response_body.is_a?(String))
71
+ return {
72
+ 'status' => response_code,
73
+ 'message' => body.dig('message')
74
+ }
75
+ # response.return! # (request, result)
70
76
  end
71
77
  end
72
78
 
@@ -129,6 +135,12 @@ module Grafana
129
135
  'status' => 401,
130
136
  'message' => format('Not authorized to connect \'%s/%s\' - wrong username or password?', @url, endpoint)
131
137
  }
138
+ rescue RestClient::Forbidden
139
+
140
+ return {
141
+ 'status' => 403,
142
+ 'message' => format('The operation is forbidden \'%s/%s\'', @url, endpoint)
143
+ }
132
144
 
133
145
  rescue RestClient::NotFound
134
146
 
@@ -6,9 +6,11 @@ module Grafana
6
6
  module Organization
7
7
 
8
8
  # Get current Organisation
9
- # GET /api/org
10
9
  #
11
- # -> {"id"=>1, "name"=>"Docker", "address"=>{"address1"=>"", "address2"=>"", "city"=>"", "zipCode"=>"", "state"=>"", "country"=>""}, "status"=>200}
10
+ # @example
11
+ # current_organization
12
+ #
13
+ # @return [Hash]
12
14
  #
13
15
  def current_organization
14
16
  endpoint = '/api/org'
@@ -17,25 +19,40 @@ module Grafana
17
19
  end
18
20
 
19
21
  # Update current Organisation
20
- # PUT /api/org
21
22
  #
23
+ # @param [Hash] params
24
+ # @option params [String] name new Organisation Name
25
+ #
26
+ # @example
27
+ # params = {
28
+ # name: 'foo'
29
+ # }
30
+ # update_current_organization( params )
22
31
  #
32
+ # @return [Hash]
23
33
  #
24
- def update_current_organization( params = {} )
34
+ def update_current_organization( params )
25
35
 
26
36
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
27
- name = params.dig(:name)
28
- raise ArgumentError.new('missing name') if( name.nil? )
37
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
38
+
39
+ name = validate( params, required: true, var: 'name', type: String )
29
40
 
30
41
  endpoint = '/api/org'
42
+ payload = {
43
+ name: name
44
+ }
45
+
31
46
  @logger.debug("Updating current organization (PUT #{endpoint})") if @debug
32
- put(endpoint, params.to_json)
47
+ put(endpoint, payload.to_json)
33
48
  end
34
49
 
35
50
  # Get all users within the actual organisation
36
- # GET /api/org/users
37
51
  #
52
+ # @example
53
+ # current_organization_users
38
54
  #
55
+ # @return [Hash]
39
56
  #
40
57
  def current_organization_users
41
58
  endpoint = '/api/org/users'
@@ -44,46 +61,59 @@ module Grafana
44
61
  end
45
62
 
46
63
  # Add a new user to the actual organisation
47
- # POST /api/org/users
48
64
  #
65
+ # @param [Hash] params
66
+ # @option params [String] login_or_email Login or email
67
+ # @option params [String] role Name of the Role - only 'Viewer', 'Editor', 'Read Only Editor' or 'Admin' allowed
68
+ #
69
+ # @example
70
+ # params = {
71
+ # login_or_email: 'foo',
72
+ # role: 'Editor'
73
+ # }
74
+ # add_user_to_current_organization( params )
49
75
  #
76
+ # @return [Hash]
50
77
  #
51
- def add_user_to_current_organization( params = {} )
78
+ def add_user_to_current_organization( params )
52
79
 
53
80
  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
54
- login_or_email = params.dig(:loginOrEmail)
55
- role = params.dig(:role)
56
- raise ArgumentError.new('missing loginOrEmail') if( login_or_email.nil? )
57
- raise ArgumentError.new('missing role') if( role.nil? )
58
- # Defaults to Viewer, other valid options are Admin and Editor and Read Only Editor
59
- # valid_perms = ['Viewer','Editor','Read Only Editor','Admin']
60
- raise ArgumentError.new( format( 'wrong role. only \'Admin\', \'Viewer\' or \'Editor\' allowed (\'%s\' giving)',role)) if( %w[Admin Viewer Editor].include?(role) == false )
61
-
62
- org = current_organization_users
63
- usr = user_by_name( login_or_email )
64
-
65
- if( org )
66
-
67
- org = org.dig('message')
81
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
68
82
 
69
- if( org.select { |x| x.dig('email') == login_or_email }.count >= 1 )
70
- return {
71
- 'status' => 404,
72
- 'message' => format('User \'%s\' are already in the organisation', login_or_email)
73
- }
74
- end
75
- end
83
+ login_or_email = validate( params, required: true, var: 'login_or_email', type: String )
84
+ role = validate( params, required: true, var: 'role', type: String )
85
+ valid_roles = ['Viewer', 'Editor', 'Read Only Editor', 'Admin']
76
86
 
77
- if( usr.nil? || usr.dig('status').to_i != 200 )
87
+ # https://stackoverflow.com/questions/9333952/case-insensitive-arrayinclude?answertab=votes#tab-top
88
+ # Do this once, or each time the array changes
89
+ downcased = Set.new valid_roles.map(&:downcase)
90
+ unless( downcased.include?( role.downcase ) )
78
91
  return {
79
92
  'status' => 404,
80
- 'message' => format('User \'%s\' not found', login_or_email)
93
+ 'login_or_email' => login_or_email,
94
+ 'role' => role,
95
+ 'message' => format( 'wrong role. Role must be one of %s, given \'%s\'', valid_roles.join(', '), role )
81
96
  }
82
97
  end
83
98
 
99
+ org = current_organization_users
100
+ usr = user( login_or_email )
101
+
102
+ return { 'status' => 404, 'message' => format('User \'%s\' not found', login_or_email) } if( usr.nil? || usr.dig('status').to_i != 200 )
103
+
104
+ if( org.is_a?(Hash) && org.dig('status').to_i == 200 )
105
+ org = org.dig('message')
106
+ return { 'status' => 404, 'message' => format('User \'%s\' are already in the organisation', login_or_email) } if( org.select { |x| x.dig('email') == login_or_email || x.dig('login') == login_or_email }.count >= 1 )
107
+ end
108
+
84
109
  endpoint = '/api/org/users'
110
+ payload = {
111
+ loginOrEmail: login_or_email,
112
+ role: role
113
+ }
114
+
85
115
  @logger.debug("Adding user to current organization (POST #{endpoint})") if @debug
86
- post(endpoint, params.to_json)
116
+ post(endpoint, payload.to_json)
87
117
  end
88
118
 
89
119
  # Updates the given user