morpheus-cli 4.1.8 → 4.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +24 -0
  4. data/lib/morpheus/api/{old_cypher_interface.rb → budgets_interface.rb} +10 -11
  5. data/lib/morpheus/api/cloud_datastores_interface.rb +7 -0
  6. data/lib/morpheus/api/cloud_resource_pools_interface.rb +2 -2
  7. data/lib/morpheus/api/cypher_interface.rb +18 -12
  8. data/lib/morpheus/api/health_interface.rb +72 -0
  9. data/lib/morpheus/api/instances_interface.rb +1 -1
  10. data/lib/morpheus/api/library_instance_types_interface.rb +7 -0
  11. data/lib/morpheus/api/log_settings_interface.rb +6 -0
  12. data/lib/morpheus/api/network_security_servers_interface.rb +30 -0
  13. data/lib/morpheus/api/price_sets_interface.rb +42 -0
  14. data/lib/morpheus/api/prices_interface.rb +68 -0
  15. data/lib/morpheus/api/provisioning_settings_interface.rb +29 -0
  16. data/lib/morpheus/api/servers_interface.rb +1 -1
  17. data/lib/morpheus/api/service_plans_interface.rb +34 -11
  18. data/lib/morpheus/api/task_sets_interface.rb +8 -0
  19. data/lib/morpheus/api/tasks_interface.rb +8 -0
  20. data/lib/morpheus/cli.rb +6 -3
  21. data/lib/morpheus/cli/appliance_settings_command.rb +13 -5
  22. data/lib/morpheus/cli/approvals_command.rb +1 -1
  23. data/lib/morpheus/cli/apps.rb +88 -28
  24. data/lib/morpheus/cli/backup_settings_command.rb +1 -1
  25. data/lib/morpheus/cli/blueprints_command.rb +2 -0
  26. data/lib/morpheus/cli/budgets_command.rb +672 -0
  27. data/lib/morpheus/cli/cli_command.rb +13 -2
  28. data/lib/morpheus/cli/cli_registry.rb +1 -0
  29. data/lib/morpheus/cli/clusters.rb +40 -274
  30. data/lib/morpheus/cli/commands/standard/benchmark_command.rb +114 -66
  31. data/lib/morpheus/cli/commands/standard/coloring_command.rb +12 -0
  32. data/lib/morpheus/cli/commands/standard/curl_command.rb +31 -6
  33. data/lib/morpheus/cli/commands/standard/echo_command.rb +8 -3
  34. data/lib/morpheus/cli/commands/standard/set_prompt_command.rb +1 -1
  35. data/lib/morpheus/cli/containers_command.rb +37 -24
  36. data/lib/morpheus/cli/cypher_command.rb +191 -150
  37. data/lib/morpheus/cli/health_command.rb +903 -0
  38. data/lib/morpheus/cli/hosts.rb +43 -32
  39. data/lib/morpheus/cli/instances.rb +119 -68
  40. data/lib/morpheus/cli/jobs_command.rb +1 -1
  41. data/lib/morpheus/cli/library_instance_types_command.rb +61 -11
  42. data/lib/morpheus/cli/library_option_types_command.rb +2 -2
  43. data/lib/morpheus/cli/log_settings_command.rb +46 -3
  44. data/lib/morpheus/cli/logs_command.rb +24 -17
  45. data/lib/morpheus/cli/mixins/accounts_helper.rb +2 -0
  46. data/lib/morpheus/cli/mixins/logs_helper.rb +73 -19
  47. data/lib/morpheus/cli/mixins/print_helper.rb +29 -1
  48. data/lib/morpheus/cli/mixins/provisioning_helper.rb +554 -96
  49. data/lib/morpheus/cli/mixins/whoami_helper.rb +13 -1
  50. data/lib/morpheus/cli/networks_command.rb +3 -0
  51. data/lib/morpheus/cli/option_types.rb +83 -53
  52. data/lib/morpheus/cli/price_sets_command.rb +543 -0
  53. data/lib/morpheus/cli/prices_command.rb +669 -0
  54. data/lib/morpheus/cli/processes_command.rb +0 -2
  55. data/lib/morpheus/cli/provisioning_settings_command.rb +237 -0
  56. data/lib/morpheus/cli/remote.rb +9 -4
  57. data/lib/morpheus/cli/reports_command.rb +10 -4
  58. data/lib/morpheus/cli/roles.rb +93 -38
  59. data/lib/morpheus/cli/security_groups.rb +10 -0
  60. data/lib/morpheus/cli/service_plans_command.rb +736 -0
  61. data/lib/morpheus/cli/tasks.rb +220 -8
  62. data/lib/morpheus/cli/tenants_command.rb +3 -16
  63. data/lib/morpheus/cli/users.rb +2 -25
  64. data/lib/morpheus/cli/version.rb +1 -1
  65. data/lib/morpheus/cli/whitelabel_settings_command.rb +18 -18
  66. data/lib/morpheus/cli/whoami.rb +28 -10
  67. data/lib/morpheus/cli/workflows.rb +488 -36
  68. data/lib/morpheus/formatters.rb +22 -0
  69. data/morpheus-cli.gemspec +1 -0
  70. metadata +28 -5
  71. data/lib/morpheus/cli/accounts.rb +0 -335
  72. data/lib/morpheus/cli/old_cypher_command.rb +0 -412
@@ -7,15 +7,17 @@ require 'morpheus/cli/cli_command'
7
7
  class Morpheus::Cli::Tasks
8
8
  include Morpheus::Cli::CliCommand
9
9
 
10
- register_subcommands :list, :get, :add, :update, :remove, :types => :task_types
10
+ register_subcommands :list, :get, :add, :update, :remove, :execute, :types => :task_types
11
11
  alias_subcommand :details, :get
12
12
  alias_subcommand :'task-types', :task_types
13
13
  set_default_subcommand :list
14
14
 
15
15
  def connect(opts)
16
16
  @api_client = establish_remote_appliance_connection(opts)
17
- @tasks_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).tasks
18
- @task_sets_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).task_sets
17
+ @tasks_interface = @api_client.tasks
18
+ @task_sets_interface = @api_client.task_sets
19
+ @instances_interface = @api_client.instances
20
+ @servers_interface = @api_client.servers
19
21
  end
20
22
 
21
23
  def handle(args)
@@ -162,6 +164,9 @@ class Morpheus::Cli::Tasks
162
164
  format_boolean(it['retryable'])
163
165
  end
164
166
  },
167
+ "Allow Custom Config" => lambda {|it| format_boolean(it['allowCustomConfig']) },
168
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
169
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
165
170
  }
166
171
  print_description_list(description_cols, task)
167
172
 
@@ -233,21 +238,22 @@ class Morpheus::Cli::Tasks
233
238
  @tasks_interface.setopts(options)
234
239
  if options[:dry_run]
235
240
  print_dry_run @tasks_interface.dry.update(task['id'], payload)
236
- return
241
+ return 0
237
242
  end
238
243
  response = @tasks_interface.update(task['id'], payload)
239
244
  if options[:json]
240
245
  print JSON.pretty_generate(json_response)
241
246
  if !response['success']
242
- exit 1
247
+ return 1
243
248
  end
244
249
  else
245
250
  print_green_success "Task #{response['task']['name']} updated"
246
251
  get([task['id']])
247
252
  end
253
+ return 0
248
254
  rescue RestClient::Exception => e
249
255
  print_rest_exception(e, options)
250
- exit 1
256
+ return 1
251
257
  end
252
258
  end
253
259
 
@@ -349,6 +355,9 @@ class Morpheus::Cli::Tasks
349
355
  opts.on('--retry-delay SECONDS', String, "Retry Delay Seconds" ) do |val|
350
356
  options[:options]['retryDelaySeconds'] = val.to_i
351
357
  end
358
+ opts.on('--allow-custom-config [on|off]', String, "Allow Custom Config") do |val|
359
+ options[:options]['allowCustomConfig'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
360
+ end
352
361
  opts.on('--file FILE', "File containing the script. This can be used instead of --O taskOptions.script" ) do |filename|
353
362
  full_filename = File.expand_path(filename)
354
363
  if File.exists?(full_filename)
@@ -554,6 +563,13 @@ class Morpheus::Cli::Tasks
554
563
  end
555
564
 
556
565
 
566
+ # Allow Custom Config
567
+ if options[:options]['allowCustomConfig'] != nil
568
+ payload['task']['allowCustomConfig'] = options[:options]['allowCustomConfig']
569
+ else
570
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'allowCustomConfig', 'fieldLabel' => 'Allow Custom Config', 'type' => 'checkbox', 'defaultValue' => false}], options[:options], @api_client)
571
+ payload['task']['allowCustomConfig'] = ['true','on'].include?(v_prompt['allowCustomConfig'].to_s) unless v_prompt['allowCustomConfig'].nil?
572
+ end
557
573
 
558
574
 
559
575
  end
@@ -568,7 +584,7 @@ class Morpheus::Cli::Tasks
568
584
  print JSON.pretty_generate(json_response),"\n"
569
585
  elsif !options[:quiet]
570
586
  task = json_response['task']
571
- print_green_success "Task #{task['name']} created successfully"
587
+ print_green_success "Task #{task['name']} created"
572
588
  get([task['id']])
573
589
  end
574
590
  rescue RestClient::Exception => e
@@ -617,8 +633,127 @@ class Morpheus::Cli::Tasks
617
633
  end
618
634
  end
619
635
 
636
+ def execute(args)
637
+ params = {}
638
+ options = {}
639
+ target_type = nil
640
+ instance_ids = []
641
+ instances = []
642
+ server_ids = []
643
+ servers = []
644
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
645
+ opts.banner = subcommand_usage("[task] --instance [instance] [options]")
646
+ opts.on('--instance INSTANCE', String, "Instance name or id to execute the task on. This option can be passed more than once.") do |val|
647
+ target_type = 'instance'
648
+ instance_ids << val
649
+ end
650
+ opts.on('--instances [LIST]', Array, "Instances, comma separated list of instance names or IDs.") do |list|
651
+ target_type = 'instance'
652
+ instance_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
653
+ end
654
+ opts.on('--host HOST', String, "Host name or id to execute the task on. This option can be passed more than once.") do |val|
655
+ target_type = 'server'
656
+ server_ids << val
657
+ end
658
+ opts.on('--hosts [LIST]', Array, "Hosts, comma separated list of host names or IDs.") do |list|
659
+ target_type = 'server'
660
+ server_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
661
+ end
662
+ opts.on('--server HOST', String, "alias for --host") do |val|
663
+ target_type = 'server'
664
+ server_ids << val
665
+ end
666
+ opts.on('--servers [LIST]', Array, "alias for --hosts") do |list|
667
+ target_type = 'server'
668
+ server_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
669
+ end
670
+ opts.add_hidden_option('--server')
671
+ opts.add_hidden_option('--servers')
672
+ opts.on('--config [TEXT]', String, "Custom config") do |val|
673
+ params['customConfig'] = val.to_s
674
+ end
675
+ build_common_options(opts, options, [:options, :json, :dry_run, :remote])
676
+ end
677
+ optparse.parse!(args)
678
+ if args.count != 1
679
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
680
+ end
681
+ task_name = args[0]
682
+ connect(options)
683
+ begin
684
+ task = find_task_by_name_or_id(task_name)
685
+ return 1 if task.nil?
686
+
687
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
688
+ payload = nil
689
+ if options[:payload]
690
+ payload = options[:payload]
691
+ payload.deep_merge!({'job' => passed_options}) unless passed_options.empty?
692
+ else
693
+ if instance_ids.size > 0 && server_ids.size > 0
694
+ raise_command_error "Pass --instance or --host, not both.\n#{optparse}"
695
+ elsif instance_ids.size > 0
696
+ instance_ids.each do |instance_id|
697
+ instance = find_instance_by_name_or_id(instance_id)
698
+ return 1 if instance.nil?
699
+ instances << instance
700
+ end
701
+ params['instances'] = instances.collect {|it| it['id'] }
702
+ elsif server_ids.size > 0
703
+ server_ids.each do |server_id|
704
+ server = find_server_by_name_or_id(server_id)
705
+ return 1 if server.nil?
706
+ servers << server
707
+ end
708
+ params['servers'] = servers.collect {|it| it['id'] }
709
+ else
710
+ raise_command_error "missing required option: --instance or --host\n#{optparse}"
711
+ end
712
+
713
+ # todo: prompt to task optionTypes for customOptions
714
+ if task['optionTypes']
715
+
716
+ end
717
+
718
+ params['targetType'] = target_type
719
+
720
+ job_payload = {}
721
+ job_payload.deep_merge!(params)
722
+ job_payload.deep_merge!(passed_options) unless passed_options.empty?
723
+ payload = {'job' => job_payload}
724
+ end
725
+
726
+ @tasks_interface.setopts(options)
727
+ if options[:dry_run]
728
+ print_dry_run @tasks_interface.dry.run(task['id'], payload)
729
+ return
730
+ end
731
+ response = @tasks_interface.run(task['id'], payload)
732
+ if options[:json]
733
+ print JSON.pretty_generate(json_response)
734
+ if !response['success']
735
+ return 1
736
+ end
737
+ else
738
+ target_desc = ""
739
+ if instances.size() > 0
740
+ target_desc = (instances.size() == 1) ? "instance #{instances[0]['name']}" : "#{instances.size()} instances"
741
+ elsif servers.size() > 0
742
+ target_desc = (servers.size() == 1) ? "host #{servers[0]['name']}" : "#{servers.size()} hosts"
743
+ end
744
+ print_green_success "Executing task #{task['name']} on #{target_desc}"
745
+ # todo: load job/execution
746
+ # get([task['id']])
747
+ end
748
+ return 0
749
+ rescue RestClient::Exception => e
750
+ print_rest_exception(e, options)
751
+ return 1
752
+ end
753
+ end
620
754
 
621
755
  private
756
+
622
757
  def find_task_by_name_or_id(val)
623
758
  if val.to_s =~ /\A\d{1,}\Z/
624
759
  return find_task_by_id(val)
@@ -634,6 +769,7 @@ class Morpheus::Cli::Tasks
634
769
  rescue RestClient::Exception => e
635
770
  if e.response && e.response.code == 404
636
771
  print_red_alert "Task not found by id #{id}"
772
+ return nil
637
773
  else
638
774
  raise e
639
775
  end
@@ -690,7 +826,7 @@ class Morpheus::Cli::Tasks
690
826
  {"ID" => lambda {|it| it['id'] } },
691
827
  {"NAME" => lambda {|it| it['name'] } },
692
828
  {"TYPE" => lambda {|it| it['taskType']['name'] ? it['taskType']['name'] : it['type'] } },
693
- # {"CREATED" => lambda {|it| format_local_dt(it['dateCreated']) } },
829
+ {"CREATED" => lambda {|it| format_local_dt(it['dateCreated']) } },
694
830
  # {"UPDATED" => lambda {|it| format_local_dt(it['lastUpdated']) } },
695
831
  ]
696
832
  if opts[:include_fields]
@@ -699,4 +835,80 @@ class Morpheus::Cli::Tasks
699
835
  print as_pretty_table(tasks, columns, opts)
700
836
  end
701
837
 
838
+ def find_instance_by_name_or_id(val)
839
+ if val.to_s =~ /\A\d{1,}\Z/
840
+ return find_instance_by_id(val)
841
+ else
842
+ return find_instance_by_name(val)
843
+ end
844
+ end
845
+
846
+ def find_instance_by_id(id)
847
+ begin
848
+ json_response = @instances_interface.get(id.to_i)
849
+ return json_response['instance']
850
+ rescue RestClient::Exception => e
851
+ if e.response && e.response.code == 404
852
+ print_red_alert "Instance not found by id #{id}"
853
+ return nil
854
+ else
855
+ raise e
856
+ end
857
+ end
858
+ end
859
+
860
+ def find_instance_by_name(name)
861
+ instances = @instances_interface.list({name: name.to_s})['instances']
862
+ if instances.empty?
863
+ print_red_alert "Instance not found by name #{name}"
864
+ return nil
865
+ elsif instances.size > 1
866
+ print_red_alert "#{instances.size} instances found by name #{name}"
867
+ as_pretty_table(instances, [:id, :name], {color: red})
868
+ print_red_alert "Try using ID instead"
869
+ print reset,"\n"
870
+ return nil
871
+ else
872
+ return instances[0]
873
+ end
874
+ end
875
+
876
+ def find_server_by_name_or_id(val)
877
+ if val.to_s =~ /\A\d{1,}\Z/
878
+ return find_server_by_id(val)
879
+ else
880
+ return find_server_by_name(val)
881
+ end
882
+ end
883
+
884
+ def find_server_by_id(id)
885
+ begin
886
+ json_response = @servers_interface.get(id.to_i)
887
+ return json_response['server']
888
+ rescue RestClient::Exception => e
889
+ if e.response && e.response.code == 404
890
+ print_red_alert "Server not found by id #{id}"
891
+ return nil
892
+ else
893
+ raise e
894
+ end
895
+ end
896
+ end
897
+
898
+ def find_server_by_name(name)
899
+ servers = @servers_interface.list({name: name.to_s})['servers']
900
+ if servers.empty?
901
+ print_red_alert "Host not found by name #{name}"
902
+ return nil
903
+ elsif servers.size > 1
904
+ print_red_alert "#{servers.size} hosts found by name #{name}"
905
+ as_pretty_table(servers, [:id, :name], {color: red})
906
+ print_red_alert "Try using ID instead"
907
+ print reset,"\n"
908
+ return nil
909
+ else
910
+ return servers[0]
911
+ end
912
+ end
913
+
702
914
  end
@@ -188,12 +188,7 @@ class Morpheus::Cli::TenantsCommand
188
188
  account_keys = ['name', 'description', 'currency']
189
189
  account_payload = params.select {|k,v| account_keys.include?(k) }
190
190
  account_payload['currency'] = account_payload['currency'].to_s.empty? ? "USD" : account_payload['currency'].upcase
191
- if !account_payload['instanceLimits']
192
- account_payload['instanceLimits'] = {}
193
- account_payload['instanceLimits']['maxStorage'] = params['instanceLimits.maxStorage'].to_i if params['instanceLimits.maxStorage'].to_s.strip != ''
194
- account_payload['instanceLimits']['maxMemory'] = params['instanceLimits.maxMemory'].to_i if params['instanceLimits.maxMemory'].to_s.strip != ''
195
- account_payload['instanceLimits']['maxCpu'] = params['instanceLimits.maxCpu'].to_i if params['instanceLimits.maxCpu'].to_s.strip != ''
196
- end
191
+
197
192
  if params['role'].to_s != ''
198
193
  role = find_role_by_name(nil, params['role'])
199
194
  exit 1 if role.nil?
@@ -255,15 +250,10 @@ class Morpheus::Cli::TenantsCommand
255
250
  end
256
251
 
257
252
  #puts "parsed params is : #{params.inspect}"
258
- #account_keys = ['name', 'description', 'currency', 'instanceLimits']
253
+ #account_keys = ['name', 'description', 'currency']
259
254
  account_payload = params
260
255
  account_payload['currency'] = account_payload['currency'].upcase unless account_payload['currency'].to_s.empty?
261
- # if !account_payload['instanceLimits']
262
- # account_payload['instanceLimits'] = {}
263
- # account_payload['instanceLimits']['maxStorage'] = params['instanceLimits.maxStorage'].to_i if params['instanceLimits.maxStorage'].to_s.strip != ''
264
- # account_payload['instanceLimits']['maxMemory'] = params['instanceLimits.maxMemory'].to_i if params['instanceLimits.maxMemory'].to_s.strip != ''
265
- # account_payload['instanceLimits']['maxCpu'] = params['instanceLimits.maxCpu'].to_i if params['instanceLimits.maxCpu'].to_s.strip != ''
266
- # end
256
+
267
257
  if params['role'].to_s != ''
268
258
  role = find_role_by_name(nil, params['role'])
269
259
  exit 1 if role.nil?
@@ -345,9 +335,6 @@ class Morpheus::Cli::TenantsCommand
345
335
  {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'displayOrder' => 2},
346
336
  {'fieldName' => 'role', 'fieldLabel' => 'Base Role', 'type' => 'text', 'displayOrder' => 3},
347
337
  {'fieldName' => 'currency', 'fieldLabel' => 'Currency', 'type' => 'text', 'displayOrder' => 4}
348
- # {'fieldName' => 'instanceLimits.maxStorage', 'fieldLabel' => 'Max Storage (bytes)', 'type' => 'text', 'displayOrder' => 5},
349
- # {'fieldName' => 'instanceLimits.maxMemory', 'fieldLabel' => 'Max Memory (bytes)', 'type' => 'text', 'displayOrder' => 6},
350
- # {'fieldName' => 'instanceLimits.maxCpu', 'fieldLabel' => 'CPU Count', 'type' => 'text', 'displayOrder' => 7},
351
338
  ]
352
339
  end
353
340
 
@@ -202,13 +202,6 @@ class Morpheus::Cli::Users
202
202
  }
203
203
  print_description_list(description_cols, user)
204
204
 
205
- # print_h2 "User Instance Limits", options
206
- # print cyan
207
- # print_description_list({
208
- # "Max Storage" => lambda {|it| (it && it['maxStorage'].to_i != 0) ? Filesize.from("#{it['maxStorage']} B").pretty : "no limit" },
209
- # "Max Memory" => lambda {|it| (it && it['maxMemory'].to_i != 0) ? Filesize.from("#{it['maxMemory']} B").pretty : "no limit" },
210
- # "CPU Count" => lambda {|it| (it && it['maxCpu'].to_i != 0) ? it['maxCpu'] : "no limit" }
211
- # }, user['instanceLimits'])
212
205
 
213
206
  if options[:include_feature_access] && user_feature_permissions
214
207
  if user_feature_permissions
@@ -258,11 +251,7 @@ class Morpheus::Cli::Users
258
251
  prompt_option_types = add_user_option_types().reject {|it| 'role' == it['fieldName'] }
259
252
  v_prompt = Morpheus::Cli::OptionTypes.prompt(prompt_option_types, options[:options], @api_client, options[:params])
260
253
  params.deep_merge!(v_prompt)
261
- if params['instanceLimits']
262
- params['instanceLimits']['maxStorage'] = params['instanceLimits']['maxStorage'].to_i if params['instanceLimits']['maxStorage'].to_s.strip != ''
263
- params['instanceLimits']['maxMemory'] = params['instanceLimits']['maxMemory'].to_i if params['instanceLimits']['maxMemory'].to_s.strip != ''
264
- params['instanceLimits']['maxCpu'] = params['instanceLimits']['maxCpu'].to_i if params['instanceLimits']['maxCpu'].to_s.strip != ''
265
- end
254
+
266
255
  # prompt for roles
267
256
  selected_roles = []
268
257
  selected_roles += params.delete('role').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if params['role']
@@ -359,13 +348,7 @@ class Morpheus::Cli::Users
359
348
  return 1
360
349
  end
361
350
 
362
- #puts "parsed params is : #{params.inspect}"
363
- if params['instanceLimits']
364
- params['instanceLimits']['maxStorage'] = params['instanceLimits']['maxStorage'].to_i if params['instanceLimits']['maxStorage'].to_s.strip != ''
365
- params['instanceLimits']['maxMemory'] = params['instanceLimits']['maxMemory'].to_i if params['instanceLimits']['maxMemory'].to_s.strip != ''
366
- params['instanceLimits']['maxCpu'] = params['instanceLimits']['maxCpu'].to_i if params['instanceLimits']['maxCpu'].to_s.strip != ''
367
- end
368
-
351
+
369
352
  payload = {'user' => params}
370
353
  end
371
354
  @users_interface.setopts(options)
@@ -524,9 +507,6 @@ class Morpheus::Cli::Users
524
507
  {'fieldName' => 'email', 'fieldLabel' => 'Email', 'type' => 'text', 'required' => true, 'displayOrder' => 4},
525
508
  {'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'required' => true, 'displayOrder' => 6},
526
509
  {'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => true, 'displayOrder' => 7},
527
- {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxStorage', 'fieldLabel' => 'Max Storage (bytes)', 'type' => 'text', 'displayOrder' => 8},
528
- {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxMemory', 'fieldLabel' => 'Max Memory (bytes)', 'type' => 'text', 'displayOrder' => 9},
529
- {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxCpu', 'fieldLabel' => 'CPU Count', 'type' => 'text', 'displayOrder' => 10},
530
510
  {'fieldName' => 'role', 'fieldLabel' => 'Role', 'type' => 'text', 'displayOrder' => 11, 'description' => "Role names (comma separated)"},
531
511
  ]
532
512
  end
@@ -539,9 +519,6 @@ class Morpheus::Cli::Users
539
519
  {'fieldName' => 'email', 'fieldLabel' => 'Email', 'type' => 'text', 'required' => false, 'displayOrder' => 4},
540
520
  {'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'required' => false, 'displayOrder' => 6},
541
521
  {'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => false, 'displayOrder' => 7},
542
- {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxStorage', 'fieldLabel' => 'Max Storage (bytes)', 'type' => 'text', 'displayOrder' => 8},
543
- {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxMemory', 'fieldLabel' => 'Max Memory (bytes)', 'type' => 'text', 'displayOrder' => 9},
544
- {'fieldContext' => 'instanceLimits', 'fieldName' => 'maxCpu', 'fieldLabel' => 'CPU Count', 'type' => 'text', 'displayOrder' => 10},
545
522
  {'fieldName' => 'role', 'fieldLabel' => 'Role', 'type' => 'text', 'displayOrder' => 11, 'description' => "Role names (comma separated)"},
546
523
  ]
547
524
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "4.1.8"
4
+ VERSION = "4.1.9"
5
5
  end
6
6
  end
@@ -5,7 +5,7 @@ class Morpheus::Cli::WhitelabelSettingsCommand
5
5
  # include Morpheus::Cli::AccountsHelper
6
6
 
7
7
  set_command_name :'whitelabel-settings'
8
- set_command_hidden
8
+
9
9
  register_subcommands :get, :update
10
10
  register_subcommands :update_images, :reset_image, :download_image, :view_image
11
11
  set_default_subcommand :get
@@ -154,58 +154,58 @@ class Morpheus::Cli::WhitelabelSettingsCommand
154
154
  params['resetFavicon'] = true
155
155
  end
156
156
  opts.on("--header-bg-color VALUE", String, "Header background color") do |val|
157
- params['headerBgColor'] = val
157
+ params['headerBgColor'] = val == 'null' ? nil : val
158
158
  end
159
159
  opts.on("--header-fg-color VALUE", String, "Header foreground color") do |val|
160
- params['headerFgColor'] = val
160
+ params['headerFgColor'] = val == 'null' ? nil : val
161
161
  end
162
162
  opts.on("--nav-bg-color VALUE", String, "Nav background color") do |val|
163
- params['navBgColor'] = val
163
+ params['navBgColor'] = val == 'null' ? nil : val
164
164
  end
165
165
  opts.on("--nav-fg-color VALUE", String, "Nav foreground color") do |val|
166
- params['navFgColor'] = val
166
+ params['navFgColor'] = val == 'null' ? nil : val
167
167
  end
168
168
  opts.on("--nav-hover-color VALUE", String, "Nav hover color") do |val|
169
- params['navHoverColor'] = val
169
+ params['navHoverColor'] = val == 'null' ? nil : val
170
170
  end
171
171
  opts.on("--primary-button-bg-color VALUE", String, "Primary button background color") do |val|
172
- params['primaryButtonBgColor'] = val
172
+ params['primaryButtonBgColor'] = val == 'null' ? nil : val
173
173
  end
174
174
  opts.on("--primary-button-fg-color VALUE", String, "Primary button foreground color") do |val|
175
- params['primaryButtonFgColor'] = val
175
+ params['primaryButtonFgColor'] = val == 'null' ? nil : val
176
176
  end
177
177
  opts.on("--primary-button-hover-bg-color VALUE", String, "Primary button hover background color") do |val|
178
- params['primaryButtonHoverBgColor'] = val
178
+ params['primaryButtonHoverBgColor'] = val == 'null' ? nil : val
179
179
  end
180
180
  opts.on("--primary-button-hover-fg-color VALUE", String, "Primary button hover foreground color") do |val|
181
- params['primaryButtonHoverFgColor'] = val
181
+ params['primaryButtonHoverFgColor'] = val == 'null' ? nil : val
182
182
  end
183
183
  opts.on("--footer-bg-color VALUE", String, "Footer background color") do |val|
184
- params['footerBgColor'] = val
184
+ params['footerBgColor'] = val == 'null' ? nil : val
185
185
  end
186
186
  opts.on("--footer-fg-color VALUE", String, "Footer foreground color") do |val|
187
- params['footerFgColor'] = val
187
+ params['footerFgColor'] = val == 'null' ? nil : val
188
188
  end
189
189
  opts.on("--login-bg-color VALUE", String, "Login background color") do |val|
190
- params['loginBgColor'] = val
190
+ params['loginBgColor'] = val == 'null' ? nil : val
191
191
  end
192
192
  opts.on("--copyright TEXT", String, "Copyright String") do |val|
193
- params['copyrightString'] = val
193
+ params['copyrightString'] = val == 'null' ? nil : val
194
194
  end
195
195
  opts.on("--css TEXT", String, "Override CSS") do |val|
196
- params['overrideCss'] = val
196
+ params['overrideCss'] = val == 'null' ? nil : val
197
197
  end
198
198
  opts.on("--css-file FILE", String, "Override CSS from local file") do |val|
199
199
  options[:overrideCssFile] = val
200
200
  end
201
201
  opts.on("--terms TEXT", String, "Terms of use content") do |val|
202
- params['termsOfUse'] = val
202
+ params['termsOfUse'] = val == 'null' ? nil : val
203
203
  end
204
204
  opts.on("--terms-file FILE", String, "Terms of use content from local file") do |val|
205
205
  options[:termsOfUseFile] = val
206
206
  end
207
207
  opts.on("--privacy-policy TEXT", String, "Privacy policy content") do |val|
208
- params['privacyPolicy'] = val
208
+ params['privacyPolicy'] = val == 'null' ? nil : val
209
209
  end
210
210
  opts.on("--privacy-policy-file FILE", String, "Privacy policy content from local file") do |val|
211
211
  options[:privacyPolicyFile] = val
@@ -215,7 +215,7 @@ class Morpheus::Cli::WhitelabelSettingsCommand
215
215
  support_menu_links = JSON.parse(val.to_s)
216
216
  params['supportMenuLinks'] = support_menu_links.kind_of?(Array) ? support_menu_links : [support_menu_links]
217
217
  rescue JSON::ParserError => e
218
- print_red_alert "Unable to parse forwarding rules JSON"
218
+ print_red_alert "Unable to parse support menu links JSON"
219
219
  exit 1
220
220
  end
221
221
  end