kontena-cli 1.3.0.pre1 → 1.3.0.pre2

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.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/bin/kontena +2 -1
  4. data/lib/kontena/callback.rb +1 -1
  5. data/lib/kontena/callbacks/auth/01_list_and_select_grid_after_master_auth.rb +1 -2
  6. data/lib/kontena/callbacks/master/01_clear_current_master_after_terminate.rb +2 -3
  7. data/lib/kontena/callbacks/master/deploy/01_show_logo_before_deploy.rb +1 -2
  8. data/lib/kontena/callbacks/master/deploy/05_before_deploy_configuration_wizard.rb +2 -2
  9. data/lib/kontena/callbacks/master/deploy/40_install_ssl_certificate_after_deploy.rb +2 -2
  10. data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +9 -9
  11. data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +2 -2
  12. data/lib/kontena/callbacks/master/deploy/56_set_server_provider_after_deploy.rb +1 -2
  13. data/lib/kontena/callbacks/master/deploy/60_configure_auth_provider_after_deploy.rb +1 -2
  14. data/lib/kontena/callbacks/master/deploy/70_invite_self_after_deploy.rb +2 -3
  15. data/lib/kontena/callbacks/master/deploy/90_proptip_after_deploy.rb +2 -2
  16. data/lib/kontena/cli/apps/common.rb +0 -1
  17. data/lib/kontena/cli/apps/init_command.rb +2 -0
  18. data/lib/kontena/cli/apps/kontena_yml_generator.rb +2 -1
  19. data/lib/kontena/cli/apps/list_command.rb +10 -2
  20. data/lib/kontena/cli/apps/yaml/reader.rb +2 -1
  21. data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -1
  22. data/lib/kontena/cli/cloud/login_command.rb +51 -7
  23. data/lib/kontena/cli/cloud/master/list_command.rb +14 -11
  24. data/lib/kontena/cli/common.rb +36 -83
  25. data/lib/kontena/cli/config.rb +46 -29
  26. data/lib/kontena/cli/containers/list_command.rb +30 -41
  27. data/lib/kontena/cli/etcd/list_command.rb +12 -7
  28. data/lib/kontena/cli/external_registries/list_command.rb +14 -8
  29. data/lib/kontena/cli/grids/list_command.rb +18 -10
  30. data/lib/kontena/cli/grids/trusted_subnets/list_command.rb +7 -5
  31. data/lib/kontena/cli/grids/users/list_command.rb +9 -7
  32. data/lib/kontena/cli/localhost_web_server.rb +3 -3
  33. data/lib/kontena/cli/log_formatters/compact.rb +65 -0
  34. data/lib/kontena/cli/log_formatters/strip_color.rb +13 -0
  35. data/lib/kontena/cli/master/config/import_command.rb +2 -1
  36. data/lib/kontena/cli/master/config/set_command.rb +1 -1
  37. data/lib/kontena/cli/master/list_command.rb +16 -10
  38. data/lib/kontena/cli/master/token/list_command.rb +23 -12
  39. data/lib/kontena/cli/master/user/invite_command.rb +1 -1
  40. data/lib/kontena/cli/master/user/list_command.rb +17 -6
  41. data/lib/kontena/cli/nodes/labels/list_command.rb +3 -0
  42. data/lib/kontena/cli/nodes/list_command.rb +58 -37
  43. data/lib/kontena/cli/nodes/show_command.rb +1 -1
  44. data/lib/kontena/cli/plugins/install_command.rb +2 -2
  45. data/lib/kontena/cli/plugins/list_command.rb +19 -5
  46. data/lib/kontena/cli/plugins/uninstall_command.rb +1 -1
  47. data/lib/kontena/cli/services/containers_command.rb +7 -0
  48. data/lib/kontena/cli/services/envs/list_command.rb +6 -4
  49. data/lib/kontena/cli/services/list_command.rb +47 -36
  50. data/lib/kontena/cli/services/services_helper.rb +9 -16
  51. data/lib/kontena/cli/services/stats_command.rb +2 -1
  52. data/lib/kontena/cli/spinner.rb +3 -5
  53. data/lib/kontena/cli/stacks/common.rb +4 -4
  54. data/lib/kontena/cli/stacks/list_command.rb +42 -33
  55. data/lib/kontena/cli/stacks/registry/search_command.rb +6 -0
  56. data/lib/kontena/cli/stacks/registry/show_command.rb +2 -0
  57. data/lib/kontena/cli/stacks/registry_command.rb +1 -2
  58. data/lib/kontena/cli/stacks/validate_command.rb +1 -0
  59. data/lib/kontena/cli/stacks/yaml/reader.rb +3 -2
  60. data/lib/kontena/cli/stacks/yaml/service_extender.rb +0 -1
  61. data/lib/kontena/cli/stacks/yaml/validations.rb +1 -1
  62. data/lib/kontena/cli/table_generator.rb +125 -0
  63. data/lib/kontena/cli/vault/export_command.rb +7 -4
  64. data/lib/kontena/cli/vault/import_command.rb +3 -0
  65. data/lib/kontena/cli/vault/list_command.rb +23 -10
  66. data/lib/kontena/cli/volumes/create_command.rb +8 -4
  67. data/lib/kontena/cli/volumes/list_command.rb +15 -7
  68. data/lib/kontena/client.rb +44 -33
  69. data/lib/kontena/command.rb +7 -4
  70. data/lib/kontena/debug_instrumentor.rb +10 -9
  71. data/lib/kontena/main_command.rb +1 -3
  72. data/lib/kontena/plugin_manager.rb +15 -7
  73. data/lib/kontena/stacks_cache.rb +7 -7
  74. data/lib/kontena/stacks_client.rb +24 -5
  75. data/lib/kontena/util.rb +43 -15
  76. data/lib/kontena_cli.rb +71 -14
  77. data/spec/kontena/cli/cloud/login_command_spec.rb +42 -0
  78. data/spec/kontena/cli/containers/list_command_spec.rb +1 -2
  79. data/spec/kontena/cli/nodes/list_command_spec.rb +153 -126
  80. data/spec/kontena/cli/registry/create_spec.rb +22 -0
  81. data/spec/kontena/cli/services/stats_command_spec.rb +22 -0
  82. data/spec/kontena/cli/table_generator_spec.rb +118 -0
  83. data/spec/kontena/cli/version_command_spec.rb +2 -2
  84. data/spec/kontena/client_spec.rb +4 -3
  85. data/spec/support/client_helpers.rb +3 -3
  86. data/spec/support/output_helpers.rb +54 -8
  87. metadata +11 -2
@@ -6,18 +6,23 @@ module Kontena::Cli::Etcd
6
6
  include Kontena::Cli::GridOptions
7
7
  include Common
8
8
 
9
- parameter "KEY", "Etcd key"
9
+ parameter "[KEY]", "Etcd key", default: '/'
10
10
 
11
- option "--recursive", :flag, "List keys recursively", default: false
11
+ option ['-r', '--recursive'], :flag, "List keys recursively", default: false
12
+
13
+ # the command outputs id info only anyway, this is here strictly for ignoring purposes
14
+ option ['-q', '--quiet'], :flag, "Output the identifying column only", hidden: true
15
+
16
+ requires_current_master
17
+ requires_current_master_token
12
18
 
13
19
  def execute
14
- require_api_url
15
- token = require_token
16
20
  validate_key
17
21
 
18
- opts = []
19
- opts << 'recursive=true' if recursive?
20
- response = client(token).get("etcd/#{current_grid}/#{key}?#{opts.join('&')}")
22
+ response = spin_if(!quiet?, "Retrieving keys from etcd") do
23
+ client.get("etcd/#{current_grid}/#{key}#{'?recursive=true' if recursive?}")
24
+ end
25
+
21
26
  if response['children']
22
27
  children = response['children'].map{|c| c['key'] }
23
28
  puts children.join("\n")
@@ -2,16 +2,22 @@ module Kontena::Cli::ExternalRegistries
2
2
  class ListCommand < Kontena::Command
3
3
  include Kontena::Cli::Common
4
4
  include Kontena::Cli::GridOptions
5
+ include Kontena::Cli::TableGenerator::Helper
6
+
7
+ requires_current_master
8
+ requires_current_master_token
9
+ requires_current_grid
10
+
11
+ def fields
12
+ quiet? ? %(name) : %w(name username email)
13
+ end
14
+
15
+ def external_registries
16
+ client.get("grids/#{current_grid}/external_registries")['external_registries']
17
+ end
5
18
 
6
19
  def execute
7
- require_api_url
8
- require_current_grid
9
- token = require_token
10
- result = client(token).get("grids/#{current_grid}/external_registries")
11
- puts "%-30s %-20s %-30s" % ['Name', 'Username', 'Email']
12
- result['external_registries'].each { |r|
13
- puts "%-30.30s %-20.20s %-30.30s" % [r['name'], r['username'], r['email']]
14
- }
20
+ print_table(external_registries)
15
21
  end
16
22
  end
17
23
  end
@@ -3,14 +3,25 @@ require_relative 'common'
3
3
  module Kontena::Cli::Grids
4
4
  class ListCommand < Kontena::Command
5
5
  include Kontena::Cli::Common
6
+ include Kontena::Cli::TableGenerator::Helper
6
7
  include Common
7
8
 
8
9
  option ['-u', '--use'], :flag, 'Automatically use first available grid sorted by user count', hidden: true
9
10
  option ['-v', '--verbose'], :flag, 'Use a more verbose output', hidden: true
10
11
 
12
+ requires_current_master
13
+ requires_current_master_token
14
+
15
+ def fields
16
+ { name: 'name', nodes: 'node_count', services: 'service_count', users: 'user_count' }
17
+ end
18
+
11
19
  def execute
12
- require_api_url
13
- require_token
20
+ if quiet?
21
+ puts grids['grids'].map { |grid| grid['name'] }.join("\n")
22
+ exit 0
23
+ end
24
+
14
25
  vputs
15
26
 
16
27
  gridlist = []
@@ -28,16 +39,13 @@ module Kontena::Cli::Grids
28
39
  vputs "You have access to the following grids:"
29
40
  vputs
30
41
 
31
- puts '%-30.30s %-8s %-12s %-10s' % ['Name', 'Nodes', 'Services', 'Users']
32
- gridlist.each do |grid|
33
- if grid['name'] == config.current_master.grid
34
- name = "#{grid['name']} *"
35
- else
36
- name = grid['name']
37
- end
38
- puts '%-30.30s %-8s %-12s %-10s' % [name, grid['node_count'], grid['service_count'], grid['user_count']]
42
+ if current_grid
43
+ current_grid_entry = gridlist.find { |grid| grid['name'] == current_grid }
44
+ current_grid_entry['name'] += pastel.yellow(' *') if current_grid_entry
39
45
  end
40
46
 
47
+ print_table(gridlist)
48
+
41
49
  if self.use?
42
50
  vputs
43
51
  vspinner "* Selecting '#{gridlist.first['name']}' as the current grid" do
@@ -1,16 +1,18 @@
1
+ require 'kontena/cli/grids/common'
2
+
1
3
  module Kontena::Cli::Grids::TrustedSubnets
2
4
  class ListCommand < Kontena::Command
3
5
  include Kontena::Cli::Common
4
6
  include Kontena::Cli::GridOptions
7
+ include Kontena::Cli::Grids::Common
8
+
9
+ # the command outputs id info only anyway, this is here strictly for ignoring purposes
10
+ option ['-q', '--quiet'], :flag, "Output the identifying column only", hidden: true
5
11
 
6
12
  requires_current_master
7
13
 
8
14
  def execute
9
- grid = client.get("grids/#{current_grid}")
10
- trusted_subnets = grid['trusted_subnets'] || []
11
- trusted_subnets.each do |subnet|
12
- puts subnet
13
- end
15
+ Array(get_grid['trusted_subnets']).map(&method(:puts))
14
16
  end
15
17
  end
16
18
  end
@@ -4,15 +4,17 @@ module Kontena::Cli::Grids::Users
4
4
  class ListCommand < Kontena::Command
5
5
  include Kontena::Cli::Common
6
6
  include Kontena::Cli::Grids::Common
7
+ include Kontena::Cli::TableGenerator::Helper
8
+ include Kontena::Cli::GridOptions
9
+
10
+ requires_current_master
11
+
12
+ def fields
13
+ quiet? ? %w(email) : %w(email name)
14
+ end
7
15
 
8
16
  def execute
9
- require_api_url
10
- token = require_token
11
- result = client(token).get("grids/#{current_grid}/users")
12
- puts "%-40s %-40s" % ['Email', 'Name']
13
- result['users'].each { |user|
14
- puts "%-40.40s %-40.40s" % [user['email'], user['name']]
15
- }
17
+ print_table(client.get("grids/#{current_grid}/users")['users'])
16
18
  end
17
19
  end
18
20
  end
@@ -39,7 +39,7 @@ module Kontena
39
39
  #
40
40
  # @return [Hash] query_params
41
41
  def serve_one
42
- ENV["DEBUG"] && $stderr.puts("Waiting for connection on port #{port}..")
42
+ Kontena.logger.debug("LHWS") { "Waiting for connection on port #{port}.." }
43
43
  socket = server.accept
44
44
 
45
45
  content = socket.recvfrom(2048).first.split(/(?:\r)?\n/)
@@ -56,7 +56,7 @@ module Kontena
56
56
 
57
57
  body = content.join("\n")
58
58
 
59
- ENV["DEBUG"] && $stderr.puts("Got request: \"#{request.inspect}\n Headers: #{headers.inspect}\n Body: #{body}\"")
59
+ Kontena.logger.debug("LHWS") { "Got request: \"#{request.inspect}\n Headers: #{headers.inspect}\n Body: #{body}\"" }
60
60
 
61
61
  get_request = request[/GET (\/cb.+?) HTTP/, 1]
62
62
  if get_request
@@ -82,7 +82,7 @@ module Kontena
82
82
  socket.close
83
83
  server.close
84
84
  uri = URI.parse("http://localhost#{get_request}")
85
- ENV["DEBUG"] && $stderr.puts(" * Parsing params: \"#{uri.query}\"")
85
+ Kontena.logger.debug("LHWS") { " * Parsing params: \"#{uri.query}\"" }
86
86
  params = {}
87
87
  URI.decode_www_form(uri.query).each do |key, value|
88
88
  if value.to_s == ''
@@ -0,0 +1,65 @@
1
+ require 'logger'
2
+
3
+ module Kontena
4
+ module Cli
5
+ module LogFormatter
6
+ class Compact < Logger::Formatter
7
+ def self.ms_since_first
8
+ Time.now.to_f - @first_log
9
+ end
10
+
11
+ def self.ms_since_last
12
+ ((Time.now.to_f - @last_log) * 1000).to_i
13
+ ensure
14
+ @last_log = Time.now.to_f
15
+ end
16
+
17
+ def self.__init_timers__
18
+ @first_log = $KONTENA_START_TIME || Time.now.to_f
19
+ @last_log = @first_log
20
+ end
21
+
22
+ __init_timers__
23
+
24
+ DEBUG_INDICATOR = Kontena.pastel.inverse.bright_blue('DEBUG').freeze
25
+ WARN_INDICATOR = Kontena.pastel.inverse.yellow('WARN ').freeze
26
+ INFO_INDICATOR = Kontena.pastel.inverse.cyan('INFO ').freeze
27
+ ERROR_INDICATOR = Kontena.pastel.inverse.red('ERROR').freeze
28
+
29
+ def colorize_severity(severity)
30
+ case severity[0..0]
31
+ when 'D' then DEBUG_INDICATOR
32
+ when 'W' then WARN_INDICATOR
33
+ when 'I' then INFO_INDICATOR
34
+ when 'E', 'F' then ERROR_INDICATOR
35
+ else severity[0..0]
36
+ end
37
+ end
38
+
39
+ TS_FORMAT = '%4d'.freeze
40
+
41
+ def colorized_time
42
+ elapsed = self.class.ms_since_last
43
+ ts = TS_FORMAT % [elapsed]
44
+ if elapsed > 300
45
+ Kontena.pastel.red(ts)
46
+ elsif elapsed > 100
47
+ Kontena.pastel.yellow(ts)
48
+ else
49
+ ts
50
+ end
51
+ end
52
+
53
+ if ENV['DEBUG_PERF']
54
+ define_method :call do |severity, time, progname, msg|
55
+ "#{colorize_severity(severity)} #{colorized_time} #{msg2str(msg)}\n"
56
+ end
57
+ else
58
+ define_method :call do |severity, time, progname, msg|
59
+ "#{colorize_severity(severity)} #{msg2str(msg)}\n"
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,13 @@
1
+ require 'logger'
2
+
3
+ module Kontena
4
+ module Cli
5
+ module LogFormatter
6
+ class StripColor < Logger::Formatter
7
+ def msg2str(msg)
8
+ super(msg.kind_of?(String) ? msg.gsub(/\e+\[{1,2}[0-9;:?]+m/m, '') : msg)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -40,7 +40,8 @@ module Kontena::Cli::Master::Config
40
40
  require 'json'
41
41
  JSON.parse(data)
42
42
  when 'yaml', 'yml'
43
- require 'yaml'
43
+ require "safe_yaml"
44
+ SafeYAML::OPTIONS[:default_mode] = :safe
44
45
  YAML.safe_load(data)
45
46
  else
46
47
  exit_with_error "Unknown input format '#{self.format}'"
@@ -11,7 +11,7 @@ module Kontena::Cli::Master::Config
11
11
  parameter "KEY_VALUE_PAIR ...", "Key/value pair, for example server.root_url=http://example.com", required: true
12
12
 
13
13
  def execute
14
- data = Hash[*self.key_value_pair_list.flat_map{ |p| p.split('=') }]
14
+ data = self.key_value_pair_list.map{ |p| p.split('=') }.to_h
15
15
  client.patch('config', data)
16
16
  end
17
17
  end
@@ -1,18 +1,24 @@
1
1
  module Kontena::Cli::Master
2
2
  class ListCommand < Kontena::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::TableGenerator::Helper
4
5
 
5
- def execute
6
- puts '%-24s %-30s' % ['Name', 'Url']
7
- current_master = config.current_master
8
- config.servers.each do |server|
9
- if current_master && server['name'] == current_master.name
10
- name = "* #{server['name']}"
11
- else
12
- name = server['name']
13
- end
14
- puts '%-24s %-30s' % [name, server['url']]
6
+ def fields
7
+ @fields ||= quiet? ? %w(name) : %w(name url)
8
+ end
9
+
10
+ def current_master_name
11
+ @current_master_name ||= current_master.nil? ? nil : current_master.name
12
+ end
13
+
14
+ def mark_if_current(row)
15
+ unless quiet?
16
+ row.name.insert(0, pastel.yellow('* ')) if row.name == current_master_name
15
17
  end
16
18
  end
19
+
20
+ def execute
21
+ print_table(config.servers, fields, &method(:mark_if_current))
22
+ end
17
23
  end
18
24
  end
@@ -2,25 +2,36 @@ require_relative 'common'
2
2
 
3
3
  module Kontena::Cli::Master::Token
4
4
  class ListCommand < Kontena::Command
5
-
5
+ include Kontena::Util
6
6
  include Kontena::Cli::Common
7
+ include Kontena::Cli::TableGenerator::Helper
7
8
  include Common
8
9
 
9
10
  requires_current_master
10
11
  requires_current_master_token
11
12
 
13
+ def fields
14
+ return ['id'] if quiet?
15
+ { id: 'id', token_type: 'token_type', token_last4: 'access_token_last_four', expires_in: 'expires_in', scopes: 'scopes' }
16
+ end
17
+
12
18
  def execute
13
- rows = []
14
- puts "%-26s %-18s %-11s %-10s %-20s" % ["ID", "TOKEN_TYPE", "TOKEN_LAST4", "EXPIRES_IN", "SCOPES"]
15
- client.get("/oauth2/tokens")["tokens"].each do |row_data|
16
- data = token_data_to_hash(row_data)
17
- puts "%-26s %-18s %-11s %-10s %-20s" % [
18
- data[:id],
19
- data[:token_type],
20
- data[:access_token_last_four],
21
- data[:expires_in],
22
- data[:scopes]
23
- ]
19
+ data = Array(client.get("/oauth2/tokens")["tokens"])
20
+ print_table(data) do |row|
21
+ next if quiet?
22
+ row['expires_in'] = colorize(row['expires_in'].to_i)
23
+ row['token_type'] ||= row['grant_type']
24
+ end
25
+ end
26
+
27
+ def colorize(expires_in)
28
+ return expires_in.to_s unless $stdout.tty?
29
+ if expires_in.zero?
30
+ pastel.yellow('never')
31
+ elsif expires_in < 0
32
+ pastel.red(time_ago(Time.now.to_i + expires_in))
33
+ else
34
+ pastel.green(time_until(expires_in))
24
35
  end
25
36
  end
26
37
  end
@@ -42,7 +42,7 @@ module Kontena::Cli::Master::User
42
42
  raise "Failed to add role" unless Kontena.run(["master", "user", "role", "add", role, email])
43
43
  end
44
44
  rescue => ex
45
- ENV["DEBUG"] && $stderr.puts("#{ex} : #{ex.message}\n#{ex.backtrace.join("\n ")}")
45
+ logger.error(ex)
46
46
  exit_with_error "Failed to invite #{email} : #{ex.message}"
47
47
  end
48
48
  end
@@ -3,15 +3,26 @@ require_relative '../../common'
3
3
  module Kontena::Cli::Master::User
4
4
  class ListCommand < Kontena::Command
5
5
  include Kontena::Cli::Common
6
+ include Kontena::Cli::TableGenerator::Helper
7
+
8
+ requires_current_master
9
+ requires_current_master_token
10
+
11
+ def fields
12
+ quiet? ? ['id'] : { email: 'email', roles: 'role_list' }
13
+ end
6
14
 
7
15
  def execute
8
- require_api_url
9
- token = require_token
10
- response = client(token).get('users')
16
+ response = spin_if(!quiet? && $stdout.tty?, "Retrieving user list from Kontena Master") do
17
+ client.get('users')['users']
18
+ end
11
19
 
12
- response['users'].each do |user|
13
- roles = user['roles'].map{|r| r['name']}
14
- puts "#{user['email']} - #{roles.join(', ')}"
20
+ print_table(response) do |row|
21
+ if row['roles'].empty?
22
+ row['role_list'] = ''
23
+ else
24
+ row['role_list'] = row['roles'].map { |r| r['name'] }.join(',')
25
+ end
15
26
  end
16
27
  end
17
28
  end
@@ -4,6 +4,9 @@ module Kontena::Cli::Nodes::Labels
4
4
 
5
5
  parameter "NODE_ID", "Node id"
6
6
 
7
+ # the command outputs id info only anyway, this is here strictly for ignoring purposes
8
+ option ['-q', '--quiet'], :flag, "Output the identifying column only", hidden: true
9
+
7
10
  requires_current_master
8
11
  requires_current_master_token
9
12
  requires_current_grid
@@ -5,57 +5,78 @@ module Kontena::Cli::Nodes
5
5
  include Kontena::Cli::Common
6
6
  include Kontena::Cli::GridOptions
7
7
  include Kontena::Cli::Helpers::HealthHelper
8
+ include Kontena::Cli::TableGenerator::Helper
8
9
 
9
- option ["--all"], :flag, "List nodes for all grids", default: false
10
+ option ['-a', '--all'], :flag, 'List nodes for all grids', default: false
11
+
12
+ requires_current_master
13
+ requires_current_master_token
14
+ requires_current_grid
15
+
16
+ def node_name(node, grid)
17
+ return node['name'] unless all?
18
+ "#{grid['name']}/#{node['name']}"
19
+ end
20
+
21
+ def node_status(node)
22
+ node['connected'] ? pastel.green('online') : pastel.red('offline')
23
+ end
10
24
 
11
25
  def node_initial(node, grid)
12
- if node['initial_member']
13
- return "#{node['node_number']} / #{grid['initial_size']}"
14
- else
15
- return "-"
16
- end
26
+ return '-' unless node['initial_member']
27
+ "#{node['node_number']} / #{grid['initial_size']}"
17
28
  end
18
29
 
19
30
  def node_labels(node)
20
- (node['labels'] || ['-']).join(",")
21
- end
22
-
23
- def show_grid_nodes(grid, nodes, multi: false)
24
- grid_health = grid_health(grid, nodes)
25
-
26
- nodes = nodes.sort_by{|n| n['node_number'] }
27
- nodes.each do |node|
28
- puts [
29
- "%s" % health_icon(node_health(node, grid_health)),
30
- "%-70.70s" % [multi ? "#{grid['name']}/#{node['name']}" : node['name']],
31
- "%-10s" % node['agent_version'],
32
- "%-10s" % (node['connected'] ? "online" : "offline"),
33
- "%-10s" % node_initial(node, grid),
34
- "%s" % [node_labels(node)],
35
- ].join ' '
36
- end
31
+ (node['labels'] || ['-']).join(',')
37
32
  end
38
33
 
39
- def execute
40
- require_api_url
41
- require_current_grid
42
- token = require_token
34
+ def fields
35
+ return ['name'] if quiet?
36
+ {
37
+ ' ' => 'health_icon',
38
+ name: 'name',
39
+ version: 'agent_version',
40
+ status: 'status',
41
+ initial: 'initial',
42
+ labels: 'labels'
43
+ }
44
+ end
43
45
 
44
- puts "%s %-70s %-10s %-10s %-10s %-s" % [health_icon(nil), "Name", "Version", "Status", "Initial", "Labels"]
46
+ def grids
47
+ all? ? client.get("grids")['grids'] : [client.get("grids/#{current_grid}")]
48
+ end
49
+
50
+ def grid_nodes(grid_name)
51
+ client.get("grids/#{grid_name}/nodes")['nodes']
52
+ end
53
+
54
+ def node_data
55
+ grids.flat_map do |grid|
56
+ grid_nodes = []
45
57
 
46
- if all?
47
- grids = client(token).get("grids")
48
- grids['grids'].each do |grid|
49
- nodes = client(require_token).get("grids/#{grid['id']}/nodes")['nodes']
58
+ grid_nodes(grid['id']).each do |node|
59
+ node['name'] = node_name(node, grid)
60
+ grid_nodes << node
61
+ next if quiet?
62
+ node['initial'] = node_initial(node, grid)
63
+ node['status'] = node_status(node)
64
+ node['labels'] = node_labels(node)
65
+ end
50
66
 
51
- show_grid_nodes(grid, nodes, multi: true)
67
+ unless quiet?
68
+ grid_health = grid_health(grid, grid_nodes)
69
+ grid_nodes.each do |node|
70
+ node['health_icon'] = health_icon(node_health(node, grid_health))
71
+ end
52
72
  end
53
- else
54
- grid = client(token).get("grids/#{current_grid}")
55
- nodes = client(require_token).get("grids/#{current_grid}/nodes")['nodes']
56
73
 
57
- show_grid_nodes(grid, nodes)
74
+ grid_nodes.sort { |n| n['node_number'] }
58
75
  end
59
76
  end
77
+
78
+ def execute
79
+ print_table(node_data)
80
+ end
60
81
  end
61
82
  end