morpheus-cli 4.2.14 → 4.2.19
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 +1 -1
- data/README.md +8 -6
- data/lib/morpheus/api/api_client.rb +32 -14
- data/lib/morpheus/api/auth_interface.rb +4 -2
- data/lib/morpheus/api/backup_jobs_interface.rb +9 -0
- data/lib/morpheus/api/backups_interface.rb +16 -0
- data/lib/morpheus/api/deploy_interface.rb +25 -56
- data/lib/morpheus/api/deployments_interface.rb +44 -55
- data/lib/morpheus/api/doc_interface.rb +57 -0
- data/lib/morpheus/api/instances_interface.rb +5 -0
- data/lib/morpheus/api/rest_interface.rb +40 -0
- data/lib/morpheus/api/user_sources_interface.rb +0 -15
- data/lib/morpheus/api/users_interface.rb +2 -3
- data/lib/morpheus/benchmarking.rb +2 -2
- data/lib/morpheus/cli.rb +4 -1
- data/lib/morpheus/cli/access_token_command.rb +27 -10
- data/lib/morpheus/cli/apps.rb +21 -15
- data/lib/morpheus/cli/backup_jobs_command.rb +276 -0
- data/lib/morpheus/cli/backups_command.rb +271 -0
- data/lib/morpheus/cli/blueprints_command.rb +27 -61
- data/lib/morpheus/cli/boot_scripts_command.rb +1 -1
- data/lib/morpheus/cli/cli_command.rb +183 -45
- data/lib/morpheus/cli/cli_registry.rb +3 -0
- data/lib/morpheus/cli/clouds.rb +7 -10
- data/lib/morpheus/cli/clusters.rb +0 -18
- data/lib/morpheus/cli/commands/standard/benchmark_command.rb +23 -20
- data/lib/morpheus/cli/commands/standard/man_command.rb +1 -1
- data/lib/morpheus/cli/credentials.rb +13 -9
- data/lib/morpheus/cli/deploy.rb +374 -0
- data/lib/morpheus/cli/deployments.rb +521 -197
- data/lib/morpheus/cli/deploys.rb +271 -126
- data/lib/morpheus/cli/doc.rb +182 -0
- data/lib/morpheus/cli/error_handler.rb +23 -8
- data/lib/morpheus/cli/errors.rb +3 -2
- data/lib/morpheus/cli/image_builder_command.rb +2 -2
- data/lib/morpheus/cli/instances.rb +136 -17
- data/lib/morpheus/cli/invoices_command.rb +339 -225
- data/lib/morpheus/cli/jobs_command.rb +2 -2
- data/lib/morpheus/cli/library_layouts_command.rb +1 -1
- data/lib/morpheus/cli/library_option_lists_command.rb +61 -125
- data/lib/morpheus/cli/library_option_types_command.rb +32 -37
- data/lib/morpheus/cli/login.rb +9 -3
- data/lib/morpheus/cli/mixins/accounts_helper.rb +158 -100
- data/lib/morpheus/cli/mixins/backups_helper.rb +115 -0
- data/lib/morpheus/cli/mixins/deployments_helper.rb +135 -0
- data/lib/morpheus/cli/mixins/library_helper.rb +32 -0
- data/lib/morpheus/cli/mixins/option_source_helper.rb +1 -1
- data/lib/morpheus/cli/mixins/print_helper.rb +149 -84
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +2 -2
- data/lib/morpheus/cli/mixins/whoami_helper.rb +19 -6
- data/lib/morpheus/cli/network_routers_command.rb +1 -1
- data/lib/morpheus/cli/option_parser.rb +48 -5
- data/lib/morpheus/cli/option_types.rb +46 -10
- data/lib/morpheus/cli/price_sets_command.rb +1 -1
- data/lib/morpheus/cli/projects_command.rb +7 -7
- data/lib/morpheus/cli/remote.rb +3 -2
- data/lib/morpheus/cli/roles.rb +49 -92
- data/lib/morpheus/cli/security_groups.rb +7 -1
- data/lib/morpheus/cli/service_plans_command.rb +10 -10
- data/lib/morpheus/cli/setup.rb +1 -1
- data/lib/morpheus/cli/shell.rb +7 -6
- data/lib/morpheus/cli/subnets_command.rb +1 -1
- data/lib/morpheus/cli/tasks.rb +24 -10
- data/lib/morpheus/cli/tenants_command.rb +133 -163
- data/lib/morpheus/cli/user_groups_command.rb +20 -65
- data/lib/morpheus/cli/user_settings_command.rb +115 -13
- data/lib/morpheus/cli/user_sources_command.rb +57 -24
- data/lib/morpheus/cli/users.rb +210 -186
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/whitelabel_settings_command.rb +29 -5
- data/lib/morpheus/cli/whoami.rb +113 -6
- data/lib/morpheus/cli/workflows.rb +11 -8
- data/lib/morpheus/ext/hash.rb +21 -0
- data/lib/morpheus/formatters.rb +7 -19
- data/lib/morpheus/terminal.rb +1 -0
- metadata +12 -3
- data/lib/morpheus/cli/auth_command.rb +0 -105
data/lib/morpheus/cli/version.rb
CHANGED
@@ -29,9 +29,13 @@ class Morpheus::Cli::WhitelabelSettingsCommand
|
|
29
29
|
options = {}
|
30
30
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
31
31
|
opts.banner = subcommand_usage()
|
32
|
-
opts.on( '
|
32
|
+
opts.on( '--tenant TENANT', String, "Tenant Name or ID" ) do |val|
|
33
33
|
options[:account] = val
|
34
34
|
end
|
35
|
+
opts.on( '-a', '--account ACCOUNT', "Tenant Name or ID" ) do |val|
|
36
|
+
options[:account] = val
|
37
|
+
end
|
38
|
+
opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
|
35
39
|
opts.on('--details', "Show full (not truncated) contents of Terms of Use, Privacy Policy, Override CSS" ) do
|
36
40
|
options[:details] = true
|
37
41
|
end
|
@@ -148,13 +152,17 @@ class Morpheus::Cli::WhitelabelSettingsCommand
|
|
148
152
|
query_params = {}
|
149
153
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
150
154
|
opts.banner = opts.banner = subcommand_usage()
|
155
|
+
opts.on( '--tenant TENANT', String, "Tenant Name or ID" ) do |val|
|
156
|
+
options[:account] = val
|
157
|
+
end
|
151
158
|
opts.on( '-a', '--account ACCOUNT', "Tenant Name or ID" ) do |val|
|
152
159
|
options[:account] = val
|
153
160
|
end
|
161
|
+
opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
|
154
162
|
opts.on('--active [on|off]', String, "Can be used to enable / disable whitelabel feature") do |val|
|
155
163
|
params['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
|
156
164
|
end
|
157
|
-
opts.on("--appliance-name NAME", String, "Appliance name. Only available to master
|
165
|
+
opts.on("--appliance-name NAME", String, "Appliance name. Only available to master tenant") do |val|
|
158
166
|
params['applianceName'] = val == 'null' ? nil : val
|
159
167
|
end
|
160
168
|
opts.on("--disable-support-menu [on|off]", ['on','off'], "Can be used to disable support menu") do |val|
|
@@ -314,9 +322,13 @@ class Morpheus::Cli::WhitelabelSettingsCommand
|
|
314
322
|
options = {}
|
315
323
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
316
324
|
opts.banner = opts.banner = subcommand_usage()
|
325
|
+
opts.on( '--tenant TENANT', String, "Tenant Name or ID" ) do |val|
|
326
|
+
options[:account] = val
|
327
|
+
end
|
317
328
|
opts.on( '-a', '--account ACCOUNT', "Tenant Name or ID" ) do |val|
|
318
329
|
options[:account] = val
|
319
330
|
end
|
331
|
+
opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
|
320
332
|
opts.on("--header-logo FILE", String, "Header logo image. Local path of a file to upload (png|jpg|svg)") do |val|
|
321
333
|
options[:headerLogo] = val
|
322
334
|
end
|
@@ -412,9 +424,13 @@ class Morpheus::Cli::WhitelabelSettingsCommand
|
|
412
424
|
options = {}
|
413
425
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
414
426
|
opts.banner = opts.banner = subcommand_usage("[image-type]")
|
415
|
-
opts.on( '
|
427
|
+
opts.on( '--tenant TENANT', String, "Tenant Name or ID" ) do |val|
|
428
|
+
options[:account] = val
|
429
|
+
end
|
430
|
+
opts.on( '-a', '--account ACCOUNT', "Tenant Name or ID" ) do |val|
|
416
431
|
options[:account] = val
|
417
432
|
end
|
433
|
+
opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
|
418
434
|
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
419
435
|
opts.footer = "Reset your whitelabel image.\n" +
|
420
436
|
"[image-type] is required. This is the whitelabel image type (#{@image_types.collect {|k,v| k}.join('|')})"
|
@@ -468,9 +484,13 @@ class Morpheus::Cli::WhitelabelSettingsCommand
|
|
468
484
|
options = {}
|
469
485
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
470
486
|
opts.banner = opts.banner = subcommand_usage("[image-type]")
|
471
|
-
opts.on( '
|
487
|
+
opts.on( '--tenant TENANT', String, "Tenant Name or ID" ) do |val|
|
488
|
+
options[:account] = val
|
489
|
+
end
|
490
|
+
opts.on( '-a', '--account ACCOUNT', "Tenant Name or ID" ) do |val|
|
472
491
|
options[:account] = val
|
473
492
|
end
|
493
|
+
opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
|
474
494
|
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
475
495
|
opts.footer = "View your image of specified [image-type].\n" +
|
476
496
|
"[image-type] is required. This is the whitelabel image type (#{@image_types.collect {|k,v| k}.join('|')})\n" +
|
@@ -532,9 +552,13 @@ class Morpheus::Cli::WhitelabelSettingsCommand
|
|
532
552
|
options = {}
|
533
553
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
534
554
|
opts.banner = opts.banner = subcommand_usage("[image-type] [local-file]")
|
535
|
-
opts.on( '
|
555
|
+
opts.on( '--tenant TENANT', String, "Tenant Name or ID" ) do |val|
|
556
|
+
options[:account] = val
|
557
|
+
end
|
558
|
+
opts.on( '-a', '--account ACCOUNT', "Tenant Name or ID" ) do |val|
|
536
559
|
options[:account] = val
|
537
560
|
end
|
561
|
+
opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
|
538
562
|
opts.on( '-f', '--force', "Overwrite existing [local-file] if it exists." ) do
|
539
563
|
options[:overwrite] = true
|
540
564
|
end
|
data/lib/morpheus/cli/whoami.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
|
-
# require 'yaml'
|
2
|
-
require 'io/console'
|
3
|
-
require 'rest_client'
|
4
|
-
require 'optparse'
|
5
1
|
require 'morpheus/cli/cli_command'
|
6
2
|
require 'morpheus/cli/mixins/whoami_helper'
|
7
3
|
require 'morpheus/cli/mixins/accounts_helper'
|
8
|
-
require '
|
4
|
+
require 'fileutils'
|
5
|
+
require 'yaml'
|
9
6
|
|
10
7
|
class Morpheus::Cli::Whoami
|
11
8
|
include Morpheus::Cli::CliCommand
|
@@ -163,7 +160,7 @@ EOT
|
|
163
160
|
print cyan
|
164
161
|
print_description_list({
|
165
162
|
"ID" => 'id',
|
166
|
-
"Tenant" => lambda {|it| (it['account'] ? it['account']['name'] : '') + (@is_master_account ? " (Master
|
163
|
+
"Tenant" => lambda {|it| (it['account'] ? it['account']['name'] : '') + (@is_master_account ? " (Master Tenant)" : '') },
|
167
164
|
"First Name" => 'firstName',
|
168
165
|
"Last Name" => 'lastName',
|
169
166
|
# "Name" => 'displayName',
|
@@ -232,4 +229,114 @@ EOT
|
|
232
229
|
end
|
233
230
|
end
|
234
231
|
|
232
|
+
# Whoami class methods
|
233
|
+
class << self
|
234
|
+
include Term::ANSIColor
|
235
|
+
|
236
|
+
# @@whoami_cache is for caching the the contents the Whoami api results
|
237
|
+
# as YAML files at $home/whoami/$appliance_name/$user_id.json
|
238
|
+
@@whoami_cache = nil
|
239
|
+
|
240
|
+
def whoami_cache
|
241
|
+
if @@whoami_cache.nil?
|
242
|
+
@@whoami_cache = {}
|
243
|
+
end
|
244
|
+
return @@whoami_cache
|
245
|
+
end
|
246
|
+
|
247
|
+
def clear_whoami_cache(appliance_name, user_id)
|
248
|
+
@@whoami_cache ||= {}
|
249
|
+
@@whoami_cache[appliance_name.to_s] ||= {}
|
250
|
+
@@whoami_cache[appliance_name.to_s][user_id.to_s] = result
|
251
|
+
end
|
252
|
+
|
253
|
+
def set_whoami_cache(appliance_name, user_id, result)
|
254
|
+
@@whoami_cache ||= {}
|
255
|
+
@@whoami_cache[appliance_name.to_s] ||= {}
|
256
|
+
@@whoami_cache[appliance_name.to_s][user_id.to_s] = result
|
257
|
+
end
|
258
|
+
|
259
|
+
def get_whoami_cache(appliance_name, user_id)
|
260
|
+
@@whoami_cache ||= {}
|
261
|
+
@@whoami_cache[appliance_name.to_s] ? @@whoami_cache[appliance_name.to_s][user_id.to_s] : nil
|
262
|
+
end
|
263
|
+
|
264
|
+
def whoami_file_path
|
265
|
+
File.join(Morpheus::Cli.home_directory, "cache", "whoami")
|
266
|
+
end
|
267
|
+
|
268
|
+
def save_whoami_file(appliance_name, user_id, json_response)
|
269
|
+
fn = File.join(whoami_file_path, appliance_name.to_s, user_id.to_s + ".json")
|
270
|
+
if !Dir.exists?(File.dirname(fn))
|
271
|
+
FileUtils.mkdir_p(File.dirname(fn))
|
272
|
+
end
|
273
|
+
Morpheus::Logging::DarkPrinter.puts "writing file #{fn}" if Morpheus::Logging.debug?
|
274
|
+
File.open(fn, 'w') {|f| f.write json_response.to_yaml }
|
275
|
+
FileUtils.chmod(0600, fn)
|
276
|
+
return json_response
|
277
|
+
end
|
278
|
+
|
279
|
+
def delete_whoami_file(appliance_name, user_id)
|
280
|
+
fn = File.join(whoami_file_path, appliance_name.to_s, user_id.to_s + ".json")
|
281
|
+
if File.exist?(fn)
|
282
|
+
#Morpheus::Logging::DarkPrinter.puts "deleting file #{fn}" if Morpheus::Logging.debug?
|
283
|
+
FileUtils.rm(fn)
|
284
|
+
end
|
285
|
+
return nil
|
286
|
+
end
|
287
|
+
|
288
|
+
def load_whoami_file(appliance_name, user_id)
|
289
|
+
raise "appliance_name is required" if appliance_name.to_s.empty?
|
290
|
+
raise "user_id is required" if user_id.to_s.empty?
|
291
|
+
fn = File.join(whoami_file_path, appliance_name.to_s, user_id.to_s + ".json")
|
292
|
+
if File.exist?(fn)
|
293
|
+
Morpheus::Logging::DarkPrinter.puts "reading file #{fn}" if Morpheus::Logging.debug?
|
294
|
+
return YAML.load_file(fn)
|
295
|
+
else
|
296
|
+
return nil
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
def save_whoami(appliance_name, user_id, result)
|
301
|
+
save_whoami_file(appliance_name, user_id, result)
|
302
|
+
set_whoami_cache(appliance_name, user_id, result)
|
303
|
+
end
|
304
|
+
|
305
|
+
def clear_whoami(appliance_name, user_id)
|
306
|
+
delete_whoami_file(appliance_name, user_id)
|
307
|
+
set_whoami_cache(appliance_name, user_id, nil)
|
308
|
+
end
|
309
|
+
|
310
|
+
def load_whoami(appliance_name, user_id, refresh=false)
|
311
|
+
result = nil
|
312
|
+
# load from cache (memory) or file or else api
|
313
|
+
if refresh == false
|
314
|
+
# load from memory
|
315
|
+
result = whoami_cache[appliance_name.to_s] ? whoami_cache[appliance_name.to_s][user_id.to_s] : nil
|
316
|
+
# load from file
|
317
|
+
if result.nil?
|
318
|
+
result = load_whoami_file(appliance_name, user_id)
|
319
|
+
set_whoami_cache(appliance_name, user_id, result)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
# if result.nil?
|
323
|
+
# # appliance needs to be passed in here...heh
|
324
|
+
# appliance = ::Morpheus::Cli::Remote.load_remote(appliance_name)
|
325
|
+
# if appliance.nil?
|
326
|
+
# raise "Remote not found for name '#{appliance_name}'"
|
327
|
+
# end
|
328
|
+
# wallet = ::Morpheus::Cli::Credentials.new(appliance[:name], appliance[:url]).load_saved_credentials()
|
329
|
+
# if wallet.nil? || wallet['access_token'].nil?
|
330
|
+
# raise "Access token not found for remote '#{appliance_name}'"
|
331
|
+
# end
|
332
|
+
# access_token = wallet['access_token']
|
333
|
+
# whoami_interface = Morpheus::WhoamiInterface.new({url: appliance[:url], access_token: wallet['access_token']})
|
334
|
+
# whoami_response = whoami_interface.get()
|
335
|
+
# result = whoami_response
|
336
|
+
# end
|
337
|
+
return result
|
338
|
+
end
|
339
|
+
|
340
|
+
end
|
341
|
+
|
235
342
|
end
|
@@ -619,7 +619,8 @@ class Morpheus::Cli::Workflows
|
|
619
619
|
elsif target_type == 'appliance'
|
620
620
|
# cool, run it locally.
|
621
621
|
else
|
622
|
-
|
622
|
+
# cool, run it locally.
|
623
|
+
#raise_command_error "missing required option: --instance, --host or --appliance\n#{optparse}"
|
623
624
|
end
|
624
625
|
|
625
626
|
# todo: prompt to workflow optionTypes for customOptions
|
@@ -631,9 +632,9 @@ class Morpheus::Cli::Workflows
|
|
631
632
|
}
|
632
633
|
custom_options = Morpheus::Cli::OptionTypes.prompt(custom_option_types, options[:options], @api_client, {})
|
633
634
|
end
|
634
|
-
|
635
|
-
|
636
|
-
|
635
|
+
if target_type
|
636
|
+
params['targetType'] = target_type
|
637
|
+
end
|
637
638
|
job_payload = {}
|
638
639
|
job_payload.deep_merge!(params)
|
639
640
|
passed_options.delete('customOptions')
|
@@ -655,15 +656,17 @@ class Morpheus::Cli::Workflows
|
|
655
656
|
puts as_json(json_response, options)
|
656
657
|
return json_response['success'] ? 0 : 1
|
657
658
|
else
|
658
|
-
target_desc =
|
659
|
+
target_desc = nil
|
659
660
|
if instances.size() > 0
|
660
661
|
target_desc = (instances.size() == 1) ? "instance #{instances[0]['name']}" : "#{instances.size()} instances"
|
661
662
|
elsif servers.size() > 0
|
662
663
|
target_desc = (servers.size() == 1) ? "host #{servers[0]['name']}" : "#{servers.size()} hosts"
|
663
|
-
elsif target_type == 'appliance'
|
664
|
-
target_desc = "appliance"
|
665
664
|
end
|
666
|
-
|
665
|
+
if target_desc
|
666
|
+
print_green_success "Executing workflow #{workflow['name']} on #{target_desc}"
|
667
|
+
else
|
668
|
+
print_green_success "Executing workflow #{workflow['name']}"
|
669
|
+
end
|
667
670
|
# todo: refresh, use get processId and load process record isntead? err
|
668
671
|
if json_response["jobExecution"] && json_response["jobExecution"]["id"]
|
669
672
|
get_args = [json_response["jobExecution"]["id"], "--details"] + (options[:remote] ? ["-r",options[:remote]] : [])
|
data/lib/morpheus/ext/hash.rb
CHANGED
@@ -85,4 +85,25 @@ class Hash
|
|
85
85
|
self
|
86
86
|
end
|
87
87
|
|
88
|
+
def upcase_keys!
|
89
|
+
self.keys.each do |k|
|
90
|
+
self[k.to_s.upcase] = self.delete(k)
|
91
|
+
end
|
92
|
+
self
|
93
|
+
end
|
94
|
+
|
95
|
+
def downcase_keys!
|
96
|
+
self.keys.each do |k|
|
97
|
+
self[k.to_s.downcase] = self.delete(k)
|
98
|
+
end
|
99
|
+
self
|
100
|
+
end
|
101
|
+
|
102
|
+
def capitalize_keys!
|
103
|
+
self.keys.each do |k|
|
104
|
+
self[k.to_s.capitalize] = self.delete(k)
|
105
|
+
end
|
106
|
+
self
|
107
|
+
end
|
108
|
+
|
88
109
|
end
|
data/lib/morpheus/formatters.rb
CHANGED
@@ -365,14 +365,8 @@ def format_number(n, opts={})
|
|
365
365
|
return out
|
366
366
|
end
|
367
367
|
|
368
|
-
def format_sig_dig(n,
|
369
|
-
|
370
|
-
parts = n.to_f.round(sig_dig).to_s.split(".")
|
371
|
-
if parts.size > 1 && sig_dig
|
372
|
-
parts[1] = parts[1].ljust(sig_dig, "0")
|
373
|
-
end
|
374
|
-
out << parts.join(".")
|
375
|
-
return out
|
368
|
+
def format_sig_dig(n, sigdig=3)
|
369
|
+
sprintf("%.#{sigdig}f", n)
|
376
370
|
end
|
377
371
|
|
378
372
|
def currency_sym(currency)
|
@@ -382,22 +376,16 @@ end
|
|
382
376
|
# returns currency amount formatted like "$4,5123.00". 0.00 is formatted as "$0"
|
383
377
|
# this is not ideal
|
384
378
|
def format_money(amount, currency='usd', opts={})
|
385
|
-
|
379
|
+
amount = amount.to_f
|
380
|
+
if amount == 0
|
386
381
|
return currency_sym(currency).to_s + "0"
|
387
382
|
# elsif amount.to_f < 0.01
|
388
383
|
# # return exponent notation like 3.4e-09
|
389
384
|
# return currency_sym(currency).to_s + "#{amount}"
|
390
385
|
else
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
elsif rtn.split('.')[1].length < 2
|
395
|
-
rtn = rtn + (['0'] * (2 - rtn.split('.')[1].length) * '')
|
396
|
-
end
|
397
|
-
dollars,cents = rtn.split(".")
|
398
|
-
rtn = currency_sym(currency).to_s + format_number(dollars.to_i.abs) + "." + cents
|
399
|
-
|
400
|
-
if dollars.to_i < 0
|
386
|
+
sigdig = opts[:sigdig] ? opts[:sigdig].to_i : 2
|
387
|
+
rtn = currency_sym(currency).to_s + format_number(sprintf("%.#{sigdig}f", amount))
|
388
|
+
if amount.to_i < 0
|
401
389
|
rtn = "(#{rtn})"
|
402
390
|
if opts[:minus_color]
|
403
391
|
rtn = "#{opts[:minus_color]}#{rtn}#{opts[:return_color] || cyan}"
|
data/lib/morpheus/terminal.rb
CHANGED
@@ -264,6 +264,7 @@ module Morpheus
|
|
264
264
|
opts.on('-V','--debug', "Print extra output for debugging.") do |json|
|
265
265
|
@terminal_log_level = Morpheus::Logging::Logger::DEBUG
|
266
266
|
Morpheus::Logging.set_log_level(Morpheus::Logging::Logger::DEBUG)
|
267
|
+
# if !options[:quiet]
|
267
268
|
::RestClient.log = Morpheus::Logging.debug? ? Morpheus::Logging::DarkPrinter.instance : nil
|
268
269
|
end
|
269
270
|
opts.on('-v','--version', "Print the version.") do
|
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: 4.2.
|
4
|
+
version: 4.2.19
|
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: 2020-
|
14
|
+
date: 2020-09-03 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -182,7 +182,9 @@ files:
|
|
182
182
|
- lib/morpheus/api/archive_buckets_interface.rb
|
183
183
|
- lib/morpheus/api/archive_files_interface.rb
|
184
184
|
- lib/morpheus/api/auth_interface.rb
|
185
|
+
- lib/morpheus/api/backup_jobs_interface.rb
|
185
186
|
- lib/morpheus/api/backup_settings_interface.rb
|
187
|
+
- lib/morpheus/api/backups_interface.rb
|
186
188
|
- lib/morpheus/api/blueprints_interface.rb
|
187
189
|
- lib/morpheus/api/budgets_interface.rb
|
188
190
|
- lib/morpheus/api/cloud_datastores_interface.rb
|
@@ -198,6 +200,7 @@ files:
|
|
198
200
|
- lib/morpheus/api/datastores_interface.rb
|
199
201
|
- lib/morpheus/api/deploy_interface.rb
|
200
202
|
- lib/morpheus/api/deployments_interface.rb
|
203
|
+
- lib/morpheus/api/doc_interface.rb
|
201
204
|
- lib/morpheus/api/environments_interface.rb
|
202
205
|
- lib/morpheus/api/execute_schedules_interface.rb
|
203
206
|
- lib/morpheus/api/execution_request_interface.rb
|
@@ -266,6 +269,7 @@ files:
|
|
266
269
|
- lib/morpheus/api/provisioning_licenses_interface.rb
|
267
270
|
- lib/morpheus/api/provisioning_settings_interface.rb
|
268
271
|
- lib/morpheus/api/reports_interface.rb
|
272
|
+
- lib/morpheus/api/rest_interface.rb
|
269
273
|
- lib/morpheus/api/roles_interface.rb
|
270
274
|
- lib/morpheus/api/security_group_rules_interface.rb
|
271
275
|
- lib/morpheus/api/security_groups_interface.rb
|
@@ -295,8 +299,9 @@ files:
|
|
295
299
|
- lib/morpheus/cli/approvals_command.rb
|
296
300
|
- lib/morpheus/cli/apps.rb
|
297
301
|
- lib/morpheus/cli/archives_command.rb
|
298
|
-
- lib/morpheus/cli/
|
302
|
+
- lib/morpheus/cli/backup_jobs_command.rb
|
299
303
|
- lib/morpheus/cli/backup_settings_command.rb
|
304
|
+
- lib/morpheus/cli/backups_command.rb
|
300
305
|
- lib/morpheus/cli/blueprints_command.rb
|
301
306
|
- lib/morpheus/cli/boot_scripts_command.rb
|
302
307
|
- lib/morpheus/cli/budgets_command.rb
|
@@ -333,8 +338,10 @@ files:
|
|
333
338
|
- lib/morpheus/cli/credentials.rb
|
334
339
|
- lib/morpheus/cli/cypher_command.rb
|
335
340
|
- lib/morpheus/cli/dashboard_command.rb
|
341
|
+
- lib/morpheus/cli/deploy.rb
|
336
342
|
- lib/morpheus/cli/deployments.rb
|
337
343
|
- lib/morpheus/cli/deploys.rb
|
344
|
+
- lib/morpheus/cli/doc.rb
|
338
345
|
- lib/morpheus/cli/dot_file.rb
|
339
346
|
- lib/morpheus/cli/environments_command.rb
|
340
347
|
- lib/morpheus/cli/error_handler.rb
|
@@ -372,6 +379,8 @@ files:
|
|
372
379
|
- lib/morpheus/cli/logout.rb
|
373
380
|
- lib/morpheus/cli/logs_command.rb
|
374
381
|
- lib/morpheus/cli/mixins/accounts_helper.rb
|
382
|
+
- lib/morpheus/cli/mixins/backups_helper.rb
|
383
|
+
- lib/morpheus/cli/mixins/deployments_helper.rb
|
375
384
|
- lib/morpheus/cli/mixins/infrastructure_helper.rb
|
376
385
|
- lib/morpheus/cli/mixins/library_helper.rb
|
377
386
|
- lib/morpheus/cli/mixins/logs_helper.rb
|
@@ -1,105 +0,0 @@
|
|
1
|
-
require 'morpheus/cli/cli_command'
|
2
|
-
|
3
|
-
# JD: this is not in use, we have login, logout and access-token instead
|
4
|
-
# This provides commands for authentication
|
5
|
-
# This also includes credential management.
|
6
|
-
class Morpheus::Cli::AuthCommand
|
7
|
-
include Morpheus::Cli::CliCommand
|
8
|
-
|
9
|
-
set_command_name :'auth'
|
10
|
-
|
11
|
-
register_subcommands :get
|
12
|
-
# register_subcommands :list # yes plz
|
13
|
-
# register_subcommands :'access-token' => :print_access_token
|
14
|
-
# register_subcommands :'refresh-token' => :print_refresh_token
|
15
|
-
# register_subcommands :'use-refresh-token' => :use_refresh_token
|
16
|
-
register_subcommands :login, :logout
|
17
|
-
register_subcommands :test => :login_test
|
18
|
-
|
19
|
-
def connect(options)
|
20
|
-
@api_client = establish_remote_appliance_connection(options.merge({:no_prompt => true, :skip_verify_access_token => true, :skip_login => true}))
|
21
|
-
# automatically get @appliance_name, @appliance_url, @wallet
|
22
|
-
if !@appliance_name
|
23
|
-
raise_command_error "#{command_name} requires a remote to be specified, use -r [remote] or set the active remote with `remote use`"
|
24
|
-
end
|
25
|
-
if !@appliance_url
|
26
|
-
unless options[:quiet]
|
27
|
-
print red,"Unable to determine remote appliance url. Review your remote configuration.#{reset}\n"
|
28
|
-
end
|
29
|
-
return 1
|
30
|
-
end
|
31
|
-
#@wallet = Morpheus::Cli::Credentials.new(@appliance_name, @appliance_url).load_saved_credentials()
|
32
|
-
if @wallet.nil? || @wallet['access_token'].nil?
|
33
|
-
unless options[:quiet]
|
34
|
-
print_error yellow,"You are not currently logged in to #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
|
35
|
-
print_error yellow,"Use `login` to authenticate.",reset,"\n"
|
36
|
-
end
|
37
|
-
return 1
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def handle(args)
|
42
|
-
handle_subcommand(args)
|
43
|
-
end
|
44
|
-
|
45
|
-
def get(args)
|
46
|
-
options = {}
|
47
|
-
params = {}
|
48
|
-
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
49
|
-
opts.banner = subcommand_usage()
|
50
|
-
build_common_options(opts, options, [:remote, :quiet])
|
51
|
-
opts.footer = "Print your current authentication info.\n" +
|
52
|
-
"This contains tokens that should be kept secret, be careful."
|
53
|
-
end
|
54
|
-
optparse.parse!(args)
|
55
|
-
if args.count != 0
|
56
|
-
raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
|
57
|
-
end
|
58
|
-
connect_result = connect(options)
|
59
|
-
return connect_result if (connect_result.is_a?(Numeric) && connect_result != 0)
|
60
|
-
|
61
|
-
# could fetch and show whoami info as well eh?
|
62
|
-
# extra api call though..
|
63
|
-
|
64
|
-
#print_h1 "Morpheus Credentials", [display_appliance(@appliance_name, @appliance_url)], options
|
65
|
-
print_h1 "Morpheus Credentials", [], options
|
66
|
-
description_cols = {
|
67
|
-
"Remote" => lambda {|wallet| @appliance_name },
|
68
|
-
"Username" => lambda {|wallet| wallet['username'] },
|
69
|
-
"Access Token" => lambda {|wallet| wallet['access_token'] },
|
70
|
-
"Refresh Token" => lambda {|wallet| wallet['refresh_token'] },
|
71
|
-
"Login Date" => lambda {|wallet| format_local_dt(wallet['login_date']) },
|
72
|
-
"Expire Date" => lambda {|wallet| wallet['expire_date'] ? format_local_dt(wallet['expire_date']) : "" },
|
73
|
-
}
|
74
|
-
print cyan
|
75
|
-
puts as_description_list(@wallet, description_cols)
|
76
|
-
print reset
|
77
|
-
return 0
|
78
|
-
end
|
79
|
-
|
80
|
-
# these are all just aliases, heh
|
81
|
-
|
82
|
-
def login(args)
|
83
|
-
::Morpheus::Cli::Login.new.handle(args)
|
84
|
-
end
|
85
|
-
|
86
|
-
def login_test(args)
|
87
|
-
::Morpheus::Cli::Login.new.handle(['--test'] + args)
|
88
|
-
end
|
89
|
-
|
90
|
-
def logout(args)
|
91
|
-
::Morpheus::Cli::Logout.new.handle(args)
|
92
|
-
end
|
93
|
-
|
94
|
-
def print_access_token(args)
|
95
|
-
::Morpheus::Cli::AccessTokenCommand.new.handle(args)
|
96
|
-
end
|
97
|
-
|
98
|
-
def use_refresh_token(args)
|
99
|
-
::Morpheus::Cli::AccessTokenCommand.new.handle(['refresh'] + args)
|
100
|
-
end
|
101
|
-
|
102
|
-
|
103
|
-
protected
|
104
|
-
|
105
|
-
end
|