module Beaker::TaskHelper::Inventory

Public Instance Methods

add_node(node, group_name, groups) click to toggle source
# File lib/beaker-task_helper/inventory.rb, line 28
def add_node(node, group_name, groups)
  if group_name =~ %r{\A[a-z0-9_]+\Z}
    group = groups.find { |g| g['name'] == group_name }
    unless group
      group = { 'name' => group_name, target_key => [] }
      groups << group
    end
    group[target_key] << node
  else
    puts "invalid group name #{group_name} skipping"
  end
end
hosts_to_inventory() click to toggle source

This attempts to make a bolt inventory hash from beakers hosts roles should be targetable by bolt as groups

# File lib/beaker-task_helper/inventory.rb, line 25
def hosts_to_inventory
  groups = []

  def add_node(node, group_name, groups)
    if group_name =~ %r{\A[a-z0-9_]+\Z}
      group = groups.find { |g| g['name'] == group_name }
      unless group
        group = { 'name' => group_name, target_key => [] }
        groups << group
      end
      group[target_key] << node
    else
      puts "invalid group name #{group_name} skipping"
    end
  end

  nodes = hosts.map do |host|
    # Make sure nodes with IPs have unique target names
    node_name = host[:ip] ? "#{host[:ip]}?n=#{host.hostname}" : host.hostname

    if host[:platform] =~ %r{windows}
      config = { 'transport' => 'winrm',
                 'winrm' => { 'ssl' => false,
                              'user' => host[:user],
                              'password' => ENV['BEAKER_password'] } }
    else
      config = { 'transport' => 'ssh',
                 'ssh' => { 'host-key-check' => false } }
      %i[password user].each do |k|
        config['ssh'][k.to_s] = host[:ssh][k] if host[:ssh][k]
      end
      if host[:ssh][:port]
        config['ssh']['port'] = host[:ssh][:port].to_i
      end

      case host[:hypervisor]
      when 'docker'
        nil
      when 'vagrant'
        key = nil
        keys = host.connection.instance_variable_get(:@ssh).options[:keys]
        key = keys.first if keys
        config['ssh']['private-key'] = key if key
      when 'vmpooler', 'abs'
        key = nil
        keys = host[:ssh][:keys]
        key = keys.first if keys
        config['ssh']['private-key'] = key if key
      else
        raise "Can't generate inventory for platform #{host[:platform]} hypervisor #{host[:hypervisor]}"
      end
    end

    # make alias groups for each role
    host[:roles].each do |role|
      add_node(node_name, role, groups)
    end

    {
      uri_key => node_name,
      'config' => config
    }
  end

  inv = { target_key => nodes,
          'groups' => groups,
          'config' => {
            'ssh' => {
              'host-key-check' => false
            }
          } }
  inv.merge!({'version' => 2}) if inventory_version == 2
  inv
end
inventory_version() click to toggle source
# File lib/beaker-task_helper/inventory.rb, line 7
def inventory_version
  if version_is_less('1.18.0', Beaker::TaskHelper.bolt_version)
    2
  else
    1
  end
end
target_key() click to toggle source
# File lib/beaker-task_helper/inventory.rb, line 15
def target_key
  inventory_version == 2 ? 'targets' : 'nodes'
end
uri_key() click to toggle source
# File lib/beaker-task_helper/inventory.rb, line 19
def uri_key
  inventory_version == 2 ? 'uri' : 'name'
end