morpheus-cli 3.6.38 → 4.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d6d83bc4ead195eec6c07b13e808adadbb2252faecb60ea09ef380c351a29439
4
- data.tar.gz: ac48e6230def4ee50088e8b5a9872619d806aff93efde92a0834a6613461d8b5
3
+ metadata.gz: bca59b88ea028739f7cb9d7484a2c48c23603bbd804fb72226297c976cc498e3
4
+ data.tar.gz: 843cf1f628ddc9f1c090243edccc5c43bd978c2df802be2a3fbea4a395919ff2
5
5
  SHA512:
6
- metadata.gz: fdc430523df174d81db58e7cadffa72fda83dfe97dd941b637b20469663c1e85608d4f973bf5abedc079ce1a402593c2d730b33e49e31741a074ec5e485b438a
7
- data.tar.gz: 2c623442ca4e4bfca590acec732930d9698127172c7a9d4507ae7dcf007381b0385d28588dc5f486acb530896fc324c6a2f0a5e9a9dd375890e5c279ad2810a2
6
+ metadata.gz: d4ae8a45df624e4a89d0c29cd12649e2d3c752e243aff2bb919c3542fa70ba4d144a8da403e77d050c1b41885aa254901ebe6e99a2c69753d6d826e8e49be104
7
+ data.tar.gz: c69d3d7b235e1ca9178fb583858a317b6a64ea66bba115df28a1527aa3c45b75ba0318cd42c5fcd528c920e06773fe6fc7d5a55cf086cad2e3e977e6f7ecae77
@@ -390,6 +390,10 @@ class Morpheus::APIClient
390
390
  Morpheus::NetworkPoolsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
391
391
  end
392
392
 
393
+ def network_pool_ips
394
+ Morpheus::NetworkPoolIpsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
395
+ end
396
+
393
397
  def network_services
394
398
  Morpheus::NetworkServicesInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
395
399
  end
@@ -402,6 +406,10 @@ class Morpheus::APIClient
402
406
  Morpheus::NetworkDomainsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
403
407
  end
404
408
 
409
+ def network_domain_records
410
+ Morpheus::NetworkDomainRecordsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
411
+ end
412
+
405
413
  def network_proxies
406
414
  Morpheus::NetworkProxiesInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
407
415
  end
@@ -0,0 +1,47 @@
1
+ require 'morpheus/api/api_client'
2
+
3
+ class Morpheus::NetworkDomainRecordsInterface < Morpheus::APIClient
4
+ def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
5
+ @access_token = access_token
6
+ @refresh_token = refresh_token
7
+ @base_url = base_url
8
+ @expires_at = expires_at
9
+ end
10
+
11
+ def get(domain_id, id, params={})
12
+ raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
13
+ url = "#{@base_url}/api/networks/domains/#{domain_id}/records/#{id}"
14
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
15
+ opts = {method: :get, url: url, headers: headers}
16
+ execute(opts)
17
+ end
18
+
19
+ def list(domain_id, params={})
20
+ url = "#{@base_url}/api/networks/domains/#{domain_id}/records"
21
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
22
+ opts = {method: :get, url: url, headers: headers}
23
+ execute(opts)
24
+ end
25
+
26
+ def create(domain_id, payload)
27
+ url = "#{@base_url}/api/networks/domains/#{domain_id}/records"
28
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
29
+ opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
30
+ execute(opts)
31
+ end
32
+
33
+ def update(domain_id, id, payload)
34
+ url = "#{@base_url}/api/networks/domains/#{domain_id}/records/#{id}"
35
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
36
+ opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
37
+ execute(opts)
38
+ end
39
+
40
+ def destroy(domain_id, id, params={})
41
+ url = "#{@base_url}/api/networks/domains/#{domain_id}/records/#{id}"
42
+ headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
43
+ opts = {method: :delete, url: url, headers: headers}
44
+ execute(opts)
45
+ end
46
+
47
+ end
@@ -0,0 +1,47 @@
1
+ require 'morpheus/api/api_client'
2
+
3
+ class Morpheus::NetworkPoolIpsInterface < Morpheus::APIClient
4
+ def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
5
+ @access_token = access_token
6
+ @refresh_token = refresh_token
7
+ @base_url = base_url
8
+ @expires_at = expires_at
9
+ end
10
+
11
+ def get(pool_id, id, params={})
12
+ raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
13
+ url = "#{@base_url}/api/networks/pools/#{pool_id}/ips/#{id}"
14
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
15
+ opts = {method: :get, url: url, headers: headers}
16
+ execute(opts)
17
+ end
18
+
19
+ def list(pool_id, params={})
20
+ url = "#{@base_url}/api/networks/pools/#{pool_id}/ips"
21
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
22
+ opts = {method: :get, url: url, headers: headers}
23
+ execute(opts)
24
+ end
25
+
26
+ def create(pool_id, payload)
27
+ url = "#{@base_url}/api/networks/pools/#{pool_id}/ips"
28
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
29
+ opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
30
+ execute(opts)
31
+ end
32
+
33
+ def update(pool_id, id, payload)
34
+ url = "#{@base_url}/api/networks/pools/#{pool_id}/ips/#{id}"
35
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
36
+ opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
37
+ execute(opts)
38
+ end
39
+
40
+ def destroy(pool_id, id, params={})
41
+ url = "#{@base_url}/api/networks/pools/#{pool_id}/ips/#{id}"
42
+ headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
43
+ opts = {method: :delete, url: url, headers: headers}
44
+ execute(opts)
45
+ end
46
+
47
+ end
@@ -15,14 +15,14 @@ class Morpheus::Cli::Apps
15
15
  include Morpheus::Cli::ProcessesHelper
16
16
  set_command_name :apps
17
17
  set_command_description "View and manage apps."
18
- register_subcommands :list, :count, :get, :add, :update, :remove, :add_instance, :remove_instance, :logs, :security_groups, :apply_security_groups, :history
18
+ register_subcommands :list, :count, :get, :view, :add, :update, :remove, :add_instance, :remove_instance, :logs, :security_groups, :apply_security_groups, :history
19
19
  register_subcommands :stop, :start, :restart
20
20
  register_subcommands :wiki, :update_wiki
21
21
  #register_subcommands :firewall_disable, :firewall_enable
22
22
  #register_subcommands :validate # add --validate instead
23
23
  alias_subcommand :details, :get
24
24
  set_default_subcommand :list
25
-
25
+
26
26
  def initialize()
27
27
  # @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
28
28
  end
@@ -184,8 +184,8 @@ class Morpheus::Cli::Apps
184
184
  opts.on('--validate','--validate', "Validate Only. Validates the configuration and skips creating it.") do
185
185
  options[:validate_only] = true
186
186
  end
187
- opts.on('--refresh [SECONDS]', String, "Refresh until status is running,failed. Default interval is 5 seconds.") do |val|
188
- options[:refresh_interval] = val.to_s.empty? ? 5 : val.to_f
187
+ opts.on('--refresh [SECONDS]', String, "Refresh until status is running,failed. Default interval is #{default_refresh_interval} seconds.") do |val|
188
+ options[:refresh_interval] = val.to_s.empty? ? default_refresh_interval : val.to_f
189
189
  end
190
190
  build_common_options(opts, options, [:options, :payload, :json, :yaml, :dry_run, :quiet])
191
191
  opts.footer = "Create a new app.\n" +
@@ -506,11 +506,8 @@ class Morpheus::Cli::Apps
506
506
  end
507
507
  end
508
508
  # print details
509
- if options[:refresh_interval]
510
- get([app['id'], '--refresh', options[:refresh_interval].to_s])
511
- else
512
- get([app['id']])
513
- end
509
+ get_args = [app['id']] + (options[:remote] ? ["-r",options[:remote]] : []) + (options[:refresh_interval] ? ['--refresh', options[:refresh_interval].to_s] : [])
510
+ get(get_args)
514
511
  end
515
512
  return 0
516
513
  rescue RestClient::Exception => e
@@ -551,7 +548,7 @@ class Morpheus::Cli::Apps
551
548
  options = {}
552
549
  optparse = Morpheus::Cli::OptionParser.new do |opts|
553
550
  opts.banner = subcommand_usage("[app]")
554
- opts.on('--refresh [SECONDS]', String, "Refresh until status is running,failed. Default interval is 5 seconds.") do |val|
551
+ opts.on('--refresh [SECONDS]', String, "Refresh until status is running,failed. Default interval is #{default_refresh_interval} seconds.") do |val|
555
552
  options[:refresh_until_status] ||= "running,failed"
556
553
  if !val.to_s.empty?
557
554
  options[:refresh_interval] = val.to_f
@@ -694,11 +691,11 @@ class Morpheus::Cli::Apps
694
691
  # refresh until a status is reached
695
692
  if options[:refresh_until_status]
696
693
  if options[:refresh_interval].nil? || options[:refresh_interval].to_f < 0
697
- options[:refresh_interval] = 5
694
+ options[:refresh_interval] = default_refresh_interval
698
695
  end
699
696
  statuses = options[:refresh_until_status].to_s.downcase.split(",").collect {|s| s.strip }.select {|s| !s.to_s.empty? }
700
697
  if !statuses.include?(app['status'])
701
- print cyan, "Refreshing in #{options[:refresh_interval]} seconds"
698
+ print cyan, "Refreshing in #{options[:refresh_interval] > 1 ? options[:refresh_interval].to_i : options[:refresh_interval]} seconds"
702
699
  sleep_with_dots(options[:refresh_interval])
703
700
  print "\n"
704
701
  _get(arg, options)
@@ -790,9 +787,9 @@ class Morpheus::Cli::Apps
790
787
  print "\n"
791
788
  else
792
789
  print_green_success "Updated app #{app['name']}"
793
- list([])
794
- # details_options = [payload['app']['name']]
795
- # details(details_options)
790
+ # print details
791
+ get_args = [app['id']] + (options[:remote] ? ["-r",options[:remote]] : [])
792
+ get(get_args)
796
793
  end
797
794
 
798
795
  rescue RestClient::Exception => e
@@ -1489,6 +1486,64 @@ class Morpheus::Cli::Apps
1489
1486
  end
1490
1487
  end
1491
1488
 
1489
+ def view(args)
1490
+ options = {}
1491
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
1492
+ opts.banner = subcommand_usage("[app]")
1493
+ opts.on('-w','--wiki', "Open the wiki tab for this app") do
1494
+ options[:link_tab] = "wiki"
1495
+ end
1496
+ opts.on('--tab VALUE', String, "Open a specific tab") do |val|
1497
+ options[:link_tab] = val.to_s
1498
+ end
1499
+ build_common_options(opts, options, [:dry_run, :remote])
1500
+ opts.footer = "View an app in a web browser" + "\n" +
1501
+ "[app] is required. This is the name or id of an app. Supports 1-N [app] arguments."
1502
+ end
1503
+ optparse.parse!(args)
1504
+ if args.count != 1
1505
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
1506
+ end
1507
+ connect(options)
1508
+ id_list = parse_id_list(args)
1509
+ return run_command_for_each_arg(id_list) do |arg|
1510
+ _view(arg, options)
1511
+ end
1512
+ end
1513
+
1514
+ def _view(arg, options={})
1515
+ begin
1516
+ app = find_app_by_name_or_id(arg)
1517
+ return 1 if app.nil?
1518
+
1519
+ link = "#{@appliance_url}/login/oauth-redirect?access_token=#{@access_token}\\&redirectUri=/provisioning/apps/#{app['id']}"
1520
+ if options[:link_tab]
1521
+ link << "#!#{options[:link_tab]}"
1522
+ end
1523
+
1524
+ open_command = nil
1525
+ if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
1526
+ open_command = "start #{link}"
1527
+ elsif RbConfig::CONFIG['host_os'] =~ /darwin/
1528
+ open_command = "open #{link}"
1529
+ elsif RbConfig::CONFIG['host_os'] =~ /linux|bsd/
1530
+ open_command = "xdg-open #{link}"
1531
+ end
1532
+
1533
+ if options[:dry_run]
1534
+ puts "system: #{open_command}"
1535
+ return 0
1536
+ end
1537
+
1538
+ system(open_command)
1539
+
1540
+ return 0
1541
+ rescue RestClient::Exception => e
1542
+ print_rest_exception(e, options)
1543
+ exit 1
1544
+ end
1545
+ end
1546
+
1492
1547
  def wiki(args)
1493
1548
  options = {}
1494
1549
  params = {}
@@ -556,11 +556,7 @@ module Morpheus
556
556
  options[:border_style] = :thin
557
557
  end
558
558
 
559
- when :outfile
560
- opts.on('--out FILE', String, "Write standard output to a file instead of the terminal.") do |val|
561
- # could validate directory is writable..
562
- options[:outfile] = val
563
- end
559
+
564
560
 
565
561
  when :dry_run
566
562
  opts.on('-d','--dry-run', "Dry Run, print the API request instead of executing it") do
@@ -586,7 +582,25 @@ module Morpheus
586
582
  opts.on(nil,'--scrub', "Mask secrets in output, such as the Authorization header. For use with --curl and --dry-run.") do
587
583
  options[:scrub] = true
588
584
  end
585
+ # dry run comes with hidden outfile options
589
586
  #opts.add_hidden_option('--scrub') if opts.is_a?(Morpheus::Cli::OptionParser)
587
+ opts.on('--out FILE', String, "Write standard output to a file instead of the terminal.") do |val|
588
+ # could validate directory is writable..
589
+ options[:outfile] = val
590
+ end
591
+ opts.add_hidden_option('--out') if opts.is_a?(Morpheus::Cli::OptionParser)
592
+ opts.on('--overwrite', '--overwrite', "Overwrite output file if it already exists.") do
593
+ options[:overwrite] = true
594
+ end
595
+ opts.add_hidden_option('--overwrite') if opts.is_a?(Morpheus::Cli::OptionParser)
596
+
597
+ when :outfile
598
+ opts.on('--out FILE', String, "Write standard output to a file instead of the terminal.") do |val|
599
+ options[:outfile] = val
600
+ end
601
+ opts.on('--overwrite', '--overwrite', "Overwrite output file if it already exists.") do |val|
602
+ options[:overwrite] = true
603
+ end
590
604
  when :quiet
591
605
  opts.on('-q','--quiet', "No Output, do not print to stdout") do
592
606
  options[:quiet] = true
@@ -662,6 +676,10 @@ module Morpheus
662
676
  self.class.default_subcommand
663
677
  end
664
678
 
679
+ def default_refresh_interval
680
+ self.class.default_refresh_interval
681
+ end
682
+
665
683
  def usage
666
684
  if !subcommands.empty?
667
685
  "Usage: morpheus #{command_name} [command] [options]"
@@ -909,21 +927,6 @@ module Morpheus
909
927
  return subtitles
910
928
  end
911
929
 
912
- def print_to_file(txt, filename)
913
- Morpheus::Logging::DarkPrinter.puts "Writing #{txt.to_s.bytesize} bytes to file #{filename}" if Morpheus::Logging.debug?
914
- outfile = nil
915
- begin
916
- outfile = File.open(File.expand_path(filename), 'w')
917
- outfile.print(txt)
918
- return 0
919
- rescue => ex
920
- puts_error "Error printing to outfile '#{filename}'. Error: #{ex}"
921
- return 1
922
- ensure
923
- outfile.close if outfile
924
- end
925
- end
926
-
927
930
  # basic rendering for options :json, :yaml, :csv, :fields, and :outfile
928
931
  # returns the string rendered, or nil if nothing was rendered.
929
932
  def render_with_format(json_response, options, object_key=nil)
@@ -938,7 +941,7 @@ module Morpheus
938
941
  end
939
942
  if output
940
943
  if options[:outfile]
941
- print_to_file(output, options[:outfile])
944
+ print_to_file(output, options[:outfile], options[:overwrite])
942
945
  else
943
946
  puts output
944
947
  end
@@ -967,7 +970,8 @@ module Morpheus
967
970
  def set_command_hidden(val=true)
968
971
  @hidden_command = val
969
972
  end
970
-
973
+ # alias :command_name= :set_command_name
974
+
971
975
  def hidden_command
972
976
  !!@hidden_command
973
977
  end
@@ -979,10 +983,18 @@ module Morpheus
979
983
  def set_command_description(val)
980
984
  @command_description = val
981
985
  end
982
-
983
- # alias :command_name= :set_command_name
984
986
  # alias :command_description= :set_command_description
985
987
 
988
+ def default_refresh_interval
989
+ @default_refresh_interval ||= 30
990
+ end
991
+
992
+ def set_default_refresh_interval(seconds)
993
+ @default_refresh_interval = seconds
994
+ end
995
+ #alias :default_refresh_interval= :set_default_refresh_interval
996
+
997
+
986
998
  # construct map of command name => instance method
987
999
  def register_subcommands(*cmds)
988
1000
  @subcommands ||= {}
@@ -32,7 +32,7 @@ class Morpheus::Cli::ContainersCommand
32
32
  opts.on( nil, '--actions', "Display Available Actions" ) do
33
33
  options[:include_available_actions] = true
34
34
  end
35
- opts.on('--refresh [SECONDS]', String, "Refresh until status is running,failed. Default interval is 5 seconds.") do |val|
35
+ opts.on('--refresh [SECONDS]', String, "Refresh until status is running,failed. Default interval is #{default_refresh_interval} seconds.") do |val|
36
36
  options[:refresh_until_status] ||= "running,failed"
37
37
  if !val.to_s.empty?
38
38
  options[:refresh_interval] = val.to_f
@@ -97,6 +97,7 @@ class Morpheus::Cli::ContainersCommand
97
97
  "Type" => lambda {|it| it['containerType'] ? it['containerType']['name'] : '' },
98
98
  "Plan" => lambda {|it| it['plan'] ? it['plan']['name'] : '' },
99
99
  "Instance" => lambda {|it| it['instance'] ? it['instance']['name'] : '' },
100
+ "Host" => lambda {|it| it['server'] ? it['server']['name'] : '' },
100
101
  "Cloud" => lambda {|it| it['cloud'] ? it['cloud']['name'] : '' },
101
102
  "Location" => lambda {|it| format_container_connection_string(it) },
102
103
  # "Description" => 'description',
@@ -134,12 +135,12 @@ class Morpheus::Cli::ContainersCommand
134
135
  # refresh until a status is reached
135
136
  if options[:refresh_until_status]
136
137
  if options[:refresh_interval].nil? || options[:refresh_interval].to_f < 0
137
- options[:refresh_interval] = 5
138
+ options[:refresh_interval] = default_refresh_interval
138
139
  end
139
140
  statuses = options[:refresh_until_status].to_s.downcase.split(",").collect {|s| s.strip }.select {|s| !s.to_s.empty? }
140
141
  if !statuses.include?(container['status'])
141
142
  print cyan
142
- print cyan, "Refreshing in #{options[:refresh_interval]} seconds"
143
+ print cyan, "Refreshing in #{options[:refresh_interval] > 1 ? options[:refresh_interval].to_i : options[:refresh_interval]} seconds"
143
144
  sleep_with_dots(options[:refresh_interval])
144
145
  print "\n"
145
146
  _get(arg, options)
@@ -13,6 +13,7 @@ class Morpheus::Cli::ExecutionRequestCommand
13
13
  #register_subcommands :'execute-against-lease' => :execute_against_lease
14
14
 
15
15
  # set_default_subcommand :list
16
+
16
17
 
17
18
  def initialize()
18
19
  # @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
@@ -37,7 +38,7 @@ class Morpheus::Cli::ExecutionRequestCommand
37
38
  optparse = Morpheus::Cli::OptionParser.new do |opts|
38
39
  opts.banner = subcommand_usage("[uid]")
39
40
  build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :dry_run, :remote])
40
- opts.on('--refresh [SECONDS]', String, "Refresh until execution is finished. Default interval is 5 seconds.") do |val|
41
+ opts.on('--refresh [SECONDS]', String, "Refresh until execution is finished. Default interval is #{default_refresh_interval} seconds.") do |val|
41
42
  options[:refresh_until_finished] = true
42
43
  if !val.to_s.empty?
43
44
  options[:refresh_interval] = val.to_f
@@ -78,7 +79,7 @@ class Morpheus::Cli::ExecutionRequestCommand
78
79
  # refresh until a status is reached
79
80
  if options[:refresh_until_finished]
80
81
  if options[:refresh_interval].nil? || options[:refresh_interval].to_f < 0
81
- options[:refresh_interval] = 5
82
+ options[:refresh_interval] = default_refresh_interval
82
83
  end
83
84
  if execution_request['exitCode'] || ['complete','failed','expired'].include?(execution_request['status'])
84
85
  # it is finished
@@ -13,7 +13,7 @@ class Morpheus::Cli::FileCopyRequestCommand
13
13
  #register_subcommands :'execute-against-lease' => :execute_against_lease
14
14
 
15
15
  # set_default_subcommand :list
16
-
16
+
17
17
  def initialize()
18
18
  # @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
19
19
  end
@@ -37,7 +37,7 @@ class Morpheus::Cli::FileCopyRequestCommand
37
37
  optparse = Morpheus::Cli::OptionParser.new do |opts|
38
38
  opts.banner = subcommand_usage("[uid]")
39
39
  build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :dry_run, :remote])
40
- opts.on('--refresh [SECONDS]', String, "Refresh until execution is finished. Default interval is 5 seconds.") do |val|
40
+ opts.on('--refresh [SECONDS]', String, "Refresh until execution is finished. Default interval is #{default_refresh_interval} seconds.") do |val|
41
41
  options[:refresh_until_finished] = true
42
42
  if !val.to_s.empty?
43
43
  options[:refresh_interval] = val.to_f
@@ -78,7 +78,7 @@ class Morpheus::Cli::FileCopyRequestCommand
78
78
  # refresh until a status is reached
79
79
  if options[:refresh_until_finished]
80
80
  if options[:refresh_interval].nil? || options[:refresh_interval].to_f < 0
81
- options[:refresh_interval] = 5
81
+ options[:refresh_interval] = default_refresh_interval
82
82
  end
83
83
  if ['complete','failed','expired'].include?(file_copy_request['status'])
84
84
  # it is finished