morpheus-cli 6.1.0 → 6.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -139,6 +139,9 @@ class Morpheus::Cli::Roles
139
139
  opts.on('-a','--all', "Display All Access Lists") do
140
140
  options[:include_all_access] = true
141
141
  end
142
+ opts.on(nil, '--include-default-access', "Include default access levels in the output (returns all available resources)") do
143
+ options[:include_default_access] = true
144
+ end
142
145
  opts.on('--account-id ID', String, "Clarify Owner of Role") do |val|
143
146
  if has_complete_access
144
147
  options[:account_id] = val.to_s
@@ -166,7 +169,7 @@ EOT
166
169
  account_id = account ? account['id'] : nil
167
170
 
168
171
  params.merge!(parse_query_options(options))
169
-
172
+ params['includeDefaultAccess'] = true if options[:include_default_access]
170
173
  @roles_interface.setopts(options)
171
174
  if options[:dry_run]
172
175
  if args[0].to_s =~ /\A\d{1,}\Z/
@@ -181,13 +184,13 @@ EOT
181
184
  json_response = nil
182
185
  role = nil
183
186
  if args[0].to_s =~ /\A\d{1,}\Z/
184
- json_response = @roles_interface.get(account_id, args[0].to_i)
187
+ json_response = @roles_interface.get(account_id, args[0].to_i, params)
185
188
  role = json_response['role']
186
189
  else
187
190
  role = find_role_by_name_or_id(account_id, args[0])
188
191
  exit 1 if role.nil?
189
192
  # refetch from show action, argh
190
- json_response = @roles_interface.get(account_id, role['id'])
193
+ json_response = @roles_interface.get(account_id, role['id'], params)
191
194
  role = json_response['role']
192
195
  end
193
196
 
@@ -201,17 +204,20 @@ EOT
201
204
 
202
205
  print_h2 "Permissions", options
203
206
  print cyan
207
+ permissions = json_response['featurePermissions'] || role['permissions'] || []
204
208
  if options[:include_feature_access] || options[:include_all_access]
205
- rows = json_response['featurePermissions'].collect do |it|
209
+ rows = permissions.collect do |it|
206
210
  {
207
211
  code: it['code'],
208
212
  name: it['name'],
209
- subCategory: it['subCategory'],
213
+ category: it['subCategory'].to_s.titleize,
210
214
  access: format_access_string(it['access']),
211
215
  }
212
216
  end
213
217
  if options[:sort]
214
218
  rows.sort! {|a,b| a[options[:sort]] <=> b[options[:sort]] }
219
+ else
220
+ rows.sort! {|a,b| [a[:category],a[:name],a[:code]] <=> [b[:category],b[:name],b[:code]] }
215
221
  end
216
222
  if options[:direction] == 'desc'
217
223
  rows.reverse!
@@ -220,7 +226,7 @@ EOT
220
226
  phrase_regexp = /#{Regexp.escape(options[:phrase])}/i
221
227
  rows = rows.select {|row| row[:code].to_s =~ phrase_regexp || row[:name].to_s =~ phrase_regexp }
222
228
  end
223
- print as_pretty_table(rows, [:code, :name, :subCategory, :access], options)
229
+ print as_pretty_table(rows, [:category, :name, :code, :access], options)
224
230
  # print reset,"\n"
225
231
  else
226
232
  print cyan,"Use --feature-access to list feature access","\n"
@@ -255,23 +261,20 @@ EOT
255
261
  if has_group_access
256
262
  #print_h2 "Group Access: #{get_access_string(json_response['globalSiteAccess'])}", options
257
263
  print cyan
258
- if json_response['sites'].find {|it| !it['access'].nil?}
259
- print_h2 "Group Access", options
260
- if options[:include_group_access] || options[:include_all_access]
261
- rows = json_response['sites'].select {|it| !it['access'].nil?}.collect do |it|
262
- {
263
- name: it['name'],
264
- access: format_access_string(it['access'], ["none","read","full"]),
265
- }
266
- end
267
- print as_pretty_table(rows, [:name, :access], options)
268
- else
269
- print cyan,"Use -g, --group-access to list custom access","\n"
264
+ print_h2 "Group Access", options
265
+ if options[:include_group_access] || options[:include_all_access]
266
+ rows = json_response['sites'].collect do |it|
267
+ {
268
+ name: it['name'],
269
+ access: format_access_string(it['access'], ["none","read","full"]),
270
+ }
270
271
  end
271
- # print reset,"\n"
272
+ if !options[:include_default_access]
273
+ rows = rows.select {|row| row[:access] && row[:access] != 'default '}
274
+ end
275
+ print as_pretty_table(rows, [:name, :access], options)
272
276
  else
273
- # print "\n"
274
- # print cyan,bold,"Group Access: #{get_access_string(json_response['globalSiteAccess'])}",reset,"\n"
277
+ print cyan,"Use -g, --group-access to list custom access","\n"
275
278
  end
276
279
  end
277
280
 
@@ -279,15 +282,18 @@ EOT
279
282
  print cyan
280
283
  #puts "Cloud Access: #{get_access_string(json_response['globalZoneAccess'])}"
281
284
  #print "\n"
282
- if json_response['sites'].find{|it| !it['access'].nil?}
285
+ if json_response['sites'].find{|it| it['access'] && it['access'] != 'default'}
283
286
  print_h2 "Cloud Access", options
284
287
  if options[:include_cloud_access] || options[:include_all_access]
285
- rows = json_response['zones'].select {|it| !it['access'].nil?}.collect do |it|
288
+ rows = json_response['zones'].collect do |it|
286
289
  {
287
290
  name: it['name'],
288
291
  access: format_access_string(it['access'], ["none","read","full"]),
289
292
  }
290
293
  end
294
+ if !options[:include_default_access]
295
+ rows = rows.select {|row| row[:access] && row[:access] != 'default '}
296
+ end
291
297
  print as_pretty_table(rows, [:name, :access], options)
292
298
  else
293
299
  print cyan,"Use -c, --cloud-access to list custom access","\n"
@@ -316,8 +322,11 @@ EOT
316
322
  access: format_access_string(it['access'], ["none","read","full"]),
317
323
  }
318
324
  end
325
+ if !options[:include_default_access]
326
+ rows = rows.select {|row| row[:access] && row[:access] != 'default '}
327
+ end
319
328
  print as_pretty_table(rows, [:name, :access], options)
320
- elsif instance_type_permissions.find {|it| !it['access'].nil?}
329
+ elsif instance_type_permissions.find {|it| it['access'] && it['access'] != 'default'}
321
330
  print_h2 "Instance Type Access", options
322
331
  print cyan,"Use -i, --instance-type-access to list custom access","\n"
323
332
  end
@@ -327,14 +336,14 @@ EOT
327
336
  print cyan
328
337
  if options[:include_blueprint_access] || options[:include_all_access]
329
338
  print_h2 "Blueprint Access", options
330
- rows = blueprint_permissions.select {|it| !it['access'].nil?}.collect do |it|
339
+ rows = blueprint_permissions.collect do |it|
331
340
  {
332
341
  name: it['name'],
333
342
  access: format_access_string(it['access'], ["none","read","full"]),
334
343
  }
335
344
  end
336
345
  print as_pretty_table(rows, [:name, :access], options)
337
- elsif blueprint_permissions.find {|it| !it['access'].nil?}
346
+ elsif blueprint_permissions.find {|it| it['access'] && it['access'] != 'default'}
338
347
  print_h2 "Blueprint Access", options
339
348
  print cyan,"Use -b, --blueprint-access to list custom access","\n"
340
349
  end
@@ -344,14 +353,17 @@ EOT
344
353
  print cyan
345
354
  if options[:include_catalog_item_type_access] || options[:include_all_access]
346
355
  print_h2 "Catalog Item Type Access", options
347
- rows = catalog_item_type_permissions.select {|it| !it['access'].nil?}.collect do |it|
356
+ rows = catalog_item_type_permissions.collect do |it|
348
357
  {
349
358
  name: it['name'],
350
359
  access: format_access_string(it['access'], ["none","read","full"]),
351
360
  }
352
361
  end
362
+ if !options[:include_default_access]
363
+ rows = rows.select {|row| row[:access] && row[:access] != 'default '}
364
+ end
353
365
  print as_pretty_table(rows, [:name, :access], options)
354
- elsif catalog_item_type_permissions.find {|it| !it['access'].nil?}
366
+ elsif catalog_item_type_permissions.find {|it| it['access'] && it['access'] != 'default'}
355
367
  print_h2 "Catalog Item Type Access", options
356
368
  print cyan,"Use --catalog-item-type-access to list access","\n"
357
369
  end
@@ -368,7 +380,7 @@ EOT
368
380
  }
369
381
  end
370
382
  print as_pretty_table(rows, [:name, :access], options)
371
- elsif persona_permissions.find {|it| !it['access'].nil?}
383
+ elsif persona_permissions.find {|it| it['access'] && it['access'] != 'default'}
372
384
  print_h2 "Persona Access", options
373
385
  print cyan,"Use --persona-access to list access","\n"
374
386
  end
@@ -378,14 +390,17 @@ EOT
378
390
  print cyan
379
391
  if options[:include_vdi_pool_access] || options[:include_all_access]
380
392
  print_h2 "VDI Pool Access", options
381
- rows = vdi_pool_permissions.select {|it| !it['access'].nil?}.collect do |it|
393
+ rows = vdi_pool_permissions.collect do |it|
382
394
  {
383
395
  name: it['name'],
384
396
  access: format_access_string(it['access'], ["none","full"]),
385
397
  }
386
398
  end
399
+ if !options[:include_default_access]
400
+ rows = rows.select {|row| row[:access] && row[:access] != 'default '}
401
+ end
387
402
  print as_pretty_table(rows, [:name, :access], options)
388
- elsif vdi_pool_permissions.find {|it| !it['access'].nil?}
403
+ elsif vdi_pool_permissions.find {|it| it['access'] && it['access'] != 'default'}
389
404
  print_h2 "VDI Pool Access", options
390
405
  print cyan,"Use --vdi-pool-access to list custom access","\n"
391
406
  end
@@ -395,14 +410,17 @@ EOT
395
410
  print cyan
396
411
  if options[:include_report_type_access] || options[:include_all_access]
397
412
  print_h2 "Report Type Access", options
398
- rows = report_type_permissions.select {|it| !it['access'].nil?}.collect do |it|
413
+ rows = report_type_permissions.collect do |it|
399
414
  {
400
415
  name: it['name'],
401
416
  access: format_access_string(it['access'], ["none","full"]),
402
417
  }
403
418
  end
419
+ if !options[:include_default_access]
420
+ rows = rows.select {|row| row[:access] && row[:access] != 'default '}
421
+ end
404
422
  print as_pretty_table(rows, [:name, :access], options)
405
- elsif report_type_permissions.find {|it| !it['access'].nil?}
423
+ elsif report_type_permissions.find {|it| it['access'] && it['access'] != 'default'}
406
424
  print_h2 "Report Type Access", options
407
425
  print cyan,"Use --report-type-access to list custom access","\n"
408
426
  end
@@ -418,8 +436,11 @@ EOT
418
436
  access: format_access_string(it['access'], ["none","full"]),
419
437
  }
420
438
  end
439
+ if !options[:include_default_access]
440
+ rows = rows.select {|row| row[:access] && row[:access] != 'default '}
441
+ end
421
442
  print as_pretty_table(rows, [:name, :access], options)
422
- elsif task_permissions.find {|it| !it['access'].nil?}
443
+ elsif task_permissions.find {|it| it['access'] && it['access'] != 'default'}
423
444
  print_h2 "Task Access", options
424
445
  print cyan,"Use --task-access to list custom access","\n"
425
446
  end
@@ -429,14 +450,17 @@ EOT
429
450
  print cyan
430
451
  if options[:include_workflow_access] || options[:include_all_access]
431
452
  print_h2 "Workflow", options
432
- rows = workflow_permissions.select {|it| !it['access'].nil?}.collect do |it|
453
+ rows = workflow_permissions.collect do |it|
433
454
  {
434
455
  name: it['name'],
435
456
  access: format_access_string(it['access'], ["none","full"]),
436
457
  }
437
458
  end
459
+ if !options[:include_default_access]
460
+ rows = rows.select {|row| row[:access] && row[:access] != 'default '}
461
+ end
438
462
  print as_pretty_table(rows, [:name, :access], options)
439
- elsif workflow_permissions.find {|it| !it['access'].nil?}
463
+ elsif workflow_permissions.find {|it| it['access'] && it['access'] != 'default'}
440
464
  print_h2 "Workflow", options
441
465
  print cyan,"Use --workflow-access to list custom access","\n"
442
466
  end
@@ -530,11 +554,14 @@ EOT
530
554
  {
531
555
  code: it['code'],
532
556
  name: it['name'],
557
+ category: it['subCategory'].to_s.titleize,
533
558
  access: format_access_string(it['access']),
534
559
  }
535
560
  end
536
561
  if options[:sort]
537
562
  rows.sort! {|a,b| a[options[:sort]] <=> b[options[:sort]] }
563
+ else
564
+ rows.sort! {|a,b| [a[:category],a[:name],a[:code]] <=> [b[:category],b[:name],b[:code]] }
538
565
  end
539
566
  if options[:direction] == 'desc'
540
567
  rows.reverse!
@@ -543,7 +570,7 @@ EOT
543
570
  phrase_regexp = /#{Regexp.escape(options[:phrase])}/i
544
571
  rows = rows.select {|row| row[:code].to_s =~ phrase_regexp || row[:name].to_s =~ phrase_regexp }
545
572
  end
546
- print as_pretty_table(rows, [:code, :name, :access], options)
573
+ print as_pretty_table(rows, [:category, :name, :code, :access], options)
547
574
  else
548
575
  puts "No permissions found"
549
576
  end
@@ -557,135 +584,15 @@ EOT
557
584
  optparse = Morpheus::Cli::OptionParser.new do |opts|
558
585
  opts.banner = subcommand_usage("[name] [options]")
559
586
  build_option_type_options(opts, options, add_role_option_types)
560
- opts.on('--permissions CODE=ACCESS', String, "Set feature permission access by permission code. Example: dashboard=read,operations-wiki=full" ) do |val|
561
- options[:permissions] ||= {}
562
- parse_access_csv(options[:permissions], val, args, optparse)
563
- end
564
- opts.add_hidden_option('--permissions')
565
- opts.on('--feature-access CODE=ACCESS', String, "Set feature permission access by permission code. Example: dashboard=read,operations-wiki=full" ) do |val|
566
- options[:permissions] ||= {}
567
- parse_access_csv(options[:permissions], val, args, optparse)
568
- end
569
- opts.on('--global-group-access ACCESS', String, "Update the global group (site) access: [none|read|full]" ) do |val|
570
- params['globalSiteAccess'] = val.to_s.downcase
571
- end
572
- opts.add_hidden_option('--global-group-access')
573
- opts.on('--default-group-access ACCESS', String, "Update the default group (site) access: [none|read|full]" ) do |val|
574
- params['globalSiteAccess'] = val.to_s.downcase
575
- end
576
- opts.on('--groups ID=ACCESS', String, "Set group (site) to a custom access by group id. Example: 1=none,2=full,3=read" ) do |val|
577
- options[:group_permissions] ||= {}
578
- parse_access_csv(options[:group_permissions], val, args, optparse)
579
- end
580
- opts.on('--global-cloud-access ACCESS', String, "Update the global cloud (zone) access: [none|read|full]" ) do |val|
581
- params['globalZoneAccess'] = val.to_s.downcase
582
- end
583
- opts.add_hidden_option('--global-cloud-access')
584
- opts.on('--default-cloud-access ACCESS', String, "Update the default cloud (zone) access: [none|read|full]" ) do |val|
585
- params['globalZoneAccess'] = val.to_s.downcase
586
- end
587
- opts.on('--clouds ID=ACCESS', String, "Set cloud (zone) to a custom access by cloud id. Example: 1=none,2=full,3=read" ) do |val|
588
- options[:cloud_permissions] ||= {}
589
- parse_access_csv(options[:cloud_permissions], val, args, optparse)
590
- end
591
- opts.on('--global-instance-type-access ACCESS', String, "Update the global instance type access: [none|full]" ) do |val|
592
- params['globalInstanceTypeAccess'] = val.to_s.downcase
593
- end
594
- opts.add_hidden_option('--global-instance-type-access')
595
- opts.on('--default-instance-type-access ACCESS', String, "Update the default instance type access: [none|full]" ) do |val|
596
- params['globalInstanceTypeAccess'] = val.to_s.downcase
597
- end
598
- opts.on('--instance-types CODE=ACCESS', String, "Set instance type to a custom access instance type code. Example: nginx=full,apache=none" ) do |val|
599
- options[:instance_type_permissions] ||= {}
600
- parse_access_csv(options[:instance_type_permissions], val, args, optparse)
601
- end
602
- opts.on('--global-blueprint-access ACCESS', String, "Update the global blueprint access: [none|full]" ) do |val|
603
- params['globalAppTemplateAccess'] = val.to_s.downcase
604
- end
605
- opts.add_hidden_option('--global-blueprint-access')
606
- opts.on('--default-blueprint-access ACCESS', String, "Update the default blueprint access: [none|full]" ) do |val|
607
- params['globalAppTemplateAccess'] = val.to_s.downcase
608
- end
609
- opts.on('--blueprints ID=ACCESS', String, "Set blueprint to a custom access by blueprint id. Example: 1=full,2=none" ) do |val|
610
- options[:blueprint_permissions] ||= {}
611
- parse_access_csv(options[:blueprint_permissions], val, args, optparse)
612
- end
613
- opts.on('--global-catalog-item-type-access ACCESS', String, "Update the global catalog item type access: [none|full]" ) do |val|
614
- params['globalCatalogItemTypeAccess'] = val.to_s.downcase
615
- end
616
- opts.add_hidden_option('--global-catalog-item-type-access')
617
- opts.on('--default-catalog-item-type-access ACCESS', String, "Update the default catalog item type access: [none|full]" ) do |val|
618
- params['globalCatalogItemTypeAccess'] = val.to_s.downcase
619
- end
620
- opts.on('--catalog-item-types CODE=ACCESS', String, "Set catalog item type to a custom access by catalog item type id. Example: 1=full,2=none" ) do |val|
621
- options[:catalog_item_type_permissions] ||= {}
622
- parse_access_csv(options[:catalog_item_type_permissions], val, args, optparse)
623
- end
624
- opts.on('--default-persona-access ACCESS', String, "Update the default persona access: [none|full]" ) do |val|
625
- params['globalPersonaAccess'] = val.to_s.downcase
626
- end
627
- opts.on('--personas CODE=ACCESS', String, "Set persona to a custom access by persona code. Example: standard=full,serviceCatalog=full,vdi=full" ) do |val|
628
- options[:persona_permissions] ||= {}
629
- parse_access_csv(options[:persona_permissions], val, args, optparse)
630
- end
631
- opts.on('--global-vdi-pool-access-access ACCESS', String, "Update the global VDI pool access: [none|full]" ) do |val|
632
- params['globalVdiPoolAccess'] = val.to_s.downcase
633
- end
634
- opts.add_hidden_option('--global-vdi-pool-access-access')
635
- opts.on('--default-vdi-pool-access-access ACCESS', String, "Update the default VDI pool access: [none|full]" ) do |val|
636
- params['globalVdiPoolAccess'] = val.to_s.downcase
637
- end
638
- opts.on('--vdi-pools ID=ACCESS', String, "Set VDI pool to a custom access by VDI pool id. Example: 1=full,2=none" ) do |val|
639
- options[:vdi_pool_permissions] ||= {}
640
- parse_access_csv(options[:vdi_pool_permissions], val, args, optparse)
641
- end
642
- opts.on('--global-report-type-access ACCESS', String, "Update the global report type access: [none|full]" ) do |val|
643
- params['globalReportTypeAccess'] = val.to_s.downcase
644
- end
645
- opts.on('--default-report-type-access ACCESS', String, "Update the default report type access: [none|full]" ) do |val|
646
- params['globalReportTypeAccess'] = val.to_s.downcase
647
- end
648
- opts.add_hidden_option('--default-report-type-access')
649
- opts.on('--report-types CODE=ACCESS', String, "Set report type to a custom access by report type code. Example: appCost=none,guidance=full" ) do |val|
650
- options[:report_type_permissions] ||= {}
651
- parse_access_csv(options[:report_type_permissions], val, args, optparse)
652
- end
653
- opts.on('--global-task-access ACCESS', String, "Set the global task access: [none|full]" ) do |val|
654
- params['globalTaskAccess'] = val.to_s.downcase
655
- end
656
- opts.add_hidden_option('--global-task-access')
657
- opts.on('--default-task-access ACCESS', String, "Set the default task access: [none|full]" ) do |val|
658
- params['globalTaskAccess'] = val.to_s.downcase
659
- end
660
- opts.on('--tasks ID=ACCESS', String, "Set task to a custom access by task id. Example: 1=none,2=full" ) do |val|
661
- options[:task_permissions] ||= {}
662
- parse_access_csv(options[:task_permissions], val, args, optparse)
663
- end
664
- opts.on('--global-workflow-access ACCESS', String, "Set the default workflow access: [none|full]" ) do |val|
665
- params['globalTaskSetAccess'] = val.to_s.downcase
666
- end
667
- opts.add_hidden_option('--global-workflow-access')
668
- opts.on('--default-workflow-access ACCESS', String, "Set the default workflow access: [none|full]" ) do |val|
669
- params['globalTaskSetAccess'] = val.to_s.downcase
670
- end
671
- opts.on('--workflows ID=ACCESS', String, "Set workflow to a custom access by workflow id. Example: 1=none,2=full" ) do |val|
672
- options[:workflow_permissions] ||= {}
673
- parse_access_csv(options[:workflow_permissions], val, args, optparse)
674
- end
675
- opts.on('--reset-permissions', "Reset all feature permission access to none. This can be used in conjunction with --permissions to recreate the feature permission access for the role." ) do
676
- options[:reset_permissions] = true
677
- end
678
- opts.add_hidden_option('--reset-permissions')
679
- opts.on('--reset-feature-access', "Reset all feature permission access to none. This can be used in conjunction with --feature-access to recreate the feature permission access for the role." ) do
680
- options[:reset_permissions] = true
681
- end
682
- opts.on('--reset-all-access', "Reset all access to none including permissions, global groups, instance types, etc. This can be used in conjunction with --feature-access to recreate the feature permission access for the role." ) do
683
- options[:reset_all_access] = true
684
- end
587
+ build_role_access_options(opts, options, params)
685
588
  opts.on('--owner ID', String, "Set the owner/tenant/account for the role by account id. Only master tenants with full permission for Tenant and Role may use this option." ) do |val|
686
589
  params['owner'] = val
687
590
  end
688
- opts.footer = <<-EOT
591
+ opts.on(nil, '--include-default-access', "Include default access levels in the response (returns all available resources)") do
592
+ options[:include_default_access] = true
593
+ end
594
+ build_standard_add_options(opts, options)
595
+ opts.footer = <<-EOT
689
596
  Create a new role.
690
597
  [name] is required. This is a unique name (authority) for the new role.
691
598
  All the role permissions and access values can be configured.
@@ -695,7 +602,6 @@ Only the specified permissions,instance types, etc. are updated.
695
602
  Use --reset-feature-access to set access to "none" for all unspecified feature permissions.
696
603
  Use --reset-all-access to set access to "none" for all unspecified feature permissions and default access values for groups, instance types, etc.
697
604
  EOT
698
- build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
699
605
  end
700
606
  optparse.parse!(args)
701
607
  verify_args!(args:args, optparse:optparse, max:1)
@@ -721,199 +627,73 @@ EOT
721
627
  # argh, some options depend on others here...eg. multitenant is only available when roleType == 'user'
722
628
  #prompt_option_types = update_role_option_types()
723
629
 
724
- role_payload = params
725
630
  v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'authority', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 1}], options[:options])
726
- role_payload['authority'] = v_prompt['authority']
631
+ params['authority'] = v_prompt['authority']
727
632
  v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'displayOrder' => 2}], options[:options])
728
- role_payload['description'] = v_prompt['description']
633
+ params['description'] = v_prompt['description']
729
634
 
730
635
  if params['owner']
731
636
  if @is_master_account && has_complete_access
732
- role_payload['owner'] = params['owner']
637
+ params['owner'] = params['owner']
733
638
  else
734
639
  print_red_alert "You do not have the necessary authority to use owner option"
735
640
  return
736
641
  end
737
642
  elsif @is_master_account && has_complete_access
738
643
  v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'owner', 'fieldLabel' => 'Owner', 'type' => 'select', 'selectOptions' => role_owner_options, 'defaultValue' => current_account['id'], 'displayOrder' => 3}], options[:options])
739
- role_payload['owner'] = v_prompt['owner']
644
+ params['owner'] = v_prompt['owner']
740
645
  else
741
- role_payload['owner'] = current_account['id']
646
+ params['owner'] = current_account['id']
742
647
  end
743
648
 
744
- if @is_master_account && role_payload['owner'] == current_account['id']
649
+ if @is_master_account && params['owner'] == current_account['id']
745
650
  v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'roleType', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => role_type_options, 'defaultValue' => 'user', 'displayOrder' => 4}], options[:options])
746
- role_payload['roleType'] = v_prompt['roleType']
651
+ params['roleType'] = v_prompt['roleType']
747
652
  else
748
- role_payload['roleType'] = 'user'
653
+ params['roleType'] = 'user'
749
654
  end
750
655
 
751
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'baseRole', 'fieldLabel' => 'Copy From Role', 'type' => 'select', 'selectOptions' => base_role_options(role_payload), 'displayOrder' => 5}], options[:options])
656
+ if options[:cloud_permissions] && params['roleType'] == 'user'
657
+ raise_command_error "The --clouds option is only available for user roles, not account roles"
658
+ end
659
+ if options[:group_permissions] && params['roleType'] == 'account'
660
+ raise_command_error "The --groups option is only available for account roles, not user roles"
661
+ end
662
+
663
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'baseRole', 'fieldLabel' => 'Copy From Role', 'type' => 'select', 'selectOptions' => base_role_options(params), 'displayOrder' => 5}], options[:options])
752
664
  if v_prompt['baseRole'].to_s != ''
753
665
  base_role = find_role_by_name_or_id(account_id, v_prompt['baseRole'])
754
666
  exit 1 if base_role.nil?
755
- role_payload['baseRoleId'] = base_role['id']
667
+ params['baseRoleId'] = base_role['id']
756
668
  end
757
669
 
758
- if @is_master_account && role_payload['owner'] == current_account['id']
759
- if role_payload['roleType'] == 'user'
670
+ if @is_master_account && params['owner'] == current_account['id']
671
+ if params['roleType'] == 'user'
760
672
  v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'multitenant', 'fieldLabel' => 'Multitenant', 'type' => 'checkbox', 'defaultValue' => 'off', 'description' => 'A Multitenant role is automatically copied into all existing subaccounts as well as placed into a subaccount when created. Useful for providing a set of predefined roles a Customer can use', 'displayOrder' => 5}], options[:options])
761
- role_payload['multitenant'] = ['on','true'].include?(v_prompt['multitenant'].to_s)
762
- if role_payload['multitenant']
673
+ params['multitenant'] = ['on','true'].include?(v_prompt['multitenant'].to_s)
674
+ if params['multitenant']
763
675
  v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'multitenantLocked', 'fieldLabel' => 'Multitenant Locked', 'type' => 'checkbox', 'defaultValue' => 'off', 'description' => 'Prevents subtenants from branching off this role/modifying it.'}], options[:options])
764
- role_payload['multitenantLocked'] = ['on','true'].include?(v_prompt['multitenantLocked'].to_s)
676
+ params['multitenantLocked'] = ['on','true'].include?(v_prompt['multitenantLocked'].to_s)
765
677
  end
766
678
  end
767
679
  end
768
680
 
769
681
  # v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'defaultPersona', 'fieldLabel' => 'Default Persona', 'type' => 'select', 'optionSource' => 'personas', 'description' => 'Default Persona'}], options[:options], @api_client)
770
682
  v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'defaultPersona', 'fieldLabel' => 'Default Persona', 'type' => 'select', 'selectOptions' => get_persona_select_options(), 'description' => 'Default Persona'}], options[:options], @api_client)
771
- role_payload['defaultPersona'] = {'code' => v_prompt['defaultPersona']} unless v_prompt['defaultPersona'].to_s.strip.empty?
772
-
773
- # bulk permissions
774
- if options[:permissions]
775
- perms_array = []
776
- options[:permissions].each do |k,v|
777
- perm_code = k
778
- access_value = v.to_s.empty? ? "none" : v.to_s
779
- perms_array << {"code" => perm_code, "access" => access_value}
780
- end
781
- params['permissions'] = perms_array
782
- end
783
- if options[:group_permissions]
784
- perms_array = []
785
- options[:group_permissions].each do |k,v|
786
- site_id = k
787
- access_value = v.to_s.empty? ? "none" : v.to_s
788
- if site_id =~ /\A\d{1,}\Z/
789
- perms_array << {"id" => site_id.to_i, "access" => access_value}
790
- else
791
- perms_array << {"name" => site_id, "access" => access_value}
792
- end
793
- end
794
- params['sites'] = perms_array
795
- end
796
- if options[:cloud_permissions]
797
- perms_array = []
798
- options[:cloud_permissions].each do |k,v|
799
- zone_id = k
800
- access_value = v.to_s.empty? ? "none" : v.to_s
801
- if zone_id =~ /\A\d{1,}\Z/
802
- perms_array << {"id" => zone_id.to_i, "access" => access_value}
803
- else
804
- perms_array << {"name" => zone_id, "access" => access_value}
805
- end
806
- perms_array << {"id" => zone_id, "access" => access_value}
807
- end
808
- params['zones'] = perms_array
809
- end
810
- if options[:instance_type_permissions]
811
- perms_array = []
812
- options[:instance_type_permissions].each do |k,v|
813
- instance_type_code = k
814
- access_value = v.to_s.empty? ? "none" : v.to_s
815
- perms_array << {"code" => instance_type_code, "access" => access_value}
816
- end
817
- params['instanceTypes'] = perms_array
818
- end
819
- if options[:blueprint_permissions]
820
- perms_array = []
821
- options[:blueprint_permissions].each do |k,v|
822
- blueprint_id = k
823
- access_value = v.to_s.empty? ? "none" : v.to_s
824
- if blueprint_id =~ /\A\d{1,}\Z/
825
- perms_array << {"id" => blueprint_id.to_i, "access" => access_value}
826
- else
827
- perms_array << {"name" => blueprint_id, "access" => access_value}
828
- end
829
- end
830
- params['appTemplates'] = perms_array
831
- end
832
- if options[:catalog_item_type_permissions]
833
- perms_array = []
834
- options[:catalog_item_type_permissions].each do |k,v|
835
- catalog_item_type_id = k
836
- access_value = v.to_s.empty? ? "none" : v.to_s
837
- if catalog_item_type_id =~ /\A\d{1,}\Z/
838
- perms_array << {"id" => catalog_item_type_id.to_i, "access" => access_value}
839
- else
840
- perms_array << {"name" => catalog_item_type_id, "access" => access_value}
841
- end
842
- end
843
- params['catalogItemTypes'] = perms_array
683
+ params['defaultPersona'] = {'code' => v_prompt['defaultPersona']} unless v_prompt['defaultPersona'].to_s.strip.empty?
844
684
 
845
- end
846
- if options[:persona_permissions]
847
- perms_array = []
848
- options[:persona_permissions].each do |k,v|
849
- persona_code = k
850
- access_value = v.to_s.empty? ? "none" : v.to_s
851
- perms_array << {"code" => persona_code, "access" => access_value}
852
- end
853
- params['personas'] = perms_array
854
- end
855
- if options[:vdi_pool_permissions]
856
- perms_array = []
857
- options[:vdi_pool_permissions].each do |k,v|
858
- vdi_pool_id = k
859
- access_value = v.to_s.empty? ? "none" : v.to_s
860
- if vdi_pool_id =~ /\A\d{1,}\Z/
861
- perms_array << {"id" => vdi_pool_id.to_i, "access" => access_value}
862
- else
863
- perms_array << {"name" => vdi_pool_id, "access" => access_value}
864
- end
865
- end
866
- params['vdiPools'] = perms_array
867
- end
868
- if options[:report_type_permissions]
869
- perms_array = []
870
- options[:report_type_permissions].each do |k,v|
871
- report_type_code = k
872
- access_value = v.to_s.empty? ? "none" : v.to_s
873
- perms_array << {"code" => report_type_code, "access" => access_value}
874
- end
875
- params['reportTypes'] = perms_array
876
- end
877
- if options[:task_permissions]
878
- perms_array = []
879
- options[:task_permissions].each do |k,v|
880
- task_id = k
881
- access_value = v.to_s.empty? ? "none" : v.to_s
882
- if task_id =~ /\A\d{1,}\Z/
883
- perms_array << {"id" => task_id.to_i, "access" => access_value}
884
- else
885
- perms_array << {"name" => task_id, "access" => access_value}
886
- end
887
- end
888
- params['tasks'] = perms_array
889
- end
890
- if options[:workflow_permissions]
891
- perms_array = []
892
- options[:workflow_permissions].each do |k,v|
893
- workflow_id = k
894
- access_value = v.to_s.empty? ? "none" : v.to_s
895
- if workflow_id =~ /\A\d{1,}\Z/
896
- perms_array << {"id" => workflow_id.to_i, "access" => access_value}
897
- else
898
- perms_array << {"name" => workflow_id, "access" => access_value}
899
- end
900
- end
901
- params['workflows'] = perms_array
902
- end
903
- if options[:reset_permissions]
904
- params["resetPermissions"] = true
905
- end
906
- if options[:reset_all_access]
907
- params["resetAllAccess"] = true
908
- end
909
- payload = {"role" => role_payload}
685
+ # bulk role permissions
686
+ parse_role_access_options(options, params)
687
+ payload = {"role" => params}
910
688
  end
689
+ query_params = parse_query_options(options)
690
+ query_params['includeDefaultAccess'] = true if options[:include_default_access]
911
691
  @roles_interface.setopts(options)
912
692
  if options[:dry_run]
913
- print_dry_run @roles_interface.dry.create(account_id, payload)
693
+ print_dry_run @roles_interface.dry.create(account_id, payload, query_params)
914
694
  return
915
695
  end
916
- json_response = @roles_interface.create(account_id, payload)
696
+ json_response = @roles_interface.create(account_id, payload, query_params)
917
697
 
918
698
  if options[:json]
919
699
  print JSON.pretty_generate(json_response)
@@ -934,13 +714,13 @@ EOT
934
714
  get_args.push "--account-id", account['id'].to_s
935
715
  end
936
716
 
937
- details_options = [role_payload["authority"]]
717
+ details_options = [params["authority"]]
938
718
  if account
939
719
  details_options.push "--account-id", account['id'].to_s
940
720
  end
941
721
 
942
- if role_payload['owner']
943
- details_options.push "--account-id", role_payload['owner'].to_s
722
+ if params['owner']
723
+ details_options.push "--account-id", params['owner'].to_s
944
724
  end
945
725
  get(details_options)
946
726
 
@@ -956,127 +736,9 @@ EOT
956
736
  optparse = Morpheus::Cli::OptionParser.new do |opts|
957
737
  opts.banner = subcommand_usage("[role] [options]")
958
738
  build_option_type_options(opts, options, update_role_option_types)
959
- opts.on('--permissions CODE=ACCESS', String, "Set feature permission access by permission code. Example: dashboard=read,operations-wiki=full" ) do |val|
960
- options[:permissions] ||= {}
961
- parse_access_csv(options[:permissions], val, args, optparse)
962
- end
963
- opts.add_hidden_option('--permissions')
964
- opts.on('--feature-access CODE=ACCESS', String, "Set feature permission access by permission code. Example: dashboard=read,operations-wiki=full" ) do |val|
965
- options[:permissions] ||= {}
966
- parse_access_csv(options[:permissions], val, args, optparse)
967
- end
968
- opts.on('--global-group-access ACCESS', String, "Update the global group (site) access: [none|read|full]" ) do |val|
969
- params['globalSiteAccess'] = val.to_s.downcase
970
- end
971
- opts.add_hidden_option('--global-group-access')
972
- opts.on('--default-group-access ACCESS', String, "Update the default group (site) access: [none|read|full]" ) do |val|
973
- params['globalSiteAccess'] = val.to_s.downcase
974
- end
975
- opts.on('--groups ID=ACCESS', String, "Set group (site) to a custom access by group id. Example: 1=none,2=full,3=read" ) do |val|
976
- options[:group_permissions] ||= {}
977
- parse_access_csv(options[:group_permissions], val, args, optparse)
978
- end
979
- opts.on('--global-cloud-access ACCESS', String, "Update the global cloud (zone) access: [none|read|full]" ) do |val|
980
- params['globalZoneAccess'] = val.to_s.downcase
981
- end
982
- opts.add_hidden_option('--global-cloud-access')
983
- opts.on('--default-cloud-access ACCESS', String, "Update the default cloud (zone) access: [none|read|full]" ) do |val|
984
- params['globalZoneAccess'] = val.to_s.downcase
985
- end
986
- opts.on('--clouds ID=ACCESS', String, "Set cloud (zone) to a custom access by cloud id. Example: 1=none,2=full,3=read" ) do |val|
987
- options[:cloud_permissions] ||= {}
988
- parse_access_csv(options[:cloud_permissions], val, args, optparse)
989
- end
990
- opts.on('--global-instance-type-access ACCESS', String, "Update the global instance type access: [none|full]" ) do |val|
991
- params['globalInstanceTypeAccess'] = val.to_s.downcase
992
- end
993
- opts.add_hidden_option('--global-instance-type-access')
994
- opts.on('--default-instance-type-access ACCESS', String, "Update the default instance type access: [none|full]" ) do |val|
995
- params['globalInstanceTypeAccess'] = val.to_s.downcase
996
- end
997
- opts.on('--instance-types CODE=ACCESS', String, "Set instance type to a custom access instance type code. Example: nginx=full,apache=none" ) do |val|
998
- options[:instance_type_permissions] ||= {}
999
- parse_access_csv(options[:instance_type_permissions], val, args, optparse)
1000
- end
1001
- opts.on('--global-blueprint-access ACCESS', String, "Update the global blueprint access: [none|full]" ) do |val|
1002
- params['globalAppTemplateAccess'] = val.to_s.downcase
1003
- end
1004
- opts.add_hidden_option('--global-blueprint-access')
1005
- opts.on('--default-blueprint-access ACCESS', String, "Update the default blueprint access: [none|full]" ) do |val|
1006
- params['globalAppTemplateAccess'] = val.to_s.downcase
1007
- end
1008
- opts.on('--blueprints ID=ACCESS', String, "Set blueprint to a custom access by blueprint id. Example: 1=full,2=none" ) do |val|
1009
- options[:blueprint_permissions] ||= {}
1010
- parse_access_csv(options[:blueprint_permissions], val, args, optparse)
1011
- end
1012
- opts.on('--global-catalog-item-type-access ACCESS', String, "Update the global catalog item type access: [none|full]" ) do |val|
1013
- params['globalCatalogItemTypeAccess'] = val.to_s.downcase
1014
- end
1015
- opts.add_hidden_option('--global-catalog-item-type-access')
1016
- opts.on('--default-catalog-item-type-access ACCESS', String, "Update the default catalog item type access: [none|full]" ) do |val|
1017
- params['globalCatalogItemTypeAccess'] = val.to_s.downcase
1018
- end
1019
- opts.on('--catalog-item-types CODE=ACCESS', String, "Set catalog item type to a custom access by catalog item type id. Example: 1=full,2=none" ) do |val|
1020
- options[:catalog_item_type_permissions] ||= {}
1021
- parse_access_csv(options[:catalog_item_type_permissions], val, args, optparse)
1022
- end
1023
- opts.on('--personas CODE=ACCESS', String, "Set persona to a custom access by persona code. Example: standard=full,serviceCatalog=full,vdi=full" ) do |val|
1024
- options[:persona_permissions] ||= {}
1025
- parse_access_csv(options[:persona_permissions], val, args, optparse)
1026
- end
1027
- opts.on('--global-vdi-pool-access ACCESS', String, "Update the global VDI pool access: [none|full]" ) do |val|
1028
- params['globalVdiPoolAccess'] = val.to_s.downcase
1029
- end
1030
- opts.add_hidden_option('--global-vdi-pool-access')
1031
- opts.on('--default-vdi-pool-access ACCESS', String, "Update the default VDI pool access: [none|full]" ) do |val|
1032
- params['globalVdiPoolAccess'] = val.to_s.downcase
1033
- end
1034
- opts.on('--vdi-pools ID=ACCESS', String, "Set VDI pool to a custom access by VDI pool id. Example: 1=full,2=none" ) do |val|
1035
- options[:vdi_pool_permissions] ||= {}
1036
- parse_access_csv(options[:vdi_pool_permissions], val, args, optparse)
1037
- end
1038
- opts.on('--global-report-type-access ACCESS', String, "Update the global report type access: [none|full]" ) do |val|
1039
- params['globalReportTypeAccess'] = val.to_s.downcase
1040
- end
1041
- opts.add_hidden_option('--global-report-type-access')
1042
- opts.on('--default-report-type-access ACCESS', String, "Update the default report type access: [none|full]" ) do |val|
1043
- params['globalReportTypeAccess'] = val.to_s.downcase
1044
- end
1045
- opts.on('--report-types CODE=ACCESS', String, "Set report type to a custom access by report type code. Example: appCost=none,guidance=full" ) do |val|
1046
- options[:report_type_permissions] ||= {}
1047
- parse_access_csv(options[:report_type_permissions], val, args, optparse)
1048
- end
1049
- opts.on('--global-task-access ACCESS', String, "Update the global task access: [none|full]" ) do |val|
1050
- params['globalTaskAccess'] = val.to_s.downcase
1051
- end
1052
- opts.add_hidden_option('--global-task-access')
1053
- opts.on('--default-task-access ACCESS', String, "Update the default task access: [none|full]" ) do |val|
1054
- params['globalTaskAccess'] = val.to_s.downcase
1055
- end
1056
- opts.on('--tasks ID=ACCESS', String, "Set task to a custom access by task id. Example: 1=none,2=full" ) do |val|
1057
- options[:task_permissions] ||= {}
1058
- parse_access_csv(options[:task_permissions], val, args, optparse)
1059
- end
1060
- opts.on('--global-workflow-access ACCESS', String, "Update the global workflow access: [none|full]" ) do |val|
1061
- params['globalTaskSetAccess'] = val.to_s.downcase
1062
- end
1063
- opts.add_hidden_option('--global-workflow-access')
1064
- opts.on('--default-workflow-access ACCESS', String, "Update the default workflow access: [none|full]" ) do |val|
1065
- params['globalTaskSetAccess'] = val.to_s.downcase
1066
- end
1067
- opts.on('--workflows ID=ACCESS', String, "Set workflow to a custom access by workflow id. Example: 1=none,2=full" ) do |val|
1068
- options[:workflow_permissions] ||= {}
1069
- parse_access_csv(options[:workflow_permissions], val, args, optparse)
1070
- end
1071
- opts.on('--reset-permissions', "Reset all feature permission access to none. This can be used in conjunction with --permissions to recreate the feature permission access for the role." ) do
1072
- options[:reset_permissions] = true
1073
- end
1074
- opts.add_hidden_option('--reset-permissions')
1075
- opts.on('--reset-feature-access', "Reset all feature permission access to none. This can be used in conjunction with --feature-access to recreate the feature permission access for the role." ) do
1076
- options[:reset_permissions] = true
1077
- end
1078
- opts.on('--reset-all-access', "Reset all access to none including permissions, global groups, instance types, etc. This can be used in conjunction with --feature-access to recreate the feature permission access for the role." ) do
1079
- options[:reset_all_access] = true
739
+ build_role_access_options(opts, options, params)
740
+ opts.on(nil, '--include-default-access', "Include default access levels in the output (returns all available resources)") do
741
+ options[:include_default_access] = true
1080
742
  end
1081
743
  build_standard_update_options(opts, options)
1082
744
  opts.footer = <<-EOT
@@ -1122,154 +784,28 @@ EOT
1122
784
  prompt_option_types = prompt_option_types.reject {|it| ['multitenant','multitenantLocked'].include?(it['fieldName']) }
1123
785
  end
1124
786
  #params = Morpheus::Cli::OptionTypes.prompt(prompt_option_types, options[:options], @api_client, options[:params])
1125
-
1126
- # bulk permissions
1127
- if options[:permissions]
1128
- perms_array = []
1129
- options[:permissions].each do |k,v|
1130
- perm_code = k
1131
- access_value = v.to_s.empty? ? "none" : v.to_s
1132
- perms_array << {"code" => perm_code, "access" => access_value}
1133
- end
1134
- params['permissions'] = perms_array
1135
- end
1136
- if options[:group_permissions]
1137
- perms_array = []
1138
- options[:group_permissions].each do |k,v|
1139
- site_id = k
1140
- access_value = v.to_s.empty? ? "none" : v.to_s
1141
- if site_id =~ /\A\d{1,}\Z/
1142
- perms_array << {"id" => site_id.to_i, "access" => access_value}
1143
- else
1144
- perms_array << {"name" => site_id, "access" => access_value}
1145
- end
1146
- end
1147
- params['sites'] = perms_array
1148
- end
1149
- if options[:cloud_permissions]
1150
- perms_array = []
1151
- options[:cloud_permissions].each do |k,v|
1152
- zone_id = k
1153
- access_value = v.to_s.empty? ? "none" : v.to_s
1154
- if zone_id =~ /\A\d{1,}\Z/
1155
- perms_array << {"id" => zone_id.to_i, "access" => access_value}
1156
- else
1157
- perms_array << {"name" => zone_id, "access" => access_value}
1158
- end
1159
- perms_array << {"id" => zone_id, "access" => access_value}
1160
- end
1161
- params['zones'] = perms_array
1162
- end
1163
- if options[:instance_type_permissions]
1164
- perms_array = []
1165
- options[:instance_type_permissions].each do |k,v|
1166
- instance_type_code = k
1167
- access_value = v.to_s.empty? ? "none" : v.to_s
1168
- perms_array << {"code" => instance_type_code, "access" => access_value}
1169
- end
1170
- params['instanceTypes'] = perms_array
1171
- end
1172
- if options[:blueprint_permissions]
1173
- perms_array = []
1174
- options[:blueprint_permissions].each do |k,v|
1175
- blueprint_id = k
1176
- access_value = v.to_s.empty? ? "none" : v.to_s
1177
- if blueprint_id =~ /\A\d{1,}\Z/
1178
- perms_array << {"id" => blueprint_id.to_i, "access" => access_value}
1179
- else
1180
- perms_array << {"name" => blueprint_id, "access" => access_value}
1181
- end
1182
- end
1183
- params['appTemplates'] = perms_array
1184
- end
1185
- if options[:catalog_item_type_permissions]
1186
- perms_array = []
1187
- options[:catalog_item_type_permissions].each do |k,v|
1188
- catalog_item_type_id = k
1189
- access_value = v.to_s.empty? ? "none" : v.to_s
1190
- if catalog_item_type_id =~ /\A\d{1,}\Z/
1191
- perms_array << {"id" => catalog_item_type_id.to_i, "access" => access_value}
1192
- else
1193
- perms_array << {"name" => catalog_item_type_id, "access" => access_value}
1194
- end
1195
- end
1196
- params['catalogItemTypes'] = perms_array
1197
-
1198
- end
1199
- if options[:persona_permissions]
1200
- perms_array = []
1201
- options[:persona_permissions].each do |k,v|
1202
- persona_code = k
1203
- access_value = v.to_s.empty? ? "none" : v.to_s
1204
- perms_array << {"code" => persona_code, "access" => access_value}
1205
- end
1206
- params['personas'] = perms_array
1207
- end
1208
- if options[:vdi_pool_permissions]
1209
- perms_array = []
1210
- options[:vdi_pool_permissions].each do |k,v|
1211
- vdi_pool_id = k
1212
- access_value = v.to_s.empty? ? "none" : v.to_s
1213
- if vdi_pool_id =~ /\A\d{1,}\Z/
1214
- perms_array << {"id" => vdi_pool_id.to_i, "access" => access_value}
1215
- else
1216
- perms_array << {"name" => vdi_pool_id, "access" => access_value}
1217
- end
1218
- end
1219
- params['vdiPools'] = perms_array
1220
- end
1221
- if options[:report_type_permissions]
1222
- perms_array = []
1223
- options[:report_type_permissions].each do |k,v|
1224
- report_type_code = k
1225
- access_value = v.to_s.empty? ? "none" : v.to_s
1226
- perms_array << {"code" => report_type_code, "access" => access_value}
1227
- end
1228
- params['reportTypes'] = perms_array
1229
- end
1230
- if options[:task_permissions]
1231
- perms_array = []
1232
- options[:task_permissions].each do |k,v|
1233
- task_id = k
1234
- access_value = v.to_s.empty? ? "none" : v.to_s
1235
- if task_id =~ /\A\d{1,}\Z/
1236
- perms_array << {"id" => task_id.to_i, "access" => access_value}
1237
- else
1238
- perms_array << {"name" => task_id, "access" => access_value}
1239
- end
1240
- end
1241
- params['tasks'] = perms_array
1242
- end
1243
- if options[:workflow_permissions]
1244
- perms_array = []
1245
- options[:workflow_permissions].each do |k,v|
1246
- workflow_id = k
1247
- access_value = v.to_s.empty? ? "none" : v.to_s
1248
- if workflow_id =~ /\A\d{1,}\Z/
1249
- perms_array << {"id" => workflow_id.to_i, "access" => access_value}
1250
- else
1251
- perms_array << {"name" => workflow_id, "access" => access_value}
1252
- end
1253
- end
1254
- params['taskSets'] = perms_array
1255
- end
1256
- if options[:reset_permissions]
1257
- params["resetPermissions"] = true
787
+ if options[:cloud_permissions] && role['roleType'] == 'user'
788
+ raise_command_error "The --clouds option is only available for user roles, not account roles"
1258
789
  end
1259
- if options[:reset_all_access]
1260
- params["resetAllAccess"] = true
790
+ if options[:group_permissions] && role['roleType'] == 'account'
791
+ raise_command_error "The --groups option is only available for account roles, not user roles"
1261
792
  end
793
+ # bulk role permissions
794
+ parse_role_access_options(options, params)
795
+
1262
796
  if params.empty?
1263
797
  raise_command_error "Specify at least one option to update.\n#{optparse}"
1264
798
  end
1265
799
  payload = {"role" => params}
1266
800
  end
801
+ query_params = parse_query_options(options)
802
+ query_params['includeDefaultAccess'] = true if options[:include_default_access]
1267
803
  @roles_interface.setopts(options)
1268
804
  if options[:dry_run]
1269
- print_dry_run @roles_interface.dry.update(account_id, role['id'], payload)
805
+ print_dry_run @roles_interface.dry.update(account_id, role['id'], payload, query_params)
1270
806
  return
1271
807
  end
1272
- json_response = @roles_interface.update(account_id, role['id'], payload)
808
+ json_response = @roles_interface.update(account_id, role['id'], payload, query_params)
1273
809
  render_response(json_response, options, "role") do
1274
810
  role = json_response['role']
1275
811
  display_name = role['authority'] rescue ''
@@ -2988,18 +2524,299 @@ Update default workflow access for a role.
2988
2524
  has_access
2989
2525
  end
2990
2526
 
2991
- def parse_access_csv(output, val, args, optparse)
2527
+ def parse_access_csv(output, val)
2992
2528
  output ||= {}
2993
2529
  val.split(",").each do |value_pair|
2994
2530
  # split on '=' only because ':' is included in the permission name
2995
2531
  k,v = value_pair.include?("=") ? value_pair.strip.split("=") : [value_pair, ""]
2996
- k.strip!
2997
- v.strip!
2998
- if v == ""
2999
- raise_command_error "permission '#{k}=#{v}' is invalid. The access code must be a value like [none|read|full]", args, optparse
2532
+ next if k.to_s.empty?
2533
+ k = k.to_s.strip
2534
+ v = v.to_s.strip
2535
+ if k.empty?
2536
+ # ignore blank values, extra comma maybe?
2537
+ next
2538
+ end
2539
+ if v == ""
2540
+ raise_command_error "permission '#{k}=#{v}' is invalid. The access value is required eg. [default|none|read|full]"
3000
2541
  end
3001
2542
  output[k] = v
3002
2543
  end
3003
2544
  return output
3004
2545
  end
2546
+
2547
+ # role permission access options shared by add and update
2548
+ def build_role_access_options(opts, options, params)
2549
+ opts.on('--permissions CODE=ACCESS', String, "Set feature permission access by permission code. Example: dashboard=read,operations-wiki=full" ) do |val|
2550
+ options[:permissions] ||= {}
2551
+ parse_access_csv(options[:permissions], val)
2552
+ end
2553
+ opts.add_hidden_option('--permissions')
2554
+ opts.on('--feature-access CODE=ACCESS', String, "Set feature permission access by permission code. Example: dashboard=read,operations-wiki=full" ) do |val|
2555
+ options[:permissions] ||= {}
2556
+ parse_access_csv(options[:permissions], val)
2557
+ end
2558
+ opts.on('--global-group-access ACCESS', String, "Update the global group (site) access: [none|read|full]" ) do |val|
2559
+ params['globalSiteAccess'] = val.to_s.downcase
2560
+ end
2561
+ opts.add_hidden_option('--global-group-access')
2562
+ opts.on('--default-group-access ACCESS', String, "Update the default group (site) access: [none|read|full]" ) do |val|
2563
+ params['globalSiteAccess'] = val.to_s.downcase
2564
+ end
2565
+ opts.on('--groups ID=ACCESS', String, "Set group (site) to a custom access by group id. Example: 1=none,2=full,3=read" ) do |val|
2566
+ options[:group_permissions] ||= {}
2567
+ parse_access_csv(options[:group_permissions], val)
2568
+ end
2569
+ opts.on('--global-cloud-access ACCESS', String, "Update the global cloud (zone) access: [none|read|full]" ) do |val|
2570
+ params['globalZoneAccess'] = val.to_s.downcase
2571
+ end
2572
+ opts.add_hidden_option('--global-cloud-access')
2573
+ opts.on('--default-cloud-access ACCESS', String, "Update the default cloud (zone) access: [none|read|full]" ) do |val|
2574
+ params['globalZoneAccess'] = val.to_s.downcase
2575
+ end
2576
+ opts.on('--clouds ID=ACCESS', String, "Set cloud (zone) to a custom access by cloud id. Example: 1=none,2=full,3=read" ) do |val|
2577
+ options[:cloud_permissions] ||= {}
2578
+ parse_access_csv(options[:cloud_permissions], val)
2579
+ end
2580
+ opts.on('--global-instance-type-access ACCESS', String, "Update the global instance type access: [none|full]" ) do |val|
2581
+ params['globalInstanceTypeAccess'] = val.to_s.downcase
2582
+ end
2583
+ opts.add_hidden_option('--global-instance-type-access')
2584
+ opts.on('--default-instance-type-access ACCESS', String, "Update the default instance type access: [none|full]" ) do |val|
2585
+ params['globalInstanceTypeAccess'] = val.to_s.downcase
2586
+ end
2587
+ opts.on('--instance-types CODE=ACCESS', String, "Set instance type to a custom access instance type code. Example: nginx=full,apache=none" ) do |val|
2588
+ options[:instance_type_permissions] ||= {}
2589
+ parse_access_csv(options[:instance_type_permissions], val)
2590
+ end
2591
+ opts.on('--global-blueprint-access ACCESS', String, "Update the global blueprint access: [none|full]" ) do |val|
2592
+ params['globalAppTemplateAccess'] = val.to_s.downcase
2593
+ end
2594
+ opts.add_hidden_option('--global-blueprint-access')
2595
+ opts.on('--default-blueprint-access ACCESS', String, "Update the default blueprint access: [none|full]" ) do |val|
2596
+ params['globalAppTemplateAccess'] = val.to_s.downcase
2597
+ end
2598
+ opts.on('--blueprints ID=ACCESS', String, "Set blueprint to a custom access by blueprint id. Example: 1=full,2=none" ) do |val|
2599
+ options[:blueprint_permissions] ||= {}
2600
+ parse_access_csv(options[:blueprint_permissions], val)
2601
+ end
2602
+ opts.on('--global-catalog-item-type-access ACCESS', String, "Update the global catalog item type access: [none|full]" ) do |val|
2603
+ params['globalCatalogItemTypeAccess'] = val.to_s.downcase
2604
+ end
2605
+ opts.add_hidden_option('--global-catalog-item-type-access')
2606
+ opts.on('--default-catalog-item-type-access ACCESS', String, "Update the default catalog item type access: [none|full]" ) do |val|
2607
+ params['globalCatalogItemTypeAccess'] = val.to_s.downcase
2608
+ end
2609
+ opts.on('--catalog-item-types CODE=ACCESS', String, "Set catalog item type to a custom access by catalog item type id. Example: 1=full,2=none" ) do |val|
2610
+ options[:catalog_item_type_permissions] ||= {}
2611
+ parse_access_csv(options[:catalog_item_type_permissions], val)
2612
+ end
2613
+ opts.on('--default-persona-access ACCESS', String, "Update the default persona access: [none|full]" ) do |val|
2614
+ params['globalPersonaAccess'] = val.to_s.downcase
2615
+ end
2616
+ opts.on('--personas CODE=ACCESS', String, "Set persona to a custom access by persona code. Example: standard=full,serviceCatalog=full,vdi=full" ) do |val|
2617
+ options[:persona_permissions] ||= {}
2618
+ parse_access_csv(options[:persona_permissions], val)
2619
+ end
2620
+ opts.on('--global-vdi-pool-access ACCESS', String, "Update the global VDI pool access: [none|full]" ) do |val|
2621
+ params['globalVdiPoolAccess'] = val.to_s.downcase
2622
+ end
2623
+ opts.add_hidden_option('--global-vdi-pool-access')
2624
+ opts.on('--default-vdi-pool-access ACCESS', String, "Update the default VDI pool access: [none|full]" ) do |val|
2625
+ params['globalVdiPoolAccess'] = val.to_s.downcase
2626
+ end
2627
+ opts.on('--vdi-pools ID=ACCESS', String, "Set VDI pool to a custom access by VDI pool id. Example: 1=full,2=none" ) do |val|
2628
+ options[:vdi_pool_permissions] ||= {}
2629
+ parse_access_csv(options[:vdi_pool_permissions], val)
2630
+ end
2631
+ opts.on('--global-report-type-access ACCESS', String, "Update the global report type access: [none|full]" ) do |val|
2632
+ params['globalReportTypeAccess'] = val.to_s.downcase
2633
+ end
2634
+ opts.on('--default-report-type-access ACCESS', String, "Update the default report type access: [none|full]" ) do |val|
2635
+ params['globalReportTypeAccess'] = val.to_s.downcase
2636
+ end
2637
+ opts.add_hidden_option('--default-report-type-access')
2638
+ opts.on('--report-types CODE=ACCESS', String, "Set report type to a custom access by report type code. Example: appCost=none,guidance=full" ) do |val|
2639
+ options[:report_type_permissions] ||= {}
2640
+ parse_access_csv(options[:report_type_permissions], val)
2641
+ end
2642
+ opts.on('--global-task-access ACCESS', String, "Set the global task access: [none|full]" ) do |val|
2643
+ params['globalTaskAccess'] = val.to_s.downcase
2644
+ end
2645
+ opts.add_hidden_option('--global-task-access')
2646
+ opts.on('--default-task-access ACCESS', String, "Set the default task access: [none|full]" ) do |val|
2647
+ params['globalTaskAccess'] = val.to_s.downcase
2648
+ end
2649
+ opts.on('--tasks ID=ACCESS', String, "Set task to a custom access by task id. Example: 1=none,2=full" ) do |val|
2650
+ options[:task_permissions] ||= {}
2651
+ parse_access_csv(options[:task_permissions], val)
2652
+ end
2653
+ opts.on('--global-workflow-access ACCESS', String, "Set the default workflow access: [none|full]" ) do |val|
2654
+ params['globalTaskSetAccess'] = val.to_s.downcase
2655
+ end
2656
+ opts.add_hidden_option('--global-workflow-access')
2657
+ opts.on('--default-workflow-access ACCESS', String, "Set the default workflow access: [none|full]" ) do |val|
2658
+ params['globalTaskSetAccess'] = val.to_s.downcase
2659
+ end
2660
+ opts.on('--workflows ID=ACCESS', String, "Set workflow to a custom access by workflow id. Example: 1=none,2=full" ) do |val|
2661
+ options[:workflow_permissions] ||= {}
2662
+ parse_access_csv(options[:workflow_permissions], val)
2663
+ end
2664
+ opts.on('--reset-permissions', "Reset all feature permission access to none. This can be used in conjunction with --permissions to recreate the feature permission access for the role." ) do
2665
+ options[:reset_permissions] = true
2666
+ end
2667
+ opts.add_hidden_option('--reset-permissions')
2668
+ opts.on('--reset-feature-access', "Reset all feature permission access to none. This can be used in conjunction with --feature-access to recreate the feature permission access for the role." ) do
2669
+ options[:reset_permissions] = true
2670
+ end
2671
+ opts.on('--reset-all-access', "Reset all access to none including permissions, global groups, instance types, etc. This can be used in conjunction with --feature-access to recreate the feature permission access for the role." ) do
2672
+ options[:reset_all_access] = true
2673
+ end
2674
+ end
2675
+
2676
+ # parse bulk permissions payload
2677
+ def parse_role_access_options(options, params)
2678
+ if options[:permissions]
2679
+ perms_array = []
2680
+ options[:permissions].each do |k,v|
2681
+ perm_code = k
2682
+ access_value = v.to_s.empty? ? "none" : v.to_s
2683
+ perms_array << {"code" => perm_code, "access" => access_value}
2684
+ end
2685
+ params['permissions'] = perms_array
2686
+ end
2687
+ if options[:group_permissions]
2688
+ perms_array = []
2689
+ options[:group_permissions].each do |k,v|
2690
+ site_id = k
2691
+ access_value = v.to_s.empty? ? "none" : v.to_s
2692
+ if site_id =~ /\A\d{1,}\Z/
2693
+ perms_array << {"id" => site_id.to_i, "access" => access_value}
2694
+ else
2695
+ perms_array << {"name" => site_id, "access" => access_value}
2696
+ end
2697
+ end
2698
+ params['sites'] = perms_array
2699
+ end
2700
+ if options[:cloud_permissions]
2701
+ perms_array = []
2702
+ options[:cloud_permissions].each do |k,v|
2703
+ zone_id = k
2704
+ access_value = v.to_s.empty? ? "none" : v.to_s
2705
+ if zone_id =~ /\A\d{1,}\Z/
2706
+ perms_array << {"id" => zone_id.to_i, "access" => access_value}
2707
+ else
2708
+ perms_array << {"name" => zone_id, "access" => access_value}
2709
+ end
2710
+ end
2711
+ params['zones'] = perms_array
2712
+ end
2713
+ if options[:instance_type_permissions]
2714
+ perms_array = []
2715
+ options[:instance_type_permissions].each do |k,v|
2716
+ instance_type_code = k
2717
+ access_value = v.to_s.empty? ? "none" : v.to_s
2718
+ if instance_type_code =~ /\A\d{1,}\Z/
2719
+ perms_array << {"id" => instance_type_code.to_i, "access" => access_value}
2720
+ else
2721
+ perms_array << {"code" => instance_type_code, "access" => access_value}
2722
+ end
2723
+ end
2724
+ params['instanceTypes'] = perms_array
2725
+ end
2726
+ if options[:blueprint_permissions]
2727
+ perms_array = []
2728
+ options[:blueprint_permissions].each do |k,v|
2729
+ blueprint_id = k
2730
+ access_value = v.to_s.empty? ? "none" : v.to_s
2731
+ if blueprint_id =~ /\A\d{1,}\Z/
2732
+ perms_array << {"id" => blueprint_id.to_i, "access" => access_value}
2733
+ else
2734
+ perms_array << {"name" => blueprint_id, "access" => access_value}
2735
+ end
2736
+ end
2737
+ params['appTemplates'] = perms_array
2738
+ end
2739
+ if options[:catalog_item_type_permissions]
2740
+ perms_array = []
2741
+ options[:catalog_item_type_permissions].each do |k,v|
2742
+ catalog_item_type_id = k
2743
+ access_value = v.to_s.empty? ? "none" : v.to_s
2744
+ if catalog_item_type_id =~ /\A\d{1,}\Z/
2745
+ perms_array << {"id" => catalog_item_type_id.to_i, "access" => access_value}
2746
+ else
2747
+ perms_array << {"name" => catalog_item_type_id, "access" => access_value}
2748
+ end
2749
+ end
2750
+ params['catalogItemTypes'] = perms_array
2751
+
2752
+ end
2753
+ if options[:persona_permissions]
2754
+ perms_array = []
2755
+ options[:persona_permissions].each do |k,v|
2756
+ persona_code = k
2757
+ access_value = v.to_s.empty? ? "none" : v.to_s
2758
+ perms_array << {"code" => persona_code, "access" => access_value}
2759
+ end
2760
+ params['personas'] = perms_array
2761
+ end
2762
+ if options[:vdi_pool_permissions]
2763
+ perms_array = []
2764
+ options[:vdi_pool_permissions].each do |k,v|
2765
+ vdi_pool_id = k
2766
+ access_value = v.to_s.empty? ? "none" : v.to_s
2767
+ if vdi_pool_id =~ /\A\d{1,}\Z/
2768
+ perms_array << {"id" => vdi_pool_id.to_i, "access" => access_value}
2769
+ else
2770
+ perms_array << {"name" => vdi_pool_id, "access" => access_value}
2771
+ end
2772
+ end
2773
+ params['vdiPools'] = perms_array
2774
+ end
2775
+ if options[:report_type_permissions]
2776
+ perms_array = []
2777
+ options[:report_type_permissions].each do |k,v|
2778
+ report_type_code = k
2779
+ access_value = v.to_s.empty? ? "none" : v.to_s
2780
+ if report_type_code =~ /\A\d{1,}\Z/
2781
+ perms_array << {"id" => report_type_code.to_i, "access" => access_value}
2782
+ else
2783
+ perms_array << {"code" => report_type_code, "access" => access_value}
2784
+ end
2785
+ end
2786
+ params['reportTypes'] = perms_array
2787
+ end
2788
+ if options[:task_permissions]
2789
+ perms_array = []
2790
+ options[:task_permissions].each do |k,v|
2791
+ task_id = k
2792
+ access_value = v.to_s.empty? ? "none" : v.to_s
2793
+ if task_id =~ /\A\d{1,}\Z/
2794
+ perms_array << {"id" => task_id.to_i, "access" => access_value}
2795
+ else
2796
+ perms_array << {"name" => task_id, "access" => access_value}
2797
+ end
2798
+ end
2799
+ params['tasks'] = perms_array
2800
+ end
2801
+ if options[:workflow_permissions]
2802
+ perms_array = []
2803
+ options[:workflow_permissions].each do |k,v|
2804
+ workflow_id = k
2805
+ access_value = v.to_s.empty? ? "none" : v.to_s
2806
+ if workflow_id =~ /\A\d{1,}\Z/
2807
+ perms_array << {"id" => workflow_id.to_i, "access" => access_value}
2808
+ else
2809
+ perms_array << {"name" => workflow_id, "access" => access_value}
2810
+ end
2811
+ end
2812
+ params['taskSets'] = perms_array
2813
+ end
2814
+ if options[:reset_permissions]
2815
+ params["resetPermissions"] = true
2816
+ end
2817
+ if options[:reset_all_access]
2818
+ params["resetAllAccess"] = true
2819
+ end
2820
+ end
2821
+
3005
2822
  end