morpheus-cli 3.1.2.1 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/morpheus/api/api_client.rb +6 -2
  3. data/lib/morpheus/api/license_interface.rb +7 -0
  4. data/lib/morpheus/api/monitoring_apps_interface.rb +15 -2
  5. data/lib/morpheus/api/{checks_interface.rb → monitoring_checks_interface.rb} +8 -21
  6. data/lib/morpheus/api/monitoring_groups_interface.rb +23 -2
  7. data/lib/morpheus/api/{incidents_interface.rb → monitoring_incidents_interface.rb} +5 -5
  8. data/lib/morpheus/api/monitoring_interface.rb +4 -4
  9. data/lib/morpheus/api/user_groups_interface.rb +65 -0
  10. data/lib/morpheus/cli.rb +1 -0
  11. data/lib/morpheus/cli/curl_command.rb +9 -7
  12. data/lib/morpheus/cli/dot_file.rb +11 -5
  13. data/lib/morpheus/cli/echo_command.rb +27 -3
  14. data/lib/morpheus/cli/license.rb +109 -20
  15. data/lib/morpheus/cli/login.rb +2 -0
  16. data/lib/morpheus/cli/logout.rb +2 -0
  17. data/lib/morpheus/cli/mixins/monitoring_helper.rb +97 -37
  18. data/lib/morpheus/cli/mixins/print_helper.rb +5 -2
  19. data/lib/morpheus/cli/monitoring_apps_command.rb +564 -9
  20. data/lib/morpheus/cli/monitoring_checks_command.rb +326 -93
  21. data/lib/morpheus/cli/monitoring_contacts_command.rb +2 -2
  22. data/lib/morpheus/cli/monitoring_groups_command.rb +540 -10
  23. data/lib/morpheus/cli/monitoring_incidents_command.rb +88 -56
  24. data/lib/morpheus/cli/remote.rb +6 -0
  25. data/lib/morpheus/cli/roles.rb +1 -1
  26. data/lib/morpheus/cli/set_prompt_command.rb +1 -0
  27. data/lib/morpheus/cli/shell.rb +17 -8
  28. data/lib/morpheus/cli/user_groups_command.rb +574 -0
  29. data/lib/morpheus/cli/users.rb +221 -115
  30. data/lib/morpheus/cli/version.rb +1 -1
  31. data/morpheus-cli.gemspec +1 -2
  32. metadata +11 -8
@@ -11,6 +11,7 @@ class Morpheus::Cli::Users
11
11
  include Morpheus::Cli::CliCommand
12
12
  include Morpheus::Cli::AccountsHelper
13
13
  register_subcommands :list, :get, :add, :update, :remove
14
+ register_subcommands :'passwd' => :change_password
14
15
  alias_subcommand :details, :get
15
16
  set_default_subcommand :list
16
17
 
@@ -32,9 +33,10 @@ class Morpheus::Cli::Users
32
33
 
33
34
  def list(args)
34
35
  options = {}
35
- optparse = OptionParser.new do|opts|
36
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
36
37
  opts.banner = subcommand_usage()
37
- build_common_options(opts, options, [:account, :list, :json, :dry_run])
38
+ build_common_options(opts, options, [:account, :list, :json, :yaml, :csv, :fields, :json, :dry_run, :remote])
39
+ opts.footer = "List users."
38
40
  end
39
41
  optparse.parse!(args)
40
42
  connect(options)
@@ -53,10 +55,18 @@ class Morpheus::Cli::Users
53
55
  end
54
56
  json_response = @users_interface.list(account_id, params)
55
57
  users = json_response['users']
56
-
58
+ if options[:include_fields]
59
+ json_response = {"users" => filter_data(users, options[:include_fields]) }
60
+ end
57
61
  if options[:json]
58
- print JSON.pretty_generate(json_response)
59
- print "\n"
62
+ puts as_json(json_response, options)
63
+ return 0
64
+ elsif options[:yaml]
65
+ puts as_yaml(json_response, options)
66
+ return 0
67
+ elsif options[:csv]
68
+ puts records_as_csv(users, options)
69
+ return 0
60
70
  else
61
71
  title = "Morpheus Users"
62
72
  subtitles = []
@@ -77,15 +87,15 @@ class Morpheus::Cli::Users
77
87
  end
78
88
  rescue RestClient::Exception => e
79
89
  print_rest_exception(e, options)
80
- exit 1
90
+ return 1
81
91
  end
82
92
  end
83
93
 
84
94
  def get(args)
85
95
  options = {}
86
- optparse = OptionParser.new do|opts|
96
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
87
97
  opts.banner = subcommand_usage("[username]")
88
- opts.on(nil,'--feature-access', "Display Feature Access") do |val|
98
+ opts.on('-f','--feature-access', "Display Feature Access") do |val|
89
99
  options[:include_feature_access] = true
90
100
  end
91
101
  # opts.on(nil,'--group-access', "Display Group Access") do
@@ -103,13 +113,15 @@ class Morpheus::Cli::Users
103
113
  options[:include_cloud_access] = true
104
114
  options[:include_instance_type_access] = true
105
115
  end
106
- build_common_options(opts, options, [:account, :json, :dry_run])
116
+ build_common_options(opts, options, [:account, :json, :yaml, :csv, :fields, :dry_run, :remote])
117
+ opts.footer = "Get details about a user." + "\n" +
118
+ "[username] is required. This is the username or id of a user."
107
119
  end
108
120
  optparse.parse!(args)
109
121
 
110
122
  if args.count < 1
111
123
  puts optparse
112
- exit 1
124
+ return 1
113
125
  end
114
126
 
115
127
  connect(options)
@@ -130,24 +142,32 @@ class Morpheus::Cli::Users
130
142
  # todo: users_response = @users_interface.list(account_id, {name: name})
131
143
  # there may be response data outside of user that needs to be displayed
132
144
  user = find_user_by_username_or_id(account_id, args[0])
133
- exit 1 if user.nil?
134
-
135
- # meh, this should just always be returned with GET /api/users/:id
136
- user_feature_permissions_json = nil
137
- user_feature_permissions = nil
138
- if options[:include_feature_access]
139
- user_feature_permissions_json = @users_interface.feature_permissions(account_id, user['id'])
140
- user_feature_permissions = user_feature_permissions_json['featurePermissions']
141
- end
145
+ return 1 if user.nil?
146
+
147
+ json_response = {'user' => user}
148
+ # json_response['user']['featurePermissions'] = user_feature_permissions if options[:include_feature_access]
142
149
 
150
+ if options[:include_fields]
151
+ json_response = {'user' => filter_data(user, options[:include_fields]) }
152
+ end
143
153
  if options[:json]
144
- print JSON.pretty_generate({user:user})
145
- print "\n"
146
- if (user_feature_permissions_json)
147
- print JSON.pretty_generate(user_feature_permissions_json)
148
- print "\n"
149
- end
154
+ puts as_json(json_response, options)
155
+ puts as_json(@users_interface.feature_permissions(account_id, user['id']), options) if options[:include_feature_access]
156
+ return 0
157
+ elsif options[:yaml]
158
+ puts as_yaml(json_response, options)
159
+ puts as_yaml(@users_interface.feature_permissions(account_id, user['id']), options) if options[:include_feature_access]
160
+ return 0
161
+ elsif options[:csv]
162
+ puts records_as_csv([user], options)
163
+ return 0
150
164
  else
165
+ user_feature_permissions_json = nil
166
+ user_feature_permissions = nil
167
+ if options[:include_feature_access]
168
+ user_feature_permissions_json = @users_interface.feature_permissions(account_id, user['id'])
169
+ user_feature_permissions = user_feature_permissions_json['featurePermissions']
170
+ end
151
171
  print_h1 "User Details"
152
172
  print cyan
153
173
  description_cols = {
@@ -191,16 +211,17 @@ class Morpheus::Cli::Users
191
211
  end
192
212
  rescue RestClient::Exception => e
193
213
  print_rest_exception(e, options)
194
- exit 1
214
+ return 1
195
215
  end
196
216
  end
197
217
 
198
218
  def add(args)
199
219
  options = {}
200
- optparse = OptionParser.new do|opts|
220
+ params = {}
221
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
201
222
  opts.banner = subcommand_usage("[options]")
202
223
  build_option_type_options(opts, options, add_user_option_types)
203
- build_common_options(opts, options, [:account, :options, :json, :dry_run])
224
+ build_common_options(opts, options, [:account, :options, :payload, :json, :dry_run])
204
225
  end
205
226
  optparse.parse!(args)
206
227
 
@@ -210,27 +231,32 @@ class Morpheus::Cli::Users
210
231
  account = find_account_from_options(options)
211
232
  account_id = account ? account['id'] : nil
212
233
 
213
- # remove role option_type, it is just for help display, the role prompt is separate down below
214
- prompt_option_types = add_user_option_types().reject {|it| ['role'].include?(it['fieldName']) }
215
- params = Morpheus::Cli::OptionTypes.prompt(prompt_option_types, options[:options], @api_client, options[:params])
216
-
217
- #puts "parsed params is : #{params.inspect}"
218
- user_keys = ['username', 'firstName', 'lastName', 'email', 'password', 'passwordConfirmation', 'instanceLimits']
219
- user_payload = params.select {|k,v| user_keys.include?(k) }
220
- if !user_payload['instanceLimits']
221
- user_payload['instanceLimits'] = {}
222
- user_payload['instanceLimits']['maxStorage'] = params['instanceLimits.maxStorage'].to_i if params['instanceLimits.maxStorage'].to_s.strip != ''
223
- user_payload['instanceLimits']['maxMemory'] = params['instanceLimits.maxMemory'].to_i if params['instanceLimits.maxMemory'].to_s.strip != ''
224
- user_payload['instanceLimits']['maxCpu'] = params['instanceLimits.maxCpu'].to_i if params['instanceLimits.maxCpu'].to_s.strip != ''
225
- end
226
-
227
- roles = prompt_user_roles(account_id, nil, options)
228
- if !roles.empty?
229
- user_payload['roles'] = roles.collect {|r| {id: r['id']} }
234
+ payload = nil
235
+ if options[:payload]
236
+ payload = options[:payload]
237
+ else
238
+ # merge -O options into normally parsed options
239
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
240
+ # remove role option_type, it is just for help display, the role prompt is separate down below
241
+ prompt_option_types = add_user_option_types().reject {|it| 'role' == it['fieldName'] }
242
+ v_prompt = Morpheus::Cli::OptionTypes.prompt(prompt_option_types, options[:options], @api_client, options[:params])
243
+ params.deep_merge!(v_prompt)
244
+ if params['instanceLimits']
245
+ params['instanceLimits']['maxStorage'] = params['instanceLimits']['maxStorage'].to_i if params['instanceLimits']['maxStorage'].to_s.strip != ''
246
+ params['instanceLimits']['maxMemory'] = params['instanceLimits']['maxMemory'].to_i if params['instanceLimits']['maxMemory'].to_s.strip != ''
247
+ params['instanceLimits']['maxCpu'] = params['instanceLimits']['maxCpu'].to_i if params['instanceLimits']['maxCpu'].to_s.strip != ''
248
+ end
249
+ # prompt for roles
250
+ selected_roles = []
251
+ selected_roles += params.delete('role').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if params['role']
252
+ selected_roles += params.delete('roles').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if params['roles']
253
+ roles = prompt_user_roles(account_id, nil, selected_roles, options)
254
+ if !roles.empty?
255
+ params['roles'] = roles.collect {|r| {id: r['id']} }
256
+ end
257
+ payload = {'user' => params}
230
258
  end
231
259
 
232
- payload = {user: user_payload}
233
-
234
260
  if options[:dry_run]
235
261
  print_dry_run @users_interface.dry.create(account_id, payload)
236
262
  return
@@ -240,38 +266,40 @@ class Morpheus::Cli::Users
240
266
  print JSON.pretty_generate(json_response)
241
267
  print "\n"
242
268
  else
243
- if account
244
- print_green_success "Added user #{user_payload['username']} to account #{account['name']}"
245
- else
246
- print_green_success "Added user #{user_payload['username']}"
247
- end
248
-
249
- details_options = [user_payload["username"]]
250
- if account
251
- details_options.push "--account-id", account['id'].to_s
252
- end
253
- get(details_options)
269
+ username = "" # json_response['user']['username']
270
+ username = payload['user']['username'] if payload['user'] && payload['user']['username']
271
+ if account
272
+ print_green_success "Added user #{username} to account #{account['name']}"
273
+ else
274
+ print_green_success "Added user #{username}"
275
+ end
276
+ details_options = [username]
277
+ if account
278
+ details_options.push "--account-id", account['id'].to_s
254
279
  end
280
+ get(details_options)
281
+ end
282
+
255
283
 
256
284
  rescue RestClient::Exception => e
257
285
  print_rest_exception(e, options)
258
- exit 1
286
+ return 1
259
287
  end
260
288
  end
261
289
 
262
290
  def update(args)
263
291
  options = {}
264
- optparse = OptionParser.new do|opts|
292
+ params = {}
293
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
265
294
  opts.banner = subcommand_usage("[username] [options]")
266
295
  build_option_type_options(opts, options, update_user_option_types)
267
- build_common_options(opts, options, [:account, :options, :json, :dry_run])
296
+ build_common_options(opts, options, [:account, :options, :payload, :json, :dry_run])
268
297
  end
269
298
  optparse.parse!(args)
270
299
 
271
300
  if args.count < 1
272
- print_red_alert "Specify atleast one option to update"
273
301
  puts optparse
274
- exit 1
302
+ return 1
275
303
  end
276
304
 
277
305
  connect(options)
@@ -281,47 +309,59 @@ class Morpheus::Cli::Users
281
309
  account_id = account ? account['id'] : nil
282
310
 
283
311
  user = find_user_by_username_or_id(account_id, args[0])
284
- exit 1 if user.nil?
312
+ return 1 if user.nil?
285
313
 
286
- #params = Morpheus::Cli::OptionTypes.prompt(update_user_option_types, options[:options], @api_client, options[:params])
287
- params = options[:options] || {}
288
- if params.empty?
289
- puts optparse
290
- exit 1
291
- end
292
- roles = prompt_user_roles(account_id, user['id'], options.merge(no_prompt: true))
293
- if !roles.empty?
294
- params['roles'] = roles.collect {|r| {id: r['id']} }
295
- end
296
- if params.empty?
297
- puts optparse.banner
298
- puts Morpheus::Cli::OptionTypes.display_option_types_help(update_user_option_types)
299
- exit 1
300
- end
314
+ payload = nil
315
+ if options[:payload]
316
+ payload = options[:payload]
317
+ else
318
+ #params = Morpheus::Cli::OptionTypes.prompt(update_user_option_types, options[:options], @api_client, options[:params])
319
+ # merge -O options into normally parsed options
320
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
321
+ # if params.empty?
322
+ # print_red_alert "Specify atleast one option to update"
323
+ # puts optparse
324
+ # return 1
325
+ # end
326
+ # prompt_option_types = update_user_option_types().reject {|it| 'role' == it['fieldName'] }
327
+ # params = Morpheus::Cli::OptionTypes.prompt(prompt_option_types, params, @api_client)
328
+ selected_roles = []
329
+ selected_roles += params.delete('role').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if params['role']
330
+ selected_roles += params.delete('roles').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if params['roles']
331
+ roles = prompt_user_roles(account_id, user['id'], selected_roles, options.merge(no_prompt: true))
332
+ if !roles.empty?
333
+ params['roles'] = roles.collect {|r| {id: r['id']} }
334
+ end
335
+ if params.empty?
336
+ puts optparse.banner
337
+ puts Morpheus::Cli::OptionTypes.display_option_types_help(update_user_option_types)
338
+ return 1
339
+ end
340
+
341
+ #puts "parsed params is : #{params.inspect}"
342
+ if params['instanceLimits']
343
+ params['instanceLimits']['maxStorage'] = params['instanceLimits']['maxStorage'].to_i if params['instanceLimits']['maxStorage'].to_s.strip != ''
344
+ params['instanceLimits']['maxMemory'] = params['instanceLimits']['maxMemory'].to_i if params['instanceLimits']['maxMemory'].to_s.strip != ''
345
+ params['instanceLimits']['maxCpu'] = params['instanceLimits']['maxCpu'].to_i if params['instanceLimits']['maxCpu'].to_s.strip != ''
346
+ end
301
347
 
302
- #puts "parsed params is : #{params.inspect}"
303
- user_keys = ['username', 'firstName', 'lastName', 'email', 'password', 'instanceLimits', 'roles']
304
- user_payload = params.select {|k,v| user_keys.include?(k) }
305
- if !user_payload['instanceLimits']
306
- user_payload['instanceLimits'] = {}
307
- user_payload['instanceLimits']['maxStorage'] = params['instanceLimits.maxStorage'].to_i if params['instanceLimits.maxStorage'].to_s.strip != ''
308
- user_payload['instanceLimits']['maxMemory'] = params['instanceLimits.maxMemory'].to_i if params['instanceLimits.maxMemory'].to_s.strip != ''
309
- user_payload['instanceLimits']['maxCpu'] = params['instanceLimits.maxCpu'].to_i if params['instanceLimits.maxCpu'].to_s.strip != ''
348
+ payload = {'user' => params}
310
349
  end
311
350
 
312
- payload = {user: user_payload}
313
- json_response = @users_interface.update(account_id, user['id'], payload)
314
351
  if options[:dry_run]
315
352
  print_dry_run @users_interface.dry.update(account_id, user['id'], payload)
316
353
  return
317
354
  end
355
+ json_response = @users_interface.update(account_id, user['id'], payload)
318
356
 
319
357
  if options[:json]
320
358
  print JSON.pretty_generate(json_response)
321
359
  print "\n"
322
360
  else
323
- print_green_success "Updated user #{user_payload['username']}"
324
- details_options = [user_payload["username"] || user['username']]
361
+ username = user['username'] # json_response['user']['username']
362
+ username = payload['user']['username'] if payload['user'] && payload['user']['username']
363
+ print_green_success "Updated user #{username}"
364
+ details_options = [username]
325
365
  if account
326
366
  details_options.push "--account-id", account['id'].to_s
327
367
  end
@@ -330,14 +370,83 @@ class Morpheus::Cli::Users
330
370
 
331
371
  rescue RestClient::Exception => e
332
372
  print_rest_exception(e, options)
333
- exit 1
373
+ return 1
374
+ end
375
+ end
376
+
377
+ def change_password(args)
378
+ options = {}
379
+ new_password = nil
380
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
381
+ opts.banner = subcommand_usage("[username] [options]")
382
+ opts.on('--password VALUE', String, "New password") do |val|
383
+ new_password = val
384
+ end
385
+ build_common_options(opts, options, [:account, :options, :json, :dry_run, :remote])
386
+ end
387
+ optparse.parse!(args)
388
+
389
+ if args.count < 1
390
+ # print_error Morpheus::Terminal.angry_prompt
391
+ # puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
392
+ puts optparse
393
+ return 1
394
+ end
395
+
396
+ connect(options)
397
+ begin
398
+
399
+ account = find_account_from_options(options)
400
+ account_id = account ? account['id'] : nil
401
+
402
+ user = find_user_by_username_or_id(account_id, args[0])
403
+ return 1 if user.nil?
404
+
405
+ if new_password.nil?
406
+
407
+ password_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'password', 'fieldLabel' => 'New Password', 'type' => 'password', 'required' => true}], options[:options], @api_client)
408
+ new_password = password_prompt['password']
409
+
410
+ confirm_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => true}], options[:options], @api_client)
411
+ confirm_password = confirm_prompt['passwordConfirmation']
412
+ if confirm_password != new_password
413
+ print_red_alert "Confirm password did not match."
414
+ return 1
415
+ end
416
+ end
417
+
418
+ if new_password.nil? || new_password.empty?
419
+ print_red_alert "A new password is required"
420
+ return 1
421
+ end
422
+
423
+ payload = {
424
+ 'user' => {
425
+ 'password' => new_password,
426
+ 'passwordConfirmation' => new_password
427
+ }
428
+ }
429
+ json_response = @users_interface.update(account_id, user['id'], payload)
430
+ if options[:dry_run]
431
+ print_dry_run @users_interface.dry.update(account_id, user['id'], payload)
432
+ return
433
+ end
434
+
435
+ if options[:json]
436
+ puts JSON.pretty_generate(json_response)
437
+ else
438
+ print_green_success "Updated password for user #{user['username']}"
439
+ end
440
+
441
+ rescue RestClient::Exception => e
442
+ print_rest_exception(e, options)
443
+ return 1
334
444
  end
335
445
  end
336
446
 
337
447
  def remove(args)
338
- usage = "Usage: morpheus users remove [username]"
339
448
  options = {}
340
- optparse = OptionParser.new do|opts|
449
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
341
450
  opts.banner = subcommand_usage("[username]")
342
451
  build_common_options(opts, options, [:account, :auto_confirm, :json, :dry_run])
343
452
  end
@@ -345,7 +454,7 @@ class Morpheus::Cli::Users
345
454
 
346
455
  if args.count < 1
347
456
  puts optparse
348
- exit 1
457
+ return 1
349
458
  end
350
459
 
351
460
  connect(options)
@@ -355,7 +464,7 @@ class Morpheus::Cli::Users
355
464
  account_id = account ? account['id'] : nil
356
465
 
357
466
  user = find_user_by_username_or_id(account_id, args[0])
358
- exit 1 if user.nil?
467
+ return 1 if user.nil?
359
468
  unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the user #{user['username']}?")
360
469
  exit
361
470
  end
@@ -374,7 +483,7 @@ class Morpheus::Cli::Users
374
483
  end
375
484
  rescue RestClient::Exception => e
376
485
  print_rest_exception(e, options)
377
- exit 1
486
+ return 1
378
487
  end
379
488
  end
380
489
 
@@ -388,9 +497,9 @@ class Morpheus::Cli::Users
388
497
  {'fieldName' => 'email', 'fieldLabel' => 'Email', 'type' => 'text', 'required' => true, 'displayOrder' => 4},
389
498
  {'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'required' => true, 'displayOrder' => 6},
390
499
  {'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => true, 'displayOrder' => 7},
391
- {'fieldName' => 'instanceLimits.maxStorage', 'fieldLabel' => 'Max Storage (bytes)', 'type' => 'text', 'displayOrder' => 8},
392
- {'fieldName' => 'instanceLimits.maxMemory', 'fieldLabel' => 'Max Memory (bytes)', 'type' => 'text', 'displayOrder' => 9},
393
- {'fieldName' => 'instanceLimits.maxCpu', 'fieldLabel' => 'CPU Count', 'type' => 'text', 'displayOrder' => 10},
500
+ {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxStorage', 'fieldLabel' => 'Max Storage (bytes)', 'type' => 'text', 'displayOrder' => 8},
501
+ {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxMemory', 'fieldLabel' => 'Max Memory (bytes)', 'type' => 'text', 'displayOrder' => 9},
502
+ {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxCpu', 'fieldLabel' => 'CPU Count', 'type' => 'text', 'displayOrder' => 10},
394
503
  {'fieldName' => 'role', 'fieldLabel' => 'Role', 'type' => 'text', 'displayOrder' => 11, 'description' => "Role names (comma separated)"},
395
504
  ]
396
505
  end
@@ -403,9 +512,9 @@ class Morpheus::Cli::Users
403
512
  {'fieldName' => 'email', 'fieldLabel' => 'Email', 'type' => 'text', 'required' => false, 'displayOrder' => 4},
404
513
  {'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'required' => false, 'displayOrder' => 6},
405
514
  {'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => false, 'displayOrder' => 7},
406
- {'fieldName' => 'instanceLimits.maxStorage', 'fieldLabel' => 'Max Storage (bytes)', 'type' => 'text', 'displayOrder' => 8},
407
- {'fieldName' => 'instanceLimits.maxMemory', 'fieldLabel' => 'Max Memory (bytes)', 'type' => 'text', 'displayOrder' => 9},
408
- {'fieldName' => 'instanceLimits.maxCpu', 'fieldLabel' => 'CPU Count', 'type' => 'text', 'displayOrder' => 10},
515
+ {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxStorage', 'fieldLabel' => 'Max Storage (bytes)', 'type' => 'text', 'displayOrder' => 8},
516
+ {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxMemory', 'fieldLabel' => 'Max Memory (bytes)', 'type' => 'text', 'displayOrder' => 9},
517
+ {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxCpu', 'fieldLabel' => 'CPU Count', 'type' => 'text', 'displayOrder' => 10},
409
518
  {'fieldName' => 'role', 'fieldLabel' => 'Role', 'type' => 'text', 'displayOrder' => 11, 'description' => "Role names (comma separated)"},
410
519
  ]
411
520
  end
@@ -414,36 +523,33 @@ class Morpheus::Cli::Users
414
523
  # options['role'] can be passed as comma separated role names
415
524
  # if so, it will be used instead of prompting
416
525
  # returns array of role objects
417
- def prompt_user_roles(account_id, user_id, options={})
418
-
419
- passed_role_string = nil
420
- if options['role'] || (options[:options] && (options[:options]['role'] || options[:options]['roles']))
421
- passed_role_string = options['role'] || (options[:options] && (options[:options]['role'] || options[:options]['roles']))
422
- end
526
+ def prompt_user_roles(account_id, user_id, selected_roles=[], options={})
423
527
  passed_role_names = []
424
- if !passed_role_string.empty?
425
- passed_role_names = passed_role_string.split(',').uniq.compact.collect {|r| r.strip}
528
+ if !selected_roles.empty?
529
+ if selected_roles.is_a?(String)
530
+ passed_role_names = selected_roles.split(',').uniq.compact.collect {|r| r.strip}
531
+ else
532
+ passed_role_names = selected_roles
533
+ end
426
534
  end
427
535
 
428
536
  available_roles = @users_interface.available_roles(account_id, user_id)['roles']
429
537
 
430
538
  if available_roles.empty?
431
539
  print_red_alert "No available roles found."
432
- exit 1
540
+ return 1
433
541
  end
434
542
  role_options = available_roles.collect {|role|
435
543
  {'name' => role['authority'], 'value' => role['id']}
436
544
  }
437
545
 
438
- # found_roles = []
439
546
  roles = []
440
547
 
441
548
  if !passed_role_names.empty?
442
549
  invalid_role_names = []
443
550
  passed_role_names.each do |role_name|
444
- found_role = available_roles.find {|ar| ar['authority'] == role_name}
551
+ found_role = available_roles.find {|ar| ar['authority'] == role_name || ar['id'] == role_name.to_i}
445
552
  if found_role
446
- # found_roles << found_role
447
553
  roles << found_role
448
554
  else
449
555
  invalid_role_names << role_name