morpheus-cli 4.1.8 → 4.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/lib/morpheus/api/api_client.rb +24 -0
- data/lib/morpheus/api/{old_cypher_interface.rb → budgets_interface.rb} +10 -11
- data/lib/morpheus/api/cloud_datastores_interface.rb +7 -0
- data/lib/morpheus/api/cloud_resource_pools_interface.rb +2 -2
- data/lib/morpheus/api/cypher_interface.rb +18 -12
- data/lib/morpheus/api/health_interface.rb +72 -0
- data/lib/morpheus/api/instances_interface.rb +1 -1
- data/lib/morpheus/api/library_instance_types_interface.rb +7 -0
- data/lib/morpheus/api/log_settings_interface.rb +6 -0
- data/lib/morpheus/api/network_security_servers_interface.rb +30 -0
- data/lib/morpheus/api/price_sets_interface.rb +42 -0
- data/lib/morpheus/api/prices_interface.rb +68 -0
- data/lib/morpheus/api/provisioning_settings_interface.rb +29 -0
- data/lib/morpheus/api/servers_interface.rb +1 -1
- data/lib/morpheus/api/service_plans_interface.rb +34 -11
- data/lib/morpheus/api/task_sets_interface.rb +8 -0
- data/lib/morpheus/api/tasks_interface.rb +8 -0
- data/lib/morpheus/cli.rb +6 -3
- data/lib/morpheus/cli/appliance_settings_command.rb +13 -5
- data/lib/morpheus/cli/approvals_command.rb +1 -1
- data/lib/morpheus/cli/apps.rb +88 -28
- data/lib/morpheus/cli/backup_settings_command.rb +1 -1
- data/lib/morpheus/cli/blueprints_command.rb +2 -0
- data/lib/morpheus/cli/budgets_command.rb +672 -0
- data/lib/morpheus/cli/cli_command.rb +13 -2
- data/lib/morpheus/cli/cli_registry.rb +1 -0
- data/lib/morpheus/cli/clusters.rb +40 -274
- data/lib/morpheus/cli/commands/standard/benchmark_command.rb +114 -66
- data/lib/morpheus/cli/commands/standard/coloring_command.rb +12 -0
- data/lib/morpheus/cli/commands/standard/curl_command.rb +31 -6
- data/lib/morpheus/cli/commands/standard/echo_command.rb +8 -3
- data/lib/morpheus/cli/commands/standard/set_prompt_command.rb +1 -1
- data/lib/morpheus/cli/containers_command.rb +37 -24
- data/lib/morpheus/cli/cypher_command.rb +191 -150
- data/lib/morpheus/cli/health_command.rb +903 -0
- data/lib/morpheus/cli/hosts.rb +43 -32
- data/lib/morpheus/cli/instances.rb +119 -68
- data/lib/morpheus/cli/jobs_command.rb +1 -1
- data/lib/morpheus/cli/library_instance_types_command.rb +61 -11
- data/lib/morpheus/cli/library_option_types_command.rb +2 -2
- data/lib/morpheus/cli/log_settings_command.rb +46 -3
- data/lib/morpheus/cli/logs_command.rb +24 -17
- data/lib/morpheus/cli/mixins/accounts_helper.rb +2 -0
- data/lib/morpheus/cli/mixins/logs_helper.rb +73 -19
- data/lib/morpheus/cli/mixins/print_helper.rb +29 -1
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +554 -96
- data/lib/morpheus/cli/mixins/whoami_helper.rb +13 -1
- data/lib/morpheus/cli/networks_command.rb +3 -0
- data/lib/morpheus/cli/option_types.rb +83 -53
- data/lib/morpheus/cli/price_sets_command.rb +543 -0
- data/lib/morpheus/cli/prices_command.rb +669 -0
- data/lib/morpheus/cli/processes_command.rb +0 -2
- data/lib/morpheus/cli/provisioning_settings_command.rb +237 -0
- data/lib/morpheus/cli/remote.rb +9 -4
- data/lib/morpheus/cli/reports_command.rb +10 -4
- data/lib/morpheus/cli/roles.rb +93 -38
- data/lib/morpheus/cli/security_groups.rb +10 -0
- data/lib/morpheus/cli/service_plans_command.rb +736 -0
- data/lib/morpheus/cli/tasks.rb +220 -8
- data/lib/morpheus/cli/tenants_command.rb +3 -16
- data/lib/morpheus/cli/users.rb +2 -25
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/whitelabel_settings_command.rb +18 -18
- data/lib/morpheus/cli/whoami.rb +28 -10
- data/lib/morpheus/cli/workflows.rb +488 -36
- data/lib/morpheus/formatters.rb +22 -0
- data/morpheus-cli.gemspec +1 -0
- metadata +28 -5
- data/lib/morpheus/cli/accounts.rb +0 -335
- data/lib/morpheus/cli/old_cypher_command.rb +0 -412
data/lib/morpheus/cli/hosts.rb
CHANGED
@@ -5,6 +5,7 @@ require 'optparse'
|
|
5
5
|
require 'morpheus/cli/cli_command'
|
6
6
|
require 'morpheus/cli/mixins/accounts_helper'
|
7
7
|
require 'morpheus/cli/mixins/provisioning_helper'
|
8
|
+
require 'morpheus/cli/mixins/logs_helper'
|
8
9
|
require 'morpheus/cli/option_types'
|
9
10
|
require 'json'
|
10
11
|
|
@@ -12,6 +13,7 @@ class Morpheus::Cli::Hosts
|
|
12
13
|
include Morpheus::Cli::CliCommand
|
13
14
|
include Morpheus::Cli::AccountsHelper
|
14
15
|
include Morpheus::Cli::ProvisioningHelper
|
16
|
+
include Morpheus::Cli::LogsHelper
|
15
17
|
set_command_name :hosts
|
16
18
|
set_command_description "View and manage hosts (servers)."
|
17
19
|
register_subcommands :list, :count, :get, :view, :stats, :add, :update, :remove, :logs, :start, :stop, :resize, :run_workflow, :make_managed, :upgrade_agent
|
@@ -37,7 +39,7 @@ class Morpheus::Cli::Hosts
|
|
37
39
|
@server_types_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).server_types
|
38
40
|
@logs_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).logs
|
39
41
|
@accounts_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).accounts
|
40
|
-
@active_group_id = Morpheus::Cli::Groups.
|
42
|
+
@active_group_id = Morpheus::Cli::Groups.active_groups[@appliance_name]
|
41
43
|
@execution_request_interface = @api_client.execution_request
|
42
44
|
@clusters_interface = @api_client.clusters
|
43
45
|
end
|
@@ -562,8 +564,24 @@ class Morpheus::Cli::Hosts
|
|
562
564
|
|
563
565
|
def logs(args)
|
564
566
|
options = {}
|
567
|
+
params = {}
|
565
568
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
566
569
|
opts.banner = subcommand_usage("[name]")
|
570
|
+
opts.on('--start TIMESTAMP','--start TIMESTAMP', "Start timestamp. Default is 30 days ago.") do |val|
|
571
|
+
options[:start] = parse_time(val) #.utc.iso8601
|
572
|
+
end
|
573
|
+
opts.on('--end TIMESTAMP','--end TIMESTAMP', "End timestamp. Default is now.") do |val|
|
574
|
+
options[:end] = parse_time(val) #.utc.iso8601
|
575
|
+
end
|
576
|
+
opts.on('--level VALUE', String, "Log Level. DEBUG,INFO,WARN,ERROR") do |val|
|
577
|
+
params['level'] = params['level'] ? [params['level'], val].flatten : val
|
578
|
+
end
|
579
|
+
opts.on('--table', '--table', "Format ouput as a table.") do
|
580
|
+
options[:table] = true
|
581
|
+
end
|
582
|
+
opts.on('-a', '--all', "Display all details: entire message." ) do
|
583
|
+
options[:details] = true
|
584
|
+
end
|
567
585
|
build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
|
568
586
|
end
|
569
587
|
optparse.parse!(args)
|
@@ -574,54 +592,47 @@ class Morpheus::Cli::Hosts
|
|
574
592
|
connect(options)
|
575
593
|
begin
|
576
594
|
server = find_host_by_name_or_id(args[0])
|
577
|
-
params = {}
|
578
595
|
params.merge!(parse_list_options(options))
|
579
|
-
params[
|
580
|
-
params[
|
596
|
+
params['query'] = params.delete('phrase') if params['phrase']
|
597
|
+
params['order'] = params['direction'] unless params['direction'].nil? # old api version expects order instead of direction
|
598
|
+
params['startMs'] = (options[:start].to_i * 1000) if options[:start]
|
599
|
+
params['endMs'] = (options[:end].to_i * 1000) if options[:end]
|
581
600
|
@logs_interface.setopts(options)
|
582
601
|
if options[:dry_run]
|
583
602
|
print_dry_run @logs_interface.dry.server_logs([server['id']], params)
|
584
603
|
return
|
585
604
|
end
|
586
605
|
json_response = @logs_interface.server_logs([server['id']], params)
|
587
|
-
render_result = render_with_format(json_response, options, 'data')
|
606
|
+
render_result = json_response['logs'] ? render_with_format(json_response, options, 'logs') : render_with_format(json_response, options, 'data')
|
588
607
|
return 0 if render_result
|
589
608
|
|
590
|
-
logs = json_response
|
591
609
|
title = "Host Logs: #{server['name']} (#{server['computeServerType'] ? server['computeServerType']['name'] : 'unmanaged'})"
|
592
610
|
subtitles = parse_list_subtitles(options)
|
611
|
+
if options[:start]
|
612
|
+
subtitles << "Start: #{options[:start]}".strip
|
613
|
+
end
|
614
|
+
if options[:end]
|
615
|
+
subtitles << "End: #{options[:end]}".strip
|
616
|
+
end
|
593
617
|
if params[:query]
|
594
618
|
subtitles << "Search: #{params[:query]}".strip
|
595
619
|
end
|
596
|
-
#
|
620
|
+
# if params['containers']
|
621
|
+
# subtitles << "Containers: #{params['containers']}".strip
|
622
|
+
# end
|
623
|
+
if params['level']
|
624
|
+
subtitles << "Level: #{params['level']}"
|
625
|
+
end
|
597
626
|
print_h1 title, subtitles, options
|
598
|
-
|
599
|
-
|
627
|
+
logs = json_response['data'] || json_response['logs']
|
628
|
+
if logs.empty?
|
629
|
+
print "#{cyan}No logs found.#{reset}\n"
|
600
630
|
else
|
601
|
-
|
602
|
-
|
603
|
-
else
|
604
|
-
logs['data'].each do |log_entry|
|
605
|
-
log_level = ''
|
606
|
-
case log_entry['level']
|
607
|
-
when 'INFO'
|
608
|
-
log_level = "#{blue}#{bold}INFO#{reset}"
|
609
|
-
when 'DEBUG'
|
610
|
-
log_level = "#{white}#{bold}DEBUG#{reset}"
|
611
|
-
when 'WARN'
|
612
|
-
log_level = "#{yellow}#{bold}WARN#{reset}"
|
613
|
-
when 'ERROR'
|
614
|
-
log_level = "#{red}#{bold}ERROR#{reset}"
|
615
|
-
when 'FATAL'
|
616
|
-
log_level = "#{red}#{bold}FATAL#{reset}"
|
617
|
-
end
|
618
|
-
puts "[#{log_entry['ts']}] #{log_level} - #{log_entry['message'].to_s.strip}"
|
619
|
-
end
|
620
|
-
print_results_pagination({'meta'=>{'total'=>json_response['total'],'size'=>json_response['data'].size,'max'=>(json_response['max'] || options[:max]),'offset'=>(json_response['offset'] || options[:offset] || 0)}})
|
621
|
-
end
|
622
|
-
print reset, "\n"
|
623
|
-
return 0
|
631
|
+
print format_log_records(logs, options)
|
632
|
+
print_results_pagination({'meta'=>{'total'=>(json_response['total']['value'] rescue json_response['total']),'size'=>logs.size,'max'=>(json_response['max'] || options[:max]),'offset'=>(json_response['offset'] || options[:offset] || 0)}})
|
624
633
|
end
|
634
|
+
print reset, "\n"
|
635
|
+
return 0
|
625
636
|
rescue RestClient::Exception => e
|
626
637
|
print_rest_exception(e, options)
|
627
638
|
exit 1
|
@@ -6,6 +6,7 @@ require 'morpheus/cli/cli_command'
|
|
6
6
|
require 'morpheus/cli/mixins/accounts_helper'
|
7
7
|
require 'morpheus/cli/mixins/provisioning_helper'
|
8
8
|
require 'morpheus/cli/mixins/processes_helper'
|
9
|
+
require 'morpheus/cli/mixins/logs_helper'
|
9
10
|
require 'morpheus/cli/option_types'
|
10
11
|
|
11
12
|
class Morpheus::Cli::Instances
|
@@ -13,6 +14,7 @@ class Morpheus::Cli::Instances
|
|
13
14
|
include Morpheus::Cli::AccountsHelper
|
14
15
|
include Morpheus::Cli::ProvisioningHelper
|
15
16
|
include Morpheus::Cli::ProcessesHelper
|
17
|
+
include Morpheus::Cli::LogsHelper
|
16
18
|
set_command_name :instances
|
17
19
|
set_command_description "View and manage instances."
|
18
20
|
register_subcommands :list, :count, :get, :view, :add, :update, :update_notes, :remove, :logs, :history, {:'history-details' => :history_details}, {:'history-event' => :history_event_details}, :stats, :stop, :start, :restart, :actions, :action, :suspend, :eject, :backup, :backups, :stop_service, :start_service, :restart_service, :resize, :clone, :envs, :setenv, :delenv, :security_groups, :apply_security_groups, :run_workflow, :import_snapshot, :console, :status_check, {:containers => :list_containers}, :scaling, {:'scaling-update' => :scaling_update}
|
@@ -36,11 +38,13 @@ class Morpheus::Cli::Instances
|
|
36
38
|
@logs_interface = @api_client.logs
|
37
39
|
@tasks_interface = @api_client.tasks
|
38
40
|
@instance_types_interface = @api_client.instance_types
|
41
|
+
@library_layouts_interface = @api_client.library_layouts
|
39
42
|
@clouds_interface = @api_client.clouds
|
43
|
+
@clouds_datastores_interface = @api_client.cloud_datastores
|
40
44
|
@servers_interface = @api_client.servers
|
41
45
|
@provision_types_interface = @api_client.provision_types
|
42
46
|
@options_interface = @api_client.options
|
43
|
-
@active_group_id = Morpheus::Cli::Groups.
|
47
|
+
@active_group_id = Morpheus::Cli::Groups.active_groups[@appliance_name]
|
44
48
|
@execution_request_interface = @api_client.execution_request
|
45
49
|
end
|
46
50
|
|
@@ -312,6 +316,15 @@ class Morpheus::Cli::Instances
|
|
312
316
|
opts.on("--layout-size NUMBER", Integer, "Apply a multiply factor of containers/vms within the instance") do |val|
|
313
317
|
options[:layout_size] = val.to_i
|
314
318
|
end
|
319
|
+
opts.on( '-l', '--layout LAYOUT', "Layout ID" ) do |val|
|
320
|
+
options[:layout] = val
|
321
|
+
end
|
322
|
+
opts.on( '-p', '--plan PLAN', "Service plan ID") do |val|
|
323
|
+
options[:service_plan] = val
|
324
|
+
end
|
325
|
+
opts.on( '--resource-pool ID', String, "Resource pool ID" ) do |val|
|
326
|
+
options[:resource_pool] = val
|
327
|
+
end
|
315
328
|
opts.on("--workflow ID", String, "Automation: Workflow ID") do |val|
|
316
329
|
options[:workflow_id] = val
|
317
330
|
end
|
@@ -359,7 +372,7 @@ class Morpheus::Cli::Instances
|
|
359
372
|
|
360
373
|
# use active group by default
|
361
374
|
options[:group] ||= @active_group_id
|
362
|
-
|
375
|
+
options[:select_datastore] = true
|
363
376
|
options[:name_required] = true
|
364
377
|
begin
|
365
378
|
payload = nil
|
@@ -1015,9 +1028,42 @@ class Morpheus::Cli::Instances
|
|
1015
1028
|
options = {}
|
1016
1029
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
1017
1030
|
opts.banner = subcommand_usage("[instance]")
|
1031
|
+
# opts.on('--hosts HOSTS', String, "Filter logs to specific Host ID(s)") do |val|
|
1032
|
+
# params['servers'] = val.to_s.split(",").collect {|it| it.to_s.strip }.select {|it| it }.compact
|
1033
|
+
# end
|
1034
|
+
# opts.on('--servers HOSTS', String, "alias for --hosts") do |val|
|
1035
|
+
# params['servers'] = val.to_s.split(",").collect {|it| it.to_s.strip }.select {|it| it }.compact
|
1036
|
+
# end
|
1037
|
+
# opts.on('--vms HOSTS', String, "alias for --hosts") do |val|
|
1038
|
+
# params['servers'] = val.to_s.split(",").collect {|it| it.to_s.strip }.select {|it| it }.compact
|
1039
|
+
# end
|
1018
1040
|
opts.on( '-n', '--node NODE_ID', "Scope logs to specific Container or VM" ) do |node_id|
|
1019
1041
|
options[:node_id] = node_id.to_i
|
1020
1042
|
end
|
1043
|
+
# opts.on('--container CONTAINER', String, "Filter logs to specific Container ID(s)") do |val|
|
1044
|
+
# params['containers'] = val.to_s.split(",").collect {|it| it.to_s.strip }.select {|it| it }.compact
|
1045
|
+
# end
|
1046
|
+
# opts.on('--nodes HOST', String, "alias for --containers") do |val|
|
1047
|
+
# params['containers'] = val.to_s.split(",").collect {|it| it.to_s.strip }.select {|it| it }.compact
|
1048
|
+
# end
|
1049
|
+
opts.on('--start TIMESTAMP','--start TIMESTAMP', "Start timestamp. Default is 30 days ago.") do |val|
|
1050
|
+
options[:start] = parse_time(val) #.utc.iso8601
|
1051
|
+
end
|
1052
|
+
opts.on('--end TIMESTAMP','--end TIMESTAMP', "End timestamp. Default is now.") do |val|
|
1053
|
+
options[:end] = parse_time(val) #.utc.iso8601
|
1054
|
+
end
|
1055
|
+
# opts.on('--interval TIME','--interval TIME', "Interval of time to include, in seconds. Default is 30 days ago.") do |val|
|
1056
|
+
# options[:interval] = parse_time(val).utc.iso8601
|
1057
|
+
# end
|
1058
|
+
opts.on('--level VALUE', String, "Log Level. DEBUG,INFO,WARN,ERROR") do |val|
|
1059
|
+
params['level'] = params['level'] ? [params['level'], val].flatten : val
|
1060
|
+
end
|
1061
|
+
opts.on('--table', '--table', "Format ouput as a table.") do
|
1062
|
+
options[:table] = true
|
1063
|
+
end
|
1064
|
+
opts.on('-a', '--all', "Display all details: entire message." ) do
|
1065
|
+
options[:details] = true
|
1066
|
+
end
|
1021
1067
|
build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
|
1022
1068
|
end
|
1023
1069
|
optparse.parse!(args)
|
@@ -1029,53 +1075,62 @@ class Morpheus::Cli::Instances
|
|
1029
1075
|
begin
|
1030
1076
|
instance = find_instance_by_name_or_id(args[0])
|
1031
1077
|
container_ids = instance['containers']
|
1032
|
-
if options[:node_id]
|
1033
|
-
container_ids
|
1078
|
+
if options[:node_id]
|
1079
|
+
if container_ids.include?(options[:node_id])
|
1080
|
+
container_ids = [options[:node_id]]
|
1081
|
+
else
|
1082
|
+
print_red_alert "Instance does not include node #{options[:node_id]}"
|
1083
|
+
return 1
|
1084
|
+
end
|
1034
1085
|
end
|
1035
1086
|
params.merge!(parse_list_options(options))
|
1036
|
-
params[
|
1087
|
+
params['query'] = params.delete('phrase') if params['phrase']
|
1037
1088
|
params['order'] = params['direction'] unless params['direction'].nil? # old api version expects order instead of direction
|
1089
|
+
params['startMs'] = (options[:start].to_i * 1000) if options[:start]
|
1090
|
+
params['endMs'] = (options[:end].to_i * 1000) if options[:end]
|
1091
|
+
params['interval'] = options[:interval].to_s if options[:interval]
|
1038
1092
|
@logs_interface.setopts(options)
|
1039
1093
|
if options[:dry_run]
|
1040
1094
|
print_dry_run @logs_interface.dry.container_logs(container_ids, params)
|
1041
1095
|
return
|
1042
1096
|
end
|
1043
1097
|
json_response = @logs_interface.container_logs(container_ids, params)
|
1044
|
-
render_result = render_with_format(json_response, options, 'data')
|
1098
|
+
render_result = json_response['logs'] ? render_with_format(json_response, options, 'logs') : render_with_format(json_response, options, 'data')
|
1045
1099
|
return 0 if render_result
|
1046
1100
|
|
1047
|
-
logs = json_response
|
1048
1101
|
title = "Instance Logs: #{instance['name']} (#{instance['instanceType'] ? instance['instanceType']['name'] : ''})"
|
1049
1102
|
subtitles = parse_list_subtitles(options)
|
1103
|
+
if options[:start]
|
1104
|
+
subtitles << "Start: #{options[:start]}".strip
|
1105
|
+
end
|
1106
|
+
if options[:end]
|
1107
|
+
subtitles << "End: #{options[:end]}".strip
|
1108
|
+
end
|
1109
|
+
if params[:query]
|
1110
|
+
subtitles << "Search: #{params[:query]}".strip
|
1111
|
+
end
|
1112
|
+
if params['servers']
|
1113
|
+
subtitles << "Servers: #{params['servers']}".strip
|
1114
|
+
end
|
1115
|
+
if params['containers']
|
1116
|
+
subtitles << "Containers: #{params['containers']}".strip
|
1117
|
+
end
|
1050
1118
|
if params[:query]
|
1051
1119
|
subtitles << "Search: #{params[:query]}".strip
|
1052
1120
|
end
|
1053
|
-
|
1121
|
+
if params['level']
|
1122
|
+
subtitles << "Level: #{params['level']}"
|
1123
|
+
end
|
1124
|
+
logs = json_response['data'] || json_response['logs']
|
1054
1125
|
print_h1 title, subtitles, options
|
1055
|
-
if logs
|
1056
|
-
|
1126
|
+
if logs.empty?
|
1127
|
+
print "#{cyan}No logs found.#{reset}\n"
|
1057
1128
|
else
|
1058
|
-
logs
|
1059
|
-
|
1060
|
-
case log_entry['level']
|
1061
|
-
when 'INFO'
|
1062
|
-
log_level = "#{blue}#{bold}INFO#{reset}"
|
1063
|
-
when 'DEBUG'
|
1064
|
-
log_level = "#{white}#{bold}DEBUG#{reset}"
|
1065
|
-
when 'WARN'
|
1066
|
-
log_level = "#{yellow}#{bold}WARN#{reset}"
|
1067
|
-
when 'ERROR'
|
1068
|
-
log_level = "#{red}#{bold}ERROR#{reset}"
|
1069
|
-
when 'FATAL'
|
1070
|
-
log_level = "#{red}#{bold}FATAL#{reset}"
|
1071
|
-
end
|
1072
|
-
puts "[#{log_entry['ts']}] #{log_level} - #{log_entry['message'].to_s.strip}"
|
1073
|
-
end
|
1074
|
-
print_results_pagination({'meta'=>{'total'=>json_response['total'],'size'=>json_response['data'].size,'max'=>(json_response['max'] || options[:max]),'offset'=>(json_response['offset'] || options[:offset] || 0)}})
|
1129
|
+
print format_log_records(logs, options)
|
1130
|
+
print_results_pagination({'meta'=>{'total'=>(json_response['total']['value'] rescue json_response['total']),'size'=>logs.size,'max'=>(json_response['max'] || options[:max]),'offset'=>(json_response['offset'] || options[:offset] || 0)}})
|
1075
1131
|
end
|
1076
1132
|
print reset, "\n"
|
1077
1133
|
return 0
|
1078
|
-
|
1079
1134
|
rescue RestClient::Exception => e
|
1080
1135
|
print_rest_exception(e, options)
|
1081
1136
|
exit 1
|
@@ -1086,6 +1141,11 @@ class Morpheus::Cli::Instances
|
|
1086
1141
|
options = {}
|
1087
1142
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
1088
1143
|
opts.banner = subcommand_usage("[instance]")
|
1144
|
+
opts.on('-a', '--all', "Display all details: containers|vms, and scaling." ) do
|
1145
|
+
options[:details] = true
|
1146
|
+
options[:include_containers] = true
|
1147
|
+
options[:include_scaling] = true
|
1148
|
+
end
|
1089
1149
|
opts.on( nil, '--containers', "Display Instance Containers" ) do
|
1090
1150
|
options[:include_containers] = true
|
1091
1151
|
end
|
@@ -1556,55 +1616,47 @@ class Morpheus::Cli::Instances
|
|
1556
1616
|
return 1 if instance.nil?
|
1557
1617
|
|
1558
1618
|
options[:options] ||= {}
|
1559
|
-
|
1619
|
+
options[:select_datastore] = true
|
1620
|
+
options[:name_required] = true
|
1621
|
+
|
1622
|
+
# defaults derived from clone
|
1623
|
+
options[:default_name] = instance['name'] + '-clone' if instance['name']
|
1624
|
+
options[:default_group] = instance['group']['id'] if instance['group']
|
1625
|
+
options[:default_cloud] = instance['cloud']['name'] if instance['cloud']
|
1626
|
+
options[:default_plan] = instance['plan']['name'] if instance['plan']
|
1627
|
+
options[:default_resource_pool] = instance['config']['resourcePoolId'] if instance['config']
|
1628
|
+
options[:default_config] = instance['config']
|
1629
|
+
options[:default_security_group] = instance['config']['securityGroups'][0]['id'] if instance['config'] && (instance['config']['securityGroups'] || []).count > 0
|
1630
|
+
|
1631
|
+
# immutable derived from clone
|
1632
|
+
options[:instance_type_code] = instance['instanceType']['code'] if instance['instanceType']
|
1633
|
+
options[:version] = instance['instanceVersion']
|
1634
|
+
options[:layout] = instance['layout']['id'] if instance['layout']
|
1635
|
+
|
1636
|
+
# volume defaults
|
1637
|
+
options[:options]['volumes'] = instance['volumes']
|
1638
|
+
|
1639
|
+
# network defaults
|
1640
|
+
options[:options]['networkInterfaces'] = instance['interfaces']
|
1641
|
+
|
1560
1642
|
# use the -g GROUP or active group by default
|
1561
1643
|
#options[:options]['group'] ||= (options[:group] || @active_group_id)
|
1562
1644
|
# support [new-name]
|
1563
1645
|
if args[1]
|
1564
1646
|
options[:options]['name'] = args[1]
|
1565
1647
|
end
|
1566
|
-
passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
|
1648
|
+
passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) || ['networkInterfaces'].include?(k)} : {}
|
1567
1649
|
payload = {}
|
1568
1650
|
if options[:payload]
|
1569
1651
|
payload = options[:payload]
|
1570
1652
|
else
|
1571
|
-
|
1653
|
+
new_instance_payload = prompt_new_instance(options)
|
1572
1654
|
|
1573
|
-
|
1574
|
-
|
1575
|
-
|
1576
|
-
|
1577
|
-
payload['
|
1578
|
-
|
1579
|
-
# Group
|
1580
|
-
group = nil
|
1581
|
-
if options[:group].nil?
|
1582
|
-
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'group', 'fieldLabel' => 'Group', 'type' => 'select', 'selectOptions' => get_available_groups(), 'defaultValue' => instance['group']['id']}], options[:options], @api_client, options[:params])
|
1583
|
-
options[:group] = v_prompt['group'] unless v_prompt['group'].to_s.empty?
|
1584
|
-
else
|
1585
|
-
#options[:group] = instance['group']['id']
|
1586
|
-
end
|
1587
|
-
if options[:group]
|
1588
|
-
group = find_group_by_name_or_id_for_provisioning(options[:group])
|
1589
|
-
return 1 if group.nil?
|
1590
|
-
payload['group'] = {id: group['id']}
|
1591
|
-
end
|
1592
|
-
# Cloud
|
1593
|
-
cloud = nil
|
1594
|
-
if group
|
1595
|
-
if options[:cloud].nil?
|
1596
|
-
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'cloud', 'fieldLabel' => 'Cloud', 'type' => 'select', 'selectOptions' => get_available_clouds(group['id']), 'defaultValue' => instance['cloud']['id']}], options[:options], @api_client, options[:params])
|
1597
|
-
options[:cloud] = v_prompt['cloud'] unless v_prompt['cloud'].to_s.empty?
|
1598
|
-
else
|
1599
|
-
#options[:cloud] = instance['cloud']['id']
|
1600
|
-
end
|
1601
|
-
cloud = find_zone_by_name_or_id(nil, options[:cloud])
|
1602
|
-
return 1 if cloud.nil?
|
1603
|
-
if cloud
|
1604
|
-
payload['cloud'] = {id: cloud['id']}
|
1605
|
-
end
|
1606
|
-
end
|
1607
|
-
|
1655
|
+
# adjust for differences between new and clone payloads
|
1656
|
+
payload = new_instance_payload.delete('instance')
|
1657
|
+
payload.deep_merge!(new_instance_payload)
|
1658
|
+
payload['cloud'] = {'id' => payload.delete('zoneId')}
|
1659
|
+
payload['group'] = payload.delete('site')
|
1608
1660
|
end
|
1609
1661
|
unless passed_options.empty?
|
1610
1662
|
passed_options.delete('cloud')
|
@@ -3215,7 +3267,7 @@ class Morpheus::Cli::Instances
|
|
3215
3267
|
# end
|
3216
3268
|
params = {}
|
3217
3269
|
params.merge!(parse_list_options(options))
|
3218
|
-
# params[
|
3270
|
+
# params['query'] = params.delete('phrase') if params['phrase']
|
3219
3271
|
@instances_interface.setopts(options)
|
3220
3272
|
if options[:dry_run]
|
3221
3273
|
print_dry_run @instances_interface.dry.history(instance['id'], params)
|
@@ -3348,7 +3400,6 @@ class Morpheus::Cli::Instances
|
|
3348
3400
|
instance = find_instance_by_name_or_id(args[0])
|
3349
3401
|
params = {}
|
3350
3402
|
params.merge!(parse_list_options(options))
|
3351
|
-
params[:query] = params.delete(:phrase) unless params[:phrase].nil?
|
3352
3403
|
@instances_interface.setopts(options)
|
3353
3404
|
if options[:dry_run]
|
3354
3405
|
print_dry_run @instances_interface.dry.history_details(instance['id'], process_id, params)
|
@@ -5,7 +5,7 @@ class Morpheus::Cli::JobsCommand
|
|
5
5
|
include Morpheus::Cli::AccountsHelper
|
6
6
|
|
7
7
|
set_command_name :'jobs'
|
8
|
-
|
8
|
+
|
9
9
|
register_subcommands :list, :get, :add, :update, :execute, :remove
|
10
10
|
register_subcommands :list_executions, :get_execution, :get_execution_event
|
11
11
|
set_default_subcommand :list
|
@@ -11,6 +11,7 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
|
|
11
11
|
set_command_name :'library-instance-types'
|
12
12
|
register_subcommands :list, :get, :add, :update, :remove
|
13
13
|
register_subcommands({:'update-logo' => :update_logo})
|
14
|
+
register_subcommands({:'toggle-featured' => :toggle_featured})
|
14
15
|
|
15
16
|
def initialize()
|
16
17
|
# @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
|
@@ -300,12 +301,11 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
|
|
300
301
|
end
|
301
302
|
|
302
303
|
print_green_success "Added Instance Type #{params['name']}"
|
303
|
-
|
304
|
-
|
305
|
-
|
304
|
+
_get(json_response['instanceType']['id'], options)
|
305
|
+
return 0
|
306
306
|
rescue RestClient::Exception => e
|
307
307
|
print_rest_exception(e, options)
|
308
|
-
|
308
|
+
return 1
|
309
309
|
end
|
310
310
|
end
|
311
311
|
|
@@ -349,21 +349,71 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
|
|
349
349
|
@library_instance_types_interface.setopts(options)
|
350
350
|
if options[:dry_run]
|
351
351
|
print_dry_run @library_instance_types_interface.dry.update(instance_type['id'], payload)
|
352
|
-
return
|
352
|
+
return 0
|
353
353
|
end
|
354
354
|
|
355
355
|
json_response = @library_instance_types_interface.update(instance_type['id'], payload)
|
356
356
|
|
357
357
|
if options[:json]
|
358
358
|
print JSON.pretty_generate(json_response), "\n"
|
359
|
-
return
|
359
|
+
return 0
|
360
360
|
end
|
361
361
|
|
362
362
|
print_green_success "Updated Instance Type #{params['name'] || instance_type['name']}"
|
363
|
-
|
363
|
+
_get(json_response['instanceType']['id'], options)
|
364
|
+
return 0
|
364
365
|
rescue RestClient::Exception => e
|
365
366
|
print_rest_exception(e, options)
|
366
|
-
|
367
|
+
return 1
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
def toggle_featured(args)
|
372
|
+
options = {}
|
373
|
+
params = {}
|
374
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
375
|
+
opts.banner = subcommand_usage("[name] [options]")
|
376
|
+
# opts.on('--featured [on|off]', String, "Featured flag") do |val|
|
377
|
+
# params['featured'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
|
378
|
+
# end
|
379
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
380
|
+
opts.footer = "Toggle featured flag for an instance type." + "\n" +
|
381
|
+
"[name] is required. This is the name or id of a instance type."
|
382
|
+
end
|
383
|
+
optparse.parse!(args)
|
384
|
+
if args.count < 1
|
385
|
+
raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
386
|
+
end
|
387
|
+
connect(options)
|
388
|
+
begin
|
389
|
+
instance_type = find_instance_type_by_name_or_id(args[0])
|
390
|
+
return 1 if instance_type.nil?
|
391
|
+
payload = nil
|
392
|
+
if options[:payload]
|
393
|
+
payload = options[:payload]
|
394
|
+
else
|
395
|
+
instance_type_payload = {}
|
396
|
+
instance_type_payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
|
397
|
+
payload = {'instanceType' => instance_type_payload}
|
398
|
+
end
|
399
|
+
@library_instance_types_interface.setopts(options)
|
400
|
+
if options[:dry_run]
|
401
|
+
print_dry_run @library_instance_types_interface.dry.toggle_featured(instance_type['id'], params, payload)
|
402
|
+
return 0
|
403
|
+
end
|
404
|
+
|
405
|
+
json_response = @library_instance_types_interface.toggle_featured(instance_type['id'], params, payload)
|
406
|
+
|
407
|
+
if options[:json]
|
408
|
+
print JSON.pretty_generate(json_response), "\n"
|
409
|
+
return 0
|
410
|
+
end
|
411
|
+
print_green_success "Updated Instance Type #{params['name'] || instance_type['name']}"
|
412
|
+
_get(instance_type['id'], options)
|
413
|
+
return 0
|
414
|
+
rescue RestClient::Exception => e
|
415
|
+
print_rest_exception(e, options)
|
416
|
+
return 1
|
367
417
|
end
|
368
418
|
end
|
369
419
|
|
@@ -408,13 +458,13 @@ class Morpheus::Cli::LibraryInstanceTypesCommand
|
|
408
458
|
json_response = @library_instance_types_interface.update_logo(instance_type['id'], logo_file)
|
409
459
|
if options[:json]
|
410
460
|
print JSON.pretty_generate(json_response), "\n"
|
411
|
-
return
|
461
|
+
return 0
|
412
462
|
end
|
413
463
|
print_green_success "Updated Instance Type #{instance_type['name']} logo"
|
414
|
-
|
464
|
+
_get(instance_type['id'], options)
|
415
465
|
rescue RestClient::Exception => e
|
416
466
|
print_rest_exception(e, options)
|
417
|
-
|
467
|
+
return 1
|
418
468
|
end
|
419
469
|
end
|
420
470
|
|