morpheus-cli 5.3.1.1 → 5.3.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/lib/morpheus/api/accounts_interface.rb +4 -30
- data/lib/morpheus/api/api_client.rb +12 -0
- data/lib/morpheus/api/load_balancer_pools_interface.rb +9 -0
- data/lib/morpheus/api/load_balancer_types_interface.rb +9 -0
- data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +9 -0
- data/lib/morpheus/api/load_balancers_interface.rb +4 -53
- data/lib/morpheus/api/network_routers_interface.rb +56 -0
- data/lib/morpheus/api/option_type_lists_interface.rb +19 -7
- data/lib/morpheus/api/secondary_read_interface.rb +25 -0
- data/lib/morpheus/api/secondary_rest_interface.rb +42 -0
- data/lib/morpheus/cli/cli_command.rb +9 -9
- data/lib/morpheus/cli/instances.rb +39 -37
- data/lib/morpheus/cli/library_cluster_layouts_command.rb +2 -3
- data/lib/morpheus/cli/library_container_scripts_command.rb +3 -4
- data/lib/morpheus/cli/library_container_templates_command.rb +4 -0
- data/lib/morpheus/cli/library_container_types_command.rb +2 -3
- data/lib/morpheus/cli/library_instance_types_command.rb +2 -3
- data/lib/morpheus/cli/library_layouts_command.rb +4 -0
- data/lib/morpheus/cli/library_option_lists_command.rb +68 -16
- data/lib/morpheus/cli/library_option_types_command.rb +4 -0
- data/lib/morpheus/cli/library_spec_templates_command.rb +3 -4
- data/lib/morpheus/cli/load_balancer_types.rb +37 -0
- data/lib/morpheus/cli/load_balancers.rb +149 -314
- data/lib/morpheus/cli/log_settings_command.rb +7 -3
- data/lib/morpheus/cli/mixins/load_balancers_helper.rb +156 -0
- data/lib/morpheus/cli/mixins/print_helper.rb +11 -0
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +3 -7
- data/lib/morpheus/cli/mixins/rest_command.rb +657 -0
- data/lib/morpheus/cli/network_routers_command.rb +1183 -185
- data/lib/morpheus/cli/networks_command.rb +194 -101
- data/lib/morpheus/cli/option_types.rb +29 -39
- data/lib/morpheus/cli/tenants_command.rb +18 -20
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli.rb +1 -0
- data/lib/morpheus/ext/string.rb +41 -0
- data/lib/morpheus/formatters.rb +4 -0
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fedf8a7443a29dd8ac5097e8f17bec94d481d3d1cadffd16dce033d9cb152f61
|
4
|
+
data.tar.gz: f1a306e2a42cebcb474371e589c07b2b31f6ed84faee0d47b640813e672d08ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe7834f3099b3dd5666c9230c8b833ac05a613d58465850d0eaf5e88cdb973a8eec4ac020946d6ba902abb43cd71d705760040e69b243a2e670e2dd8b5295c9b
|
7
|
+
data.tar.gz: 3cc4909d59ae2fcf99f319e74a13eb4db2261fe475629723b6a091fbf3dd13aa5f92e939ae9262ec44b9817b97591c21d6ac69046c400c41523ed588c9602087
|
data/Dockerfile
CHANGED
@@ -1,35 +1,9 @@
|
|
1
|
-
require 'morpheus/api/
|
1
|
+
require 'morpheus/api/rest_interface'
|
2
2
|
|
3
|
-
class Morpheus::AccountsInterface < Morpheus::
|
4
|
-
|
5
|
-
def get(id)
|
6
|
-
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
7
|
-
url = "#{@base_url}/api/accounts/#{id}"
|
8
|
-
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
9
|
-
execute(method: :get, url: url, headers: headers)
|
10
|
-
end
|
11
|
-
|
12
|
-
def list(params={})
|
13
|
-
url = "#{@base_url}/api/accounts"
|
14
|
-
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
15
|
-
execute(method: :get, url: url, headers: headers)
|
16
|
-
end
|
3
|
+
class Morpheus::AccountsInterface < Morpheus::RestInterface
|
17
4
|
|
18
|
-
def
|
19
|
-
|
20
|
-
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
21
|
-
execute(method: :post, url: url, headers: headers, payload: payload.to_json)
|
5
|
+
def base_path
|
6
|
+
"/api/accounts"
|
22
7
|
end
|
23
8
|
|
24
|
-
def update(id, payload)
|
25
|
-
url = "#{@base_url}/api/accounts/#{id}"
|
26
|
-
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
27
|
-
execute(method: :put, url: url, headers: headers, payload: payload.to_json)
|
28
|
-
end
|
29
|
-
|
30
|
-
def destroy(id)
|
31
|
-
url = "#{@base_url}/api/accounts/#{id}"
|
32
|
-
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
33
|
-
execute(method: :delete, url: url, headers: headers)
|
34
|
-
end
|
35
9
|
end
|
@@ -474,6 +474,18 @@ class Morpheus::APIClient
|
|
474
474
|
Morpheus::LoadBalancersInterface.new(common_interface_options).setopts(@options)
|
475
475
|
end
|
476
476
|
|
477
|
+
def load_balancer_types
|
478
|
+
Morpheus::LoadBalancerTypesInterface.new(common_interface_options).setopts(@options)
|
479
|
+
end
|
480
|
+
|
481
|
+
def load_balancer_virtual_servers
|
482
|
+
Morpheus::LoadBalancerVirtualServersInterface.new(common_interface_options).setopts(@options)
|
483
|
+
end
|
484
|
+
|
485
|
+
def load_balancer_pools
|
486
|
+
Morpheus::LoadBalancerPoolsInterface.new(common_interface_options).setopts(@options)
|
487
|
+
end
|
488
|
+
|
477
489
|
def tasks
|
478
490
|
Morpheus::TasksInterface.new(common_interface_options).setopts(@options)
|
479
491
|
end
|
@@ -1,58 +1,9 @@
|
|
1
|
-
require 'morpheus/api/
|
1
|
+
require 'morpheus/api/rest_interface'
|
2
2
|
|
3
|
-
class Morpheus::LoadBalancersInterface < Morpheus::
|
3
|
+
class Morpheus::LoadBalancersInterface < Morpheus::RestInterface
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
8
|
-
if options.is_a?(Hash)
|
9
|
-
headers[:params].merge!(options)
|
10
|
-
elsif options.is_a?(Numeric)
|
11
|
-
url = "#{@base_url}/api/load-balancer-types/#{options}"
|
12
|
-
elsif options.is_a?(String)
|
13
|
-
headers[:params]['name'] = options
|
14
|
-
end
|
15
|
-
execute(method: :get, url: url, headers: headers)
|
5
|
+
def base_path
|
6
|
+
"/api/load-balancers"
|
16
7
|
end
|
17
8
|
|
18
|
-
def list(params={})
|
19
|
-
url = "#{@base_url}/api/load-balancers"
|
20
|
-
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
21
|
-
opts = {method: :get, url: url, headers: headers}
|
22
|
-
execute(opts)
|
23
|
-
end
|
24
|
-
|
25
|
-
def get(options=nil)
|
26
|
-
url = "#{@base_url}/api/load-balancers"
|
27
|
-
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
28
|
-
if options.is_a?(Hash)
|
29
|
-
headers[:params].merge!(options)
|
30
|
-
elsif options.is_a?(Numeric)
|
31
|
-
url = "#{@base_url}/api/load-balancers/#{options}"
|
32
|
-
elsif options.is_a?(String)
|
33
|
-
headers[:params]['name'] = options
|
34
|
-
end
|
35
|
-
execute(method: :get, url: url, headers: headers)
|
36
|
-
end
|
37
|
-
|
38
|
-
def update(id, options)
|
39
|
-
url = "#{@base_url}/api/load-balancers/#{id}"
|
40
|
-
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
41
|
-
payload = options
|
42
|
-
execute(method: :put, url: url, headers: headers, payload: payload.to_json)
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
def create(options)
|
47
|
-
url = "#{@base_url}/api/load-balancers"
|
48
|
-
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
49
|
-
payload = options
|
50
|
-
execute(method: :post, url: url, headers: headers, payload: payload.to_json)
|
51
|
-
end
|
52
|
-
|
53
|
-
def destroy(id)
|
54
|
-
url = "#{@base_url}/api/load-balancers/#{id}"
|
55
|
-
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
56
|
-
execute(method: :delete, url: url, headers: headers)
|
57
|
-
end
|
58
9
|
end
|
@@ -59,6 +59,34 @@ class Morpheus::NetworkRoutersInterface < Morpheus::APIClient
|
|
59
59
|
execute(opts)
|
60
60
|
end
|
61
61
|
|
62
|
+
def list_firewall_rule_groups(router_id, params={})
|
63
|
+
url = "#{@base_url}/api/networks/routers/#{router_id}/firewall-rule-groups"
|
64
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json', params: params }
|
65
|
+
opts = {method: :get, url: url, headers: headers}
|
66
|
+
execute(opts)
|
67
|
+
end
|
68
|
+
|
69
|
+
def create_firewall_rule_group(router_id, payload={})
|
70
|
+
url = "#{@base_url}/api/networks/routers/#{router_id}/firewall-rule-groups"
|
71
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
72
|
+
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
73
|
+
execute(opts)
|
74
|
+
end
|
75
|
+
|
76
|
+
def update_firewall_rule_group(router_id, group_id, payload={})
|
77
|
+
url = "#{@base_url}/api/networks/routers/#{router_id}/firewall-rule-groups/#{group_id}"
|
78
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
79
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
80
|
+
execute(opts)
|
81
|
+
end
|
82
|
+
|
83
|
+
def destroy_firewall_rule_group(router_id, group_id, payload={})
|
84
|
+
url = "#{@base_url}/api/networks/routers/#{router_id}/firewall-rule-groups/#{group_id}"
|
85
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
86
|
+
opts = {method: :delete, url: url, headers: headers, payload: payload.to_json}
|
87
|
+
execute(opts)
|
88
|
+
end
|
89
|
+
|
62
90
|
def create_firewall_rule(router_id, payload={})
|
63
91
|
url = "#{@base_url}/api/networks/routers/#{router_id}/firewall-rules"
|
64
92
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
@@ -66,6 +94,13 @@ class Morpheus::NetworkRoutersInterface < Morpheus::APIClient
|
|
66
94
|
execute(opts)
|
67
95
|
end
|
68
96
|
|
97
|
+
def update_firewall_rule(router_id, rule_id, payload={})
|
98
|
+
url = "#{@base_url}/api/networks/routers/#{router_id}/firewall-rules/#{rule_id}"
|
99
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
100
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
101
|
+
execute(opts)
|
102
|
+
end
|
103
|
+
|
69
104
|
def destroy_firewall_rule(router_id, rule_id, payload={})
|
70
105
|
url = "#{@base_url}/api/networks/routers/#{router_id}/firewall-rules/#{rule_id}"
|
71
106
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
@@ -87,6 +122,27 @@ class Morpheus::NetworkRoutersInterface < Morpheus::APIClient
|
|
87
122
|
execute(opts)
|
88
123
|
end
|
89
124
|
|
125
|
+
def create_nat(router_id, payload={})
|
126
|
+
url = "#{@base_url}/api/networks/routers/#{router_id}/nats"
|
127
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
128
|
+
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
129
|
+
execute(opts)
|
130
|
+
end
|
131
|
+
|
132
|
+
def update_nat(router_id, nat_id, payload={})
|
133
|
+
url = "#{@base_url}/api/networks/routers/#{router_id}/nats/#{nat_id}"
|
134
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
135
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
136
|
+
execute(opts)
|
137
|
+
end
|
138
|
+
|
139
|
+
def destroy_nat(router_id, nat_id, payload={})
|
140
|
+
url = "#{@base_url}/api/networks/routers/#{router_id}/nats/#{nat_id}"
|
141
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
142
|
+
opts = {method: :delete, url: url, headers: headers, payload: payload.to_json}
|
143
|
+
execute(opts)
|
144
|
+
end
|
145
|
+
|
90
146
|
def update_permissions(router_id, payload)
|
91
147
|
url = "#{@base_url}/api/networks/routers/#{router_id}/permissions"
|
92
148
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
@@ -2,38 +2,50 @@ require 'morpheus/api/api_client'
|
|
2
2
|
|
3
3
|
class Morpheus::OptionTypeListsInterface < Morpheus::APIClient
|
4
4
|
|
5
|
-
def
|
5
|
+
def base_path
|
6
|
+
"/api/library/option-type-lists"
|
7
|
+
end
|
8
|
+
|
9
|
+
def get(id, params={})
|
6
10
|
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
7
|
-
url = "#{
|
8
|
-
headers = { params:
|
11
|
+
url = "#{base_path}/#{id}"
|
12
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
9
13
|
opts = {method: :get, url: url, headers: headers}
|
10
14
|
execute(opts)
|
11
15
|
end
|
12
16
|
|
13
17
|
def list(params={})
|
14
|
-
url = "#{
|
18
|
+
url = "#{base_path}"
|
15
19
|
headers = { params: {}, authorization: "Bearer #{@access_token}" }
|
16
20
|
headers[:params].merge!(params)
|
17
21
|
opts = {method: :get, url: url, headers: headers}
|
18
22
|
execute(opts)
|
19
23
|
end
|
20
24
|
|
25
|
+
def list_items(id, params={})
|
26
|
+
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
27
|
+
url = "#{base_path}/#{id}/items"
|
28
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
29
|
+
opts = {method: :get, url: url, headers: headers}
|
30
|
+
execute(opts)
|
31
|
+
end
|
32
|
+
|
21
33
|
def create(payload)
|
22
|
-
url = "#{
|
34
|
+
url = "#{base_path}"
|
23
35
|
headers = { :params => {}, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
24
36
|
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
25
37
|
execute(opts)
|
26
38
|
end
|
27
39
|
|
28
40
|
def update(id, payload)
|
29
|
-
url = "#{
|
41
|
+
url = "#{base_path}/#{id}"
|
30
42
|
headers = { :params => {}, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
31
43
|
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
32
44
|
execute(opts)
|
33
45
|
end
|
34
46
|
|
35
47
|
def destroy(id)
|
36
|
-
url = "#{
|
48
|
+
url = "#{base_path}/#{id}"
|
37
49
|
headers = { :params => {}, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
38
50
|
opts = {method: :delete, url: url, headers: headers}
|
39
51
|
execute(opts)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
|
3
|
+
# Interface class to be subclassed by interfaces that provide CRUD endpoints
|
4
|
+
# for objects underneath another resource
|
5
|
+
# Subclasses must override the base_path(resource_id) method
|
6
|
+
class Morpheus::SecondaryReadInterface < Morpheus::APIClient
|
7
|
+
|
8
|
+
# subclasses should override in your interface
|
9
|
+
# Example: "/api/things/#{resource_id}/widgets"
|
10
|
+
def base_path(resource_id)
|
11
|
+
raise "#{self.class} has not defined base_path(resource_id)!"
|
12
|
+
end
|
13
|
+
|
14
|
+
def list(resource_id, params={}, headers={})
|
15
|
+
validate_id!(resource_id)
|
16
|
+
execute(method: :get, url: "#{base_path(resource_id)}", params: params, headers: headers)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(resource_id, id, params={}, headers={})
|
20
|
+
validate_id!(resource_id)
|
21
|
+
validate_id!(id)
|
22
|
+
execute(method: :get, url: "#{base_path(resource_id)}/#{id}", params: params, headers: headers)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
|
3
|
+
# Interface class to be subclassed by interfaces that provide CRUD endpoints
|
4
|
+
# for objects underneath another resource
|
5
|
+
# Subclasses must override the base_path(resource_id) method
|
6
|
+
class Morpheus::SecondaryRestInterface < Morpheus::APIClient
|
7
|
+
|
8
|
+
# subclasses should override in your interface
|
9
|
+
# Example: "/api/things/#{resource_id}/widgets"
|
10
|
+
def base_path(resource_id)
|
11
|
+
raise "#{self.class} has not defined base_path(resource_id)!"
|
12
|
+
end
|
13
|
+
|
14
|
+
def list(resource_id, params={}, headers={})
|
15
|
+
validate_id!(resource_id)
|
16
|
+
execute(method: :get, url: "#{base_path(resource_id)}", params: params, headers: headers)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(resource_id, id, params={}, headers={})
|
20
|
+
validate_id!(resource_id)
|
21
|
+
validate_id!(id)
|
22
|
+
execute(method: :get, url: "#{base_path(resource_id)}/#{id}", params: params, headers: headers)
|
23
|
+
end
|
24
|
+
|
25
|
+
def create(resource_id, payload, params={}, headers={})
|
26
|
+
validate_id!(resource_id)
|
27
|
+
execute(method: :post, url: "#{base_path(resource_id)}", params: params, payload: payload, headers: headers)
|
28
|
+
end
|
29
|
+
|
30
|
+
def update(resource_id, id, payload, params={}, headers={})
|
31
|
+
validate_id!(resource_id)
|
32
|
+
validate_id!(id)
|
33
|
+
execute(method: :put, url: "#{base_path(resource_id)}/#{id}", params: params, payload: payload, headers: headers)
|
34
|
+
end
|
35
|
+
|
36
|
+
def destroy(resource_id, id, params = {}, headers={})
|
37
|
+
validate_id!(resource_id)
|
38
|
+
validate_id!(id)
|
39
|
+
execute(method: :delete, url: "#{base_path(resource_id)}/#{id}", params: params, headers: headers)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -18,11 +18,11 @@ module Morpheus
|
|
18
18
|
# todo: use delegate
|
19
19
|
module CliCommand
|
20
20
|
|
21
|
-
def self.included(
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
Morpheus::Cli::CliRegistry.add(
|
21
|
+
def self.included(base)
|
22
|
+
base.send :include, Morpheus::Cli::PrintHelper
|
23
|
+
base.send :include, Morpheus::Benchmarking::HasBenchmarking
|
24
|
+
base.extend ClassMethods
|
25
|
+
Morpheus::Cli::CliRegistry.add(base, base.command_name)
|
26
26
|
end
|
27
27
|
|
28
28
|
# the beginning of instance variables from optparse !
|
@@ -983,10 +983,11 @@ module Morpheus
|
|
983
983
|
out = ""
|
984
984
|
out << usage.to_s.strip if usage
|
985
985
|
out << "\n"
|
986
|
-
|
986
|
+
my_subcommands = visible_subcommands
|
987
|
+
if !my_subcommands.empty?
|
987
988
|
out << "Commands:"
|
988
989
|
out << "\n"
|
989
|
-
|
990
|
+
my_subcommands.sort.each {|subcmd, method|
|
990
991
|
desc = get_subcommand_description(subcmd)
|
991
992
|
out << "\t#{subcmd.to_s}"
|
992
993
|
out << "\t#{desc}" if desc
|
@@ -1527,8 +1528,7 @@ module Morpheus
|
|
1527
1528
|
cmds = subcommands.clone
|
1528
1529
|
if @hidden_subcommands && !@hidden_subcommands.empty?
|
1529
1530
|
@hidden_subcommands.each do |hidden_cmd|
|
1530
|
-
cmds.delete(hidden_cmd.to_s)
|
1531
|
-
cmds.delete(hidden_cmd.to_sym)
|
1531
|
+
cmds.delete(hidden_cmd.to_s.gsub('_', '-'))
|
1532
1532
|
end
|
1533
1533
|
end
|
1534
1534
|
cmds
|
@@ -2565,46 +2565,50 @@ class Morpheus::Cli::Instances
|
|
2565
2565
|
options = {}
|
2566
2566
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
2567
2567
|
opts.banner = subcommand_usage("[instance]")
|
2568
|
-
|
2568
|
+
build_standard_update_options(opts, options)
|
2569
2569
|
end
|
2570
2570
|
optparse.parse!(args)
|
2571
|
-
|
2572
|
-
puts optparse
|
2573
|
-
exit 1
|
2574
|
-
end
|
2571
|
+
verify_args!(args:args, optparse:optparse, count:1)
|
2575
2572
|
connect(options)
|
2576
|
-
|
2577
|
-
|
2578
|
-
|
2579
|
-
|
2580
|
-
|
2581
|
-
|
2582
|
-
|
2583
|
-
|
2573
|
+
instance = find_instance_by_name_or_id(args[0])
|
2574
|
+
return 1, "instance not found" if instance.nil?
|
2575
|
+
|
2576
|
+
payload = {}
|
2577
|
+
if options[:payload]
|
2578
|
+
payload = options[:payload]
|
2579
|
+
payload.deep_merge!(parse_passed_options(options))
|
2580
|
+
else
|
2584
2581
|
payload = {
|
2585
|
-
|
2582
|
+
"instance" => {:id => instance["id"]}
|
2586
2583
|
}
|
2584
|
+
payload.deep_merge!(parse_passed_options(options))
|
2587
2585
|
|
2588
2586
|
# avoid 500 error
|
2589
2587
|
# payload[:servicePlanOptions] = {}
|
2590
2588
|
|
2591
2589
|
puts "\nDue to limitations by most Guest Operating Systems, Disk sizes can only be expanded and not reduced.\nIf a smaller plan is selected, memory and CPU (if relevant) will be reduced but storage will not.\n\n"
|
2592
2590
|
|
2591
|
+
group_id = instance['group']['id']
|
2592
|
+
cloud_id = instance['cloud']['id']
|
2593
|
+
layout_id = instance['layout']['id']
|
2594
|
+
plan_id = instance['plan']['id']
|
2595
|
+
current_plan_name = instance['plan']['name']
|
2593
2596
|
# prompt for service plan
|
2594
2597
|
service_plans_json = @instances_interface.service_plans({zoneId: cloud_id, siteId: group_id, layoutId: layout_id})
|
2595
2598
|
service_plans = service_plans_json["plans"]
|
2596
2599
|
service_plans_dropdown = service_plans.collect {|sp| {'name' => sp["name"], 'value' => sp["id"]} } # already sorted
|
2597
2600
|
service_plans_dropdown.each do |plan|
|
2598
|
-
if plan['value'] && plan['value'].to_i == plan_id.to_i
|
2599
|
-
|
2600
|
-
|
2601
|
+
# if plan['value'] && plan['value'].to_i == plan_id.to_i
|
2602
|
+
# plan['name'] = "#{plan['name']} (current)"
|
2603
|
+
# current_plan_name = plan['name']
|
2604
|
+
# end
|
2601
2605
|
end
|
2602
|
-
plan_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'servicePlan', 'type' => 'select', 'fieldLabel' => 'Plan', 'selectOptions' => service_plans_dropdown, 'required' => true, 'description' => 'Choose the appropriately sized plan for this instance'}],options[:options])
|
2606
|
+
plan_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'servicePlan', 'type' => 'select', 'fieldLabel' => 'Plan', 'selectOptions' => service_plans_dropdown, 'required' => true, 'defaultValue' => current_plan_name, 'description' => 'Choose the appropriately sized plan for this instance'}],options[:options])
|
2603
2607
|
service_plan = service_plans.find {|sp| sp["id"] == plan_prompt['servicePlan'].to_i }
|
2604
2608
|
new_plan_id = service_plan["id"]
|
2605
2609
|
#payload[:servicePlan] = new_plan_id # ew, this api uses servicePlanId instead
|
2606
2610
|
#payload[:servicePlanId] = new_plan_id
|
2607
|
-
payload[
|
2611
|
+
payload["instance"]["plan"] = {"id" => service_plan["id"]}
|
2608
2612
|
|
2609
2613
|
volumes_response = @instances_interface.volumes(instance['id'])
|
2610
2614
|
current_volumes = volumes_response['volumes'].sort {|x,y| x['displayOrder'] <=> y['displayOrder'] }
|
@@ -2612,29 +2616,27 @@ class Morpheus::Cli::Instances
|
|
2612
2616
|
# prompt for volumes
|
2613
2617
|
volumes = prompt_resize_volumes(current_volumes, service_plan, options)
|
2614
2618
|
if !volumes.empty?
|
2615
|
-
payload[
|
2619
|
+
payload["volumes"] = volumes
|
2616
2620
|
end
|
2617
2621
|
|
2618
2622
|
# only amazon supports this option
|
2619
2623
|
# for now, always do this
|
2620
|
-
payload[
|
2621
|
-
|
2622
|
-
|
2623
|
-
|
2624
|
-
|
2625
|
-
|
2626
|
-
|
2627
|
-
|
2628
|
-
|
2629
|
-
|
2630
|
-
|
2631
|
-
|
2632
|
-
#list([])
|
2633
|
-
end
|
2634
|
-
rescue RestClient::Exception => e
|
2635
|
-
print_rest_exception(e, options)
|
2636
|
-
exit 1
|
2624
|
+
payload["deleteOriginalVolumes"] = true
|
2625
|
+
end
|
2626
|
+
payload.delete("rootVolume")
|
2627
|
+
(1..20).each {|i| payload.delete("dataVolume#{i}") }
|
2628
|
+
@instances_interface.setopts(options)
|
2629
|
+
if options[:dry_run]
|
2630
|
+
print_dry_run @instances_interface.dry.resize(instance['id'], payload)
|
2631
|
+
return
|
2632
|
+
end
|
2633
|
+
json_response = @instances_interface.resize(instance['id'], payload)
|
2634
|
+
render_response(json_response, options, 'snapshots') do
|
2635
|
+
print_green_success "Resizing instance #{instance['name']}"
|
2637
2636
|
end
|
2637
|
+
return 0, nil
|
2638
|
+
|
2639
|
+
|
2638
2640
|
end
|
2639
2641
|
|
2640
2642
|
def backup(args)
|