morpheus-cli 4.2.8 → 4.2.10

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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api.rb +1 -1
  4. data/lib/morpheus/api/activity_interface.rb +9 -0
  5. data/lib/morpheus/api/api_client.rb +83 -27
  6. data/lib/morpheus/api/apps_interface.rb +21 -0
  7. data/lib/morpheus/api/dashboard_interface.rb +5 -21
  8. data/lib/morpheus/api/instances_interface.rb +3 -10
  9. data/lib/morpheus/api/invoice_line_items_interface.rb +14 -0
  10. data/lib/morpheus/api/invoices_interface.rb +7 -12
  11. data/lib/morpheus/api/library_layouts_interface.rb +8 -0
  12. data/lib/morpheus/api/ping_interface.rb +20 -0
  13. data/lib/morpheus/api/projects_interface.rb +33 -0
  14. data/lib/morpheus/api/setup_interface.rb +19 -36
  15. data/lib/morpheus/api/user_settings_interface.rb +0 -6
  16. data/lib/morpheus/api/whoami_interface.rb +4 -8
  17. data/lib/morpheus/benchmarking.rb +16 -26
  18. data/lib/morpheus/cli.rb +10 -5
  19. data/lib/morpheus/cli/access_token_command.rb +5 -8
  20. data/lib/morpheus/cli/activity_command.rb +146 -0
  21. data/lib/morpheus/cli/apps.rb +312 -121
  22. data/lib/morpheus/cli/archives_command.rb +1 -1
  23. data/lib/morpheus/cli/auth_command.rb +4 -11
  24. data/lib/morpheus/cli/blueprints_command.rb +196 -137
  25. data/lib/morpheus/cli/change_password_command.rb +1 -1
  26. data/lib/morpheus/cli/cli_command.rb +225 -72
  27. data/lib/morpheus/cli/cli_registry.rb +2 -2
  28. data/lib/morpheus/cli/cloud_datastores_command.rb +1 -1
  29. data/lib/morpheus/cli/clouds.rb +5 -20
  30. data/lib/morpheus/cli/clusters.rb +4 -28
  31. data/lib/morpheus/cli/commands/standard/alias_command.rb +2 -9
  32. data/lib/morpheus/cli/commands/standard/benchmark_command.rb +2 -0
  33. data/lib/morpheus/cli/commands/standard/curl_command.rb +2 -3
  34. data/lib/morpheus/cli/commands/standard/history_command.rb +3 -6
  35. data/lib/morpheus/cli/commands/standard/man_command.rb +10 -7
  36. data/lib/morpheus/cli/commands/standard/ssl_verification_command.rb +10 -9
  37. data/lib/morpheus/cli/containers_command.rb +3 -3
  38. data/lib/morpheus/cli/credentials.rb +13 -16
  39. data/lib/morpheus/cli/error_handler.rb +18 -12
  40. data/lib/morpheus/cli/errors.rb +45 -0
  41. data/lib/morpheus/cli/execute_schedules_command.rb +1 -1
  42. data/lib/morpheus/cli/execution_request_command.rb +4 -4
  43. data/lib/morpheus/cli/groups.rb +84 -132
  44. data/lib/morpheus/cli/hosts.rb +6 -16
  45. data/lib/morpheus/cli/instances.rb +100 -183
  46. data/lib/morpheus/cli/invoices_command.rb +505 -71
  47. data/lib/morpheus/cli/library_layouts_command.rb +254 -166
  48. data/lib/morpheus/cli/library_option_lists_command.rb +0 -87
  49. data/lib/morpheus/cli/library_option_types_command.rb +0 -96
  50. data/lib/morpheus/cli/license.rb +3 -0
  51. data/lib/morpheus/cli/login.rb +17 -37
  52. data/lib/morpheus/cli/logout.rb +9 -5
  53. data/lib/morpheus/cli/mixins/accounts_helper.rb +83 -7
  54. data/lib/morpheus/cli/mixins/operations_helper.rb +41 -0
  55. data/lib/morpheus/cli/mixins/option_source_helper.rb +255 -0
  56. data/lib/morpheus/cli/mixins/print_helper.rb +18 -4
  57. data/lib/morpheus/cli/mixins/provisioning_helper.rb +222 -13
  58. data/lib/morpheus/cli/mixins/remote_helper.rb +139 -0
  59. data/lib/morpheus/cli/monitoring_checks_command.rb +11 -3
  60. data/lib/morpheus/cli/network_groups_command.rb +8 -2
  61. data/lib/morpheus/cli/option_types.rb +1 -1
  62. data/lib/morpheus/cli/ping.rb +252 -0
  63. data/lib/morpheus/cli/price_sets_command.rb +16 -27
  64. data/lib/morpheus/cli/prices_command.rb +34 -27
  65. data/lib/morpheus/cli/processes_command.rb +81 -7
  66. data/lib/morpheus/cli/projects_command.rb +607 -0
  67. data/lib/morpheus/cli/recent_activity_command.rb +87 -65
  68. data/lib/morpheus/cli/remote.rb +965 -974
  69. data/lib/morpheus/cli/reports_command.rb +3 -15
  70. data/lib/morpheus/cli/roles.rb +8 -31
  71. data/lib/morpheus/cli/service_plans_command.rb +25 -31
  72. data/lib/morpheus/cli/setup.rb +392 -0
  73. data/lib/morpheus/cli/shell.rb +144 -56
  74. data/lib/morpheus/cli/subnets_command.rb +71 -11
  75. data/lib/morpheus/cli/tasks.rb +3 -3
  76. data/lib/morpheus/cli/user_sources_command.rb +4 -4
  77. data/lib/morpheus/cli/users.rb +135 -109
  78. data/lib/morpheus/cli/version.rb +1 -1
  79. data/lib/morpheus/cli/whitelabel_settings_command.rb +7 -7
  80. data/lib/morpheus/cli/whoami.rb +90 -129
  81. data/lib/morpheus/cli/wiki_command.rb +2 -14
  82. data/lib/morpheus/ext/rest_client.rb +36 -0
  83. data/lib/morpheus/formatters.rb +42 -5
  84. data/lib/morpheus/rest_client.rb +0 -10
  85. data/lib/morpheus/terminal.rb +41 -1
  86. data/lib/morpheus/util.rb +24 -0
  87. metadata +16 -3
  88. data/lib/morpheus/cli/command_error.rb +0 -22
@@ -16,6 +16,9 @@ class Morpheus::Cli::Users
16
16
  alias_subcommand :details, :get
17
17
  set_default_subcommand :list
18
18
 
19
+ #todo: TOO_SIMPL_REGEX = //i
20
+ # TOO_SIMPLE_ERROR = "Password too simple. Password must contain at least one uppercase letter, one lowercase letter, a number, and a symbol."
21
+
19
22
  def initialize()
20
23
  # @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
21
24
  end
@@ -116,10 +119,15 @@ class Morpheus::Cli::Users
116
119
  params = {}
117
120
  optparse = Morpheus::Cli::OptionParser.new do |opts|
118
121
  opts.banner = subcommand_usage("[username]")
119
- opts.on(nil,'--feature-access', "Display Feature Access") do |val|
122
+ opts.on('-p','--permissions', "Display Permissions") do |val|
120
123
  options[:include_features_access] = true
121
124
  params['includeAccess'] = true
122
125
  end
126
+ opts.on(nil,'--feature-access', "Display Permissions") do |val|
127
+ options[:include_features_access] = true
128
+ params['includeAccess'] = true
129
+ end
130
+ opts.add_hidden_option('--feature-access')
123
131
  opts.on(nil,'--group-access', "Display Group Access") do
124
132
  options[:include_sites_access] = true
125
133
  params['includeAccess'] = true
@@ -211,12 +219,13 @@ class Morpheus::Cli::Users
211
219
  description_cols = {
212
220
  "ID" => 'id',
213
221
  "Account" => lambda {|it| it['account'] ? it['account']['name'] : '' },
214
- # "First" => 'firstName',
215
- # "Last" => 'lastName',
222
+ "First Name" => 'firstName',
223
+ "Last Name" => 'lastName',
216
224
  # "Name" => 'displayName',
217
- "Name" => lambda {|it| it['firstName'] ? it['displayName'] : '' },
225
+ #"Name" => lambda {|it| it['firstName'] ? it['displayName'] : '' },
218
226
  "Username" => 'username',
219
227
  "Email" => 'email',
228
+ "Notifications" => lambda {|it| it['receiveNotifications'].nil? ? '' : format_boolean(it['receiveNotifications']) },
220
229
  "Role" => lambda {|it| format_user_role_names(it) },
221
230
  "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
222
231
  "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
@@ -233,12 +242,12 @@ class Morpheus::Cli::Users
233
242
  print cyan
234
243
  if user_feature_permissions.is_a?(Array)
235
244
  rows = user_feature_permissions.collect do |it|
236
- {name: it['name'], code: it['code'], access: get_access_string(it['access']) }
245
+ {name: it['name'], code: it['code'], access: format_access_string(it['access']) }
237
246
  end
238
247
  print as_pretty_table(rows, [:name, :code, :access], options)
239
248
  else
240
249
  rows = user_feature_permissions.collect do |code, access|
241
- {code: code, access: get_access_string(access) }
250
+ {code: code, access: format_access_string(access) }
242
251
  end
243
252
  print as_pretty_table(rows, [:code, :access], options)
244
253
  end
@@ -252,11 +261,21 @@ class Morpheus::Cli::Users
252
261
  access = user['access'][field.split('_').enum_for(:each_with_index).collect {|word, idx| idx == 0 ? word : word.capitalize}.join]
253
262
  access = access.reject {|it| it['access'] == 'none'} if !options[:display_none_access]
254
263
 
255
- print_h2 "#{label} Access", options
264
+ if field == "features"
265
+ # print_h2 "Permissions", options
266
+ print_h2 "#{label} Access", options
267
+ else
268
+ print_h2 "#{label} Access", options
269
+ end
256
270
  print cyan
257
271
 
272
+ # access levels vary, default is none,read,user,full
273
+ available_access_levels = ["none","read","user","full"]
274
+ if field == 'sites' || field == 'zones' || field == 'instance_types' || field == 'app_templates'
275
+ available_access_levels = ["none","read","full"]
276
+ end
258
277
  if access.count > 0
259
- access.each {|it| it['access'] = get_access_string(it['access'])}
278
+ access.each {|it| it['access'] = format_access_string(it['access'], available_access_levels)}
260
279
 
261
280
  if ['features', 'instance_types'].include?(field)
262
281
  print as_pretty_table(access, [:name, :code, :access], options)
@@ -289,11 +308,7 @@ class Morpheus::Cli::Users
289
308
  "[username] is required. This is the username or id of a user."
290
309
  end
291
310
  optparse.parse!(args)
292
-
293
- if args.count < 1
294
- puts optparse
295
- return 1
296
- end
311
+ verify_args!(args:args, optparse:optparse, count:1)
297
312
 
298
313
  connect(options)
299
314
  begin
@@ -331,12 +346,12 @@ class Morpheus::Cli::Users
331
346
  print cyan
332
347
  if user_feature_permissions.is_a?(Array)
333
348
  rows = user_feature_permissions.collect do |it|
334
- {name: it['name'], code: it['code'], access: get_access_string(it['access']) }
349
+ {name: it['name'], code: it['code'], access: format_access_string(it['access']) }
335
350
  end
336
351
  print as_pretty_table(rows, [:name, :code, :access], options)
337
352
  else
338
353
  rows = user_feature_permissions.collect do |code, access|
339
- {code: code, access: get_access_string(access) }
354
+ {code: code, access: format_access_string(access) }
340
355
  end
341
356
  print as_pretty_table(rows, [:code, :access], options)
342
357
  end
@@ -367,9 +382,12 @@ class Morpheus::Cli::Users
367
382
 
368
383
  print_h2 "#{label} Access", options
369
384
  print cyan
370
-
385
+ available_access_levels = ["full","user","read","none"]
386
+ if field == 'sites' || field == 'zones' || field == 'instance_types' || field == 'app_templates'
387
+ available_access_levels = ["full","custom","none"]
388
+ end
371
389
  if access.count > 0
372
- access.each {|it| it['access'] = get_access_string(it['access'])}
390
+ access.each {|it| it['access'] = format_access_string(it['access'], available_access_levels)}
373
391
 
374
392
  if ['features', 'instance_types'].include?(field)
375
393
  print as_pretty_table(access, [:name, :code, :access], options)
@@ -377,7 +395,7 @@ class Morpheus::Cli::Users
377
395
  print as_pretty_table(access, [:name, :access], options)
378
396
  end
379
397
  else
380
- println yellow,"No #{label} Access Found.",reset
398
+ println cyan,"No #{label} Access Found.",reset
381
399
  end
382
400
  end
383
401
  end
@@ -394,24 +412,36 @@ class Morpheus::Cli::Users
394
412
  options = {}
395
413
  params = {}
396
414
  optparse = Morpheus::Cli::OptionParser.new do |opts|
397
- opts.banner = subcommand_usage("[options]")
415
+ opts.banner = subcommand_usage("[username] [email] [first] [last] [options]")
398
416
  build_option_type_options(opts, options, add_user_option_types)
399
417
  build_common_options(opts, options, [:account, :options, :payload, :json, :dry_run])
418
+ opts.footer = <<-EOT
419
+ Create a new user.
420
+ [username] is required. Username of the new user
421
+ [email] is required. Email address
422
+ [first] is optional. First Name
423
+ [last] is optional. Last Name
424
+ EOT
400
425
  end
401
426
  optparse.parse!(args)
402
-
427
+ verify_args!(args:args, optparse:optparse, min:0, max:4)
428
+ options[:options]['username'] = args[0] if args[0]
429
+ options[:options]['email'] = args[1] if args[1]
430
+ options[:options]['firstName'] = args[2] if args[2]
431
+ options[:options]['lastName'] = args[3] if args[3]
403
432
  connect(options)
404
433
  begin
405
434
 
406
435
  account = find_account_from_options(options)
407
436
  account_id = account ? account['id'] : nil
408
437
 
409
- payload = nil
438
+ payload = {}
410
439
  if options[:payload]
411
440
  payload = options[:payload]
441
+ payload.deep_merge!(parse_passed_options(options))
412
442
  else
413
443
  # merge -O options into normally parsed options
414
- params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
444
+ payload.deep_merge!(parse_passed_options(options))
415
445
  # remove role option_type, it is just for help display, the role prompt is separate down below
416
446
  prompt_option_types = add_user_option_types().reject {|it| 'role' == it['fieldName'] }
417
447
  v_prompt = Morpheus::Cli::OptionTypes.prompt(prompt_option_types, options[:options], @api_client, options[:params])
@@ -452,7 +482,7 @@ class Morpheus::Cli::Users
452
482
  if account
453
483
  details_options.push "--account-id", account['id'].to_s
454
484
  end
455
- get(details_options)
485
+ get(details_options + (options[:remote] ? ["-r",options[:remote]] : []))
456
486
  end
457
487
 
458
488
 
@@ -465,18 +495,14 @@ class Morpheus::Cli::Users
465
495
  def update(args)
466
496
  options = {}
467
497
  params = {}
498
+ payload = {}
468
499
  optparse = Morpheus::Cli::OptionParser.new do |opts|
469
500
  opts.banner = subcommand_usage("[username] [options]")
470
501
  build_option_type_options(opts, options, update_user_option_types)
471
502
  build_common_options(opts, options, [:account, :options, :payload, :json, :dry_run])
472
503
  end
473
504
  optparse.parse!(args)
474
-
475
- if args.count < 1
476
- puts optparse
477
- return 1
478
- end
479
-
505
+ verify_args!(args:args, optparse:optparse, count:1)
480
506
  connect(options)
481
507
  begin
482
508
 
@@ -486,36 +512,29 @@ class Morpheus::Cli::Users
486
512
  user = find_user_by_username_or_id(account_id, args[0])
487
513
  return 1 if user.nil?
488
514
 
489
- payload = nil
515
+ # use --payload
490
516
  if options[:payload]
491
517
  payload = options[:payload]
518
+ payload.deep_merge!(parse_passed_options(options))
492
519
  else
493
- #params = Morpheus::Cli::OptionTypes.prompt(update_user_option_types, options[:options], @api_client, options[:params])
494
- # merge -O options into normally parsed options
495
- params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
496
- # if params.empty?
497
- # print_red_alert "Specify at least one option to update"
498
- # puts optparse
499
- # return 1
500
- # end
501
- # prompt_option_types = update_user_option_types().reject {|it| 'role' == it['fieldName'] }
502
- # params = Morpheus::Cli::OptionTypes.prompt(prompt_option_types, params, @api_client)
520
+ # inject -O key=value options
521
+ # payload.deep_merge!(parse_passed_options(options))
522
+ params.deep_merge!(parse_passed_options(options))
523
+ # user_prompt_output = Morpheus::Cli::OptionTypes.prompt(prompt_option_types, payload['user'], @api_client)
503
524
  selected_roles = []
504
525
  selected_roles += params.delete('role').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if params['role']
505
526
  selected_roles += params.delete('roles').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if params['roles']
506
527
  roles = prompt_user_roles(account_id, user['id'], selected_roles, options.merge(no_prompt: true))
528
+ # should it allow [] (no roles) ?
507
529
  if !roles.empty?
508
530
  params['roles'] = roles.collect {|r| {id: r['id']} }
509
531
  end
510
- if params.empty?
511
- puts optparse.banner
512
- puts Morpheus::Cli::OptionTypes.display_option_types_help(update_user_option_types)
513
- return 1
532
+ payload.deep_merge!({'user' => params})
533
+ if payload['user'].empty? # || options[:no_prompt]
534
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
514
535
  end
515
-
516
-
517
- payload = {'user' => params}
518
536
  end
537
+
519
538
  @users_interface.setopts(options)
520
539
  if options[:dry_run]
521
540
  print_dry_run @users_interface.dry.update(account_id, user['id'], payload)
@@ -528,13 +547,15 @@ class Morpheus::Cli::Users
528
547
  print "\n"
529
548
  else
530
549
  username = user['username'] # json_response['user']['username']
531
- username = payload['user']['username'] if payload['user'] && payload['user']['username']
550
+ if payload['user'] && payload['user']['username']
551
+ username = payload['user']['username']
552
+ end
532
553
  print_green_success "Updated user #{username}"
533
554
  details_options = [username]
534
555
  if account
535
556
  details_options.push "--account-id", account['id'].to_s
536
557
  end
537
- get(details_options)
558
+ get(details_options + (options[:remote] ? ["-r",options[:remote]] : []))
538
559
  end
539
560
 
540
561
  rescue RestClient::Exception => e
@@ -547,75 +568,79 @@ class Morpheus::Cli::Users
547
568
  options = {}
548
569
  new_password = nil
549
570
  optparse = Morpheus::Cli::OptionParser.new do |opts|
550
- opts.banner = subcommand_usage("[username] [options]")
551
- opts.on('--password VALUE', String, "New password") do |val|
552
- new_password = val
553
- end
554
- build_common_options(opts, options, [:account, :options, :json, :dry_run, :remote, :quiet])
571
+ opts.banner = subcommand_usage("[username] [password] [options]")
572
+ # opts.on('--password VALUE', String, "New password") do |val|
573
+ # new_password = val
574
+ # end
575
+ build_standard_update_options(opts, options, [:account])
555
576
  end
556
577
  optparse.parse!(args)
557
-
558
- if args.count < 1
559
- # print_error Morpheus::Terminal.angry_prompt
560
- # puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
561
- puts optparse
562
- return 1
563
- end
564
-
578
+ verify_args!(args:args, optparse:optparse, min:1,max:2) # [username] [password]
565
579
  connect(options)
566
- begin
580
+ exit_code, err = 0, nil
567
581
 
568
- account = find_account_from_options(options)
569
- account_id = account ? account['id'] : nil
582
+ # user can be scoped to account (tenant)
583
+ account = find_account_from_options(options)
584
+ account_id = account ? account['id'] : nil
570
585
 
571
- user = find_user_by_username_or_id(account_id, args[0])
572
- return 1 if user.nil?
573
-
574
- if !options[:quiet]
575
- print cyan, "Changing password for #{user['username']}", reset, "\n"
576
- end
586
+ # fetch the user to update
587
+ user = find_user_by_username_or_id(account_id, args[0])
588
+ return 1 if user.nil?
589
+
590
+ new_password = args[1] if args[1]
577
591
 
578
- if new_password.nil?
579
-
592
+ # print a warning or important info
593
+ if !options[:quiet]
594
+ print cyan, "Changing password for #{user['username']}", reset, "\n"
595
+ end
596
+ # construct change_password payload
597
+
598
+ # use --payload
599
+ if options[:payload]
600
+ payload = options[:payload]
601
+ payload.deep_merge!(parse_passed_options(options))
602
+ else
603
+ # inject -O key=value options
604
+ payload.deep_merge!(parse_passed_options(options))
605
+
606
+ # prompt for password input
607
+ current_input_attempt = 1
608
+ still_prompting = new_password ? false : true
609
+ while still_prompting do
610
+ # New Password
580
611
  password_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'password', 'fieldLabel' => 'New Password', 'type' => 'password', 'required' => true}], options[:options], @api_client)
581
612
  new_password = password_prompt['password']
582
-
613
+
614
+ # could validate password is "strong"
615
+ # Confirm New Password
583
616
  confirm_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => true}], options[:options], @api_client)
584
617
  confirm_password = confirm_prompt['passwordConfirmation']
585
618
  if confirm_password != new_password
586
619
  print_red_alert "Confirm password did not match."
587
- return 1
620
+ new_password = nil
621
+ unless ::Morpheus::Cli::OptionTypes::confirm("Would you like to try again?", options.merge({default: true}))
622
+ return 9, "aborted login"
623
+ end
588
624
  end
625
+ still_prompting = !!new_password
589
626
  end
590
-
591
- if new_password.nil? || new_password.empty?
592
- print_red_alert "A new password is required"
593
- return 1
594
- end
595
-
596
627
  payload = {
597
628
  'user' => {
598
629
  'password' => new_password
599
630
  }
600
631
  }
601
- @users_interface.setopts(options)
602
- if options[:dry_run]
603
- print_dry_run @users_interface.dry.update(account_id, user['id'], payload)
604
- return
605
- end
606
632
 
607
- json_response = @users_interface.update(account_id, user['id'], payload)
608
-
609
- if options[:json]
610
- puts JSON.pretty_generate(json_response)
611
- elsif !options[:quiet]
612
- print_green_success "Updated password for user #{user['username']}"
613
- end
614
- return 0
615
- rescue RestClient::Exception => e
616
- print_rest_exception(e, options)
617
- return 1
618
633
  end
634
+ @users_interface.setopts(options)
635
+ if options[:dry_run]
636
+ print_dry_run @users_interface.dry.update(account_id, user['id'], payload)
637
+ return
638
+ end
639
+ json_response = @users_interface.update(account_id, user['id'], payload)
640
+ render_response(json_response, optparse, "user") do
641
+ print_green_success "Updated password for user #{user['username']}"
642
+ end
643
+ return exit_code, err
619
644
  end
620
645
 
621
646
  def remove(args)
@@ -670,22 +695,23 @@ class Morpheus::Cli::Users
670
695
  {'fieldName' => 'lastName', 'fieldLabel' => 'Last Name', 'type' => 'text', 'required' => false, 'displayOrder' => 2},
671
696
  {'fieldName' => 'username', 'fieldLabel' => 'Username', 'type' => 'text', 'required' => true, 'displayOrder' => 3},
672
697
  {'fieldName' => 'email', 'fieldLabel' => 'Email', 'type' => 'text', 'required' => true, 'displayOrder' => 4},
673
- {'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'required' => true, 'displayOrder' => 6},
674
- {'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => true, 'displayOrder' => 7},
675
- {'fieldName' => 'role', 'fieldLabel' => 'Role', 'type' => 'text', 'displayOrder' => 11, 'description' => "Role names (comma separated)"},
698
+ {'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'required' => true, 'displayOrder' => 5},
699
+ {'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => true, 'displayOrder' => 6},
700
+ {'fieldName' => 'role', 'fieldLabel' => 'Role', 'type' => 'text', 'description' => "Role names (comma separated)", 'displayOrder' => 7},
701
+ {'fieldName' => 'receiveNotifications', 'fieldLabel' => 'receiveNotifications', 'type' => 'checkbox', 'required' => false, 'defaultValue' => true, 'displayOrder' => 58},
702
+ {'fieldName' => 'linuxUsername', 'fieldLabel' => 'Linux Username', 'type' => 'text', 'required' => false, 'displayOrder' => 9},
703
+ # {'fieldName' => 'linuxPassword', 'fieldLabel' => 'Linux Password', 'type' => 'password', 'required' => false, 'displayOrder' => 10},
704
+ {'fieldName' => 'windowsUsername', 'fieldLabel' => 'Windows Username', 'type' => 'text', 'required' => false, 'displayOrder' => 11},
705
+ # {'fieldName' => 'windowsPassword', 'fieldLabel' => 'Windows Password', 'type' => 'text', 'required' => false, 'displayOrder' => 12},
706
+ # 'linuxUsername','windowsUsername','linuxKeyPairId'
676
707
  ]
677
708
  end
678
709
 
679
710
  def update_user_option_types
680
- [
681
- {'fieldName' => 'firstName', 'fieldLabel' => 'First Name', 'type' => 'text', 'required' => false, 'displayOrder' => 1},
682
- {'fieldName' => 'lastName', 'fieldLabel' => 'Last Name', 'type' => 'text', 'required' => false, 'displayOrder' => 2},
683
- {'fieldName' => 'username', 'fieldLabel' => 'Username', 'type' => 'text', 'required' => false, 'displayOrder' => 3},
684
- {'fieldName' => 'email', 'fieldLabel' => 'Email', 'type' => 'text', 'required' => false, 'displayOrder' => 4},
685
- {'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'required' => false, 'displayOrder' => 6},
686
- {'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => false, 'displayOrder' => 7},
687
- {'fieldName' => 'role', 'fieldLabel' => 'Role', 'type' => 'text', 'displayOrder' => 11, 'description' => "Role names (comma separated)"},
688
- ]
711
+ add_user_option_types.collect {|it|
712
+ it['required'] = false
713
+ it
714
+ }
689
715
  end
690
716
 
691
717
  # prompt user to select roles for a new or existing user
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "4.2.8"
4
+ VERSION = "4.2.10"
5
5
  end
6
6
  end
@@ -29,7 +29,7 @@ class Morpheus::Cli::WhitelabelSettingsCommand
29
29
  options = {}
30
30
  optparse = Morpheus::Cli::OptionParser.new do |opts|
31
31
  opts.banner = subcommand_usage()
32
- opts.on( '-a', '--account ACCOUNT', "Account Name or ID" ) do |val|
32
+ opts.on( '-a', '--tenant TENANT', "Tenant Name or ID" ) do |val|
33
33
  options[:account] = val
34
34
  end
35
35
  opts.on('--details', "Show full (not truncated) contents of Terms of Use, Privacy Policy, Override CSS" ) do
@@ -80,7 +80,7 @@ class Morpheus::Cli::WhitelabelSettingsCommand
80
80
  print_h1 "Whitelabel Settings"
81
81
  print cyan
82
82
  description_cols = {
83
- "Account" => lambda {|it| it['account']['name'] rescue '' },
83
+ "Tenant" => lambda {|it| it['account']['name'] rescue '' },
84
84
  "Enabled" => lambda {|it| format_boolean(it['enabled']) },
85
85
  "Appliance Name" => lambda {|it| it['applianceName'] },
86
86
  "Disable Support Menu" => lambda {|it| format_boolean(it['disableSupportMenu'])},
@@ -148,7 +148,7 @@ class Morpheus::Cli::WhitelabelSettingsCommand
148
148
  query_params = {}
149
149
  optparse = Morpheus::Cli::OptionParser.new do |opts|
150
150
  opts.banner = opts.banner = subcommand_usage()
151
- opts.on( '-a', '--account ACCOUNT', "Account Name or ID" ) do |val|
151
+ opts.on( '-a', '--account ACCOUNT', "Tenant Name or ID" ) do |val|
152
152
  options[:account] = val
153
153
  end
154
154
  opts.on('--active [on|off]', String, "Can be used to enable / disable whitelabel feature") do |val|
@@ -314,7 +314,7 @@ class Morpheus::Cli::WhitelabelSettingsCommand
314
314
  options = {}
315
315
  optparse = Morpheus::Cli::OptionParser.new do |opts|
316
316
  opts.banner = opts.banner = subcommand_usage()
317
- opts.on( '-a', '--account ACCOUNT', "Account Name or ID" ) do |val|
317
+ opts.on( '-a', '--account ACCOUNT', "Tenant Name or ID" ) do |val|
318
318
  options[:account] = val
319
319
  end
320
320
  opts.on("--header-logo FILE", String, "Header logo image. Local path of a file to upload (png|jpg|svg)") do |val|
@@ -412,7 +412,7 @@ class Morpheus::Cli::WhitelabelSettingsCommand
412
412
  options = {}
413
413
  optparse = Morpheus::Cli::OptionParser.new do |opts|
414
414
  opts.banner = opts.banner = subcommand_usage("[image-type]")
415
- opts.on( '-a', '--account ACCOUNT', "Account Name or ID" ) do |val|
415
+ opts.on( '-a', '--tenant TENANT', "Tenant Name or ID" ) do |val|
416
416
  options[:account] = val
417
417
  end
418
418
  build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
@@ -468,7 +468,7 @@ class Morpheus::Cli::WhitelabelSettingsCommand
468
468
  options = {}
469
469
  optparse = Morpheus::Cli::OptionParser.new do |opts|
470
470
  opts.banner = opts.banner = subcommand_usage("[image-type]")
471
- opts.on( '-a', '--account ACCOUNT', "Account Name or ID" ) do |val|
471
+ opts.on( '-a', '--tenant TENANT', "Tenant Name or ID" ) do |val|
472
472
  options[:account] = val
473
473
  end
474
474
  build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
@@ -532,7 +532,7 @@ class Morpheus::Cli::WhitelabelSettingsCommand
532
532
  options = {}
533
533
  optparse = Morpheus::Cli::OptionParser.new do |opts|
534
534
  opts.banner = opts.banner = subcommand_usage("[image-type] [local-file]")
535
- opts.on( '-a', '--account ACCOUNT', "Account Name or ID" ) do |val|
535
+ opts.on( '-a', '--tenant TENANT', "Tenant Name or ID" ) do |val|
536
536
  options[:account] = val
537
537
  end
538
538
  opts.on( '-f', '--force', "Overwrite existing [local-file] if it exists." ) do