class KnifeTopo::TopoBootstrap

knife topo bootstrap

Attributes

msgs[RW]
results[RW]

Public Class Methods

new(args) click to toggle source
Calls superclass method
# File lib/chef/knife/topo_bootstrap.rb, line 67
def initialize(args)
  super
  @bootstrap_args = initialize_cmd_args(args, name_args, ['bootstrap', ''])
  @results = {
    bootstrapped: [], skipped: [], skipped_ssh: [], existed: [], failed: []
  }
  @msgs = bootstrap_msgs
  @bootstrap = true

  # All called commands need to accept union of options
  Chef::Knife::Bootstrap.options = options
end

Public Instance Methods

bootstrap_msgs() click to toggle source
# File lib/chef/knife/topo_bootstrap.rb, line 54
def bootstrap_msgs
  {
    bootstrapped: 'Bootstrapped %{num} nodes [ %{list} ]',
    skipped: 'Unexpected error',
    skipped_ssh: 'Did not bootstrap %{num} nodes [ %{list} ] ' \
      'because they do not have an ssh_host',
    existed: 'Did not bootstrap %{num} nodes [ %{list} ] because '\
      "they already exist.\n"\
      "Specify --overwrite to re-bootstrap existing nodes. \n",
    failed: '%{num} nodes [ %{list} ] failed to bootstrap due to errors'
  }
end
node_bootstrap(node_data) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/chef/knife/topo_bootstrap.rb, line 104
def node_bootstrap(node_data)
  node_name = node_data['name']
  state = :skipped_ssh
  if node_data['ssh_host']
    exists = resource_exists?("nodes/#{node_name}")
    if config[:overwrite] || !exists
      success = run_bootstrap(node_data, @bootstrap_args, exists)
      state = success ? :bootstrapped : :failed
    else
      state = :existed
    end
  end
  @results[state] << node_name
  success
end
report() click to toggle source

Report is used by create, update and bootstrap commands

# File lib/chef/knife/topo_bootstrap.rb, line 122
def report
  if @topo['nodes'].empty?
    ui.info 'No nodes found'
  else
    report_msg(:bootstrapped, :info, false) if @bootstrap
    report_msg(:skipped, :info, true)
    report_msg(:skipped_ssh, :info, true)
    report_msg(:existed, :info, true)
    report_msg(:failed, :warn, true) if @bootstrap
  end
  ui.info("Topology: #{@topo.display_info}")
end
report_msg(state, level, only_non_zero = true) click to toggle source
# File lib/chef/knife/topo_bootstrap.rb, line 135
def report_msg(state, level, only_non_zero = true)
  nodes = @results[state]
  return if only_non_zero && nodes.empty?
  ui.send(level, @msgs[state] %
    { num: nodes.length, list: nodes.join(', ') })
end
run() click to toggle source
# File lib/chef/knife/topo_bootstrap.rb, line 80
def run
  validate_args

  # load and bootstrap each node that has a ssh_host
  @topo = load_topo_from_server_or_exit(@topo_name)
  @processor = KnifeTopo::Processor.for_topo(@topo)
  nodes = @processor.generate_nodes
  nodes.each do |node_data|
    node_bootstrap(node_data)
  end

  report
end
validate_args() click to toggle source
# File lib/chef/knife/topo_bootstrap.rb, line 94
def validate_args
  unless @name_args[0]
    show_usage
    ui.fatal('You must specify the name of a topology')
    exit 1
  end
  @topo_name = @name_args[0]
end