morpheus-cli 3.2.0.1 → 3.3.1
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/lib/morpheus/api/api_client.rb +4 -0
- data/lib/morpheus/api/instances_interface.rb +10 -10
- data/lib/morpheus/api/power_scheduling_interface.rb +78 -0
- data/lib/morpheus/cli.rb +1 -0
- data/lib/morpheus/cli/app_templates.rb +55 -41
- data/lib/morpheus/cli/clouds.rb +8 -1
- data/lib/morpheus/cli/instances.rb +55 -18
- data/lib/morpheus/cli/key_pairs.rb +36 -12
- data/lib/morpheus/cli/power_scheduling_command.rb +815 -0
- data/lib/morpheus/cli/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b8c741a2147562961cf875fa8395b16323e9c5c
|
4
|
+
data.tar.gz: 2ad98468d07e2981a0b5156c0ac21dce6669971d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45bf78b5e848b756dc5ea5ff392b26dbaa89ae8c3b222c73c90c9619df47d916e9ed9b6d155fca5e79d4ec604c9f5f2d87607b7f40519b780b172db9abf8c55e
|
7
|
+
data.tar.gz: c838e7043db30e90aaa9fe114ed22167b921ef2f618fce9d6c11bec4d8f260e92c457742942970779070126fd12d3c1d0b557b146893e2c52ea3dbb2df39c9f9
|
@@ -177,6 +177,10 @@ class Morpheus::APIClient
|
|
177
177
|
Morpheus::DashboardInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
|
178
178
|
end
|
179
179
|
|
180
|
+
def power_scheduling
|
181
|
+
Morpheus::PowerSchedulingInterface.new(@access_token, @refresh_token, @expires_at, @base_url)
|
182
|
+
end
|
183
|
+
|
180
184
|
def setup
|
181
185
|
Morpheus::SetupInterface.new(@base_url)
|
182
186
|
end
|
@@ -68,37 +68,37 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
68
68
|
execute(opts)
|
69
69
|
end
|
70
70
|
|
71
|
-
def stop(id,
|
71
|
+
def stop(id, params={})
|
72
72
|
url = "#{@base_url}/api/instances/#{id}/stop"
|
73
|
-
headers = { :params =>
|
73
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
74
74
|
opts = {method: :put, url: url, headers: headers}
|
75
75
|
execute(opts)
|
76
76
|
end
|
77
77
|
|
78
|
-
def start(id,
|
78
|
+
def start(id, params={})
|
79
79
|
url = "#{@base_url}/api/instances/#{id}/start"
|
80
|
-
headers = { :params =>
|
80
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
81
81
|
opts = {method: :put, url: url, headers: headers}
|
82
82
|
execute(opts)
|
83
83
|
end
|
84
84
|
|
85
|
-
def restart(id,
|
85
|
+
def restart(id, params={})
|
86
86
|
url = "#{@base_url}/api/instances/#{id}/restart"
|
87
|
-
headers = { :params =>
|
87
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
88
88
|
opts = {method: :put, url: url, headers: headers}
|
89
89
|
execute(opts)
|
90
90
|
end
|
91
91
|
|
92
|
-
def suspend(id,
|
92
|
+
def suspend(id, params={})
|
93
93
|
url = "#{@base_url}/api/instances/#{id}/suspend"
|
94
|
-
headers = { :params =>
|
94
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
95
95
|
opts = {method: :put, url: url, headers: headers}
|
96
96
|
execute(opts)
|
97
97
|
end
|
98
98
|
|
99
|
-
def eject(id,
|
99
|
+
def eject(id, params={})
|
100
100
|
url = "#{@base_url}/api/instances/#{id}/eject"
|
101
|
-
headers = { :params =>
|
101
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
102
102
|
opts = {method: :put, url: url, headers: headers}
|
103
103
|
execute(opts)
|
104
104
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
|
3
|
+
class Morpheus::PowerSchedulingInterface < Morpheus::APIClient
|
4
|
+
def initialize(access_token, refresh_token, expires_at = nil, base_url=nil)
|
5
|
+
@access_token = access_token
|
6
|
+
@refresh_token = refresh_token
|
7
|
+
@base_url = base_url
|
8
|
+
@expires_at = expires_at
|
9
|
+
end
|
10
|
+
|
11
|
+
def get(id)
|
12
|
+
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
13
|
+
url = "#{@base_url}/api/power-scheduling/#{id}"
|
14
|
+
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
15
|
+
opts = {method: :get, url: url, timeout: 10, headers: headers}
|
16
|
+
execute(opts)
|
17
|
+
end
|
18
|
+
|
19
|
+
def list(options={})
|
20
|
+
url = "#{@base_url}/api/power-scheduling"
|
21
|
+
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
22
|
+
headers[:params].merge!(options)
|
23
|
+
opts = {method: :get, url: url, timeout: 10, headers: headers}
|
24
|
+
execute(opts)
|
25
|
+
end
|
26
|
+
|
27
|
+
def create(options)
|
28
|
+
url = "#{@base_url}/api/power-scheduling"
|
29
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
30
|
+
payload = options
|
31
|
+
opts = {method: :post, url: url, timeout: 10, headers: headers, payload: payload.to_json}
|
32
|
+
execute(opts)
|
33
|
+
end
|
34
|
+
|
35
|
+
def update(id, options)
|
36
|
+
url = "#{@base_url}/api/power-scheduling/#{id}"
|
37
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
38
|
+
payload = options
|
39
|
+
opts = {method: :put, url: url, timeout: 10, headers: headers, payload: payload.to_json}
|
40
|
+
execute(opts)
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy(id)
|
44
|
+
url = "#{@base_url}/api/power-scheduling/#{id}"
|
45
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
46
|
+
opts = {method: :delete, url: url, timeout: 10, headers: headers}
|
47
|
+
execute(opts)
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_instances(id, payload)
|
51
|
+
url = "#{@base_url}/api/power-scheduling/#{id}/add-instances"
|
52
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
53
|
+
opts = {method: :put, url: url, timeout: 10, headers: headers, payload: payload.to_json}
|
54
|
+
execute(opts)
|
55
|
+
end
|
56
|
+
|
57
|
+
def remove_instances(id, payload)
|
58
|
+
url = "#{@base_url}/api/power-scheduling/#{id}/remove-instances"
|
59
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
60
|
+
opts = {method: :put, url: url, timeout: 10, headers: headers, payload: payload.to_json}
|
61
|
+
execute(opts)
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_servers(id, payload)
|
65
|
+
url = "#{@base_url}/api/power-scheduling/#{id}/add-servers"
|
66
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
67
|
+
opts = {method: :put, url: url, timeout: 10, headers: headers, payload: payload.to_json}
|
68
|
+
execute(opts)
|
69
|
+
end
|
70
|
+
|
71
|
+
def remove_servers(id, payload)
|
72
|
+
url = "#{@base_url}/api/power-scheduling/#{id}/remove-servers"
|
73
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
74
|
+
opts = {method: :put, url: url, timeout: 10, headers: headers, payload: payload.to_json}
|
75
|
+
execute(opts)
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
data/lib/morpheus/cli.rb
CHANGED
@@ -59,6 +59,7 @@ module Morpheus
|
|
59
59
|
load 'morpheus/cli/logout.rb'
|
60
60
|
load 'morpheus/cli/whoami.rb'
|
61
61
|
load 'morpheus/cli/dashboard_command.rb'
|
62
|
+
load 'morpheus/cli/power_scheduling_command.rb'
|
62
63
|
load 'morpheus/cli/recent_activity_command.rb'
|
63
64
|
load 'morpheus/cli/groups.rb'
|
64
65
|
load 'morpheus/cli/clouds.rb'
|
@@ -47,7 +47,7 @@ class Morpheus::Cli::AppTemplates
|
|
47
47
|
options = {}
|
48
48
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
49
49
|
opts.banner = subcommand_usage()
|
50
|
-
build_common_options(opts, options, [:list, :json, :dry_run])
|
50
|
+
build_common_options(opts, options, [:list, :json, :yaml, :csv, :fields, :dry_run, :remote])
|
51
51
|
opts.footer = "List app templates."
|
52
52
|
end
|
53
53
|
optparse.parse!(args)
|
@@ -61,26 +61,40 @@ class Morpheus::Cli::AppTemplates
|
|
61
61
|
print_dry_run @app_templates_interface.dry.list(params)
|
62
62
|
return
|
63
63
|
end
|
64
|
+
|
64
65
|
json_response = @app_templates_interface.list(params)
|
65
66
|
app_templates = json_response['appTemplates']
|
67
|
+
|
68
|
+
if options[:include_fields]
|
69
|
+
json_response = {"appTemplates" => filter_data(json_response["appTemplates"], options[:include_fields]) }
|
70
|
+
end
|
66
71
|
if options[:json]
|
67
|
-
|
68
|
-
|
72
|
+
puts as_json(json_response, options)
|
73
|
+
return 0
|
74
|
+
elsif options[:csv]
|
75
|
+
puts records_as_csv(json_response['appTemplates'], options)
|
76
|
+
return 0
|
77
|
+
elsif options[:yaml]
|
78
|
+
puts as_yaml(json_response, options)
|
79
|
+
return 0
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
title = "Morpheus App Templates"
|
84
|
+
subtitles = []
|
85
|
+
if params[:phrase]
|
86
|
+
subtitles << "Search: #{params[:phrase]}".strip
|
87
|
+
end
|
88
|
+
print_h1 title, subtitles
|
89
|
+
if app_templates.empty?
|
90
|
+
print cyan,"No app templates found.",reset,"\n"
|
69
91
|
else
|
70
|
-
|
71
|
-
|
72
|
-
if params[:phrase]
|
73
|
-
subtitles << "Search: #{params[:phrase]}".strip
|
74
|
-
end
|
75
|
-
print_h1 title, subtitles
|
76
|
-
if app_templates.empty?
|
77
|
-
print cyan,"No app templates found.",reset,"\n"
|
78
|
-
else
|
79
|
-
print_app_templates_table(app_templates)
|
80
|
-
print_results_pagination(json_response)
|
81
|
-
end
|
82
|
-
print reset,"\n"
|
92
|
+
print_app_templates_table(app_templates, options)
|
93
|
+
print_results_pagination(json_response)
|
83
94
|
end
|
95
|
+
print reset,"\n"
|
96
|
+
return 0
|
97
|
+
|
84
98
|
rescue RestClient::Exception => e
|
85
99
|
print_rest_exception(e, options)
|
86
100
|
exit 1
|
@@ -180,7 +194,7 @@ class Morpheus::Cli::AppTemplates
|
|
180
194
|
options['configFile'] = val.to_s
|
181
195
|
end
|
182
196
|
build_option_type_options(opts, options, add_app_template_option_types(false))
|
183
|
-
build_common_options(opts, options, [:options, :json, :dry_run])
|
197
|
+
build_common_options(opts, options, [:options, :json, :dry_run, :remote])
|
184
198
|
opts.footer = "Create a new app template.\n" +
|
185
199
|
"[name] is optional and can be passed as --name or inside the config instead."
|
186
200
|
"[--config] or [--config-file] can be used to define the app template."
|
@@ -267,7 +281,7 @@ class Morpheus::Cli::AppTemplates
|
|
267
281
|
options['configFile'] = val.to_s
|
268
282
|
end
|
269
283
|
build_option_type_options(opts, options, update_app_template_option_types(false))
|
270
|
-
build_common_options(opts, options, [:options, :json, :dry_run, :quiet])
|
284
|
+
build_common_options(opts, options, [:options, :json, :dry_run, :quiet, :remote])
|
271
285
|
opts.footer = "Update an app template.\n" +
|
272
286
|
"[template] is required. This is the name or id of an app template.\n" +
|
273
287
|
"[options] Available options include --name and --description. This will update only the specified values.\n" +
|
@@ -412,7 +426,7 @@ class Morpheus::Cli::AppTemplates
|
|
412
426
|
options = {}
|
413
427
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
414
428
|
opts.banner = subcommand_usage("[template] [new name]")
|
415
|
-
build_common_options(opts, options, [:auto_confirm, :json, :dry_run])
|
429
|
+
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
|
416
430
|
opts.footer = "Duplicate an app template." + "\n" +
|
417
431
|
"[template] is required. This is the name or id of an app template." + "\n" +
|
418
432
|
"[new name] is required. This is the name for the clone."
|
@@ -461,7 +475,7 @@ class Morpheus::Cli::AppTemplates
|
|
461
475
|
options = {}
|
462
476
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
463
477
|
opts.banner = subcommand_usage("[template]")
|
464
|
-
build_common_options(opts, options, [:auto_confirm, :json, :dry_run])
|
478
|
+
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
|
465
479
|
opts.footer = "Delete an app template." + "\n" +
|
466
480
|
"[template] is required. This is the name or id of an app template."
|
467
481
|
end
|
@@ -788,7 +802,7 @@ class Morpheus::Cli::AppTemplates
|
|
788
802
|
# opts.on( nil, '--index NUMBER', "The index of the instance to remove, starting with 0." ) do |val|
|
789
803
|
# instance_index = val.to_i
|
790
804
|
# end
|
791
|
-
build_common_options(opts, options, [:auto_confirm, :json, :dry_run])
|
805
|
+
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
|
792
806
|
opts.footer = "Update an app template, removing a specified instance config." + "\n" +
|
793
807
|
"[template] is required. This is the name or id of an app template." + "\n" +
|
794
808
|
"[tier] is required. This is the name of the tier." + "\n" +
|
@@ -971,7 +985,7 @@ class Morpheus::Cli::AppTemplates
|
|
971
985
|
# opts.on('--index NUMBER', Number, "Identify Instance by index within tier, starting with 0." ) do |val|
|
972
986
|
# instance_index = val.to_i
|
973
987
|
# end
|
974
|
-
build_common_options(opts, options, [:auto_confirm, :json, :dry_run])
|
988
|
+
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
|
975
989
|
end
|
976
990
|
optparse.parse!(args)
|
977
991
|
|
@@ -1333,7 +1347,7 @@ class Morpheus::Cli::AppTemplates
|
|
1333
1347
|
options = {}
|
1334
1348
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
1335
1349
|
opts.banner = subcommand_usage("[template] [tier]")
|
1336
|
-
build_common_options(opts, options, [:auto_confirm, :json, :dry_run])
|
1350
|
+
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
|
1337
1351
|
end
|
1338
1352
|
optparse.parse!(args)
|
1339
1353
|
|
@@ -1400,7 +1414,7 @@ class Morpheus::Cli::AppTemplates
|
|
1400
1414
|
options = {}
|
1401
1415
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
1402
1416
|
opts.banner = subcommand_usage("[template] [Tier1] [Tier2]")
|
1403
|
-
build_common_options(opts, options, [:json, :dry_run])
|
1417
|
+
build_common_options(opts, options, [:json, :dry_run, :remote])
|
1404
1418
|
end
|
1405
1419
|
optparse.parse!(args)
|
1406
1420
|
|
@@ -1498,7 +1512,7 @@ class Morpheus::Cli::AppTemplates
|
|
1498
1512
|
options = {}
|
1499
1513
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
1500
1514
|
opts.banner = subcommand_usage("[template] [Tier1] [Tier2]")
|
1501
|
-
build_common_options(opts, options, [:json, :dry_run])
|
1515
|
+
build_common_options(opts, options, [:json, :dry_run, :remote])
|
1502
1516
|
end
|
1503
1517
|
optparse.parse!(args)
|
1504
1518
|
|
@@ -1588,7 +1602,7 @@ class Morpheus::Cli::AppTemplates
|
|
1588
1602
|
options = {}
|
1589
1603
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
1590
1604
|
opts.banner = subcommand_usage()
|
1591
|
-
build_common_options(opts, options, [:json, :dry_run])
|
1605
|
+
build_common_options(opts, options, [:json, :dry_run, :remote])
|
1592
1606
|
end
|
1593
1607
|
optparse.parse!(args)
|
1594
1608
|
connect(options)
|
@@ -1735,10 +1749,9 @@ class Morpheus::Cli::AppTemplates
|
|
1735
1749
|
:category,
|
1736
1750
|
{:tiers_summary => {:display_name => "TIERS", :max_width => tiers_col_width} }
|
1737
1751
|
]
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
1741
|
-
# end
|
1752
|
+
if opts[:include_fields]
|
1753
|
+
columns = opts[:include_fields]
|
1754
|
+
end
|
1742
1755
|
print table_color
|
1743
1756
|
print as_pretty_table(rows, columns, opts)
|
1744
1757
|
print reset
|
@@ -1751,6 +1764,7 @@ class Morpheus::Cli::AppTemplates
|
|
1751
1764
|
end
|
1752
1765
|
|
1753
1766
|
def format_app_template_tiers_summary(app_template)
|
1767
|
+
# don't use colors here, or cell truncation will not work
|
1754
1768
|
str = ""
|
1755
1769
|
if app_template["config"] && app_template["config"]["tiers"]
|
1756
1770
|
tier_descriptions = app_template["config"]["tiers"].collect do |tier_name, tier_config|
|
@@ -1763,9 +1777,9 @@ class Morpheus::Cli::AppTemplates
|
|
1763
1777
|
# instance_blurbs << instance_config["instance"]["type"]
|
1764
1778
|
instance_name = instance_config["instance"]["name"] || ""
|
1765
1779
|
instance_type_code = instance_config["instance"]["type"]
|
1766
|
-
instances_str = "#{
|
1780
|
+
instances_str = "#{instance_type_code}"
|
1767
1781
|
if instance_name.to_s != ""
|
1768
|
-
instances_str << "
|
1782
|
+
instances_str << " - #{instance_name}"
|
1769
1783
|
end
|
1770
1784
|
begin
|
1771
1785
|
config_list = parse_scoped_instance_configs(instance_config)
|
@@ -1791,9 +1805,9 @@ class Morpheus::Cli::AppTemplates
|
|
1791
1805
|
end
|
1792
1806
|
end
|
1793
1807
|
if instance_blurbs.size > 0
|
1794
|
-
tier_name + ": #{instance_blurbs.join(', ')}"
|
1808
|
+
tier_name + ": #{instance_blurbs.join(', ')}"
|
1795
1809
|
else
|
1796
|
-
tier_name + ": (empty)"
|
1810
|
+
tier_name + ": (empty)"
|
1797
1811
|
end
|
1798
1812
|
end
|
1799
1813
|
str += tier_descriptions.compact.join(", ")
|
@@ -1834,7 +1848,7 @@ class Morpheus::Cli::AppTemplates
|
|
1834
1848
|
end
|
1835
1849
|
instance_bullet = ""
|
1836
1850
|
# instance_bullet += "#{green} - #{bold}#{instance_type_code}#{reset}"
|
1837
|
-
instance_bullet += "
|
1851
|
+
instance_bullet += "#{green}#{bold}#{instance_type_code}#{reset}"
|
1838
1852
|
if instance_name.to_s != ""
|
1839
1853
|
instance_bullet += "#{green} - #{instance_name}#{reset}"
|
1840
1854
|
end
|
@@ -1846,9 +1860,9 @@ class Morpheus::Cli::AppTemplates
|
|
1846
1860
|
if config_list.size > 0
|
1847
1861
|
print "\n"
|
1848
1862
|
if config_list.size == 1
|
1849
|
-
puts "
|
1863
|
+
puts " Config:"
|
1850
1864
|
else
|
1851
|
-
puts "
|
1865
|
+
puts " Configs (#{config_list.size}):"
|
1852
1866
|
end
|
1853
1867
|
config_list.each do |config_obj|
|
1854
1868
|
# puts " = #{config_obj[:scope].inspect}"
|
@@ -1869,10 +1883,10 @@ class Morpheus::Cli::AppTemplates
|
|
1869
1883
|
# config_items << {label: "Plan", value: scoped_instance_config['plan']['code']}
|
1870
1884
|
# end
|
1871
1885
|
config_description = config_items.collect {|item| "#{item[:label]}: #{item[:value]}"}.join(", ")
|
1872
|
-
puts "
|
1886
|
+
puts " * #{config_description}"
|
1873
1887
|
end
|
1874
1888
|
else
|
1875
|
-
print white,"
|
1889
|
+
print white," Instance has no configs, see `app-templates add-instance-config \"#{app_template['name']}\" \"#{tier_name}\" \"#{instance_type_code}\"`",reset,"\n"
|
1876
1890
|
end
|
1877
1891
|
rescue => err
|
1878
1892
|
#puts_error "Failed to parse instance scoped instance configs for app template #{app_template['id']} #{app_template['name']} Exception: #{err.class} #{err.message}"
|
@@ -1885,10 +1899,10 @@ class Morpheus::Cli::AppTemplates
|
|
1885
1899
|
|
1886
1900
|
print cyan
|
1887
1901
|
if tier_config['bootOrder']
|
1888
|
-
puts "
|
1902
|
+
puts "Boot Order: #{tier_config['bootOrder']}"
|
1889
1903
|
end
|
1890
1904
|
if tier_config['linkedTiers'] && !tier_config['linkedTiers'].empty?
|
1891
|
-
puts "
|
1905
|
+
puts "Connected Tiers: #{tier_config['linkedTiers'].join(', ')}"
|
1892
1906
|
end
|
1893
1907
|
|
1894
1908
|
else
|
data/lib/morpheus/cli/clouds.rb
CHANGED
@@ -119,7 +119,14 @@ class Morpheus::Cli::Clouds
|
|
119
119
|
end
|
120
120
|
json_response = @clouds_interface.get(cloud['id'])
|
121
121
|
cloud = json_response['zone']
|
122
|
-
|
122
|
+
cloud_stats = cloud['stats']
|
123
|
+
# serverCounts moved to zone.stats.serverCounts
|
124
|
+
server_counts = nil
|
125
|
+
if cloud_stats
|
126
|
+
server_counts = cloud_stats['serverCounts']
|
127
|
+
else
|
128
|
+
server_counts = json_response['serverCounts'] # legacy
|
129
|
+
end
|
123
130
|
if options[:json]
|
124
131
|
print JSON.pretty_generate(json_response), "\n"
|
125
132
|
return
|
@@ -212,7 +212,7 @@ class Morpheus::Cli::Instances
|
|
212
212
|
opts.on("--expire-days NUMBER", Integer, "Automation: Expiration Days") do |val|
|
213
213
|
options[:expire_days] = val.to_i
|
214
214
|
end
|
215
|
-
opts.on("--create-backup on|off", String, "Automation: Create Backups. Default is off") do |val|
|
215
|
+
opts.on("--create-backup on|off", String, "Automation: Create Backups. Default is off.") do |val|
|
216
216
|
options[:create_backup] = ['on','true','1'].include?(val.to_s.downcase) ? 'on' : 'off'
|
217
217
|
end
|
218
218
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
|
@@ -256,6 +256,20 @@ class Morpheus::Cli::Instances
|
|
256
256
|
lb_payload = prompt_instance_load_balancer(payload['instance'], nil, options)
|
257
257
|
payload.deep_merge!(lb_payload)
|
258
258
|
end
|
259
|
+
# clean payload of empty objects
|
260
|
+
# note: this is temporary and should be fixed upstream in OptionTypes.prompt()
|
261
|
+
if payload['instance'].is_a?(Hash)
|
262
|
+
payload['instance'].keys.each do |k|
|
263
|
+
v = payload['instance'][k]
|
264
|
+
payload['instance'].delete(k) if v.is_a?(Hash) && v.empty?
|
265
|
+
end
|
266
|
+
end
|
267
|
+
if payload['config'].is_a?(Hash)
|
268
|
+
payload['config'].keys.each do |k|
|
269
|
+
v = payload['config'][k]
|
270
|
+
payload['config'].delete(k) if v.is_a?(Hash) && v.empty?
|
271
|
+
end
|
272
|
+
end
|
259
273
|
end
|
260
274
|
|
261
275
|
if options[:dry_run]
|
@@ -1061,9 +1075,13 @@ class Morpheus::Cli::Instances
|
|
1061
1075
|
end
|
1062
1076
|
|
1063
1077
|
def stop(args)
|
1078
|
+
params = {'server' => true, 'muteMonitoring' => false}
|
1064
1079
|
options = {}
|
1065
1080
|
optparse = OptionParser.new do|opts|
|
1066
1081
|
opts.banner = subcommand_usage("[name]")
|
1082
|
+
opts.on('--muteMonitoring [on|off]', String, "Mute monitoring. Default is off.") do |val|
|
1083
|
+
params['muteMonitoring'] = val.nil? || val.to_s == 'on' || val.to_s == 'true'
|
1084
|
+
end
|
1067
1085
|
build_common_options(opts, options, [:auto_confirm, :quiet, :json, :dry_run, :remote])
|
1068
1086
|
end
|
1069
1087
|
optparse.parse!(args)
|
@@ -1078,10 +1096,10 @@ class Morpheus::Cli::Instances
|
|
1078
1096
|
exit 1
|
1079
1097
|
end
|
1080
1098
|
if options[:dry_run]
|
1081
|
-
print_dry_run @instances_interface.dry.stop(instance['id'])
|
1099
|
+
print_dry_run @instances_interface.dry.stop(instance['id'], params)
|
1082
1100
|
return
|
1083
1101
|
end
|
1084
|
-
json_response = @instances_interface.stop(instance['id'])
|
1102
|
+
json_response = @instances_interface.stop(instance['id'], params)
|
1085
1103
|
if options[:json]
|
1086
1104
|
puts as_json(json_response, options)
|
1087
1105
|
elsif !options[:quiet]
|
@@ -1095,6 +1113,7 @@ class Morpheus::Cli::Instances
|
|
1095
1113
|
end
|
1096
1114
|
|
1097
1115
|
def start(args)
|
1116
|
+
params = {'server' => true}
|
1098
1117
|
options = {}
|
1099
1118
|
optparse = OptionParser.new do|opts|
|
1100
1119
|
opts.banner = subcommand_usage("[name]")
|
@@ -1109,10 +1128,10 @@ class Morpheus::Cli::Instances
|
|
1109
1128
|
begin
|
1110
1129
|
instance = find_instance_by_name_or_id(args[0])
|
1111
1130
|
if options[:dry_run]
|
1112
|
-
print_dry_run @instances_interface.dry.start(instance['id'])
|
1131
|
+
print_dry_run @instances_interface.dry.start(instance['id'], params)
|
1113
1132
|
return 0
|
1114
1133
|
end
|
1115
|
-
json_response = @instances_interface.start(instance['id'])
|
1134
|
+
json_response = @instances_interface.start(instance['id'], params)
|
1116
1135
|
if options[:json]
|
1117
1136
|
puts as_json(json_response, options)
|
1118
1137
|
return 0
|
@@ -1127,9 +1146,13 @@ class Morpheus::Cli::Instances
|
|
1127
1146
|
end
|
1128
1147
|
|
1129
1148
|
def restart(args)
|
1149
|
+
params = {'server' => true, 'muteMonitoring' => true}
|
1130
1150
|
options = {}
|
1131
1151
|
optparse = OptionParser.new do|opts|
|
1132
1152
|
opts.banner = subcommand_usage("[name]")
|
1153
|
+
opts.on('--muteMonitoring [on|off]', String, "Mute monitoring. Default is on.") do |val|
|
1154
|
+
params['muteMonitoring'] = val.nil? || val.to_s == 'on' || val.to_s == 'true'
|
1155
|
+
end
|
1133
1156
|
build_common_options(opts, options, [:auto_confirm, :quiet, :json, :dry_run, :remote])
|
1134
1157
|
end
|
1135
1158
|
optparse.parse!(args)
|
@@ -1144,14 +1167,14 @@ class Morpheus::Cli::Instances
|
|
1144
1167
|
exit 1
|
1145
1168
|
end
|
1146
1169
|
if options[:dry_run]
|
1147
|
-
print_dry_run @instances_interface.dry.restart(instance['id'])
|
1170
|
+
print_dry_run @instances_interface.dry.restart(instance['id'], params)
|
1148
1171
|
return 0
|
1149
1172
|
end
|
1150
|
-
json_response = @instances_interface.restart(instance['id'])
|
1173
|
+
json_response = @instances_interface.restart(instance['id'], params)
|
1151
1174
|
if options[:json]
|
1152
1175
|
puts as_json(json_response, options)
|
1153
1176
|
elsif !options[:quiet]
|
1154
|
-
print green, "
|
1177
|
+
print green, "Restarting instance #{instance['name']}", reset, "\n"
|
1155
1178
|
end
|
1156
1179
|
return 0
|
1157
1180
|
rescue RestClient::Exception => e
|
@@ -1161,9 +1184,13 @@ class Morpheus::Cli::Instances
|
|
1161
1184
|
end
|
1162
1185
|
|
1163
1186
|
def suspend(args)
|
1187
|
+
params = {'server' => true, 'muteMonitoring' => false}
|
1164
1188
|
options = {}
|
1165
1189
|
optparse = OptionParser.new do|opts|
|
1166
1190
|
opts.banner = subcommand_usage("[name]")
|
1191
|
+
opts.on('--muteMonitoring [on|off]', String, "Mute monitoring. Default is off.") do |val|
|
1192
|
+
params['muteMonitoring'] = val.nil? || val.to_s == 'on' || val.to_s == 'true'
|
1193
|
+
end
|
1167
1194
|
build_common_options(opts, options, [:auto_confirm, :quiet, :json, :dry_run, :remote])
|
1168
1195
|
end
|
1169
1196
|
optparse.parse!(args)
|
@@ -1178,10 +1205,10 @@ class Morpheus::Cli::Instances
|
|
1178
1205
|
exit 1
|
1179
1206
|
end
|
1180
1207
|
if options[:dry_run]
|
1181
|
-
print_dry_run @instances_interface.dry.suspend(instance['id'])
|
1208
|
+
print_dry_run @instances_interface.dry.suspend(instance['id'], params)
|
1182
1209
|
return
|
1183
1210
|
end
|
1184
|
-
json_response = @instances_interface.suspend(instance['id'])
|
1211
|
+
json_response = @instances_interface.suspend(instance['id'], params)
|
1185
1212
|
if options[:json]
|
1186
1213
|
puts as_json(json_response, options)
|
1187
1214
|
end
|
@@ -1193,6 +1220,7 @@ class Morpheus::Cli::Instances
|
|
1193
1220
|
end
|
1194
1221
|
|
1195
1222
|
def eject(args)
|
1223
|
+
params = {'server' => true}
|
1196
1224
|
options = {}
|
1197
1225
|
optparse = OptionParser.new do|opts|
|
1198
1226
|
opts.banner = subcommand_usage("[name]")
|
@@ -1210,10 +1238,10 @@ class Morpheus::Cli::Instances
|
|
1210
1238
|
# exit 1
|
1211
1239
|
# end
|
1212
1240
|
if options[:dry_run]
|
1213
|
-
print_dry_run @instances_interface.dry.eject(instance['id'])
|
1241
|
+
print_dry_run @instances_interface.dry.eject(instance['id'], params)
|
1214
1242
|
return
|
1215
1243
|
end
|
1216
|
-
json_response = @instances_interface.eject(instance['id'])
|
1244
|
+
json_response = @instances_interface.eject(instance['id'], params)
|
1217
1245
|
if options[:json]
|
1218
1246
|
puts as_json(json_response, options)
|
1219
1247
|
end
|
@@ -1225,9 +1253,13 @@ class Morpheus::Cli::Instances
|
|
1225
1253
|
end
|
1226
1254
|
|
1227
1255
|
def stop_service(args)
|
1256
|
+
params = {'server' => false, 'muteMonitoring' => false}
|
1228
1257
|
options = {}
|
1229
1258
|
optparse = OptionParser.new do|opts|
|
1230
1259
|
opts.banner = subcommand_usage("[name]")
|
1260
|
+
opts.on('--muteMonitoring [on|off]', String, "Mute monitoring. Default is off.") do |val|
|
1261
|
+
params['muteMonitoring'] = val.nil? || val.to_s == 'on' || val.to_s == 'true'
|
1262
|
+
end
|
1231
1263
|
build_common_options(opts, options, [:auto_confirm, :quiet, :json, :dry_run, :remote])
|
1232
1264
|
end
|
1233
1265
|
optparse.parse!(args)
|
@@ -1242,10 +1274,10 @@ class Morpheus::Cli::Instances
|
|
1242
1274
|
exit 1
|
1243
1275
|
end
|
1244
1276
|
if options[:dry_run]
|
1245
|
-
print_dry_run @instances_interface.dry.stop(instance['id'],
|
1277
|
+
print_dry_run @instances_interface.dry.stop(instance['id'], params)
|
1246
1278
|
return 0
|
1247
1279
|
end
|
1248
|
-
json_response = @instances_interface.stop(instance['id'],
|
1280
|
+
json_response = @instances_interface.stop(instance['id'], params)
|
1249
1281
|
if options[:json]
|
1250
1282
|
puts as_json(json_response, options)
|
1251
1283
|
elsif !options[:quiet]
|
@@ -1259,6 +1291,7 @@ class Morpheus::Cli::Instances
|
|
1259
1291
|
end
|
1260
1292
|
|
1261
1293
|
def start_service(args)
|
1294
|
+
params = {'server' => true}
|
1262
1295
|
options = {}
|
1263
1296
|
optparse = OptionParser.new do|opts|
|
1264
1297
|
opts.banner = subcommand_usage("[name]")
|
@@ -1273,10 +1306,10 @@ class Morpheus::Cli::Instances
|
|
1273
1306
|
begin
|
1274
1307
|
instance = find_instance_by_name_or_id(args[0])
|
1275
1308
|
if options[:dry_run]
|
1276
|
-
print_dry_run @instances_interface.dry.start(instance['id'],
|
1309
|
+
print_dry_run @instances_interface.dry.start(instance['id'], params)
|
1277
1310
|
return 0
|
1278
1311
|
end
|
1279
|
-
json_response = @instances_interface.start(instance['id'],
|
1312
|
+
json_response = @instances_interface.start(instance['id'], params)
|
1280
1313
|
if options[:json]
|
1281
1314
|
puts as_json(json_response, options)
|
1282
1315
|
elsif !options[:quiet]
|
@@ -1289,9 +1322,13 @@ class Morpheus::Cli::Instances
|
|
1289
1322
|
end
|
1290
1323
|
|
1291
1324
|
def restart_service(args)
|
1325
|
+
params = {'server' => false, 'muteMonitoring' => true}
|
1292
1326
|
options = {}
|
1293
1327
|
optparse = OptionParser.new do|opts|
|
1294
1328
|
opts.banner = subcommand_usage("[name]")
|
1329
|
+
opts.on('--muteMonitoring [on|off]', String, "Mute monitoring. Default is on.") do |val|
|
1330
|
+
params['muteMonitoring'] = val.nil? || val.to_s == 'on' || val.to_s == 'true'
|
1331
|
+
end
|
1295
1332
|
build_common_options(opts, options, [:auto_confirm, :quiet, :json, :dry_run, :remote])
|
1296
1333
|
end
|
1297
1334
|
optparse.parse!(args)
|
@@ -1306,10 +1343,10 @@ class Morpheus::Cli::Instances
|
|
1306
1343
|
exit 1
|
1307
1344
|
end
|
1308
1345
|
if options[:dry_run]
|
1309
|
-
print_dry_run @instances_interface.dry.restart(instance['id'],
|
1346
|
+
print_dry_run @instances_interface.dry.restart(instance['id'], params)
|
1310
1347
|
return 0
|
1311
1348
|
end
|
1312
|
-
json_response = @instances_interface.restart(instance['id'],
|
1349
|
+
json_response = @instances_interface.restart(instance['id'], params)
|
1313
1350
|
if options[:json]
|
1314
1351
|
puts as_json(json_response, options)
|
1315
1352
|
elsif !options[:quiet]
|