morpheus-cli 3.6.8 → 3.6.9
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/lib/morpheus/api/account_groups_interface.rb +2 -2
- data/lib/morpheus/api/accounts_interface.rb +4 -7
- data/lib/morpheus/api/api_client.rb +207 -70
- data/lib/morpheus/api/app_templates_interface.rb +7 -28
- data/lib/morpheus/api/apps_interface.rb +14 -21
- data/lib/morpheus/api/archive_buckets_interface.rb +2 -2
- data/lib/morpheus/api/archive_files_interface.rb +6 -6
- data/lib/morpheus/api/auth_interface.rb +14 -1
- data/lib/morpheus/api/blueprints_interface.rb +9 -16
- data/lib/morpheus/api/cloud_datastores_interface.rb +1 -1
- data/lib/morpheus/api/cloud_policies_interface.rb +1 -1
- data/lib/morpheus/api/clouds_interface.rb +18 -21
- data/lib/morpheus/api/cypher_interface.rb +19 -28
- data/lib/morpheus/api/file_copy_request_interface.rb +1 -1
- data/lib/morpheus/api/group_policies_interface.rb +1 -1
- data/lib/morpheus/api/groups_interface.rb +4 -4
- data/lib/morpheus/api/image_builder_boot_scripts_interface.rb +1 -1
- data/lib/morpheus/api/image_builder_image_builds_interface.rb +2 -2
- data/lib/morpheus/api/image_builder_preseed_scripts_interface.rb +1 -1
- data/lib/morpheus/api/instances_interface.rb +17 -23
- data/lib/morpheus/api/logs_interface.rb +7 -10
- data/lib/morpheus/api/network_domains_interface.rb +1 -1
- data/lib/morpheus/api/network_groups_interface.rb +1 -1
- data/lib/morpheus/api/network_pool_servers_interface.rb +1 -1
- data/lib/morpheus/api/network_pools_interface.rb +1 -1
- data/lib/morpheus/api/network_proxies_interface.rb +1 -1
- data/lib/morpheus/api/network_services_interface.rb +1 -1
- data/lib/morpheus/api/networks_interface.rb +1 -1
- data/lib/morpheus/api/old_cypher_interface.rb +55 -0
- data/lib/morpheus/api/packages_interface.rb +1 -1
- data/lib/morpheus/api/policies_interface.rb +1 -1
- data/lib/morpheus/api/setup_interface.rb +1 -1
- data/lib/morpheus/api/storage_providers_interface.rb +1 -1
- data/lib/morpheus/api/whoami_interface.rb +1 -1
- data/lib/morpheus/benchmarking.rb +277 -0
- data/lib/morpheus/cli.rb +6 -22
- data/lib/morpheus/cli/access_token_command.rb +172 -0
- data/lib/morpheus/cli/accounts.rb +5 -0
- data/lib/morpheus/cli/apps.rb +93 -37
- data/lib/morpheus/cli/archives_command.rb +0 -2
- data/lib/morpheus/cli/auth_command.rb +112 -0
- data/lib/morpheus/cli/blueprints_command.rb +50 -13
- data/lib/morpheus/cli/change_password_command.rb +148 -0
- data/lib/morpheus/cli/cli_command.rb +173 -49
- data/lib/morpheus/cli/clouds.rb +15 -5
- data/lib/morpheus/cli/command_error.rb +7 -1
- data/lib/morpheus/cli/{alias_command.rb → commands/standard/alias_command.rb} +79 -51
- data/lib/morpheus/cli/commands/standard/benchmark_command.rb +399 -0
- data/lib/morpheus/cli/commands/standard/coloring_command.rb +60 -0
- data/lib/morpheus/cli/{curl_command.rb → commands/standard/curl_command.rb} +0 -7
- data/lib/morpheus/cli/commands/standard/debug_command.rb +61 -0
- data/lib/morpheus/cli/{echo_command.rb → commands/standard/echo_command.rb} +1 -1
- data/lib/morpheus/cli/{edit_profile_command.rb → commands/standard/edit_profile_command.rb} +0 -0
- data/lib/morpheus/cli/{edit_rc_command.rb → commands/standard/edit_rc_command.rb} +0 -0
- data/lib/morpheus/cli/commands/standard/get_prompt_command.rb +39 -0
- data/lib/morpheus/cli/commands/standard/history_command.rb +76 -0
- data/lib/morpheus/cli/{log_level_command.rb → commands/standard/log_level_command.rb} +1 -1
- data/lib/morpheus/cli/{man_command.rb → commands/standard/man_command.rb} +2 -2
- data/lib/morpheus/cli/commands/standard/rm_command.rb +14 -0
- data/lib/morpheus/cli/commands/standard/set_prompt_command.rb +54 -0
- data/lib/morpheus/cli/{sleep_command.rb → commands/standard/sleep_command.rb} +0 -0
- data/lib/morpheus/cli/{source_command.rb → commands/standard/source_command.rb} +0 -0
- data/lib/morpheus/cli/{ssl_verification_command.rb → commands/standard/ssl_verification_command.rb} +1 -1
- data/lib/morpheus/cli/commands/standard/tee_command.rb +14 -0
- data/lib/morpheus/cli/{version_command.rb → commands/standard/version_command.rb} +0 -0
- data/lib/morpheus/cli/credentials.rb +276 -87
- data/lib/morpheus/cli/cypher_command.rb +333 -214
- data/lib/morpheus/cli/error_handler.rb +12 -2
- data/lib/morpheus/cli/groups.rb +44 -20
- data/lib/morpheus/cli/hosts.rb +39 -16
- data/lib/morpheus/cli/instances.rb +114 -62
- data/lib/morpheus/cli/login.rb +74 -21
- data/lib/morpheus/cli/logout.rb +3 -4
- data/lib/morpheus/cli/mixins/accounts_helper.rb +50 -18
- data/lib/morpheus/cli/mixins/print_helper.rb +207 -42
- data/lib/morpheus/cli/old_cypher_command.rb +414 -0
- data/lib/morpheus/cli/option_parser.rb +6 -1
- data/lib/morpheus/cli/processes_command.rb +3 -0
- data/lib/morpheus/cli/remote.rb +11 -17
- data/lib/morpheus/cli/roles.rb +17 -17
- data/lib/morpheus/cli/security_groups.rb +47 -17
- data/lib/morpheus/cli/shell.rb +139 -79
- data/lib/morpheus/cli/tenants_command.rb +353 -0
- data/lib/morpheus/cli/users.rb +26 -18
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/whoami.rb +14 -10
- data/lib/morpheus/formatters.rb +4 -4
- data/lib/morpheus/logging.rb +16 -8
- data/lib/morpheus/terminal.rb +63 -34
- metadata +28 -15
- data/lib/morpheus/cli/coloring_command.rb +0 -45
- data/lib/morpheus/cli/set_prompt_command.rb +0 -51
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'yaml'
|
|
2
2
|
require 'json'
|
|
3
3
|
require 'morpheus/logging'
|
|
4
|
+
require 'morpheus/benchmarking'
|
|
4
5
|
require 'morpheus/cli/option_parser'
|
|
5
6
|
require 'morpheus/cli/cli_registry'
|
|
6
7
|
require 'morpheus/cli/mixins/print_helper'
|
|
@@ -18,6 +19,7 @@ module Morpheus
|
|
|
18
19
|
|
|
19
20
|
def self.included(klass)
|
|
20
21
|
klass.send :include, Morpheus::Cli::PrintHelper
|
|
22
|
+
klass.send :include, Morpheus::Benchmarking::HasBenchmarking
|
|
21
23
|
klass.extend ClassMethods
|
|
22
24
|
Morpheus::Cli::CliRegistry.add(klass, klass.command_name)
|
|
23
25
|
end
|
|
@@ -66,6 +68,13 @@ module Morpheus
|
|
|
66
68
|
my_terminal.stderr.puts(*msgs)
|
|
67
69
|
end
|
|
68
70
|
|
|
71
|
+
# todo: customizable output color, other than cyan.
|
|
72
|
+
# def terminal_fg
|
|
73
|
+
# end
|
|
74
|
+
# def cyan
|
|
75
|
+
# Term::ANSIColor.black
|
|
76
|
+
# end
|
|
77
|
+
|
|
69
78
|
# todo: use terminal.stdin
|
|
70
79
|
# def readline(*msgs)
|
|
71
80
|
# @my_terminal.stdin.readline(*msgs)
|
|
@@ -179,11 +188,16 @@ module Morpheus
|
|
|
179
188
|
# @param options [Hash] the output Hash that is to being modified
|
|
180
189
|
# @param includes [Array] which options to include eg. :options, :json, :remote
|
|
181
190
|
# @return opts
|
|
182
|
-
def build_common_options(opts, options, includes=[])
|
|
191
|
+
def build_common_options(opts, options, includes=[], excludes=[])
|
|
183
192
|
#opts.separator ""
|
|
184
193
|
# opts.separator "Common options:"
|
|
185
|
-
|
|
186
|
-
|
|
194
|
+
option_keys = includes.clone
|
|
195
|
+
# todo: support --quiet everywhere
|
|
196
|
+
# turn on some options all the time..
|
|
197
|
+
# unless command_name == "shell"
|
|
198
|
+
# option_keys << :quiet unless option_keys.include?(:quiet)
|
|
199
|
+
# end
|
|
200
|
+
while (option_key = option_keys.shift) do
|
|
187
201
|
case option_key.to_sym
|
|
188
202
|
|
|
189
203
|
when :account
|
|
@@ -400,47 +414,56 @@ module Morpheus
|
|
|
400
414
|
end
|
|
401
415
|
|
|
402
416
|
when :remote
|
|
403
|
-
|
|
404
|
-
# this is the only option now...
|
|
405
|
-
# first, you must do `remote use [appliance]`
|
|
406
|
-
opts.on( '-r', '--remote REMOTE', "Remote Appliance Name to use for this command. The active appliance is used by default." ) do |val|
|
|
417
|
+
opts.on( '-r', '--remote REMOTE', "Remote name. The current remote is used by default." ) do |val|
|
|
407
418
|
options[:remote] = val
|
|
408
419
|
end
|
|
420
|
+
opts.on( nil, '--remote-url URL', "Remote url. The current remote url is used by default." ) do |val|
|
|
421
|
+
options[:remote_url] = val
|
|
422
|
+
end
|
|
423
|
+
opts.on( '-T', '--token TOKEN', "Access token for authentication with --remote. Saved credentials are used by default." ) do |val|
|
|
424
|
+
options[:remote_token] = val
|
|
425
|
+
end unless excludes.include?(:remote_token)
|
|
426
|
+
opts.on( '-U', '--username USERNAME', "Username for authentication." ) do |val|
|
|
427
|
+
options[:remote_username] = val
|
|
428
|
+
end unless excludes.include?(:remote_username)
|
|
429
|
+
opts.on( '-P', '--password PASSWORD', "Password for authentication." ) do |val|
|
|
430
|
+
options[:remote_password] = val
|
|
431
|
+
end unless excludes.include?(:remote_password)
|
|
409
432
|
|
|
410
433
|
# todo: also require this for talking to plain old HTTP
|
|
411
434
|
opts.on('-I','--insecure', "Allow insecure HTTPS communication. i.e. bad SSL certificate.") do |val|
|
|
412
435
|
options[:insecure] = true
|
|
413
436
|
Morpheus::RestClient.enable_ssl_verification = false
|
|
414
437
|
end
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
options[:remote_username] = remote
|
|
438
|
+
|
|
439
|
+
#when :header, :headers
|
|
440
|
+
opts.on( '-H', '--header HEADER', "Additional HTTP header to include with requests." ) do |val|
|
|
441
|
+
options[:headers] ||= {}
|
|
442
|
+
# header_list = val.to_s.split(',')
|
|
443
|
+
header_list = [val.to_s]
|
|
444
|
+
header_list.each do |h|
|
|
445
|
+
header_parts = val.to_s.split(":")
|
|
446
|
+
header_key, header_value = header_parts[0], header_parts[1..-1].join(":")
|
|
447
|
+
if header_parts.size() < 2
|
|
448
|
+
header_parts = val.to_s.split("=")
|
|
449
|
+
header_key, header_value = header_parts[0], header_parts[1..-1].join("=")
|
|
450
|
+
end
|
|
451
|
+
if header_parts.size() < 2
|
|
452
|
+
raise_command_error "Invalid HEADER value '#{val}'. HEADER should contain a key and a value. eg. -H 'X-Morpheus-Lease: $MORPHEUS_LEASE_TOKEN'"
|
|
453
|
+
end
|
|
454
|
+
options[:headers][header_key] = header_value
|
|
455
|
+
end
|
|
434
456
|
end
|
|
457
|
+
# opts.add_hidden_option('-H') if opts.is_a?(Morpheus::Cli::OptionParser)
|
|
458
|
+
# opts.add_hidden_option('--header') if opts.is_a?(Morpheus::Cli::OptionParser)
|
|
459
|
+
opts.add_hidden_option('--headers') if opts.is_a?(Morpheus::Cli::OptionParser)
|
|
435
460
|
|
|
436
|
-
|
|
437
|
-
|
|
461
|
+
#when :timeout
|
|
462
|
+
opts.on( '--timeout SECONDS', "Timeout for api requests. Default is typically 30 seconds." ) do |val|
|
|
463
|
+
options[:timeout] = val ? val.to_f : nil
|
|
438
464
|
end
|
|
465
|
+
# opts.add_hidden_option('--timeout') if opts.is_a?(Morpheus::Cli::OptionParser)
|
|
439
466
|
|
|
440
|
-
opts.on( '-T', '--token ACCESS_TOKEN', "Access Token" ) do |remote|
|
|
441
|
-
options[:remote_token] = remote
|
|
442
|
-
end
|
|
443
|
-
|
|
444
467
|
when :auto_confirm
|
|
445
468
|
opts.on( '-y', '--yes', "Auto Confirm" ) do
|
|
446
469
|
options[:yes] = true
|
|
@@ -512,6 +535,11 @@ module Morpheus
|
|
|
512
535
|
options[:include_fields] = val
|
|
513
536
|
end
|
|
514
537
|
|
|
538
|
+
when :thin
|
|
539
|
+
opts.on( '--thin', '--thin', "Format headers and columns with thin borders." ) do |val|
|
|
540
|
+
options[:border_style] = :thin
|
|
541
|
+
end
|
|
542
|
+
|
|
515
543
|
when :outfile
|
|
516
544
|
opts.on('--out FILE', String, "Write standard output to a file instead of the terminal.") do |val|
|
|
517
545
|
# could validate directory is writable..
|
|
@@ -520,9 +548,31 @@ module Morpheus
|
|
|
520
548
|
|
|
521
549
|
when :dry_run
|
|
522
550
|
opts.on('-d','--dry-run', "Dry Run, print the API request instead of executing it") do
|
|
551
|
+
# todo: this should print after parsing obv..
|
|
552
|
+
# need a hook after parse! or a standard_handle(options) { ... } paradigm
|
|
553
|
+
# either that or hook it up in every command somehow, maybe a hook on connect()
|
|
554
|
+
#puts "#{cyan}#{dark} #=> DRY RUN#{reset}"
|
|
555
|
+
# don't print this for --json combined with -d
|
|
556
|
+
# print once and dont munge json
|
|
557
|
+
if !options[:curl] && !options[:json]
|
|
558
|
+
puts "#{cyan}#{bold}#{dark}DRY RUN#{reset}"
|
|
559
|
+
end
|
|
523
560
|
options[:dry_run] = true
|
|
524
561
|
end
|
|
525
|
-
|
|
562
|
+
opts.on(nil,'--curl', "Dry Run to output API request as a curl command.") do
|
|
563
|
+
# print once and dont munge json
|
|
564
|
+
if !options[:dry_run] && !options[:json]
|
|
565
|
+
puts "#{cyan}#{bold}#{dark}DRY RUN#{reset}"
|
|
566
|
+
end
|
|
567
|
+
options[:dry_run] = true
|
|
568
|
+
options[:curl] = true
|
|
569
|
+
end
|
|
570
|
+
# hide until fully supported
|
|
571
|
+
opts.add_hidden_option('--curl') if opts.is_a?(Morpheus::Cli::OptionParser)
|
|
572
|
+
opts.on(nil,'--scrub', "Mask secrets in output, such as the Authorization header. For use with --curl") do
|
|
573
|
+
options[:scrub] = true
|
|
574
|
+
end
|
|
575
|
+
opts.add_hidden_option('--scrub') if opts.is_a?(Morpheus::Cli::OptionParser)
|
|
526
576
|
when :quiet
|
|
527
577
|
opts.on('-q','--quiet', "No Output, do not print to stdout") do
|
|
528
578
|
options[:quiet] = true
|
|
@@ -535,11 +585,32 @@ module Morpheus
|
|
|
535
585
|
|
|
536
586
|
# options that are always included
|
|
537
587
|
|
|
588
|
+
# always support thin, but hidden because mostly not hooked up at the moment...
|
|
589
|
+
unless includes.include?(:thin)
|
|
590
|
+
opts.on( '--thin', '--thin', "Format headers and columns with thin borders." ) do |val|
|
|
591
|
+
options[:border_style] = :thin
|
|
592
|
+
end
|
|
593
|
+
opts.add_hidden_option('--thin') if opts.is_a?(Morpheus::Cli::OptionParser)
|
|
594
|
+
end
|
|
595
|
+
|
|
538
596
|
# disable ANSI coloring
|
|
539
597
|
opts.on('-C','--nocolor', "Disable ANSI coloring") do
|
|
540
598
|
Term::ANSIColor::coloring = false
|
|
541
599
|
end
|
|
542
600
|
|
|
601
|
+
|
|
602
|
+
# Benchmark this command?
|
|
603
|
+
opts.on('-B','--benchmark', "Print benchmark time after the command is finished.") do
|
|
604
|
+
options[:benchmark] = true
|
|
605
|
+
# this is hacky, but working!
|
|
606
|
+
# shell handles returning to false
|
|
607
|
+
#Morpheus::Benchmarking.enabled = true
|
|
608
|
+
#my_terminal.benchmarking = true
|
|
609
|
+
#start_benchmark(args.join(' '))
|
|
610
|
+
# ok it happens outside of handle() alltogether..
|
|
611
|
+
# wow, simplify me plz
|
|
612
|
+
end
|
|
613
|
+
|
|
543
614
|
opts.on('-V','--debug', "Print extra output for debugging.") do
|
|
544
615
|
options[:debug] = true
|
|
545
616
|
Morpheus::Logging.set_log_level(Morpheus::Logging::Logger::DEBUG)
|
|
@@ -553,9 +624,9 @@ module Morpheus
|
|
|
553
624
|
# end
|
|
554
625
|
end
|
|
555
626
|
|
|
556
|
-
opts.on('-h', '--help', "
|
|
627
|
+
opts.on('-h', '--help', "Print this help" ) do
|
|
557
628
|
puts opts
|
|
558
|
-
exit
|
|
629
|
+
exit # return 0 maybe?
|
|
559
630
|
end
|
|
560
631
|
|
|
561
632
|
opts
|
|
@@ -646,7 +717,7 @@ module Morpheus
|
|
|
646
717
|
cmd_method = subcommands[subcommand_name]
|
|
647
718
|
if !cmd_method
|
|
648
719
|
print_error Morpheus::Terminal.angry_prompt
|
|
649
|
-
puts_error "'#{subcommand_name}' is not
|
|
720
|
+
puts_error "'#{subcommand_name}' is not recognized. See '#{my_help_command}'"
|
|
650
721
|
return 127
|
|
651
722
|
end
|
|
652
723
|
self.send(cmd_method, args[1..-1])
|
|
@@ -733,26 +804,32 @@ module Morpheus
|
|
|
733
804
|
Morpheus::Logging::DarkPrinter.puts "establishing connection to [#{@appliance_name}] #{@appliance_url}" if options[:debug]
|
|
734
805
|
#puts "#{dark} #=> establishing connection to [#{@appliance_name}] #{@appliance_url}#{reset}\n" if options[:debug]
|
|
735
806
|
|
|
736
|
-
|
|
737
|
-
# punt.. and just allow passing an access token instead for now..
|
|
738
|
-
# this skips saving to the appliances file and all that..
|
|
739
|
-
if options[:token]
|
|
740
|
-
@access_token = options[:token]
|
|
741
|
-
end
|
|
742
807
|
|
|
743
808
|
# ok, get some credentials.
|
|
744
809
|
# this prompts for username, password without options[:no_prompt]
|
|
745
|
-
#
|
|
746
|
-
|
|
810
|
+
# uses saved credentials by default.
|
|
811
|
+
# passing --remote-url or --token or --username will skip loading saved credentials and trigger prompting
|
|
747
812
|
if options[:remote_token]
|
|
748
813
|
@access_token = options[:remote_token]
|
|
749
814
|
else
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
815
|
+
credentials = Morpheus::Cli::Credentials.new(@appliance_name, @appliance_url)
|
|
816
|
+
# @wallet = credentials.load_saved_credentials()
|
|
817
|
+
# @wallet = credentials.request_credentials(options)
|
|
818
|
+
if options[:remote_token]
|
|
819
|
+
@wallet = credentials.request_credentials(options, false)
|
|
820
|
+
elsif options[:remote_url] || options[:remote_username]
|
|
821
|
+
@wallet = credentials.request_credentials(options, false)
|
|
822
|
+
else
|
|
823
|
+
#@wallet = credentials.request_credentials(options)
|
|
824
|
+
@wallet = credentials.load_saved_credentials()
|
|
755
825
|
end
|
|
826
|
+
@access_token = @wallet ? @wallet['access_token'] : nil
|
|
827
|
+
# if @access_token.to_s.empty?
|
|
828
|
+
# unless options[:no_prompt]
|
|
829
|
+
# @wallet = credentials.request_credentials(options)
|
|
830
|
+
# @access_token = @wallet ? @wallet['access_token'] : nil
|
|
831
|
+
# end
|
|
832
|
+
# end
|
|
756
833
|
# bail if we got nothing still
|
|
757
834
|
unless options[:skip_verify_access_token]
|
|
758
835
|
verify_access_token!
|
|
@@ -854,8 +931,44 @@ module Morpheus
|
|
|
854
931
|
return output
|
|
855
932
|
end
|
|
856
933
|
|
|
934
|
+
def parse_command_result(cmd_result)
|
|
935
|
+
self.class.parse_command_result(cmd_result)
|
|
936
|
+
end
|
|
937
|
+
|
|
857
938
|
module ClassMethods
|
|
858
939
|
|
|
940
|
+
# Parse exit_code and err from a command result (object of some type)
|
|
941
|
+
# returns [exit_code, err]
|
|
942
|
+
def parse_command_result(cmd_result)
|
|
943
|
+
exit_code, err = nil, nil
|
|
944
|
+
if cmd_result.is_a?(Array)
|
|
945
|
+
exit_code, err = cmd_result[0], cmd_result[1]
|
|
946
|
+
elsif cmd_result.is_a?(Hash)
|
|
947
|
+
exit_code, err = cmd_result[:exit_code], (cmd_result[:error] || cmd_result[:err])
|
|
948
|
+
end
|
|
949
|
+
if cmd_result == nil || cmd_result == true
|
|
950
|
+
exit_code = 0
|
|
951
|
+
elsif cmd_result == false
|
|
952
|
+
exit_code = 1
|
|
953
|
+
elsif cmd_result.is_a?(Integer)
|
|
954
|
+
exit_code = cmd_result
|
|
955
|
+
elsif cmd_result.is_a?(Float)
|
|
956
|
+
exit_code = cmd_result.to_i
|
|
957
|
+
elsif cmd_result.is_a?(String)
|
|
958
|
+
exit_code = cmd_result.to_i
|
|
959
|
+
else
|
|
960
|
+
if cmd_result.respond_to?(:to_i)
|
|
961
|
+
exit_code = cmd_result.to_i
|
|
962
|
+
else
|
|
963
|
+
# happens for aliases right now.. and execution flow probably, need to handle Array
|
|
964
|
+
# uncomment to track them down, proceed with exit 0 for now
|
|
965
|
+
#Morpheus::Logging::DarkPrinter.puts "debug: command #{command_name} produced an unexpected result: (#{cmd_result.class}) #{cmd_result}" if Morpheus::Logging.debug?
|
|
966
|
+
exit_code = 0
|
|
967
|
+
end
|
|
968
|
+
end
|
|
969
|
+
return exit_code, err
|
|
970
|
+
end
|
|
971
|
+
|
|
859
972
|
def set_command_name(cmd_name)
|
|
860
973
|
@command_name = cmd_name
|
|
861
974
|
Morpheus::Cli::CliRegistry.add(self, self.command_name)
|
|
@@ -880,6 +993,17 @@ module Morpheus
|
|
|
880
993
|
!!@hidden_command
|
|
881
994
|
end
|
|
882
995
|
|
|
996
|
+
def command_description
|
|
997
|
+
@command_description
|
|
998
|
+
end
|
|
999
|
+
|
|
1000
|
+
def set_command_description(val)
|
|
1001
|
+
@command_description = val
|
|
1002
|
+
end
|
|
1003
|
+
|
|
1004
|
+
# alias :command_name= :set_command_name
|
|
1005
|
+
# alias :command_description= :set_command_description
|
|
1006
|
+
|
|
883
1007
|
# construct map of command name => instance method
|
|
884
1008
|
def register_subcommands(*cmds)
|
|
885
1009
|
@subcommands ||= {}
|
data/lib/morpheus/cli/clouds.rb
CHANGED
|
@@ -60,10 +60,10 @@ class Morpheus::Cli::Clouds
|
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
params.merge!(parse_list_options(options))
|
|
63
|
-
|
|
63
|
+
@clouds_interface.setopts(options)
|
|
64
64
|
if options[:dry_run]
|
|
65
65
|
print_dry_run @clouds_interface.dry.get(params)
|
|
66
|
-
return
|
|
66
|
+
return 0
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
json_response = @clouds_interface.get(params)
|
|
@@ -113,6 +113,7 @@ class Morpheus::Cli::Clouds
|
|
|
113
113
|
begin
|
|
114
114
|
params = {}
|
|
115
115
|
params.merge!(parse_list_options(options))
|
|
116
|
+
@clouds_interface.setopts(options)
|
|
116
117
|
if options[:dry_run]
|
|
117
118
|
print_dry_run @clouds_interface.dry.get(params)
|
|
118
119
|
return
|
|
@@ -153,6 +154,7 @@ class Morpheus::Cli::Clouds
|
|
|
153
154
|
def _get(arg, options={})
|
|
154
155
|
begin
|
|
155
156
|
if options[:dry_run]
|
|
157
|
+
@clouds_interface.setopts(options)
|
|
156
158
|
if arg.to_s =~ /\A\d{1,}\Z/
|
|
157
159
|
print_dry_run @clouds_interface.dry.get(arg.to_i)
|
|
158
160
|
else
|
|
@@ -166,6 +168,7 @@ class Morpheus::Cli::Clouds
|
|
|
166
168
|
# print_dry_run @clouds_interface.dry.get(cloud['id'])
|
|
167
169
|
# return
|
|
168
170
|
# end
|
|
171
|
+
@clouds_interface.setopts(options)
|
|
169
172
|
json_response = @clouds_interface.get(cloud['id'])
|
|
170
173
|
cloud = json_response['zone']
|
|
171
174
|
cloud_stats = cloud['stats']
|
|
@@ -323,6 +326,7 @@ class Morpheus::Cli::Clouds
|
|
|
323
326
|
cloud_payload.deep_merge!(params)
|
|
324
327
|
payload = {zone: cloud_payload}
|
|
325
328
|
end
|
|
329
|
+
@clouds_interface.setopts(options)
|
|
326
330
|
if options[:dry_run]
|
|
327
331
|
print_dry_run @clouds_interface.dry.create(payload)
|
|
328
332
|
return
|
|
@@ -377,7 +381,7 @@ class Morpheus::Cli::Clouds
|
|
|
377
381
|
end
|
|
378
382
|
else
|
|
379
383
|
cloud_type = cloud_type_for_id(cloud['zoneTypeId'])
|
|
380
|
-
cloud_payload = {
|
|
384
|
+
cloud_payload = {}
|
|
381
385
|
all_option_types = update_cloud_option_types(cloud_type)
|
|
382
386
|
#params = Morpheus::Cli::OptionTypes.prompt(all_option_types, options[:options], @api_client, {zoneTypeId: cloud_type['id']})
|
|
383
387
|
params = options[:options] || {}
|
|
@@ -393,7 +397,7 @@ class Morpheus::Cli::Clouds
|
|
|
393
397
|
cloud_payload.merge!(params)
|
|
394
398
|
payload = {zone: cloud_payload}
|
|
395
399
|
end
|
|
396
|
-
|
|
400
|
+
@clouds_interface.setopts(options)
|
|
397
401
|
if options[:dry_run]
|
|
398
402
|
print_dry_run @clouds_interface.dry.update(cloud['id'], payload)
|
|
399
403
|
return
|
|
@@ -433,6 +437,7 @@ class Morpheus::Cli::Clouds
|
|
|
433
437
|
unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the cloud #{cloud['name']}?")
|
|
434
438
|
exit
|
|
435
439
|
end
|
|
440
|
+
@clouds_interface.setopts(options)
|
|
436
441
|
json_response = @clouds_interface.destroy(cloud['id'], query_params)
|
|
437
442
|
if options[:json]
|
|
438
443
|
print JSON.pretty_generate(json_response)
|
|
@@ -462,6 +467,7 @@ class Morpheus::Cli::Clouds
|
|
|
462
467
|
connect(options)
|
|
463
468
|
begin
|
|
464
469
|
cloud = find_cloud_by_name_or_id(args[0])
|
|
470
|
+
@clouds_interface.setopts(options)
|
|
465
471
|
if options[:dry_run]
|
|
466
472
|
print_dry_run @clouds_interface.dry.firewall_disable(cloud['id'])
|
|
467
473
|
return
|
|
@@ -494,6 +500,7 @@ class Morpheus::Cli::Clouds
|
|
|
494
500
|
connect(options)
|
|
495
501
|
begin
|
|
496
502
|
cloud = find_cloud_by_name_or_id(args[0])
|
|
503
|
+
@clouds_interface.setopts(options)
|
|
497
504
|
if options[:dry_run]
|
|
498
505
|
print_dry_run @clouds_interface.dry.firewall_enable(cloud['id'])
|
|
499
506
|
return
|
|
@@ -527,6 +534,7 @@ class Morpheus::Cli::Clouds
|
|
|
527
534
|
begin
|
|
528
535
|
cloud = find_cloud_by_name_or_id(args[0])
|
|
529
536
|
zone_id = cloud['id']
|
|
537
|
+
@clouds_interface.setopts(options)
|
|
530
538
|
if options[:dry_run]
|
|
531
539
|
print_dry_run @clouds_interface.dry.security_groups(zone_id)
|
|
532
540
|
return
|
|
@@ -580,6 +588,7 @@ class Morpheus::Cli::Clouds
|
|
|
580
588
|
connect(options)
|
|
581
589
|
begin
|
|
582
590
|
cloud = find_cloud_by_name_or_id(args[0])
|
|
591
|
+
@clouds_interface.setopts(options)
|
|
583
592
|
if options[:dry_run]
|
|
584
593
|
print_dry_run @clouds_interface.dry.apply_security_groups(cloud['id'])
|
|
585
594
|
return
|
|
@@ -607,9 +616,10 @@ class Morpheus::Cli::Clouds
|
|
|
607
616
|
optparse.parse!(args)
|
|
608
617
|
connect(options)
|
|
609
618
|
begin
|
|
619
|
+
@clouds_interface.setopts(options)
|
|
610
620
|
if options[:dry_run]
|
|
611
621
|
print_dry_run @clouds_interface.dry.cloud_types({})
|
|
612
|
-
return
|
|
622
|
+
return 0
|
|
613
623
|
end
|
|
614
624
|
cloud_types = get_available_cloud_types() # @clouds_interface.dry.cloud_types({})['zoneTypes']
|
|
615
625
|
if options[:json]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# A standard error to raise in your CliCommand classes.
|
|
2
2
|
class Morpheus::Cli::CommandError < StandardError
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
attr_reader :args, :exit_code
|
|
5
5
|
|
|
6
6
|
# def initialize(msg, args=[], options={})
|
|
7
7
|
# @args = args
|
|
@@ -9,4 +9,10 @@ class Morpheus::Cli::CommandError < StandardError
|
|
|
9
9
|
# super(msg)
|
|
10
10
|
# end
|
|
11
11
|
|
|
12
|
+
def initialize(msg, args=[], exit_code=nil)
|
|
13
|
+
@args = args
|
|
14
|
+
@exit_code = exit_code
|
|
15
|
+
super(msg)
|
|
16
|
+
end
|
|
17
|
+
|
|
12
18
|
end
|