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.
- 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
|
|