class BeakerHostGenerator::Generator

Public Instance Methods

generate(layout, options) click to toggle source

Main host generation entry point, returns a Ruby map for the given host specification and optional configuration.

@param layout [String] The raw hosts specification user input.

For example `"centos9-64m-redhat7-64a"`.

@param options [Hash] Global, optional configuration such as the default

hypervisor or OS info version.

@returns [Hash] A complete Ruby map as defining the HOSTS and CONFIG

sections as required by Beaker.
# File lib/beaker-hostgenerator/generator.rb, line 22
def generate(layout, options)
  layout = prepare(layout)
  tokens = tokenize_layout(layout)
  config = {}.deeper_merge(BASE_CONFIG)
  nodeid = Hash.new(1)
  ostype = nil
  bhg_version = options[:osinfo_version] || 0

  tokens.each do |token|
    if is_ostype_token?(token, bhg_version)
      raise "Error: no nodes generated for #{ostype}" if nodeid[ostype] == 1 and !ostype.nil?

      ostype = token
      next
    end

    node_info = parse_node_info_token(token)

    # Build node host name
    platform = "#{ostype}-#{node_info['bits']}"
    host_name = "#{platform}-#{nodeid[ostype]}"

    node_info['platform'] = platform
    node_info['ostype'] = ostype
    node_info['nodeid'] = nodeid[ostype]

    host_config = base_host_config(options)

    # Delegate to the hypervisor
    hypervisor = BeakerHostGenerator::Hypervisor.create(node_info, options)
    host_config = hypervisor.generate_node(node_info, host_config, bhg_version)
    config['CONFIG'].deeper_merge!(hypervisor.global_config)

    # Merge in any arbitrary key-value host settings. Treat the 'hostname'
    # setting specially, and don't merge it in as an arbitrary setting.
    arbitrary_settings = node_info['host_settings']
    host_name = arbitrary_settings.delete('hostname') if
      arbitrary_settings.has_key?('hostname')
    host_config.merge!(arbitrary_settings)

    if PE_USE_WIN32 && ostype =~ /windows/ && node_info['bits'] == '64'
      host_config['ruby_arch'] = 'x86'
      host_config['install_32'] = true
    end

    generate_host_roles!(host_config, node_info, options)

    config['HOSTS'][host_name] = host_config
    nodeid[ostype] += 1
  end

  # Merge in global configuration settings after the hypervisor defaults
  if options[:global_config]
    decoded = prepare(options[:global_config])
    # Support for strings without '{}' was introduced, so just double
    # check here to ensure that we pass in values surrounded by '{}'.
    decoded = "{#{decoded}}" unless decoded.start_with?('{')
    global_config = settings_string_to_map(decoded)
    config['CONFIG'].deeper_merge!(global_config)
  end

  # Munge non-string scalar values into proper data types
  unstringify_values!(config)

  config
end
get_host_roles(node_info) click to toggle source
# File lib/beaker-hostgenerator/generator.rb, line 89
def get_host_roles(node_info)
  roles = []

  node_info['roles'].each_char do |c|
    roles << ROLES[c]
  end

  node_info['arbitrary_roles'].each do |role|
    roles << role
  end

  roles
end

Private Instance Methods

generate_host_roles!(host_config, node_info, options) click to toggle source
# File lib/beaker-hostgenerator/generator.rb, line 105
def generate_host_roles!(host_config, node_info, options)
  host_config['roles'] = if options[:disable_default_role]
                           []
                         else
                           ['agent']
                         end

  host_config['roles'].concat get_host_roles(node_info)
  host_config['roles'].uniq!

  unless options[:disable_role_config]
    host_config['roles'].each do |role|
      host_config.deeper_merge! get_role_config(role)
    end
  end
end
unstringify_value(value) click to toggle source

Attempts to convert numeric strings and boolean strings into proper integer and boolean types. If value is an array, it will recurse through those values. Returns the input value if it’s not a number string or boolean string. For example “123” would be converted to 123, and “true”/“false” would be converted to true/false. The only valid boolean-strings are “true” and “false”.

# File lib/beaker-hostgenerator/generator.rb, line 143
def unstringify_value(value)
  result = begin
    Integer(value)
  rescue StandardError
    value
  end
  if value == 'true'
    result = true
  elsif value == 'false'
    result = false
  elsif value.is_a?(Array)
    value.each_with_index do |v, i|
      result[i] = unstringify_value(v)
    end
  end
  result
end
unstringify_values!(config) click to toggle source

Passes over all the values of config and config and subsequent arrays to convert numbers or booleans into proper integer or boolean types.

# File lib/beaker-hostgenerator/generator.rb, line 125
def unstringify_values!(config)
  config['HOSTS'].each do |host, settings|
    settings.each do |k, v|
      config['HOSTS'][host][k] = unstringify_value(v)
    end
  end
  config['CONFIG'].each do |k, v|
    config['CONFIG'][k] = unstringify_value(v)
  end
end