morpheus-cli 2.10.3 → 2.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/morpheus +5 -96
- data/lib/morpheus/api/api_client.rb +23 -1
- data/lib/morpheus/api/checks_interface.rb +106 -0
- data/lib/morpheus/api/incidents_interface.rb +102 -0
- data/lib/morpheus/api/monitoring_apps_interface.rb +47 -0
- data/lib/morpheus/api/monitoring_contacts_interface.rb +47 -0
- data/lib/morpheus/api/monitoring_groups_interface.rb +47 -0
- data/lib/morpheus/api/monitoring_interface.rb +36 -0
- data/lib/morpheus/api/option_type_lists_interface.rb +47 -0
- data/lib/morpheus/api/option_types_interface.rb +47 -0
- data/lib/morpheus/api/roles_interface.rb +0 -1
- data/lib/morpheus/api/setup_interface.rb +19 -9
- data/lib/morpheus/cli.rb +20 -1
- data/lib/morpheus/cli/accounts.rb +8 -3
- data/lib/morpheus/cli/app_templates.rb +19 -11
- data/lib/morpheus/cli/apps.rb +52 -37
- data/lib/morpheus/cli/cli_command.rb +229 -53
- data/lib/morpheus/cli/cli_registry.rb +48 -40
- data/lib/morpheus/cli/clouds.rb +55 -26
- data/lib/morpheus/cli/command_error.rb +12 -0
- data/lib/morpheus/cli/credentials.rb +68 -26
- data/lib/morpheus/cli/curl_command.rb +98 -0
- data/lib/morpheus/cli/dashboard_command.rb +2 -7
- data/lib/morpheus/cli/deployments.rb +4 -4
- data/lib/morpheus/cli/deploys.rb +1 -2
- data/lib/morpheus/cli/dot_file.rb +5 -8
- data/lib/morpheus/cli/error_handler.rb +179 -15
- data/lib/morpheus/cli/groups.rb +21 -13
- data/lib/morpheus/cli/hosts.rb +220 -110
- data/lib/morpheus/cli/instance_types.rb +2 -2
- data/lib/morpheus/cli/instances.rb +257 -167
- data/lib/morpheus/cli/key_pairs.rb +15 -9
- data/lib/morpheus/cli/library.rb +673 -27
- data/lib/morpheus/cli/license.rb +2 -2
- data/lib/morpheus/cli/load_balancers.rb +4 -4
- data/lib/morpheus/cli/log_level_command.rb +6 -4
- data/lib/morpheus/cli/login.rb +17 -3
- data/lib/morpheus/cli/logout.rb +25 -11
- data/lib/morpheus/cli/man_command.rb +388 -0
- data/lib/morpheus/cli/mixins/accounts_helper.rb +1 -1
- data/lib/morpheus/cli/mixins/monitoring_helper.rb +434 -0
- data/lib/morpheus/cli/mixins/print_helper.rb +620 -112
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +1 -1
- data/lib/morpheus/cli/monitoring_apps_command.rb +29 -0
- data/lib/morpheus/cli/monitoring_checks_command.rb +427 -0
- data/lib/morpheus/cli/monitoring_contacts_command.rb +373 -0
- data/lib/morpheus/cli/monitoring_groups_command.rb +29 -0
- data/lib/morpheus/cli/monitoring_incidents_command.rb +711 -0
- data/lib/morpheus/cli/option_types.rb +10 -1
- data/lib/morpheus/cli/recent_activity_command.rb +2 -5
- data/lib/morpheus/cli/remote.rb +874 -134
- data/lib/morpheus/cli/roles.rb +54 -27
- data/lib/morpheus/cli/security_group_rules.rb +2 -2
- data/lib/morpheus/cli/security_groups.rb +23 -19
- data/lib/morpheus/cli/set_prompt_command.rb +50 -0
- data/lib/morpheus/cli/shell.rb +222 -157
- data/lib/morpheus/cli/tasks.rb +19 -15
- data/lib/morpheus/cli/users.rb +27 -17
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/virtual_images.rb +28 -13
- data/lib/morpheus/cli/whoami.rb +131 -52
- data/lib/morpheus/cli/workflows.rb +24 -9
- data/lib/morpheus/formatters.rb +195 -3
- data/lib/morpheus/logging.rb +86 -0
- data/lib/morpheus/terminal.rb +371 -0
- data/scripts/generate_morpheus_commands_help.morpheus +60 -0
- metadata +21 -2
data/lib/morpheus/cli/clouds.rb
CHANGED
@@ -72,9 +72,20 @@ class Morpheus::Cli::Clouds
|
|
72
72
|
print "\n"
|
73
73
|
else
|
74
74
|
clouds = json_response['zones']
|
75
|
-
|
75
|
+
title = "Morpheus Clouds"
|
76
|
+
subtitles = []
|
77
|
+
if group
|
78
|
+
subtitles << "Group: #{group['name']}".strip
|
79
|
+
end
|
80
|
+
if cloud_type
|
81
|
+
subtitles << "Type: #{cloud_type['name']}".strip
|
82
|
+
end
|
83
|
+
if params[:phrase]
|
84
|
+
subtitles << "Search: #{params[:phrase]}".strip
|
85
|
+
end
|
86
|
+
print_h1 title, subtitles
|
76
87
|
if clouds.empty?
|
77
|
-
|
88
|
+
print cyan,"No clouds found.",reset,"\n"
|
78
89
|
else
|
79
90
|
print_clouds_table(clouds)
|
80
91
|
print_results_pagination(json_response)
|
@@ -114,26 +125,29 @@ class Morpheus::Cli::Clouds
|
|
114
125
|
return
|
115
126
|
end
|
116
127
|
cloud_type = cloud_type_for_id(cloud['zoneTypeId'])
|
117
|
-
|
128
|
+
print_h1 "Cloud Details"
|
118
129
|
print cyan
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
puts "
|
135
|
-
|
136
|
-
|
130
|
+
description_cols = {
|
131
|
+
"ID" => 'id',
|
132
|
+
"Name" => 'name',
|
133
|
+
"Type" => lambda {|it| cloud_type ? cloud_type['name'] : '' },
|
134
|
+
"Code" => 'code',
|
135
|
+
"Location" => 'location',
|
136
|
+
"Visibility" => lambda {|it| it['visibility'].to_s.capitalize },
|
137
|
+
"Groups" => lambda {|it| it['groups'].collect {|g| g.instance_of?(Hash) ? g['name'] : g.to_s }.join(', ') },
|
138
|
+
"Status" => lambda {|it| format_cloud_status(it) }
|
139
|
+
}
|
140
|
+
print_description_list(description_cols, cloud)
|
141
|
+
# puts "ID: #{cloud['id']}"
|
142
|
+
# puts "Name: #{cloud['name']}"
|
143
|
+
# puts "Type: #{cloud_type ? cloud_type['name'] : ''}"
|
144
|
+
# puts "Code: #{cloud['code']}"
|
145
|
+
# puts "Location: #{cloud['location']}"
|
146
|
+
# puts "Visibility: #{cloud['visibility'].to_s.capitalize}"
|
147
|
+
# puts "Groups: #{cloud['groups'].collect {|it| it.instance_of?(Hash) ? it['name'] : it.to_s }.join(', ')}"
|
148
|
+
# puts "Status: #{format_cloud_status(cloud)}"
|
149
|
+
|
150
|
+
print_h2 "Cloud Servers"
|
137
151
|
print cyan
|
138
152
|
if server_counts
|
139
153
|
print "Container Hosts: #{server_counts['containerHost']}".center(20)
|
@@ -439,11 +453,13 @@ class Morpheus::Cli::Clouds
|
|
439
453
|
return
|
440
454
|
end
|
441
455
|
securityGroups = json_response['securityGroups']
|
442
|
-
|
443
|
-
print cyan
|
456
|
+
print_h1 "Morpheus Security Groups for Cloud: #{cloud['name']}"
|
457
|
+
print cyan
|
458
|
+
print_description_list({"Firewall Enabled" => lambda {|it| format_boolean it['firewallEnabled'] } }, json_response)
|
444
459
|
if securityGroups.empty?
|
445
|
-
|
460
|
+
print yellow,"\n","No security groups currently applied.",reset,"\n"
|
446
461
|
else
|
462
|
+
print "\n"
|
447
463
|
securityGroups.each do |securityGroup|
|
448
464
|
print cyan, "= #{securityGroup['id']} (#{securityGroup['name']}) - (#{securityGroup['description']})\n"
|
449
465
|
end
|
@@ -515,9 +531,9 @@ class Morpheus::Cli::Clouds
|
|
515
531
|
print JSON.pretty_generate({zoneTypes: cloud_types})
|
516
532
|
print "\n"
|
517
533
|
else
|
518
|
-
|
534
|
+
print_h1 "Morpheus Cloud Types"
|
519
535
|
if cloud_types.empty?
|
520
|
-
|
536
|
+
print yellow,"No instances found.",reset,"\n"
|
521
537
|
else
|
522
538
|
print cyan
|
523
539
|
cloud_types = cloud_types.select {|it| it['enabled'] }
|
@@ -610,4 +626,17 @@ class Morpheus::Cli::Clouds
|
|
610
626
|
get_available_cloud_types().select {|it| it['enabled'] }.collect {|it| {'name' => it['name'], 'value' => it['code']} }
|
611
627
|
end
|
612
628
|
|
629
|
+
def format_cloud_status(cloud, return_color=cyan)
|
630
|
+
out = ""
|
631
|
+
status_string = cloud['status']
|
632
|
+
if status_string.nil? || status_string.empty? || status_string == "unknown"
|
633
|
+
out << "#{white}UNKNOWN#{return_color}"
|
634
|
+
elsif status_string == 'ok'
|
635
|
+
out << "#{green}#{status_string.upcase}#{return_color}"
|
636
|
+
else
|
637
|
+
out << "#{red}#{status_string ? status_string.upcase : 'N/A'}#{cloud['statusMessage'] ? "#{return_color} - #{cloud['statusMessage']}" : ''}#{return_color}"
|
638
|
+
end
|
639
|
+
out
|
640
|
+
end
|
641
|
+
|
613
642
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# A standard error to raise in your CliCommand classes.
|
2
|
+
class Morpheus::Cli::CommandError < StandardError
|
3
|
+
|
4
|
+
# attr_reader :args, :options
|
5
|
+
|
6
|
+
# def initialize(msg, args=[], options={})
|
7
|
+
# @args = args
|
8
|
+
# @options = options
|
9
|
+
# super(msg)
|
10
|
+
# end
|
11
|
+
|
12
|
+
end
|
@@ -11,18 +11,18 @@ module Morpheus
|
|
11
11
|
class Credentials
|
12
12
|
include Morpheus::Cli::PrintHelper
|
13
13
|
|
14
|
-
@@
|
14
|
+
@@appliance_credentials_map = nil
|
15
15
|
|
16
16
|
def initialize(appliance_name, appliance_url)
|
17
|
-
@appliance_url = appliance_url
|
18
17
|
@appliance_name = appliance_name
|
18
|
+
@appliance_url = appliance_url
|
19
19
|
end
|
20
20
|
|
21
21
|
def request_credentials(opts = {})
|
22
22
|
#puts "request_credentials(#{opts})"
|
23
23
|
username = nil
|
24
24
|
password = nil
|
25
|
-
|
25
|
+
access_token = nil
|
26
26
|
skip_save = false
|
27
27
|
# We should return an access Key for Morpheus CLI Here
|
28
28
|
if !opts[:remote_username].nil?
|
@@ -30,10 +30,10 @@ module Morpheus
|
|
30
30
|
password = opts[:remote_password]
|
31
31
|
skip_save = opts[:remote_url] ? true : false
|
32
32
|
else
|
33
|
-
|
33
|
+
access_token = load_saved_credentials
|
34
34
|
end
|
35
|
-
if
|
36
|
-
return
|
35
|
+
if access_token
|
36
|
+
return access_token
|
37
37
|
end
|
38
38
|
unless opts[:quiet] || opts[:no_prompt]
|
39
39
|
# if username.empty? || password.empty?
|
@@ -65,14 +65,14 @@ module Morpheus
|
|
65
65
|
print reset, "\n"
|
66
66
|
end
|
67
67
|
access_token = json_response['access_token']
|
68
|
-
if
|
68
|
+
if access_token && access_token != ""
|
69
69
|
unless skip_save
|
70
70
|
save_credentials(@appliance_name, access_token)
|
71
71
|
end
|
72
|
-
return access_token
|
72
|
+
# return access_token
|
73
73
|
else
|
74
74
|
print_red_alert "Credentials not verified."
|
75
|
-
return nil
|
75
|
+
# return nil
|
76
76
|
end
|
77
77
|
rescue ::RestClient::Exception => e
|
78
78
|
#raise e
|
@@ -86,8 +86,40 @@ module Morpheus
|
|
86
86
|
else
|
87
87
|
print_rest_exception(e, opts)
|
88
88
|
end
|
89
|
+
access_token = nil
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
unless skip_save
|
94
|
+
begin
|
95
|
+
# save pertinent session info to the appliance
|
96
|
+
now = Time.now.to_i
|
97
|
+
appliance = ::Morpheus::Cli::Remote.load_remote(@appliance_name)
|
98
|
+
if appliance
|
99
|
+
if access_token
|
100
|
+
appliance = ::Morpheus::Cli::Remote.load_remote(@appliance_name)
|
101
|
+
appliance[:authenticated] = true
|
102
|
+
appliance[:username] = username
|
103
|
+
appliance[:status] = "ready"
|
104
|
+
appliance[:last_login_at] = now
|
105
|
+
appliance[:last_success_at] = now
|
106
|
+
::Morpheus::Cli::Remote.save_remote(@appliance_name, appliance)
|
107
|
+
else
|
108
|
+
now = Time.now.to_i
|
109
|
+
appliance = ::Morpheus::Cli::Remote.load_remote(@appliance_name)
|
110
|
+
appliance[:authenticated] = false
|
111
|
+
#appliance[:username] = username
|
112
|
+
#appliance[:last_login_at] = now
|
113
|
+
#appliance[:error] = "Credentials not verified"
|
114
|
+
::Morpheus::Cli::Remote.save_remote(@appliance_name, appliance)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
rescue => e
|
118
|
+
#puts "failed to update remote appliance config: (#{e.class}) #{e.message}"
|
119
|
+
end
|
89
120
|
end
|
90
121
|
|
122
|
+
return access_token
|
91
123
|
end
|
92
124
|
|
93
125
|
def login(opts = {})
|
@@ -97,35 +129,45 @@ module Morpheus
|
|
97
129
|
|
98
130
|
def logout()
|
99
131
|
clear_saved_credentials(@appliance_name)
|
132
|
+
# save pertinent session info to the appliance
|
133
|
+
appliance = ::Morpheus::Cli::Remote.load_remote(@appliance_name)
|
134
|
+
if appliance
|
135
|
+
appliance.delete(:username) # could leave this...
|
136
|
+
appliance[:authenticated] = false
|
137
|
+
appliance[:last_logout_at] = Time.now.to_i
|
138
|
+
::Morpheus::Cli::Remote.save_remote(@appliance_name, appliance)
|
139
|
+
end
|
140
|
+
true
|
100
141
|
end
|
101
142
|
|
102
143
|
def clear_saved_credentials(appliance_name)
|
103
|
-
@@
|
104
|
-
@@
|
105
|
-
|
106
|
-
File.open(credentials_file_path, 'w') {|f| f.write @@
|
144
|
+
@@appliance_credentials_map = load_credentials_file || {}
|
145
|
+
@@appliance_credentials_map.delete(appliance_name)
|
146
|
+
Morpheus::Logging::DarkPrinter.puts "clearing credentials for #{appliance_name} from file #{credentials_file_path}" if Morpheus::Logging.debug?
|
147
|
+
File.open(credentials_file_path, 'w') {|f| f.write @@appliance_credentials_map.to_yaml } #Store
|
107
148
|
end
|
108
149
|
|
109
150
|
def load_saved_credentials(reload=false)
|
110
|
-
if
|
111
|
-
return
|
151
|
+
if saved_credentials && !reload
|
152
|
+
return saved_credentials
|
112
153
|
end
|
113
|
-
|
114
|
-
|
154
|
+
#Morpheus::Logging::DarkPrinter.puts "loading credentials for #{appliance_name}" if Morpheus::Logging.debug?
|
155
|
+
@@appliance_credentials_map = load_credentials_file || {}
|
156
|
+
return @@appliance_credentials_map[@appliance_name]
|
115
157
|
end
|
116
158
|
|
117
159
|
# Provides the current credential information, simply :appliance_name => "access_token"
|
118
|
-
def
|
119
|
-
if !defined?(@@
|
120
|
-
@@
|
160
|
+
def saved_credentials
|
161
|
+
if !defined?(@@appliance_credentials_map)
|
162
|
+
@@appliance_credentials_map = load_credentials_file
|
121
163
|
end
|
122
|
-
return @@
|
164
|
+
return @@appliance_credentials_map ? @@appliance_credentials_map[@appliance_name.to_sym] : nil
|
123
165
|
end
|
124
166
|
|
125
167
|
def load_credentials_file
|
126
168
|
fn = credentials_file_path
|
127
169
|
if File.exist? fn
|
128
|
-
|
170
|
+
Morpheus::Logging::DarkPrinter.puts "loading credentials file #{fn}" if Morpheus::Logging.debug?
|
129
171
|
return YAML.load_file(fn)
|
130
172
|
else
|
131
173
|
return nil
|
@@ -136,20 +178,20 @@ module Morpheus
|
|
136
178
|
File.join(Morpheus::Cli.home_directory, "credentials")
|
137
179
|
end
|
138
180
|
|
139
|
-
def save_credentials(
|
140
|
-
# credential_map =
|
181
|
+
def save_credentials(appliance_name, token)
|
182
|
+
# credential_map = appliance_credentials_map
|
141
183
|
# reloading file is better for now, otherwise you can lose credentials with multiple shells.
|
142
184
|
credential_map = load_credentials_file || {}
|
143
185
|
if credential_map.nil?
|
144
186
|
credential_map = {}
|
145
187
|
end
|
146
|
-
credential_map[
|
188
|
+
credential_map[appliance_name] = token
|
147
189
|
begin
|
148
190
|
fn = credentials_file_path
|
149
191
|
if !Dir.exists?(File.dirname(fn))
|
150
192
|
FileUtils.mkdir_p(File.dirname(fn))
|
151
193
|
end
|
152
|
-
|
194
|
+
Morpheus::Logging::DarkPrinter.puts "adding credentials for #{appliance_name} to #{fn}" if Morpheus::Logging.debug?
|
153
195
|
File.open(fn, 'w') {|f| f.write credential_map.to_yaml } #Store
|
154
196
|
FileUtils.chmod(0600, fn)
|
155
197
|
rescue => e
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'morpheus/logging'
|
3
|
+
require 'morpheus/cli/cli_command'
|
4
|
+
|
5
|
+
class Morpheus::Cli::CurlCommand
|
6
|
+
include Morpheus::Cli::CliCommand
|
7
|
+
set_command_name :curl
|
8
|
+
set_command_hidden
|
9
|
+
|
10
|
+
def handle(args)
|
11
|
+
split_args = args.join(" ").split(" -- ")
|
12
|
+
args = split_args[0].split(" ")
|
13
|
+
curl_args = split_args[1] ? split_args[1].split(" ") : []
|
14
|
+
# puts "args is : #{args}"
|
15
|
+
# puts "curl_args is : #{curl_args}"
|
16
|
+
options = {}
|
17
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
18
|
+
opts.banner = "Usage: morpheus curl [path] -- [*args]"
|
19
|
+
build_common_options(opts, options, [:remote])
|
20
|
+
opts.footer = <<-EOT
|
21
|
+
This invokes the `curl` command with url "appliance_url/api/$0
|
22
|
+
and includes the authorization header -H "Authorization: Bearer access_token"
|
23
|
+
Arguments for the curl command should be passed after ' -- '
|
24
|
+
Example: morpheus curl "/api/servers/1" -- -XGET -sV
|
25
|
+
|
26
|
+
EOT
|
27
|
+
end
|
28
|
+
optparse.parse!(args)
|
29
|
+
if args.count < 1
|
30
|
+
puts optparse
|
31
|
+
return false
|
32
|
+
end
|
33
|
+
|
34
|
+
if !command_available?("curl")
|
35
|
+
print "#{red}The 'curl' command is not available on your system.#{reset}\n"
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
|
39
|
+
@api_client = establish_remote_appliance_connection(options.merge({:no_prompt => true, :skip_verify_access_token => true}))
|
40
|
+
|
41
|
+
if !@appliance_name
|
42
|
+
print yellow,"Please specify a Morpheus Appliance with -r or see the command `remote use`#{reset}\n"
|
43
|
+
return false
|
44
|
+
end
|
45
|
+
|
46
|
+
# curry --insecure to curl
|
47
|
+
if options[:insecure] || !Morpheus::RestClient.ssl_verification_enabled?
|
48
|
+
#curl_args.unshift "-k"
|
49
|
+
curl_args.unshift "--inescure"
|
50
|
+
end
|
51
|
+
|
52
|
+
creds = Morpheus::Cli::Credentials.new(@appliance_name, @appliance_url).load_saved_credentials()
|
53
|
+
if !creds
|
54
|
+
print yellow,"You are not currently logged in to #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
|
55
|
+
print yellow,"Use the 'login' command.",reset,"\n"
|
56
|
+
return 0
|
57
|
+
end
|
58
|
+
|
59
|
+
if !@appliance_url
|
60
|
+
raise "Unable to determine remote appliance url"
|
61
|
+
print "#{red}Unable to determine remote appliance url.#{reset}\n"
|
62
|
+
return false
|
63
|
+
end
|
64
|
+
|
65
|
+
# determine curl url
|
66
|
+
base_url = @appliance_url.chomp("/")
|
67
|
+
api_path = args[0].sub(/^\//, "")
|
68
|
+
url = "#{base_url}/#{api_path}"
|
69
|
+
curl_cmd = "curl \"#{url}\""
|
70
|
+
curl_cmd << " -H \"Authorization: Bearer #{@access_token}\""
|
71
|
+
if !curl_args.empty?
|
72
|
+
curl_cmd << " " + curl_args.join(' ')
|
73
|
+
end
|
74
|
+
|
75
|
+
# Morpheus::Logging::DarkPrinter.puts "#{curl_cmd}" if Morpheus::Logging.debug?
|
76
|
+
print cyan
|
77
|
+
print "#{cyan}#{curl_cmd}#{reset}"
|
78
|
+
print "\n\n"
|
79
|
+
print reset
|
80
|
+
# print result
|
81
|
+
curl_output = `#{curl_cmd}`
|
82
|
+
puts curl_output
|
83
|
+
return $?.success?
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
def command_available?(cmd)
|
88
|
+
has_it = false
|
89
|
+
begin
|
90
|
+
system("which #{cmd} > /dev/null 2>&1")
|
91
|
+
has_it = $?.success?
|
92
|
+
rescue => e
|
93
|
+
raise e
|
94
|
+
end
|
95
|
+
return has_it
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
@@ -45,14 +45,9 @@ class Morpheus::Cli::DashboardCommand
|
|
45
45
|
print "\n"
|
46
46
|
else
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
print "\n" ,cyan, bold, "Dashboard\n","==================", reset, "\n\n"
|
48
|
+
print_h1 "Dashboard"
|
51
49
|
print cyan
|
52
|
-
|
53
|
-
puts "Coming soon.... see --json"
|
54
|
-
print "\n"
|
55
|
-
|
50
|
+
puts "Coming soon... see --json"
|
56
51
|
print reset,"\n"
|
57
52
|
|
58
53
|
end
|
@@ -44,9 +44,9 @@ class Morpheus::Cli::Deployments
|
|
44
44
|
puts JSON.pretty_generate(json_response)
|
45
45
|
else
|
46
46
|
deployments = json_response['deployments']
|
47
|
-
|
47
|
+
print_h1 "Morpheus Deployments"
|
48
48
|
if deployments.empty?
|
49
|
-
|
49
|
+
print yellow,"No deployments currently configured.",reset,"\n"
|
50
50
|
else
|
51
51
|
print cyan
|
52
52
|
deployments_table_data = deployments.collect do |deployment|
|
@@ -92,9 +92,9 @@ class Morpheus::Cli::Deployments
|
|
92
92
|
puts JSON.pretty_generate(json_response)
|
93
93
|
else
|
94
94
|
versions = json_response['versions']
|
95
|
-
|
95
|
+
print_h1 "Deployment Versions: #{deployment['name']}"
|
96
96
|
if versions.empty?
|
97
|
-
|
97
|
+
print yellow,"No deployment versions currently exist.",reset,"\n"
|
98
98
|
else
|
99
99
|
print cyan
|
100
100
|
versions_table_data = versions.collect do |version|
|