morpheus-cli 4.2.14 → 4.2.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/README.md +8 -6
  4. data/lib/morpheus/api/api_client.rb +32 -14
  5. data/lib/morpheus/api/auth_interface.rb +4 -2
  6. data/lib/morpheus/api/backup_jobs_interface.rb +9 -0
  7. data/lib/morpheus/api/backups_interface.rb +16 -0
  8. data/lib/morpheus/api/deploy_interface.rb +25 -56
  9. data/lib/morpheus/api/deployments_interface.rb +44 -55
  10. data/lib/morpheus/api/doc_interface.rb +57 -0
  11. data/lib/morpheus/api/instances_interface.rb +5 -0
  12. data/lib/morpheus/api/rest_interface.rb +40 -0
  13. data/lib/morpheus/api/user_sources_interface.rb +0 -15
  14. data/lib/morpheus/api/users_interface.rb +2 -3
  15. data/lib/morpheus/benchmarking.rb +2 -2
  16. data/lib/morpheus/cli.rb +4 -1
  17. data/lib/morpheus/cli/access_token_command.rb +27 -10
  18. data/lib/morpheus/cli/apps.rb +21 -15
  19. data/lib/morpheus/cli/backup_jobs_command.rb +276 -0
  20. data/lib/morpheus/cli/backups_command.rb +271 -0
  21. data/lib/morpheus/cli/blueprints_command.rb +27 -61
  22. data/lib/morpheus/cli/boot_scripts_command.rb +1 -1
  23. data/lib/morpheus/cli/cli_command.rb +183 -45
  24. data/lib/morpheus/cli/cli_registry.rb +3 -0
  25. data/lib/morpheus/cli/clouds.rb +7 -10
  26. data/lib/morpheus/cli/clusters.rb +0 -18
  27. data/lib/morpheus/cli/commands/standard/benchmark_command.rb +23 -20
  28. data/lib/morpheus/cli/commands/standard/man_command.rb +1 -1
  29. data/lib/morpheus/cli/credentials.rb +13 -9
  30. data/lib/morpheus/cli/deploy.rb +374 -0
  31. data/lib/morpheus/cli/deployments.rb +521 -197
  32. data/lib/morpheus/cli/deploys.rb +271 -126
  33. data/lib/morpheus/cli/doc.rb +182 -0
  34. data/lib/morpheus/cli/error_handler.rb +23 -8
  35. data/lib/morpheus/cli/errors.rb +3 -2
  36. data/lib/morpheus/cli/image_builder_command.rb +2 -2
  37. data/lib/morpheus/cli/instances.rb +136 -17
  38. data/lib/morpheus/cli/invoices_command.rb +339 -225
  39. data/lib/morpheus/cli/jobs_command.rb +2 -2
  40. data/lib/morpheus/cli/library_layouts_command.rb +1 -1
  41. data/lib/morpheus/cli/library_option_lists_command.rb +61 -125
  42. data/lib/morpheus/cli/library_option_types_command.rb +32 -37
  43. data/lib/morpheus/cli/login.rb +9 -3
  44. data/lib/morpheus/cli/mixins/accounts_helper.rb +158 -100
  45. data/lib/morpheus/cli/mixins/backups_helper.rb +115 -0
  46. data/lib/morpheus/cli/mixins/deployments_helper.rb +135 -0
  47. data/lib/morpheus/cli/mixins/library_helper.rb +32 -0
  48. data/lib/morpheus/cli/mixins/option_source_helper.rb +1 -1
  49. data/lib/morpheus/cli/mixins/print_helper.rb +149 -84
  50. data/lib/morpheus/cli/mixins/provisioning_helper.rb +2 -2
  51. data/lib/morpheus/cli/mixins/whoami_helper.rb +19 -6
  52. data/lib/morpheus/cli/network_routers_command.rb +1 -1
  53. data/lib/morpheus/cli/option_parser.rb +48 -5
  54. data/lib/morpheus/cli/option_types.rb +46 -10
  55. data/lib/morpheus/cli/price_sets_command.rb +1 -1
  56. data/lib/morpheus/cli/projects_command.rb +7 -7
  57. data/lib/morpheus/cli/remote.rb +3 -2
  58. data/lib/morpheus/cli/roles.rb +49 -92
  59. data/lib/morpheus/cli/security_groups.rb +7 -1
  60. data/lib/morpheus/cli/service_plans_command.rb +10 -10
  61. data/lib/morpheus/cli/setup.rb +1 -1
  62. data/lib/morpheus/cli/shell.rb +7 -6
  63. data/lib/morpheus/cli/subnets_command.rb +1 -1
  64. data/lib/morpheus/cli/tasks.rb +24 -10
  65. data/lib/morpheus/cli/tenants_command.rb +133 -163
  66. data/lib/morpheus/cli/user_groups_command.rb +20 -65
  67. data/lib/morpheus/cli/user_settings_command.rb +115 -13
  68. data/lib/morpheus/cli/user_sources_command.rb +57 -24
  69. data/lib/morpheus/cli/users.rb +210 -186
  70. data/lib/morpheus/cli/version.rb +1 -1
  71. data/lib/morpheus/cli/whitelabel_settings_command.rb +29 -5
  72. data/lib/morpheus/cli/whoami.rb +113 -6
  73. data/lib/morpheus/cli/workflows.rb +11 -8
  74. data/lib/morpheus/ext/hash.rb +21 -0
  75. data/lib/morpheus/formatters.rb +7 -19
  76. data/lib/morpheus/terminal.rb +1 -0
  77. metadata +12 -3
  78. data/lib/morpheus/cli/auth_command.rb +0 -105
@@ -25,19 +25,24 @@ class Morpheus::Cli::UserGroupsCommand
25
25
  options = {}
26
26
  params = {}
27
27
  optparse = Morpheus::Cli::OptionParser.new do |opts|
28
- opts.banner = subcommand_usage()
29
- build_common_options(opts, options, [:list, :json, :yaml, :csv, :fields, :dry_run, :remote])
28
+ opts.banner = subcommand_usage("[search phrase]")
29
+ build_standard_list_options(opts, options)
30
+ opts.footer = "List user groups."
30
31
  end
31
32
  optparse.parse!(args)
33
+ # verify_args!(args:args, optparse:optparse, count:0)
34
+ options[:phrase] = args.join(" ") if args.count > 0
32
35
  connect(options)
33
- begin
34
- params.merge!(parse_list_options(options))
35
- @user_groups_interface.setopts(options)
36
- if options[:dry_run]
37
- print_dry_run @user_groups_interface.dry.list(nil, params)
38
- return
39
- end
40
- json_response = @user_groups_interface.list(nil, params)
36
+
37
+ params.merge!(parse_list_options(options))
38
+ @user_groups_interface.setopts(options)
39
+ if options[:dry_run]
40
+ print_dry_run @user_groups_interface.dry.list(nil, params)
41
+ return
42
+ end
43
+ json_response = @user_groups_interface.list(nil, params)
44
+
45
+ render_response(json_response, options, "userGroups") do
41
46
  if options[:json]
42
47
  puts as_json(json_response, options, "userGroups")
43
48
  return 0
@@ -56,15 +61,13 @@ class Morpheus::Cli::UserGroupsCommand
56
61
  if user_groups.empty?
57
62
  print cyan,"No user groups found.",reset,"\n"
58
63
  else
59
- print_user_groups_table(user_groups, options)
60
- print_results_pagination(json_response, {:label => "user group", :n_label => "user groups"})
61
- # print_results_pagination(json_response)
64
+ print cyan
65
+ print as_pretty_table(user_groups, list_user_group_column_definitions, options)
66
+ print_results_pagination(json_response)
62
67
  end
63
68
  print reset,"\n"
64
- rescue RestClient::Exception => e
65
- print_rest_exception(e, options)
66
- exit 1
67
69
  end
70
+ return 0, nil
68
71
  end
69
72
 
70
73
  def get(args)
@@ -113,18 +116,7 @@ class Morpheus::Cli::UserGroupsCommand
113
116
 
114
117
  print_h1 "User Group Details"
115
118
  print cyan
116
- description_cols = {
117
- "ID" => lambda {|it| it['id'] },
118
- #"Account" => lambda {|it| it['account'] ? it['account']['name'] : '' },
119
- "Name" => lambda {|it| it['name'] },
120
- "Description" => lambda {|it| it['description'] },
121
- "Server Group" => lambda {|it| it['serverGroup'] },
122
- "Sudo Access" => lambda {|it| format_boolean it['sudoAccess'] },
123
- # "Shared User" => lambda {|it| format_boolean it['sharedUser'] },
124
- "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
125
- "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
126
- }
127
- print_description_list(description_cols, user_group)
119
+ print_description_list(user_group_column_definitions, user_group, options)
128
120
 
129
121
  ## Users
130
122
  print_h2 "Users (#{users.size})"
@@ -518,41 +510,4 @@ class Morpheus::Cli::UserGroupsCommand
518
510
  print as_pretty_table(user_groups, columns, opts)
519
511
  end
520
512
 
521
- def find_user_group_by_name_or_id(account_id, val)
522
- if val.to_s =~ /\A\d{1,}\Z/
523
- return find_user_group_by_id(account_id, val)
524
- else
525
- return find_user_group_by_name(account_id, val)
526
- end
527
- end
528
-
529
- def find_user_group_by_id(account_id, id)
530
- begin
531
- json_response = @user_groups_interface.get(account_id, id.to_i)
532
- return json_response['userGroup']
533
- rescue RestClient::Exception => e
534
- if e.response && e.response.code == 404
535
- print_red_alert "User Group not found by id #{id}"
536
- else
537
- raise e
538
- end
539
- end
540
- end
541
-
542
- def find_user_group_by_name(account_id, name)
543
- user_groups = @user_groups_interface.list(account_id, {name: name.to_s})['userGroups']
544
- if user_groups.empty?
545
- print_red_alert "User Group not found by name #{name}"
546
- return nil
547
- elsif user_groups.size > 1
548
- print_red_alert "#{user_groups.size} user groups found by name #{name}"
549
- print_user_groups_table(user_groups, {color: red})
550
- print_red_alert "Try using ID instead"
551
- print reset,"\n"
552
- return nil
553
- else
554
- return user_groups[0]
555
- end
556
- end
557
-
558
513
  end
@@ -2,6 +2,7 @@ require 'morpheus/cli/cli_command'
2
2
 
3
3
  class Morpheus::Cli::UserSettingsCommand
4
4
  include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::AccountsHelper
5
6
 
6
7
  set_command_name :'user-settings'
7
8
 
@@ -16,6 +17,7 @@ class Morpheus::Cli::UserSettingsCommand
16
17
  def connect(opts)
17
18
  @api_client = establish_remote_appliance_connection(opts)
18
19
  @user_settings_interface = @api_client.user_settings
20
+ @users_interface = @api_client.users
19
21
  end
20
22
 
21
23
  def handle(args)
@@ -28,11 +30,18 @@ class Morpheus::Cli::UserSettingsCommand
28
30
  params = {}
29
31
  optparse = Morpheus::Cli::OptionParser.new do |opts|
30
32
  opts.banner = subcommand_usage()
33
+ opts.on("-u", "--user USER", "User username or ID") do |val|
34
+ options[:user] = val.to_s
35
+ end
31
36
  opts.on("--user-id ID", String, "User ID") do |val|
32
37
  params['userId'] = val.to_s
33
38
  end
39
+ #opts.add_hidden_option('--user-id')
34
40
  build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :dry_run, :remote])
35
- opts.footer = "Get your user settings."
41
+ opts.footer = <<-EOT
42
+ Get user settings.
43
+ Done for the current user by default, unless a user is specified with the --user option.
44
+ EOT
36
45
  end
37
46
  optparse.parse!(args)
38
47
  connect(options)
@@ -43,6 +52,11 @@ class Morpheus::Cli::UserSettingsCommand
43
52
  end
44
53
 
45
54
  begin
55
+ if options[:user]
56
+ user = find_user_by_username_or_id(nil, options[:user], {global:true})
57
+ return 1 if user.nil?
58
+ params['userId'] = user['id']
59
+ end
46
60
  params.merge!(parse_list_options(options))
47
61
  @user_settings_interface.setopts(options)
48
62
  if options[:dry_run]
@@ -89,11 +103,16 @@ class Morpheus::Cli::UserSettingsCommand
89
103
  #"ID" => lambda {|it| it['id'] },
90
104
  "CLIENT ID" => lambda {|it| it['clientId'] },
91
105
  "USERNAME" => lambda {|it| it['username'] },
106
+ "ACCESS TOKEN" => lambda {|it| it['maskedAccessToken'] },
107
+ "REFRESH TOKEN" => lambda {|it| it['maskedRefreshToken'] },
92
108
  "EXPIRATION" => lambda {|it| format_local_dt(it['expiration']) },
93
109
  "TTL" => lambda {|it| it['expiration'] ? (format_duration(it['expiration']) rescue '') : '' }
94
110
  }
95
111
  print cyan
96
112
  puts as_pretty_table(access_tokens, cols)
113
+ else
114
+ #print "\n"
115
+ print cyan, "\n", "No API access tokens found", "\n\n"
97
116
  end
98
117
 
99
118
  print reset #, "\n"
@@ -111,11 +130,18 @@ class Morpheus::Cli::UserSettingsCommand
111
130
  params = {}
112
131
  optparse = Morpheus::Cli::OptionParser.new do |opts|
113
132
  opts.banner = subcommand_usage("[options]")
133
+ opts.on("-u", "--user USER", "User username or ID") do |val|
134
+ options[:user] = val.to_s
135
+ end
114
136
  opts.on("--user-id ID", String, "User ID") do |val|
115
137
  params['userId'] = val.to_s
116
138
  end
139
+ #opts.add_hidden_option('--user-id')
117
140
  build_common_options(opts, options, [:payload, :options, :json, :dry_run, :quiet, :remote])
118
- opts.footer = "Update your user settings."
141
+ opts.footer = <<-EOT
142
+ Update user settings.
143
+ Done for the current user by default, unless a user is specified with the --user option.
144
+ EOT
119
145
  end
120
146
  optparse.parse!(args)
121
147
  connect(options)
@@ -126,6 +152,11 @@ class Morpheus::Cli::UserSettingsCommand
126
152
  end
127
153
 
128
154
  begin
155
+ if options[:user]
156
+ user = find_user_by_username_or_id(nil, options[:user], {global:true})
157
+ return 1 if user.nil?
158
+ params['userId'] = user['id']
159
+ end
129
160
  payload = {}
130
161
  if options[:payload]
131
162
  payload = options[:payload]
@@ -165,12 +196,19 @@ class Morpheus::Cli::UserSettingsCommand
165
196
  params = {}
166
197
  optparse = Morpheus::Cli::OptionParser.new do |opts|
167
198
  opts.banner = subcommand_usage("[file]")
199
+ opts.on("-u", "--user USER", "User username or ID") do |val|
200
+ options[:user] = val.to_s
201
+ end
168
202
  opts.on("--user-id ID", String, "User ID") do |val|
169
203
  params['userId'] = val.to_s
170
204
  end
205
+ #opts.add_hidden_option('--user-id')
171
206
  build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
172
- opts.footer = "Update your avatar profile image.\n" +
173
- "[file] is required. This is the local path of a file to upload [png|jpg|svg]."
207
+ opts.footer = <<-EOT
208
+ Update avatar profile image.
209
+ [file] is required. This is the local path of a file to upload [png|jpg|svg].
210
+ Done for the current user by default, unless a user is specified with the --user option.
211
+ EOT
174
212
  end
175
213
  optparse.parse!(args)
176
214
  connect(options)
@@ -191,6 +229,11 @@ class Morpheus::Cli::UserSettingsCommand
191
229
  end
192
230
 
193
231
  begin
232
+ if options[:user]
233
+ user = find_user_by_username_or_id(nil, options[:user], {global:true})
234
+ return 1 if user.nil?
235
+ params['userId'] = user['id']
236
+ end
194
237
  @user_settings_interface.setopts(options)
195
238
  if options[:dry_run]
196
239
  print_dry_run @user_settings_interface.dry.update_avatar(image_file, params)
@@ -219,11 +262,19 @@ class Morpheus::Cli::UserSettingsCommand
219
262
  params = {}
220
263
  optparse = Morpheus::Cli::OptionParser.new do |opts|
221
264
  opts.banner = subcommand_usage()
265
+ opts.on("-u", "--user USER", "User username or ID") do |val|
266
+ options[:user] = val.to_s
267
+ end
222
268
  opts.on("--user-id ID", String, "User ID") do |val|
223
269
  params['userId'] = val.to_s
224
270
  end
271
+ #opts.add_hidden_option('--user-id')
225
272
  build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
226
- opts.footer = "Remove your avatar profile image."
273
+ opts.footer = <<-EOT
274
+ Remove avatar profile image.
275
+ [file] is required. This is the local path of a file to upload [png|jpg|svg].
276
+ Done for the current user by default, unless a user is specified with the --user option.
277
+ EOT
227
278
  end
228
279
  optparse.parse!(args)
229
280
  connect(options)
@@ -234,6 +285,11 @@ class Morpheus::Cli::UserSettingsCommand
234
285
  end
235
286
 
236
287
  begin
288
+ if options[:user]
289
+ user = find_user_by_username_or_id(nil, options[:user], {global:true})
290
+ return 1 if user.nil?
291
+ params['userId'] = user['id']
292
+ end
237
293
  @user_settings_interface.setopts(options)
238
294
  if options[:dry_run]
239
295
  print_dry_run @user_settings_interface.dry.remove_avatar(params)
@@ -263,12 +319,19 @@ class Morpheus::Cli::UserSettingsCommand
263
319
  params = {}
264
320
  optparse = Morpheus::Cli::OptionParser.new do |opts|
265
321
  opts.banner = subcommand_usage()
322
+ opts.on("-u", "--user USER", "User username or ID") do |val|
323
+ options[:user] = val.to_s
324
+ end
266
325
  opts.on("--user-id ID", String, "User ID") do |val|
267
326
  params['userId'] = val.to_s
268
327
  end
328
+ #opts.add_hidden_option('--user-id')
269
329
  build_common_options(opts, options, [:remote])
270
- opts.footer = "View your avatar profile image.\n" +
271
- "This opens the avatar image url with a web browser."
330
+ opts.footer = <<-EOT
331
+ View avatar profile image.
332
+ This opens the avatar image url with a web browser.
333
+ Done for the current user by default, unless a user is specified with the --user option.
334
+ EOT
272
335
  end
273
336
  optparse.parse!(args)
274
337
  connect(options)
@@ -279,7 +342,11 @@ class Morpheus::Cli::UserSettingsCommand
279
342
  end
280
343
 
281
344
  begin
282
-
345
+ if options[:user]
346
+ user = find_user_by_username_or_id(nil, options[:user], {global:true})
347
+ return 1 if user.nil?
348
+ params['userId'] = user['id']
349
+ end
283
350
  json_response = @user_settings_interface.get(params)
284
351
  user_settings = json_response['user'] || json_response['userSettings']
285
352
 
@@ -310,12 +377,19 @@ class Morpheus::Cli::UserSettingsCommand
310
377
  params = {}
311
378
  optparse = Morpheus::Cli::OptionParser.new do |opts|
312
379
  opts.banner = subcommand_usage("[client-id]")
380
+ opts.on("-u", "--user USER", "User username or ID") do |val|
381
+ options[:user] = val.to_s
382
+ end
313
383
  opts.on("--user-id ID", String, "User ID") do |val|
314
384
  params['userId'] = val.to_s
315
385
  end
386
+ #opts.add_hidden_option('--user-id')
316
387
  build_common_options(opts, options, [:payload, :options, :json, :dry_run, :quiet, :remote])
317
- opts.footer = "Regenerate API access token for a specific client.\n" +
318
- "[client-id] is required. This is the id of an api client."
388
+ opts.footer = <<-EOT
389
+ Regenerate API access token for a specific client.
390
+ [client-id] is required. This is the id of an api client.
391
+ Done for the current user by default, unless a user is specified with the --user option.
392
+ EOT
319
393
  end
320
394
  optparse.parse!(args)
321
395
  connect(options)
@@ -326,6 +400,11 @@ class Morpheus::Cli::UserSettingsCommand
326
400
  end
327
401
  params['clientId'] = args[0]
328
402
  begin
403
+ if options[:user]
404
+ user = find_user_by_username_or_id(nil, options[:user], {global:true})
405
+ return 1 if user.nil?
406
+ params['userId'] = user['id']
407
+ end
329
408
  payload = {}
330
409
  @user_settings_interface.setopts(options)
331
410
  if options[:dry_run]
@@ -374,12 +453,19 @@ class Morpheus::Cli::UserSettingsCommand
374
453
  # opts.on("--client-id", "Client ID. eg. morph-api, morph-cli") do |val|
375
454
  # params['clientId'] = val.to_s
376
455
  # end
456
+ opts.on("-u", "--user USER", "User username or ID") do |val|
457
+ options[:user] = val.to_s
458
+ end
377
459
  opts.on("--user-id ID", String, "User ID") do |val|
378
460
  params['userId'] = val.to_s
379
461
  end
462
+ #opts.add_hidden_option('--user-id')
380
463
  build_common_options(opts, options, [:payload, :options, :json, :dry_run, :quiet, :remote])
381
- opts.footer = "Clear API access token for a specific client.\n" +
382
- "[client-id] or --all is required. This is the id of an api client."
464
+ opts.footer = <<-EOT
465
+ Clear API access token for a specific client.
466
+ [client-id] or --all is required. This is the id of an api client.
467
+ Done for the current user by default, unless a user is specified with the --user option.
468
+ EOT
383
469
  end
384
470
  optparse.parse!(args)
385
471
  connect(options)
@@ -397,6 +483,11 @@ class Morpheus::Cli::UserSettingsCommand
397
483
  # clears all when clientId is omitted, no api parameter needed.
398
484
  end
399
485
  begin
486
+ if options[:user]
487
+ user = find_user_by_username_or_id(nil, options[:user], {global:true})
488
+ return 1 if user.nil?
489
+ params['userId'] = user['id']
490
+ end
400
491
  payload = {}
401
492
  @user_settings_interface.setopts(options)
402
493
  if options[:dry_run]
@@ -445,11 +536,17 @@ class Morpheus::Cli::UserSettingsCommand
445
536
  params = {}
446
537
  optparse = Morpheus::Cli::OptionParser.new do |opts|
447
538
  opts.banner = subcommand_usage()
539
+ # opts.on("-u", "--user USER", "User username or ID") do |val|
540
+ # options[:user] = val.to_s
541
+ # end
448
542
  # opts.on("--user-id ID", String, "User ID") do |val|
449
543
  # params['userId'] = val.to_s
450
544
  # end
545
+ # #opts.add_hidden_option('--user-id')
451
546
  build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :dry_run, :remote])
452
- opts.footer = "List available api clients."
547
+ opts.footer = <<-EOT
548
+ List available api clients.
549
+ EOT
453
550
  end
454
551
  optparse.parse!(args)
455
552
  connect(options)
@@ -460,6 +557,11 @@ class Morpheus::Cli::UserSettingsCommand
460
557
  end
461
558
 
462
559
  begin
560
+ # if options[:user]
561
+ # user = find_user_by_username_or_id(nil, options[:user], {global:true})
562
+ # return 1 if user.nil?
563
+ # params['userId'] = user['id']
564
+ # end
463
565
  params.merge!(parse_list_options(options))
464
566
  @user_settings_interface.setopts(options)
465
567
  if options[:dry_run]
@@ -36,9 +36,13 @@ class Morpheus::Cli::UserSourcesCommand
36
36
  account_id = nil
37
37
  optparse = Morpheus::Cli::OptionParser.new do |opts|
38
38
  opts.banner = subcommand_usage()
39
- opts.on('--account ID', String, "Filter by Tenant") do |val|
39
+ opts.on( '--tenant TENANT', String, "Filter by Tenant" ) do |val|
40
40
  account_id = val
41
41
  end
42
+ opts.on( '-a', '--account ACCOUNT', "Filter by Tenant" ) do |val|
43
+ account_id = val
44
+ end
45
+ opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
42
46
  # opts.on('--technology VALUE', String, "Filter by technology") do |val|
43
47
  # params['provisionType'] = val
44
48
  # end
@@ -175,13 +179,15 @@ class Morpheus::Cli::UserSourcesCommand
175
179
  #"Subdomain" => lambda {|it| it['subdomain'] },
176
180
  "Login URL" => lambda {|it| it['loginURL'] },
177
181
  "Default Role" => lambda {|it| it['defaultAccountRole'] ? it['defaultAccountRole']['authority'] : '' },
182
+ "External Login" => lambda {|it| format_boolean it['externalLogin'] },
183
+ "Allow Custom Mappings" => lambda {|it| format_boolean it['allowCustomMappings'] },
178
184
  "Active" => lambda {|it| format_boolean it['active'] },
179
185
  }
180
186
  print_description_list(description_cols, user_source)
181
187
 
182
188
  # show config settings...
183
189
  user_source_config = user_source['config']
184
- print_h2 "#{user_source['type']} Configuration"
190
+ print_h2 "User Source Config (#{user_source['type']})"
185
191
  if user_source_config
186
192
  columns = user_source_config.keys #.sort
187
193
  print_description_list(columns, user_source_config)
@@ -223,9 +229,13 @@ class Morpheus::Cli::UserSourcesCommand
223
229
  default_role_id = nil
224
230
  optparse = Morpheus::Cli::OptionParser.new do|opts|
225
231
  opts.banner = subcommand_usage("[account] [name]")
226
- opts.on('--account ID', String, "Tenant this user source belongs to") do |val|
232
+ opts.on( '--tenant TENANT', String, "Tenant Name or ID the user source will belong to, default is your own." ) do |val|
227
233
  account_id = val
228
234
  end
235
+ opts.on( '-a', '--account ACCOUNT', "Tenant Name or ID the user source will belong to, default is your own." ) do |val|
236
+ account_id = val
237
+ end
238
+ opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
229
239
  opts.on('--type CODE', String, "User Source Type") do |val|
230
240
  type_code = val
231
241
  end
@@ -235,6 +245,13 @@ class Morpheus::Cli::UserSourcesCommand
235
245
  opts.on('--description VALUE', String, "Description") do |val|
236
246
  params['description'] = val
237
247
  end
248
+ opts.on("--allow-custom-mappings [on|off]", ['on','off'], "Allow Custom Mappings, Enable Role Mapping Permissions") do |val|
249
+ params['allowCustomMappings'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
250
+ end
251
+ opts.on("--allowCustomMappings [on|off]", ['on','off'], "Allow Custom Mappings, Enable Role Mapping Permissions") do |val|
252
+ params['allowCustomMappings'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
253
+ end
254
+ opts.add_hidden_option('--allowCustomMappings')
238
255
  opts.on('--role-mappings MAPPINGS', String, "Role Mappings FQN in the format id1:FQN1,id2:FQN2") do |val|
239
256
  role_mappings = {}
240
257
  val.split(',').collect {|it| it.strip.split(':') }.each do |pair|
@@ -258,7 +275,7 @@ class Morpheus::Cli::UserSourcesCommand
258
275
  default_role_id = val
259
276
  end
260
277
  #build_option_type_options(opts, options, add_user_source_option_types())
261
- build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
278
+ build_standard_add_options(opts, options)
262
279
  opts.footer = "Create a new user source." + "\n" +
263
280
  "[account] is required. This is the name or id of an account."
264
281
  end
@@ -275,7 +292,9 @@ class Morpheus::Cli::UserSourcesCommand
275
292
  if args[1]
276
293
  params['name'] = args[1]
277
294
  end
278
- begin
295
+
296
+
297
+
279
298
  # find the account first, or just prompt for that too please.
280
299
  if !account_id
281
300
  print_error Morpheus::Terminal.angry_prompt
@@ -287,11 +306,12 @@ class Morpheus::Cli::UserSourcesCommand
287
306
  account_id = account['id']
288
307
 
289
308
  # construct payload
290
- payload = nil
309
+ payload = {}
291
310
  if options[:payload]
292
311
  payload = options[:payload]
312
+ payload.deep_merge!({'userSource' => parse_passed_options(options)})
293
313
  else
294
- payload = {'userSource' => {}}
314
+ payload.deep_merge!({'userSource' => parse_passed_options(options)})
295
315
 
296
316
  # User Source Type
297
317
  user_source_types = @user_sources_interface.list_types({userSelectable: true})['userSourceTypes']
@@ -339,6 +359,13 @@ class Morpheus::Cli::UserSourcesCommand
339
359
  payload['userSource']['defaultAccountRole'] = {'id' => default_role_id }
340
360
  end
341
361
 
362
+ # Allow Custom Mappings
363
+ if !params['allowCustomMappings'].nil?
364
+ payload['userSource']['allowCustomMappings'] = ["on","true"].include?(params['allowCustomMappings'].to_s)
365
+ else
366
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'allowCustomMappings', 'type' => 'checkbox', 'fieldLabel' => 'Allow Custom Mappings', 'defaultValue' => false}], options[:options])
367
+ payload['userSource']['allowCustomMappings'] = ["on","true"].include?(v_prompt['allowCustomMappings'].to_s)
368
+ end
342
369
 
343
370
  if role_mappings
344
371
  payload['roleMappings'] = role_mappings
@@ -367,12 +394,8 @@ class Morpheus::Cli::UserSourcesCommand
367
394
  end
368
395
  user_source = json_response['userSource']
369
396
  print_green_success "Added User Source #{user_source['name']}"
370
- get([user_source['id']])
397
+ get([user_source['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
371
398
  return 0
372
- rescue RestClient::Exception => e
373
- print_rest_exception(e, options)
374
- exit 1
375
- end
376
399
  end
377
400
 
378
401
  def update(args)
@@ -389,6 +412,13 @@ class Morpheus::Cli::UserSourcesCommand
389
412
  opts.on('--description VALUE', String, "Description") do |val|
390
413
  params['description'] = val
391
414
  end
415
+ opts.on("--allow-custom-mappings [on|off]", ['on','off'], "Allow Custom Mappings, Enable Role Mapping Permissions") do |val|
416
+ params['allowCustomMappings'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
417
+ end
418
+ opts.on("--allowCustomMappings [on|off]", ['on','off'], "Allow Custom Mappings, Enable Role Mapping Permissions") do |val|
419
+ params['allowCustomMappings'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
420
+ end
421
+ opts.add_hidden_option('--allowCustomMappings')
392
422
  opts.on('--role-mappings MAPPINGS', String, "Role Mappings in the format id1:FQN,id2:FQN2") do |val|
393
423
  role_mappings = {}
394
424
  val.split(',').collect {|it| it.strip.split(':') }.each do |pair|
@@ -407,7 +437,7 @@ class Morpheus::Cli::UserSourcesCommand
407
437
  end
408
438
  end
409
439
  end
410
- build_common_options(opts, options, [:options, :json, :dry_run, :remote])
440
+ build_standard_update_options(opts, options)
411
441
  opts.footer = "Update a user source." + "\n" +
412
442
  "[name] is required. This is the name or id of a user source."
413
443
  end
@@ -420,11 +450,12 @@ class Morpheus::Cli::UserSourcesCommand
420
450
  begin
421
451
  user_source = find_user_source_by_name_or_id(nil, args[0])
422
452
  exit 1 if user_source.nil?
423
- payload = nil
453
+ payload = {}
424
454
  if options[:payload]
425
455
  payload = options[:payload]
456
+ payload.deep_merge!({'userSource' => parse_passed_options(options)})
426
457
  else
427
- payload = {'userSource' => {}}
458
+ payload.deep_merge!({'userSource' => parse_passed_options(options)})
428
459
 
429
460
  # Name
430
461
  if params['name']
@@ -436,6 +467,11 @@ class Morpheus::Cli::UserSourcesCommand
436
467
  payload['userSource']['description'] = params['description']
437
468
  end
438
469
 
470
+ # Allow Custom Mappings
471
+ if !params['allowCustomMappings'].nil?
472
+ payload['userSource']['allowCustomMappings'] = params['allowCustomMappings']
473
+ end
474
+
439
475
  if role_mappings
440
476
  payload['roleMappings'] = role_mappings
441
477
  end
@@ -444,9 +480,6 @@ class Morpheus::Cli::UserSourcesCommand
444
480
  payload['roleMappingNames'] = role_mapping_names
445
481
  end
446
482
 
447
- # support old -O options
448
- payload['userSource'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
449
-
450
483
  end
451
484
  @user_sources_interface.setopts(options)
452
485
  if options[:dry_run]
@@ -462,7 +495,7 @@ class Morpheus::Cli::UserSourcesCommand
462
495
  end
463
496
 
464
497
  print_green_success "Updated User Source #{params['name'] || user_source['name']}"
465
- get([user_source['id']])
498
+ get([user_source['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
466
499
  rescue RestClient::Exception => e
467
500
  print_rest_exception(e, options)
468
501
  exit 1
@@ -512,7 +545,7 @@ class Morpheus::Cli::UserSourcesCommand
512
545
  end
513
546
 
514
547
  print_green_success "Activated User Source #{user_source['name']}"
515
- get([user_source['id']])
548
+ get([user_source['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
516
549
  rescue RestClient::Exception => e
517
550
  print_rest_exception(e, options)
518
551
  exit 1
@@ -562,7 +595,7 @@ class Morpheus::Cli::UserSourcesCommand
562
595
  end
563
596
 
564
597
  print_green_success "Activated User Source #{user_source['name']}"
565
- get([user_source['id']])
598
+ get([user_source['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
566
599
  rescue RestClient::Exception => e
567
600
  print_rest_exception(e, options)
568
601
  exit 1
@@ -612,9 +645,9 @@ class Morpheus::Cli::UserSourcesCommand
612
645
  puts JSON.pretty_generate(json_response)
613
646
  return
614
647
  end
615
-
616
- print_green_success "Activated User Source #{user_source['name']}"
617
- get([user_source['id']])
648
+ # JD: uhh this updates the account too, it cannot be set per user source ...yet
649
+ print_green_success "Updated User Source #{user_source['name']} subdomain to '#{payload['subdomain']}'"
650
+ get([user_source['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
618
651
  rescue RestClient::Exception => e
619
652
  print_rest_exception(e, options)
620
653
  exit 1