morpheus-cli 5.5.0 → 5.5.1.2
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/Dockerfile +2 -2
- data/lib/morpheus/api/api_client.rb +12 -0
- data/lib/morpheus/api/backup_service_types_interface.rb +9 -0
- data/lib/morpheus/api/backup_services_interface.rb +9 -0
- data/lib/morpheus/api/clusters_interface.rb +12 -0
- data/lib/morpheus/api/network_pool_servers_interface.rb +7 -0
- data/lib/morpheus/api/scale_thresholds_interface.rb +9 -0
- data/lib/morpheus/cli/cli_command.rb +39 -20
- data/lib/morpheus/cli/commands/apps.rb +1 -1
- data/lib/morpheus/cli/commands/backup_services_command.rb +44 -0
- data/lib/morpheus/cli/commands/cloud_resource_pools_command.rb +33 -2
- data/lib/morpheus/cli/commands/clouds.rb +18 -6
- data/lib/morpheus/cli/commands/clusters.rb +66 -5
- data/lib/morpheus/cli/commands/hosts.rb +5 -1
- data/lib/morpheus/cli/commands/instances.rb +1 -1
- data/lib/morpheus/cli/commands/integrations_command.rb +1 -1
- data/lib/morpheus/cli/commands/invoices_command.rb +8 -1
- data/lib/morpheus/cli/commands/jobs_command.rb +45 -225
- data/lib/morpheus/cli/commands/library_container_types_command.rb +52 -3
- data/lib/morpheus/cli/commands/library_option_types_command.rb +56 -62
- data/lib/morpheus/cli/commands/load_balancers.rb +11 -19
- data/lib/morpheus/cli/commands/network_pool_servers_command.rb +5 -2
- data/lib/morpheus/cli/commands/roles.rb +475 -70
- data/lib/morpheus/cli/commands/scale_thresholds.rb +103 -0
- data/lib/morpheus/cli/commands/tasks.rb +19 -12
- data/lib/morpheus/cli/commands/user_sources_command.rb +107 -39
- data/lib/morpheus/cli/commands/users.rb +10 -10
- data/lib/morpheus/cli/commands/view.rb +1 -0
- data/lib/morpheus/cli/commands/workflows.rb +21 -14
- data/lib/morpheus/cli/error_handler.rb +13 -4
- data/lib/morpheus/cli/mixins/accounts_helper.rb +1 -1
- data/lib/morpheus/cli/mixins/execution_request_helper.rb +1 -1
- data/lib/morpheus/cli/mixins/infrastructure_helper.rb +4 -3
- data/lib/morpheus/cli/mixins/jobs_helper.rb +173 -0
- data/lib/morpheus/cli/mixins/print_helper.rb +120 -38
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +1 -3
- data/lib/morpheus/cli/mixins/rest_command.rb +58 -15
- data/lib/morpheus/cli/option_types.rb +68 -37
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/logging.rb +6 -8
- metadata +9 -4
|
@@ -61,13 +61,24 @@ module Morpheus
|
|
|
61
61
|
if option_type['fieldName'] == 'sshHosts'
|
|
62
62
|
option_type['type'] = 'multiText'
|
|
63
63
|
end
|
|
64
|
+
# swap types to multiSelect when flag is set..
|
|
65
|
+
if option_type["config"] && ["true","on"].include?(option_type["config"]["multiSelect"].to_s)
|
|
66
|
+
if option_type["type"] == "typeahead"
|
|
67
|
+
option_type["type"] = "multiTypeahead"
|
|
68
|
+
elsif option_type["type"] == "select"
|
|
69
|
+
option_type["type"] = "multiSelect"
|
|
70
|
+
elsif option_type["type"] == "textarea"
|
|
71
|
+
option_type["type"] = "multiText"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
64
74
|
end
|
|
65
|
-
|
|
75
|
+
|
|
66
76
|
# puts "Options Prompt #{options}"
|
|
67
77
|
# Sort options by default, group, advanced
|
|
68
78
|
cur_field_group = 'default'
|
|
69
|
-
|
|
70
|
-
|
|
79
|
+
prompt_local_credentials = true
|
|
80
|
+
self.sort_option_types(option_types.reject {|it| it[:for_help_only]}).each do |option_type|
|
|
81
|
+
next if option_type['localCredential'] && !prompt_local_credentials
|
|
71
82
|
context_map = results
|
|
72
83
|
value = nil
|
|
73
84
|
value_found = false
|
|
@@ -147,28 +158,9 @@ module Morpheus
|
|
|
147
158
|
next if !found_dep_value
|
|
148
159
|
end
|
|
149
160
|
|
|
150
|
-
#
|
|
151
|
-
|
|
152
|
-
if
|
|
153
|
-
if !credential_option_types[credential_code]
|
|
154
|
-
credential_option_type = {'code' => credential_code, 'fieldName' => credential_code, 'fieldLabel' => 'Credentials', 'type' => 'select', 'optionSource' => 'credentials', 'description' => 'Credential ID or use "local" to specify username and password', 'defaultValue' => "local", 'required' => true}
|
|
155
|
-
credential_option_types[credential_code] = credential_option_type
|
|
156
|
-
supported_credential_types = [option_type['credentialType'], option_type['credentialTypes']].compact.flatten.join(",").split(",").collect {|it| it.strip }
|
|
157
|
-
credential_params = {"new" => false, "credentialTypes" => supported_credential_types}
|
|
158
|
-
credential_value = select_prompt(credential_option_type, api_client, credential_params, no_prompt, options[credential_code])
|
|
159
|
-
if !credential_value.to_s.empty?
|
|
160
|
-
if credential_value == "local"
|
|
161
|
-
context_map[credential_code] = {"type" => credential_value}
|
|
162
|
-
elsif credential_value.to_s =~ /\A\d{1,}\Z/
|
|
163
|
-
context_map[credential_code] = {"id" => credential_value.to_i}
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
# skip this option unless using local credentials
|
|
168
|
-
if context_map[credential_code].is_a?(Hash) && context_map[credential_code]["type"] != "local"
|
|
169
|
-
next
|
|
170
|
-
end
|
|
171
|
-
end
|
|
161
|
+
# build parameters for option source api request
|
|
162
|
+
option_params = (option_type['noParams'] ? {} : (api_params || {}).deep_merge(results))
|
|
163
|
+
option_params.merge!(option_type['optionParams']) if option_type['optionParams']
|
|
172
164
|
|
|
173
165
|
cur_namespace = options
|
|
174
166
|
parent_context_map = context_map
|
|
@@ -184,9 +176,26 @@ module Morpheus
|
|
|
184
176
|
context_map = context_map[ns.to_s]
|
|
185
177
|
end
|
|
186
178
|
|
|
187
|
-
#
|
|
188
|
-
|
|
189
|
-
|
|
179
|
+
# credential type
|
|
180
|
+
handle_credential_type = -> {
|
|
181
|
+
credential_type = select_prompt(option_type.merge({'defaultValue' => value}), api_client, option_params.merge({'credentialTypes' => option_type['config']['credentialTypes']}), !value.nil?, nil, paging_enabled, ignore_empty)
|
|
182
|
+
# continue prompting for local creds
|
|
183
|
+
if credential_type == 'local'
|
|
184
|
+
parent_context_map.reject! {|k,v| k == 'credential'}
|
|
185
|
+
next
|
|
186
|
+
end
|
|
187
|
+
# hide local cred options
|
|
188
|
+
prompt_local_credentials = false
|
|
189
|
+
if credential_type.is_a?(Numeric)
|
|
190
|
+
# set as credential.id
|
|
191
|
+
credential = {'id' => credential_type}
|
|
192
|
+
else
|
|
193
|
+
# prompt credential type options
|
|
194
|
+
credential = prompt(api_client.credential_types.list({name:credential_type})['credentialTypes'][0]['optionTypes'], options, api_client, option_params, options[:no_prompt], paging_enabled, ignore_empty)['credential']
|
|
195
|
+
credential['type'] = credential_type
|
|
196
|
+
end
|
|
197
|
+
parent_context_map['credential'] = credential
|
|
198
|
+
}
|
|
190
199
|
|
|
191
200
|
# use the value passed in the options map
|
|
192
201
|
if cur_namespace.respond_to?('key?') && cur_namespace.key?(field_name)
|
|
@@ -219,6 +228,8 @@ module Morpheus
|
|
|
219
228
|
select_value_list << typeahead_prompt(option_type.merge({'defaultValue' => v, 'defaultInputValue' => input_value_list[i]}), api_client, option_params, true)
|
|
220
229
|
end
|
|
221
230
|
value = select_value_list
|
|
231
|
+
elsif option_type['type'] == 'credential'
|
|
232
|
+
handle_credential_type.call
|
|
222
233
|
end
|
|
223
234
|
if options[:always_prompt] != true
|
|
224
235
|
value_found = true
|
|
@@ -277,6 +288,9 @@ module Morpheus
|
|
|
277
288
|
value = multiline_prompt(option_type)
|
|
278
289
|
elsif option_type['type'] == 'code-editor'
|
|
279
290
|
value = multiline_prompt(option_type)
|
|
291
|
+
elsif option_type['type'] == 'credential'
|
|
292
|
+
print "\nCREDENTIALS\n#{"=" * ("CREDENTIALS".length)}\n\n"
|
|
293
|
+
handle_credential_type.call
|
|
280
294
|
elsif ['select', 'multiSelect'].include?(option_type['type'])
|
|
281
295
|
# so, the /api/options/source is may need ALL the previously
|
|
282
296
|
# selected values that are being accumulated in options
|
|
@@ -287,7 +301,8 @@ module Morpheus
|
|
|
287
301
|
value = select_prompt(option_type, api_client, option_params, options[:no_prompt], nil, paging_enabled, ignore_empty)
|
|
288
302
|
if value && option_type['type'] == 'multiSelect'
|
|
289
303
|
value = [value]
|
|
290
|
-
|
|
304
|
+
recommended_count = (option_type['config'] || {})['recommendedCount'] || 0
|
|
305
|
+
while self.confirm("Add another #{option_type['fieldLabel']}?", {:default => recommended_count > value.count}) do
|
|
291
306
|
if addn_value = select_prompt(option_type, api_client, option_params, options[:no_prompt], nil, paging_enabled, ignore_empty)
|
|
292
307
|
value << addn_value
|
|
293
308
|
else
|
|
@@ -391,7 +406,6 @@ module Morpheus
|
|
|
391
406
|
return value
|
|
392
407
|
end
|
|
393
408
|
|
|
394
|
-
|
|
395
409
|
def self.set_last_select(obj)
|
|
396
410
|
Thread.current[:_last_select] = obj
|
|
397
411
|
end
|
|
@@ -766,15 +780,18 @@ module Morpheus
|
|
|
766
780
|
help_prompt(option_type)
|
|
767
781
|
next
|
|
768
782
|
end
|
|
769
|
-
if input.downcase == 'yes'
|
|
783
|
+
if input.downcase == 'yes' || input.downcase == 'y' || input.downcase == 'on'
|
|
770
784
|
value_found = true
|
|
771
785
|
value = 'on'
|
|
772
|
-
elsif input.downcase == 'no'
|
|
786
|
+
elsif input.downcase == 'no' || input.downcase == 'n' || input.downcase == 'off'
|
|
773
787
|
value_found = true
|
|
774
788
|
value = 'off'
|
|
775
789
|
elsif input == '' && has_default
|
|
776
790
|
value_found = true
|
|
777
791
|
value = default_yes ? 'on' : 'off'
|
|
792
|
+
elsif input != ""
|
|
793
|
+
puts "Invalid Option... Please try again."
|
|
794
|
+
next
|
|
778
795
|
end
|
|
779
796
|
if value.nil? && option_type['required']
|
|
780
797
|
puts "Invalid Option... Please try again."
|
|
@@ -820,6 +837,20 @@ module Morpheus
|
|
|
820
837
|
elsif !value.nil? || option_type['required'] != true
|
|
821
838
|
value_found = true
|
|
822
839
|
end
|
|
840
|
+
# attempt to parse Java regex and validate it
|
|
841
|
+
if option_type["verifyPattern"].to_s != "" && !(value.to_s == "" && option_type['required'])
|
|
842
|
+
begin
|
|
843
|
+
# pattern is matched on the entire string
|
|
844
|
+
verify_pattern = Regexp.compile("^" + option_type["verifyPattern"] + "$")
|
|
845
|
+
if !verify_pattern.match(value)
|
|
846
|
+
value_found = false
|
|
847
|
+
puts "Invalid Option. Value must match the pattern '#{option_type['verifyPattern']}'. Please try again."
|
|
848
|
+
next
|
|
849
|
+
end
|
|
850
|
+
rescue => regex_ex
|
|
851
|
+
puts "Failed to parse verifyPattern '#{option_type['verifyPattern']}' as a regular expression"
|
|
852
|
+
end
|
|
853
|
+
end
|
|
823
854
|
end
|
|
824
855
|
return value
|
|
825
856
|
end
|
|
@@ -1083,10 +1114,10 @@ module Morpheus
|
|
|
1083
1114
|
return out
|
|
1084
1115
|
end
|
|
1085
1116
|
|
|
1086
|
-
def self.
|
|
1087
|
-
option_types.
|
|
1088
|
-
option_types.reject {|it| ['default', 'advanced'].include?(it['fieldGroup'] || 'default')}.sort{|a,b| a['displayOrder'] <=> b['displayOrder']}.group_by{|it| it['fieldGroup']}.values.collect { |it| it.sort{|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i}}.flatten +
|
|
1089
|
-
option_types.
|
|
1117
|
+
def self.sort_option_types(option_types)
|
|
1118
|
+
option_types.select {|it| (it['fieldGroup'] || 'default').casecmp?('default')}.sort {|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i} +
|
|
1119
|
+
option_types.reject {|it| ['default', 'advanced'].include?((it['fieldGroup'] || 'default').downcase)}.sort{|a,b| a['displayOrder'] <=> b['displayOrder']}.group_by{|it| it['fieldGroup']}.values.collect { |it| it.sort{|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i}}.flatten +
|
|
1120
|
+
option_types.select {|it| 'advanced'.casecmp?(it['fieldGroup'])}.sort {|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i}
|
|
1090
1121
|
end
|
|
1091
1122
|
|
|
1092
1123
|
def self.display_select_options(opt, select_options = [], paging = nil)
|
|
@@ -1094,7 +1125,7 @@ module Morpheus
|
|
|
1094
1125
|
end
|
|
1095
1126
|
|
|
1096
1127
|
def self.format_option_types_help(option_types, opts={})
|
|
1097
|
-
option_types = self.
|
|
1128
|
+
option_types = self.sort_option_types(option_types).reject {|it| it['hidden']}
|
|
1098
1129
|
|
|
1099
1130
|
if option_types.empty?
|
|
1100
1131
|
"#{opts[:color]}#{opts[:title] || "Available Options:"}\nNone\n\n"
|
data/lib/morpheus/cli/version.rb
CHANGED
data/lib/morpheus/logging.rb
CHANGED
|
@@ -155,10 +155,9 @@ module Morpheus::Logging
|
|
|
155
155
|
|
|
156
156
|
def print(*messages)
|
|
157
157
|
if @io
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
@io.print msg
|
|
158
|
+
print_with_color do
|
|
159
|
+
messages.flatten.each do |msg|
|
|
160
|
+
@io.print scrub_message(msg)
|
|
162
161
|
end
|
|
163
162
|
end
|
|
164
163
|
end
|
|
@@ -166,10 +165,9 @@ module Morpheus::Logging
|
|
|
166
165
|
|
|
167
166
|
def puts(*messages)
|
|
168
167
|
if @io
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
@io.puts msg
|
|
168
|
+
print_with_color do
|
|
169
|
+
messages.flatten.each do |msg|
|
|
170
|
+
@io.puts scrub_message(msg)
|
|
173
171
|
end
|
|
174
172
|
end
|
|
175
173
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: morpheus-cli
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.5.
|
|
4
|
+
version: 5.5.1.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- David Estes
|
|
@@ -11,7 +11,7 @@ authors:
|
|
|
11
11
|
autorequire:
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date: 2022-
|
|
14
|
+
date: 2022-07-19 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: bundler
|
|
@@ -185,6 +185,8 @@ files:
|
|
|
185
185
|
- lib/morpheus/api/audit_interface.rb
|
|
186
186
|
- lib/morpheus/api/auth_interface.rb
|
|
187
187
|
- lib/morpheus/api/backup_jobs_interface.rb
|
|
188
|
+
- lib/morpheus/api/backup_service_types_interface.rb
|
|
189
|
+
- lib/morpheus/api/backup_services_interface.rb
|
|
188
190
|
- lib/morpheus/api/backup_settings_interface.rb
|
|
189
191
|
- lib/morpheus/api/backups_interface.rb
|
|
190
192
|
- lib/morpheus/api/billing_interface.rb
|
|
@@ -292,6 +294,7 @@ files:
|
|
|
292
294
|
- lib/morpheus/api/reports_interface.rb
|
|
293
295
|
- lib/morpheus/api/rest_interface.rb
|
|
294
296
|
- lib/morpheus/api/roles_interface.rb
|
|
297
|
+
- lib/morpheus/api/scale_thresholds_interface.rb
|
|
295
298
|
- lib/morpheus/api/search_interface.rb
|
|
296
299
|
- lib/morpheus/api/secondary_read_interface.rb
|
|
297
300
|
- lib/morpheus/api/secondary_rest_interface.rb
|
|
@@ -341,6 +344,7 @@ files:
|
|
|
341
344
|
- lib/morpheus/cli/commands/archives_command.rb
|
|
342
345
|
- lib/morpheus/cli/commands/audit.rb
|
|
343
346
|
- lib/morpheus/cli/commands/backup_jobs_command.rb
|
|
347
|
+
- lib/morpheus/cli/commands/backup_services_command.rb
|
|
344
348
|
- lib/morpheus/cli/commands/backup_settings_command.rb
|
|
345
349
|
- lib/morpheus/cli/commands/backups_command.rb
|
|
346
350
|
- lib/morpheus/cli/commands/benchmark_command.rb
|
|
@@ -451,6 +455,7 @@ files:
|
|
|
451
455
|
- lib/morpheus/cli/commands/reports_command.rb
|
|
452
456
|
- lib/morpheus/cli/commands/rm_command.rb
|
|
453
457
|
- lib/morpheus/cli/commands/roles.rb
|
|
458
|
+
- lib/morpheus/cli/commands/scale_thresholds.rb
|
|
454
459
|
- lib/morpheus/cli/commands/search_command.rb
|
|
455
460
|
- lib/morpheus/cli/commands/security_group_rules.rb
|
|
456
461
|
- lib/morpheus/cli/commands/security_groups.rb
|
|
@@ -500,6 +505,7 @@ files:
|
|
|
500
505
|
- lib/morpheus/cli/mixins/deployments_helper.rb
|
|
501
506
|
- lib/morpheus/cli/mixins/execution_request_helper.rb
|
|
502
507
|
- lib/morpheus/cli/mixins/infrastructure_helper.rb
|
|
508
|
+
- lib/morpheus/cli/mixins/jobs_helper.rb
|
|
503
509
|
- lib/morpheus/cli/mixins/library_helper.rb
|
|
504
510
|
- lib/morpheus/cli/mixins/load_balancers_helper.rb
|
|
505
511
|
- lib/morpheus/cli/mixins/logs_helper.rb
|
|
@@ -550,8 +556,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
550
556
|
- !ruby/object:Gem::Version
|
|
551
557
|
version: '0'
|
|
552
558
|
requirements: []
|
|
553
|
-
|
|
554
|
-
rubygems_version: 2.7.6
|
|
559
|
+
rubygems_version: 3.1.6
|
|
555
560
|
signing_key:
|
|
556
561
|
specification_version: 4
|
|
557
562
|
summary: Provides CLI Interface to the Morpheus Public/Private Cloud Appliance
|