morpheus-cli 3.2.0.1 → 3.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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]
|