class Kontena::Cli::Grids::HealthCommand

Public Instance Methods

execute() click to toggle source
# File lib/kontena/cli/grids/health_command.rb, line 12
def execute
  require_api_url

  grid = get_grid(name)
  grid_nodes = client(require_token).get("grids/#{grid['name']}/nodes")

  return show_grid_health(grid, grid_nodes['nodes'])
end
show_grid_health(grid, nodes) click to toggle source

Validate grid/nodes configuration for grid operation

@return [Boolean] false if unhealthy

# File lib/kontena/cli/grids/health_command.rb, line 24
def show_grid_health(grid, nodes)
  initial_size = grid['initial_size']
  minimum_size = grid['initial_size'] / 2 + 1 # a majority is required for etcd quorum

  grid_health = grid_health(grid, nodes)
  initial_nodes = nodes.select{|node| node['initial_member']}
  online_nodes = initial_nodes.select{|node| node['connected']}

  # configuration and status
  if initial_nodes.length == 0
    puts "#{health_icon :error} Grid does not have any initial nodes, and requires at least #{minimum_size} of #{initial_size} initial nodes for operation"
  elsif online_nodes.empty?
    puts "#{health_icon :error} Grid does not have any initial nodes online, and requires at least #{minimum_size} of #{initial_size} initial nodes for operation"
  elsif initial_nodes.length < minimum_size
    puts "#{health_icon :error} Grid only has #{initial_nodes.length} initial nodes, and requires at least #{minimum_size} of #{initial_size} initial nodes for operation"
  elsif online_nodes.length < minimum_size
    puts "#{health_icon :error} Grid only has #{online_nodes.length} initial nodes online, and requires at least #{minimum_size} of #{initial_size} initial nodes for operation"
  elsif initial_nodes.length < initial_size
    puts "#{health_icon :warning} Grid only has #{initial_nodes.length} initial nodes of #{initial_size} required for high-availability"
  elsif online_nodes.length < initial_size
    puts "#{health_icon :warning} Grid only has #{online_nodes.length} initial nodes online of #{initial_size} required for high-availability"
  elsif initial_nodes.length == 2
    puts "#{health_icon :warning} Grid only has #{initial_nodes.length} initial nodes, and is not high-availability"
  elsif initial_nodes.length == 1
    puts "#{health_icon :warning} Grid only has #{initial_nodes.length} initial node, and is not high-availability"
  else
    puts "#{health_icon :ok} Grid has all #{online_nodes.length} of #{initial_size} initial nodes online"
  end

  nodes.each do |node|
    node_health = node_health(node, grid_health)

    if node['connected']

    elsif node['initial_member']
      puts "#{health_icon grid_health} Initial node #{node['name']} is offline"
    else
      puts "#{health_icon node_health} Grid node #{node['name']} is offline"
    end
  end

  # operational if we have etcd quorum
  return online_nodes.length >= minimum_size
end