morpheus-cli 5.3.2 → 5.3.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/instances_interface.rb +18 -5
- 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/secondary_read_interface.rb +25 -0
- data/lib/morpheus/api/secondary_rest_interface.rb +42 -0
- data/lib/morpheus/api/virtual_images_interface.rb +23 -2
- data/lib/morpheus/cli/apps.rb +3 -2
- data/lib/morpheus/cli/cli_command.rb +21 -14
- data/lib/morpheus/cli/cli_registry.rb +55 -2
- data/lib/morpheus/cli/cloud_resource_pools_command.rb +169 -133
- data/lib/morpheus/cli/clusters.rb +51 -33
- data/lib/morpheus/cli/instances.rb +292 -174
- data/lib/morpheus/cli/invoices_command.rb +79 -99
- data/lib/morpheus/cli/library_cluster_layouts_command.rb +20 -0
- 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 +123 -101
- data/lib/morpheus/cli/mixins/rest_command.rb +657 -0
- data/lib/morpheus/cli/monitoring_checks_command.rb +2 -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_parser.rb +25 -17
- data/lib/morpheus/cli/option_types.rb +42 -45
- data/lib/morpheus/cli/tenants_command.rb +18 -20
- data/lib/morpheus/cli/vdi_pools_command.rb +4 -1
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/virtual_images.rb +249 -29
- data/lib/morpheus/cli.rb +1 -0
- data/lib/morpheus/ext/string.rb +41 -0
- data/lib/morpheus/formatters.rb +4 -0
- data/morpheus-cli.gemspec +1 -1
- metadata +13 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca7c939828b8f72ee86c663a19d01743a56d5c6c209cecc5e17b44046caeb484
|
4
|
+
data.tar.gz: e13fccbf1a45e8980e818e4cc1f0dba98d65e405c79f5d90e13c33341ad2e514
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5965b1af85499cadcae249f3109b6fd0ea4bee6af38192196fd6091bdcdb452f75c1f4025f372ec3d5f47ab1531e04acbf5fb2ed17848ba023087c309fdd06ee
|
7
|
+
data.tar.gz: 56bc2124de4e6b28c0c4484b5fa40beef19287708edd98ee1fdddbe334bc7854b853153209d1531793502aa8034d1c8ccf9fca643ec13aebf3eb8353cdd1f72e
|
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
|
@@ -57,11 +57,24 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
57
57
|
execute(opts)
|
58
58
|
end
|
59
59
|
|
60
|
-
def
|
61
|
-
url
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
def extend_shutdown(id, params={}, payload={}, headers={})
|
61
|
+
execute(method: :put, url: "#{base_path}/#{id}/extend-shutdown", params: params, payload: payload, headers: headers)
|
62
|
+
end
|
63
|
+
|
64
|
+
def extend_expiration(id, params={}, payload={}, headers={})
|
65
|
+
execute(method: :put, url: "#{base_path}/#{id}/extend-expiration", params: params, payload: payload, headers: headers)
|
66
|
+
end
|
67
|
+
|
68
|
+
def cancel_shutdown(id, params={}, payload={}, headers={})
|
69
|
+
execute(method: :put, url: "#{base_path}/#{id}/cancel-shutdown", params: params, payload: payload, headers: headers)
|
70
|
+
end
|
71
|
+
|
72
|
+
def cancel_expiration(id, params={}, payload={}, headers={})
|
73
|
+
execute(method: :put, url: "#{base_path}/#{id}/cancel-expiration", params: params, payload: payload, headers: headers)
|
74
|
+
end
|
75
|
+
|
76
|
+
def cancel_removal(id, params={}, payload={}, headers={})
|
77
|
+
execute(method: :put, url: "#{base_path}/#{id}/cancel-removal", params: params, payload: payload, headers: headers)
|
65
78
|
end
|
66
79
|
|
67
80
|
def stop(id, params={})
|
@@ -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' }
|
@@ -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
|
@@ -45,10 +45,10 @@ class Morpheus::VirtualImagesInterface < Morpheus::APIClient
|
|
45
45
|
execute(method: :put, url: url, headers: headers, payload: payload.to_json)
|
46
46
|
end
|
47
47
|
|
48
|
-
def destroy(id)
|
48
|
+
def destroy(id, params={})
|
49
49
|
url = "#{@base_url}/api/virtual-images/#{id}"
|
50
50
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
51
|
-
execute(method: :delete, url: url, headers: headers)
|
51
|
+
execute(method: :delete, url: url, params: params, headers: headers)
|
52
52
|
end
|
53
53
|
|
54
54
|
# multipart file upload
|
@@ -165,4 +165,25 @@ class Morpheus::VirtualImagesInterface < Morpheus::APIClient
|
|
165
165
|
execute(method: :delete, url: url, headers: headers)
|
166
166
|
end
|
167
167
|
|
168
|
+
def location_base_path(resource_id)
|
169
|
+
"/api/virtual-images/#{resource_id}/locations"
|
170
|
+
end
|
171
|
+
|
172
|
+
def list_locations(resource_id, params={}, headers={})
|
173
|
+
validate_id!(resource_id)
|
174
|
+
execute(method: :get, url: "#{location_base_path(resource_id)}", params: params, headers: headers)
|
175
|
+
end
|
176
|
+
|
177
|
+
def get_location(resource_id, id, params={}, headers={})
|
178
|
+
validate_id!(resource_id)
|
179
|
+
validate_id!(id)
|
180
|
+
execute(method: :get, url: "#{location_base_path(resource_id)}/#{id}", params: params, headers: headers)
|
181
|
+
end
|
182
|
+
|
183
|
+
def destroy_location(resource_id, id, params = {}, headers={})
|
184
|
+
validate_id!(resource_id)
|
185
|
+
validate_id!(id)
|
186
|
+
execute(method: :delete, url: "#{location_base_path(resource_id)}/#{id}", params: params, headers: headers)
|
187
|
+
end
|
188
|
+
|
168
189
|
end
|
data/lib/morpheus/cli/apps.rb
CHANGED
@@ -438,7 +438,7 @@ class Morpheus::Cli::Apps
|
|
438
438
|
instance_prompt_options[:default_cloud] = cloud ? cloud['name'] : nil
|
439
439
|
instance_prompt_options[:environment] = selected_environment ? selected_environment['code'] : nil
|
440
440
|
instance_prompt_options[:default_security_groups] = scoped_instance_config['securityGroups'] ? scoped_instance_config['securityGroups'] : nil
|
441
|
-
|
441
|
+
|
442
442
|
instance_prompt_options[:no_prompt] = options[:no_prompt]
|
443
443
|
#instance_prompt_options[:always_prompt] = options[:no_prompt] != true # options[:always_prompt]
|
444
444
|
instance_prompt_options[:options] = scoped_instance_config # meh, actually need to make these default values instead..
|
@@ -460,8 +460,9 @@ class Morpheus::Cli::Apps
|
|
460
460
|
instance_prompt_options[:locked_fields] = scoped_instance_config['lockedFields']
|
461
461
|
instance_prompt_options[:for_app] = true
|
462
462
|
# this provisioning helper method handles all (most) of the parsing and prompting
|
463
|
+
scoped_instance_config = Marshal.load( Marshal.dump(scoped_instance_config) )
|
463
464
|
instance_config_payload = prompt_new_instance(instance_prompt_options)
|
464
|
-
|
465
|
+
|
465
466
|
# strip all empty string and nil
|
466
467
|
instance_config_payload.deep_compact!
|
467
468
|
# use the blueprint config as the base
|
@@ -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
|
@@ -1201,11 +1202,18 @@ module Morpheus
|
|
1201
1202
|
# this could go be done in optparse.parse instead perhaps
|
1202
1203
|
def verify_args!(opts={})
|
1203
1204
|
args = opts[:args] || []
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1205
|
+
count = opts[:count]
|
1206
|
+
# simplify output for verify_args!(min:2, max:2) or verify_args!(max:0)
|
1207
|
+
if opts[:min] && opts[:max] && opts[:min] == opts[:max]
|
1208
|
+
count = opts[:min]
|
1209
|
+
elsif opts[:max] == 0
|
1210
|
+
count = 0
|
1211
|
+
end
|
1212
|
+
if count
|
1213
|
+
if args.count < count
|
1214
|
+
raise_args_error("not enough arguments, expected #{count} and got #{args.count == 0 ? '0' : args.count.to_s + ': '}#{args.join(', ')}", args, opts[:optparse])
|
1215
|
+
elsif args.count > count
|
1216
|
+
raise_args_error("too many arguments, expected #{count} and got #{args.count == 0 ? '0' : args.count.to_s + ': '}#{args.join(', ')}", args, opts[:optparse])
|
1209
1217
|
end
|
1210
1218
|
else
|
1211
1219
|
if opts[:min]
|
@@ -1527,8 +1535,7 @@ module Morpheus
|
|
1527
1535
|
cmds = subcommands.clone
|
1528
1536
|
if @hidden_subcommands && !@hidden_subcommands.empty?
|
1529
1537
|
@hidden_subcommands.each do |hidden_cmd|
|
1530
|
-
cmds.delete(hidden_cmd.to_s)
|
1531
|
-
cmds.delete(hidden_cmd.to_sym)
|
1538
|
+
cmds.delete(hidden_cmd.to_s.gsub('_', '-'))
|
1532
1539
|
end
|
1533
1540
|
end
|
1534
1541
|
cmds
|