morpheus-cli 4.2.18 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +14 -0
  4. data/lib/morpheus/api/billing_interface.rb +33 -0
  5. data/lib/morpheus/api/catalog_item_types_interface.rb +9 -0
  6. data/lib/morpheus/api/rest_interface.rb +0 -6
  7. data/lib/morpheus/api/roles_interface.rb +14 -0
  8. data/lib/morpheus/cli.rb +2 -2
  9. data/lib/morpheus/cli/apps.rb +3 -4
  10. data/lib/morpheus/cli/backup_jobs_command.rb +3 -0
  11. data/lib/morpheus/cli/backups_command.rb +3 -0
  12. data/lib/morpheus/cli/blueprints_command.rb +27 -61
  13. data/lib/morpheus/cli/budgets_command.rb +4 -4
  14. data/lib/morpheus/cli/catalog_command.rb +507 -0
  15. data/lib/morpheus/cli/cli_command.rb +30 -15
  16. data/lib/morpheus/cli/cloud_resource_pools_command.rb +16 -0
  17. data/lib/morpheus/cli/clouds.rb +7 -10
  18. data/lib/morpheus/cli/commands/standard/curl_command.rb +23 -7
  19. data/lib/morpheus/cli/commands/standard/source_command.rb +1 -1
  20. data/lib/morpheus/cli/commands/standard/update_command.rb +76 -0
  21. data/lib/morpheus/cli/containers_command.rb +14 -0
  22. data/lib/morpheus/cli/deployments.rb +1 -1
  23. data/lib/morpheus/cli/hosts.rb +30 -2
  24. data/lib/morpheus/cli/instances.rb +19 -1
  25. data/lib/morpheus/cli/invoices_command.rb +8 -9
  26. data/lib/morpheus/cli/jobs_command.rb +30 -8
  27. data/lib/morpheus/cli/library_instance_types_command.rb +17 -3
  28. data/lib/morpheus/cli/library_option_lists_command.rb +14 -6
  29. data/lib/morpheus/cli/mixins/accounts_helper.rb +7 -6
  30. data/lib/morpheus/cli/mixins/backups_helper.rb +2 -4
  31. data/lib/morpheus/cli/mixins/catalog_helper.rb +66 -0
  32. data/lib/morpheus/cli/mixins/deployments_helper.rb +0 -1
  33. data/lib/morpheus/cli/mixins/option_source_helper.rb +1 -1
  34. data/lib/morpheus/cli/mixins/print_helper.rb +46 -0
  35. data/lib/morpheus/cli/network_pools_command.rb +14 -6
  36. data/lib/morpheus/cli/ping.rb +0 -1
  37. data/lib/morpheus/cli/projects_command.rb +7 -7
  38. data/lib/morpheus/cli/provisioning_licenses_command.rb +2 -2
  39. data/lib/morpheus/cli/remote.rb +0 -2
  40. data/lib/morpheus/cli/roles.rb +305 -3
  41. data/lib/morpheus/cli/service_plans_command.rb +2 -2
  42. data/lib/morpheus/cli/storage_providers_command.rb +40 -56
  43. data/lib/morpheus/cli/tasks.rb +24 -10
  44. data/lib/morpheus/cli/tenants_command.rb +1 -1
  45. data/lib/morpheus/cli/usage_command.rb +150 -0
  46. data/lib/morpheus/cli/user_settings_command.rb +1 -0
  47. data/lib/morpheus/cli/users.rb +12 -1
  48. data/lib/morpheus/cli/version.rb +1 -1
  49. data/lib/morpheus/cli/workflows.rb +12 -9
  50. data/lib/morpheus/formatters.rb +26 -5
  51. metadata +8 -2
@@ -199,7 +199,6 @@ EOT
199
199
  "Version" => lambda {|it| appliance[:build_version] },
200
200
  # "Active" => lambda {|it| it[:active] ? "Yes " + format_is_current() : "No" },
201
201
  "Response Time" => lambda {|it| format_duration_seconds(took_sec) },
202
- #"Response Time" => lambda {|it| format_sig_dig(took_sec, 3) + "s" rescue "" },
203
202
  # "Error" => lambda {|it| error_string },
204
203
  "Status" => lambda {|it| format_appliance_status(appliance, cyan) },
205
204
  }
@@ -102,7 +102,7 @@ EOT
102
102
  options = {}
103
103
  optparse = Morpheus::Cli::OptionParser.new do |opts|
104
104
  opts.banner = subcommand_usage("[project]")
105
- build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
105
+ build_standard_get_options(opts, options, [:find_by_name])
106
106
  opts.footer = <<-EOT
107
107
  Get details about a project.
108
108
  [project] is required. This is the name or id of a project.
@@ -127,8 +127,8 @@ EOT
127
127
  end
128
128
  return
129
129
  end
130
- project = find_project_by_name_or_id(id)
131
- exit 1 if project.nil?
130
+ project = options[:find_by_name] ? find_project_by_name(id) : find_project_by_name_or_id(id)
131
+ return 1, "project not found by '#{id}'" if project.nil?
132
132
  # refetch it by id
133
133
  json_response = {'project' => project}
134
134
  unless id.to_s =~ /\A\d{1,}\Z/
@@ -332,7 +332,7 @@ EOT
332
332
  opts.on('--remove-resources LIST', Array, "Remove Resources, comma separated list of resource names or IDs to remove.") do |list|
333
333
  remove_resource_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
334
334
  end
335
- build_standard_update_options(opts, options)
335
+ build_standard_update_options(opts, options, [:find_by_name])
336
336
  opts.footer = <<-EOT
337
337
  Update a project.
338
338
  [project] is required. This is the name or id of a project.
@@ -342,7 +342,7 @@ EOT
342
342
  verify_args!(args:args, optparse:optparse, count:1)
343
343
  connect(options)
344
344
  exit_code, err = 0, nil
345
- project = find_project_by_name_or_id(args[0])
345
+ project = options[:find_by_name] ? find_project_by_name(args[0]) : find_project_by_name_or_id(args[0])
346
346
  return 1, "project not found by '#{args[0]}'" if project.nil?
347
347
  # construct payload
348
348
  if options[:payload]
@@ -433,7 +433,7 @@ EOT
433
433
  options = {}
434
434
  optparse = Morpheus::Cli::OptionParser.new do |opts|
435
435
  opts.banner = subcommand_usage("[project]")
436
- build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
436
+ build_standard_remove_options(opts, options, [:find_by_name])
437
437
  # opts.on( '-f', '--force', "Force Delete" ) do
438
438
  # params[:force] = true
439
439
  # end
@@ -446,7 +446,7 @@ EOT
446
446
  verify_args!(args:args, optparse:optparse, count:1)
447
447
  connect(options)
448
448
  exit_code, err = 0, nil
449
- project = find_project_by_name_or_id(args[0])
449
+ project = options[:find_by_name] ? find_project_by_name(args[0]) : find_project_by_name_or_id(args[0])
450
450
  return 1, "project not found by '#{args[0]}'" if project.nil?
451
451
  unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the project #{project['name']}?")
452
452
  return 9, "aborted command"
@@ -478,7 +478,7 @@ class Morpheus::Cli::ProvisioningLicensesCommand
478
478
 
479
479
  def add_license_option_types
480
480
  [
481
- {'fieldName' => 'licenseType', 'fieldLabel' => 'License Type', 'type' => 'select', 'optionSource' => lambda {
481
+ {'fieldName' => 'licenseType', 'fieldLabel' => 'License Type', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
482
482
  # @options_interface.options_for_source("licenseTypes", {})['data']
483
483
  get_license_types_dropdown()
484
484
  }, 'required' => true, 'displayOrder' => 1},
@@ -493,7 +493,7 @@ class Morpheus::Cli::ProvisioningLicensesCommand
493
493
  # @options_interface.options_for_source("virtualImages", {})['data']
494
494
  get_virtual_images_dropdown()
495
495
  }, 'displayOrder' => 9},
496
- {'fieldName' => 'tenants', 'fieldLabel' => 'Tenants', 'type' => 'multiSelect', 'optionSource' => lambda {
496
+ {'fieldName' => 'tenants', 'fieldLabel' => 'Tenants', 'type' => 'multiSelect', 'optionSource' => lambda { |api_client, api_params|
497
497
  @options_interface.options_for_source("allTenants", {})['data']
498
498
  }, 'displayOrder' => 10},
499
499
  ]
@@ -137,7 +137,6 @@ EOT
137
137
  check_str
138
138
  },
139
139
  "Response Time" => lambda {|it| format_duration_milliseconds(it[:last_check][:took]) rescue "" },
140
- #"Response Time" => lambda {|it| format_sig_dig((it[:last_check][:took]/ 1000.to_f), 3) + "s" rescue "" },
141
140
  "Error" => {display_method: lambda {|it|
142
141
  error_str = it[:last_check] ? it[:last_check][:error].to_s : ""
143
142
  error_str
@@ -1283,7 +1282,6 @@ EOT
1283
1282
  end
1284
1283
  },
1285
1284
  "Response Time" => lambda {|it| format_duration_milliseconds(it[:last_check][:took]) rescue "" },
1286
- #"Response Time" => lambda {|it| format_sig_dig((it[:last_check][:took]/ 1000.to_f), 3) + "s" rescue "" },
1287
1285
  "Status" => lambda {|it| format_appliance_status(it, cyan) },
1288
1286
  "Error" => lambda {|it|
1289
1287
  error_str = it[:last_check] ? it[:last_check][:error] : ""
@@ -13,7 +13,7 @@ class Morpheus::Cli::Roles
13
13
  include Morpheus::Cli::AccountsHelper
14
14
  include Morpheus::Cli::ProvisioningHelper
15
15
  include Morpheus::Cli::WhoamiHelper
16
- register_subcommands :list, :get, :add, :update, :remove, :'list-permissions', :'update-feature-access', :'update-global-group-access', :'update-group-access', :'update-global-cloud-access', :'update-cloud-access', :'update-global-instance-type-access', :'update-instance-type-access', :'update-global-blueprint-access', :'update-blueprint-access'
16
+ register_subcommands :list, :get, :add, :update, :remove, :'list-permissions', :'update-feature-access', :'update-global-group-access', :'update-group-access', :'update-global-cloud-access', :'update-cloud-access', :'update-global-instance-type-access', :'update-instance-type-access', :'update-global-blueprint-access', :'update-blueprint-access', :'update-global-catalog-item-type-access', :'update-catalog-item-type-access', :'update-persona-access'
17
17
  alias_subcommand :details, :get
18
18
  set_default_subcommand :list
19
19
 
@@ -101,12 +101,20 @@ class Morpheus::Cli::Roles
101
101
  opts.on('-b','--blueprint-access', "Display Blueprint Access") do
102
102
  options[:include_blueprint_access] = true
103
103
  end
104
- opts.on('-a','--all-access', "Display All Access Lists") do
104
+ opts.on(nil,'--catalog-item-type-access', "Display Catalog Item Type Access") do
105
+ options[:include_catalog_item_types_access] = true
106
+ end
107
+ opts.on(nil,'--personas', "Display Persona Access") do
108
+ options[:include_personas_access] = true
109
+ end
110
+ opts.on('-a','--all', "Display All Access Lists") do
105
111
  options[:include_feature_access] = true
106
112
  options[:include_group_access] = true
107
113
  options[:include_cloud_access] = true
108
114
  options[:include_instance_type_access] = true
109
115
  options[:include_blueprint_access] = true
116
+ options[:include_catalog_item_types_access] = true
117
+ options[:include_personas_access] = true
110
118
  end
111
119
  build_standard_get_options(opts, options)
112
120
  opts.footer = <<-EOT
@@ -198,6 +206,7 @@ EOT
198
206
  rows = rows.select {|row| row[:code].to_s =~ phrase_regexp || row[:name].to_s =~ phrase_regexp }
199
207
  end
200
208
  print as_pretty_table(rows, [:code, :name, :access], options)
209
+ print reset,"\n"
201
210
  else
202
211
  print cyan,"Use --permissions to list permissions","\n"
203
212
  end
@@ -208,6 +217,7 @@ EOT
208
217
  {"Clouds" => lambda {|it| get_access_string(it['globalZoneAccess']) } },
209
218
  {"Instance Types" => lambda {|it| get_access_string(it['globalInstanceTypeAccess']) } },
210
219
  {"Blueprints" => lambda {|it| get_access_string(it['globalAppTemplateAccess'] || it['globalBlueprintAccess']) } },
220
+ {"Catalog Item Types" => lambda {|it| get_access_string(it['globalCatalogItemTypeAccess']) } },
211
221
  ], options)
212
222
 
213
223
  #print_h2 "Group Access: #{get_access_string(json_response['globalSiteAccess'])}", options
@@ -225,6 +235,7 @@ EOT
225
235
  else
226
236
  print cyan,"Use -g, --group-access to list custom access","\n"
227
237
  end
238
+ print reset,"\n"
228
239
  else
229
240
  # print "\n"
230
241
  # print cyan,bold,"Group Access: #{get_access_string(json_response['globalSiteAccess'])}",reset,"\n"
@@ -246,6 +257,7 @@ EOT
246
257
  else
247
258
  print cyan,"Use -c, --cloud-access to list custom access","\n"
248
259
  end
260
+ print reset,"\n"
249
261
  else
250
262
  # print "\n"
251
263
  # print cyan,bold,"Cloud Access: #{get_access_string(json_response['globalZoneAccess'])}",reset,"\n"
@@ -267,6 +279,7 @@ EOT
267
279
  else
268
280
  print cyan,"Use -i, --instance-type-access to list custom access","\n"
269
281
  end
282
+ print reset,"\n"
270
283
  else
271
284
  # print "\n"
272
285
  # print cyan,bold,"Instance Type Access: #{get_access_string(json_response['globalInstanceTypeAccess'])}",reset,"\n"
@@ -290,12 +303,54 @@ EOT
290
303
  else
291
304
  print cyan,"Use -b, --blueprint-access to list custom access","\n"
292
305
  end
306
+ print reset,"\n"
293
307
  else
294
308
  # print "\n"
295
309
  # print cyan,bold,"Blueprint Access: #{get_access_string(json_response['globalAppTemplateAccess'])}",reset,"\n"
296
310
  end
297
- print reset,"\n"
311
+
312
+
313
+ catalog_item_type_global_access = json_response['globalCatalogItemTypeAccess']
314
+ catalog_item_type_permissions = json_response['catalogItemTypePermissions'] || []
315
+ print cyan
316
+ # print_h2 "catalog_item_type Access: #{get_access_string(json_response['globalCatalogItemTypeAccess'])}", options
317
+ # print "\n"
318
+ if catalog_item_type_global_access == 'custom'
319
+ print_h2 "Catalog Item Type Access", options
320
+ if options[:include_catalog_item_types_access]
321
+ rows = catalog_item_type_permissions.collect do |it|
322
+ {
323
+ name: it['name'],
324
+ access: format_access_string(it['access'], ["none","read","full"]),
325
+ }
326
+ end
327
+ print as_pretty_table(rows, [:name, :access], options)
328
+ else
329
+ print cyan,"Use -b, --catalog-item-type-access to list custom access","\n"
330
+ end
331
+ else
332
+ # print "\n"
333
+ # print cyan,bold,"Catalog Item Type Access: #{get_access_string(json_response['globalCatalogItemTypeAccess'])}",reset,"\n"
334
+ end
335
+
336
+
337
+ persona_permissions = json_response['personaPermissions'] || json_response['personas'] || []
338
+ if options[:include_catalog_item_types_access]
339
+ print_h2 "Persona Access", options
340
+ rows = persona_permissions.collect do |it|
341
+ {
342
+ name: it['name'],
343
+ access: format_access_string(it['access'], ["none","read","full"]),
344
+ }
345
+ end
346
+ print as_pretty_table(rows, [:name, :access], options)
347
+ print reset,"\n"
348
+ end
349
+
350
+ # print reset,"\n"
351
+
298
352
  end
353
+
299
354
  return 0, nil
300
355
  end
301
356
 
@@ -449,6 +504,10 @@ EOT
449
504
  end
450
505
  end
451
506
 
507
+ # v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'defaultPersona', 'fieldLabel' => 'Default Persona', 'type' => 'select', 'optionSource' => 'personas', 'description' => 'Default Persona'}], options[:options], @api_client)
508
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'defaultPersona', 'fieldLabel' => 'Default Persona', 'type' => 'select', 'selectOptions' => [{'name'=>'Service Catalog','value'=>'serviceCatalog'},{'name'=>'Standard','value'=>'standard'}], 'description' => 'Default Persona'}], options[:options], @api_client)
509
+ role_payload['defaultPersona'] = {'code' => v_prompt['defaultPersona']} unless v_prompt['defaultPersona'].to_s.strip.empty?
510
+
452
511
  payload = {"role" => role_payload}
453
512
  end
454
513
  @roles_interface.setopts(options)
@@ -1267,6 +1326,249 @@ EOT
1267
1326
  end
1268
1327
  end
1269
1328
 
1329
+ def update_global_catalog_item_type_access(args)
1330
+ usage = "Usage: morpheus roles update-global-catalog-item-type-access [name] [full|custom|none]"
1331
+ options = {}
1332
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
1333
+ opts.banner = subcommand_usage("[name] [full|custom|none]")
1334
+ build_common_options(opts, options, [:json, :dry_run, :remote])
1335
+ end
1336
+ optparse.parse!(args)
1337
+
1338
+ if args.count < 2
1339
+ puts optparse
1340
+ exit 1
1341
+ end
1342
+ name = args[0]
1343
+ access_value = args[1].to_s.downcase
1344
+ if !['full', 'custom', 'none'].include?(access_value)
1345
+ puts optparse
1346
+ exit 1
1347
+ end
1348
+
1349
+
1350
+ connect(options)
1351
+ begin
1352
+ account = find_account_from_options(options)
1353
+ account_id = account ? account['id'] : nil
1354
+ role = find_role_by_name_or_id(account_id, name)
1355
+ exit 1 if role.nil?
1356
+
1357
+ params = {permissionCode: 'CatalogItemType', access: access_value}
1358
+ @roles_interface.setopts(options)
1359
+ if options[:dry_run]
1360
+ print_dry_run @roles_interface.dry.update_permission(account_id, role['id'], params)
1361
+ return
1362
+ end
1363
+ json_response = @roles_interface.update_permission(account_id, role['id'], params)
1364
+
1365
+ if options[:json]
1366
+ print JSON.pretty_generate(json_response)
1367
+ print "\n"
1368
+ else
1369
+ print_green_success "Role #{role['authority']} global catalog item type access updated"
1370
+ end
1371
+ rescue RestClient::Exception => e
1372
+ print_rest_exception(e, options)
1373
+ exit 1
1374
+ end
1375
+ end
1376
+
1377
+ def update_catalog_item_type_access(args)
1378
+ options = {}
1379
+ catalog_item_type_id = nil
1380
+ access_value = nil
1381
+ do_all = false
1382
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
1383
+ opts.banner = subcommand_usage("[name]")
1384
+ opts.on( '--catalog-item-type ID', String, "Catalog Item Type ID or Name" ) do |val|
1385
+ catalog_item_type_id = val
1386
+ end
1387
+ opts.on( nil, '--all', "Update all catalog item types at once." ) do
1388
+ do_all = true
1389
+ end
1390
+ opts.on( '--access VALUE', String, "Access value [full|none]" ) do |val|
1391
+ access_value = val
1392
+ end
1393
+ build_common_options(opts, options, [:json, :dry_run, :remote])
1394
+ opts.footer = "Update role access for an catalog item type or all types.\n" +
1395
+ "[name] is required. This is the name or id of a role.\n" +
1396
+ "--catalog-item-type or --all is required. This is the name or id of a catalog item type.\n" +
1397
+ "--access is required. This is the new access value."
1398
+ end
1399
+ optparse.parse!(args)
1400
+
1401
+ if args.count < 1
1402
+ puts optparse
1403
+ return 1
1404
+ end
1405
+ name = args[0]
1406
+ # support old usage: [name] [catalog_item_type] [access]
1407
+ catalog_item_type_id ||= args[1]
1408
+ access_value ||= args[2]
1409
+
1410
+ if (!catalog_item_type_id && !do_all) || !access_value
1411
+ puts_error optparse
1412
+ return 1
1413
+ end
1414
+
1415
+ access_value = access_value.to_s.downcase
1416
+
1417
+ if !['full', 'none'].include?(access_value)
1418
+ puts optparse
1419
+ return 1
1420
+ end
1421
+
1422
+ connect(options)
1423
+ begin
1424
+ account = find_account_from_options(options)
1425
+ account_id = account ? account['id'] : nil
1426
+ role = find_role_by_name_or_id(account_id, name)
1427
+ return 1 if role.nil?
1428
+
1429
+ role_json = @roles_interface.get(account_id, role['id'])
1430
+ catalog_item_type_global_access = role_json['globalCatalogItemTypeAccess']
1431
+ catalog_item_type_permissions = role_json['catalogItemTypePermissions'] || []
1432
+ if catalog_item_type_global_access != 'custom'
1433
+ print "\n", red, "Global Catalog Item Type Access is currently: #{catalog_item_type_global_access.to_s.capitalize}"
1434
+ print "\n", "You must first set it to Custom via `morpheus roles update-global-catalog-item-type-access \"#{name}\" custom`"
1435
+ print "\n\n", reset
1436
+ return 1
1437
+ end
1438
+
1439
+ # hacky, but support name or code lookup via the list returned in the show payload
1440
+ catalog_item_type = nil
1441
+ if !do_all
1442
+ if catalog_item_type_id.to_s =~ /\A\d{1,}\Z/
1443
+ catalog_item_type = catalog_item_type_permissions.find {|b| b['id'] == catalog_item_type_id.to_i }
1444
+ else
1445
+ catalog_item_type = catalog_item_type_permissions.find {|b| b['name'] == catalog_item_type_id }
1446
+ end
1447
+ if catalog_item_type.nil?
1448
+ print_red_alert "Catalog Item Type not found: '#{catalog_item_type_id}'"
1449
+ return 1
1450
+ end
1451
+ end
1452
+
1453
+ params = {}
1454
+ if do_all
1455
+ params['allCatalogItemTypes'] = true
1456
+ else
1457
+ params['catalogItemTypeId'] = catalog_item_type['id']
1458
+ end
1459
+ params['access'] = access_value
1460
+ @roles_interface.setopts(options)
1461
+ if options[:dry_run]
1462
+ print_dry_run @roles_interface.dry.update_catalog_item_type(account_id, role['id'], params)
1463
+ return
1464
+ end
1465
+ json_response = @roles_interface.update_catalog_item_type(account_id, role['id'], params)
1466
+
1467
+ if options[:json]
1468
+ print JSON.pretty_generate(json_response)
1469
+ print "\n"
1470
+ else
1471
+ if do_all
1472
+ print_green_success "Role #{role['authority']} access updated for all catalog item types"
1473
+ else
1474
+ print_green_success "Role #{role['authority']} access updated for catalog item type #{catalog_item_type['name']}"
1475
+ end
1476
+ end
1477
+ return 0
1478
+ rescue RestClient::Exception => e
1479
+ print_rest_exception(e, options)
1480
+ exit 1
1481
+ end
1482
+ end
1483
+
1484
+ def update_persona_access(args)
1485
+ options = {}
1486
+ persona_id = nil
1487
+ access_value = nil
1488
+ do_all = false
1489
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
1490
+ opts.banner = subcommand_usage("[name] [serviceCatalog|standard]")
1491
+ opts.on( '--persona CODE', String, "Persona Code" ) do |val|
1492
+ persona_id = val
1493
+ end
1494
+ opts.on( nil, '--all', "Update all personas at once." ) do
1495
+ do_all = true
1496
+ end
1497
+ opts.on( '--access VALUE', String, "Access value [full|none]" ) do |val|
1498
+ access_value = val
1499
+ end
1500
+ build_common_options(opts, options, [:json, :dry_run, :remote])
1501
+ opts.footer = "Update role access for an persona or personas.\n" +
1502
+ "[name] is required. This is the name or id of a role.\n" +
1503
+ "--persona or --all is required. This is the code of a persona.\n" +
1504
+ "--access is required. This is the new access value."
1505
+ end
1506
+ optparse.parse!(args)
1507
+
1508
+ if args.count < 1
1509
+ puts optparse
1510
+ return 1
1511
+ end
1512
+ name = args[0]
1513
+ # support old usage: [name] [persona] [access]
1514
+ persona_id ||= args[1]
1515
+ access_value ||= args[2]
1516
+
1517
+ if (!persona_id && !do_all) || !access_value
1518
+ puts_error optparse
1519
+ return 1
1520
+ end
1521
+
1522
+ access_value = access_value.to_s.downcase
1523
+
1524
+ if !['full', 'none'].include?(access_value)
1525
+ puts optparse
1526
+ return 1
1527
+ end
1528
+
1529
+ connect(options)
1530
+ begin
1531
+ account = find_account_from_options(options)
1532
+ account_id = account ? account['id'] : nil
1533
+ role = find_role_by_name_or_id(account_id, name)
1534
+ return 1 if role.nil?
1535
+
1536
+ role_json = @roles_interface.get(account_id, role['id'])
1537
+
1538
+ # no lookup right now, pass the code serviceCatalog|standard
1539
+ persona_code = persona_id
1540
+
1541
+ params = {}
1542
+ if do_all
1543
+ params['allPersonas'] = true
1544
+ else
1545
+ params['personaCode'] = persona_code
1546
+ end
1547
+ params['access'] = access_value
1548
+ @roles_interface.setopts(options)
1549
+ if options[:dry_run]
1550
+ print_dry_run @roles_interface.dry.update_persona(account_id, role['id'], params)
1551
+ return
1552
+ end
1553
+ json_response = @roles_interface.update_persona(account_id, role['id'], params)
1554
+
1555
+ if options[:json]
1556
+ print JSON.pretty_generate(json_response)
1557
+ print "\n"
1558
+ else
1559
+ if do_all
1560
+ print_green_success "Role #{role['authority']} access updated for all personas"
1561
+ else
1562
+ print_green_success "Role #{role['authority']} access updated for persona #{persona_code}"
1563
+ end
1564
+ end
1565
+ return 0
1566
+ rescue RestClient::Exception => e
1567
+ print_rest_exception(e, options)
1568
+ exit 1
1569
+ end
1570
+ end
1571
+
1270
1572
  private
1271
1573
 
1272
1574
  def add_role_option_types