class Kafo::HieraConfigurer

Constants

HIERARCHY_FILENAME
HIERARCHY_NAME

Attributes

config_path[R]
data_dir[R]
logger[R]
temp_dir[R]

Public Class Methods

new(user_config_path, modules, modules_order) click to toggle source
# File lib/kafo/hiera_configurer.rb, line 11
def initialize(user_config_path, modules, modules_order)
  @user_config_path = user_config_path
  @modules = modules
  @modules_order = modules_order
  @logger = KafoConfigure.logger
end

Public Instance Methods

build_temp_dir() click to toggle source
# File lib/kafo/hiera_configurer.rb, line 89
def build_temp_dir
  @temp_dir ||= Dir.mktmpdir('kafo_hiera')
  @config_path = File.join(temp_dir, 'hiera.conf')
  @data_dir = File.join(temp_dir, 'data')
end
generate_config(config = {}) click to toggle source
# File lib/kafo/hiera_configurer.rb, line 41
def generate_config(config = {})
  config ||= {}

  config['version'] = 5

  # ensure there are defaults
  config['defaults'] ||= {}
  config['defaults']['datadir'] = determine_data_dir_path(config['defaults']['datadir'])
  config['defaults']['data_hash'] ||= 'yaml_data'

  # ensure our answers file is present and has the right settings
  config['hierarchy'] ||= []

  config['hierarchy'].each do |level|
    if level['datadir']
      level['datadir'] = determine_data_dir_path(level['datadir'])
    end
  end

  kafo_answers = config['hierarchy'].find { |level| level['name'] == HIERARCHY_NAME }
  if kafo_answers
    kafo_answers.clear
  else
    kafo_answers = {}
    config['hierarchy'].unshift(kafo_answers)
  end
  kafo_answers['name'] = HIERARCHY_NAME
  kafo_answers['path'] = HIERARCHY_FILENAME
  kafo_answers['datadir'] = data_dir
  kafo_answers['data_hash'] = 'yaml_data'

  config
end
generate_data(modules) click to toggle source
# File lib/kafo/hiera_configurer.rb, line 75
def generate_data(modules)
  classes = []
  data = modules.select(&:enabled?).inject({}) do |config, mod|
    classes << mod.class_name
    config.update(Hash[mod.params_hash.map { |k, v| ["#{mod.class_name}::#{k}", v] }])
  end
  data['classes'] = @modules_order ? sort_modules(classes, @modules_order) : classes
  data
end
sort_modules(modules, order) click to toggle source
# File lib/kafo/hiera_configurer.rb, line 85
def sort_modules(modules, order)
  (order & modules) + (modules - order)
end
write_configs() click to toggle source
# File lib/kafo/hiera_configurer.rb, line 18
def write_configs
  build_temp_dir

  if @user_config_path
    logger.debug("Merging existing Hiera config file from #{@user_config_path}")
    user_config = YAML.load(File.read(@user_config_path))
  else
    user_config = {}
  end
  logger.debug("Writing Hiera config file to #{config_path}")
  File.open(config_path, 'w') do |f|
    # merge required config changes into the user's Hiera config
    f.write(format_yaml_symbols(generate_config(user_config).to_yaml))
  end

  logger.debug("Creating Hiera data files in #{data_dir}")
  FileUtils.mkdir(data_dir)

  File.open(File.join(data_dir, HIERARCHY_FILENAME), 'w') do |f|
    f.write(format_yaml_symbols(generate_data(@modules).to_yaml))
  end
end

Private Instance Methods

determine_data_dir_path(path) click to toggle source
# File lib/kafo/hiera_configurer.rb, line 101
def determine_data_dir_path(path)
  # Relies on data_dir being absolute or having a user config
  path ||= data_dir
  Pathname.new(path).relative? ? File.join(original_hiera_directory, path) : path
end
format_yaml_symbols(data) click to toggle source
# File lib/kafo/hiera_configurer.rb, line 97
def format_yaml_symbols(data)
  data.gsub('!ruby/sym ', ':')
end
original_hiera_directory() click to toggle source
# File lib/kafo/hiera_configurer.rb, line 107
def original_hiera_directory
  @user_config_path ? File.dirname(@user_config_path) : nil
end