class Hiera::Backend::Fragment_backend

Constants

SUPPORTED_EXTENSIONS

Public Class Methods

new() click to toggle source
# File lib/hiera/backend/fragment_backend.rb, line 23
def initialize
  Fragment_backend::debug 'Hiera fragment backend starting'
end
process_files() click to toggle source
# File lib/hiera/backend/fragment_backend.rb, line 40
def self.process_files
  conf = Config[:fragment]
  data_dir = conf[:datadir]
  # restrict to yaml extensions only

  if conf[:extensions] and not conf[:extensions].to_set.subset? SUPPORTED_EXTENSIONS.to_set
    raise "Unsupported extensions #{conf[:extensions]}. Only #{SUPPORTED_EXTENSIONS} are supported"
  end

  extensions = [conf[:extensions] || SUPPORTED_EXTENSIONS].flatten.join(',')

  fragments = [conf[:fragments]].flatten.map do |fragment|
    path_join_glob(data_dir, "#{fragment}.{#{extensions}}")
  end.flatten.select do |file|
    File.file? file
  end

  if fragments.empty?
    warn "No fragments found in #{data_dir}"
  end

  dest_dir = conf[:destdir] || Config[:yaml][:datadir]

  input_dirs = [conf[:inputdirs]].flatten.map { |file| Pathname.new(file).realpath.to_s }

  debug "Cleaning output dir: #{dest_dir}"
  FileUtils.rm_rf dest_dir
  FileUtils.mkdir_p dest_dir

  glob_pattern = "**/*.{#{extensions}}"
  debug "Using fragments #{fragments.join(',')}"
  merge_input(fragments, glob_pattern, input_dirs) do |yaml_file, input_dir, yaml|
    output_file = Pathname.new(yaml_file).realpath.to_s.sub(input_dir, dest_dir)
    debug "Writing to #{output_file}"

    FileUtils.mkdir_p File.dirname(output_file)
    File.open(output_file, 'w+') { |file| YAML.dump(yaml, file) }
  end
end

Private Class Methods

debug(message) click to toggle source
# File lib/hiera/backend/fragment_backend.rb, line 82
def self.debug(message)
  Hiera.debug("[fragment_backend]: #{message}")
end
merge_files(base, overrides = []) click to toggle source
# File lib/hiera/backend/fragment_backend.rb, line 120
def self.merge_files(base, overrides = [])
  result = YAML.load_file(base)
  if result.nil? or not result.is_a?(Hash)
    return
  end
  keys = result.keys.to_set
  [overrides].flatten.select {|file| File.readable? file}.each do |override_file|
    override = YAML.load_file(override_file)
    replace_values result, override
  end
  result
end
merge_input(fragments, glob_pattern, input_dirs, &f) click to toggle source
# File lib/hiera/backend/fragment_backend.rb, line 94
def self.merge_input(fragments, glob_pattern, input_dirs, &f)
  input_dirs.each do |input_dir|
    debug "Searching for files in #{input_dir} using pattern #{glob_pattern}"
    path_join_glob(input_dir, glob_pattern).each do |yaml_file|
      debug "Processing #{yaml_file}"

      yaml = merge_files(yaml_file, fragments)
      f.call(yaml_file, input_dir, yaml)
    end
  end
end
path_join_glob(dir, file_pattern) click to toggle source
# File lib/hiera/backend/fragment_backend.rb, line 90
def self.path_join_glob(dir, file_pattern)
  Dir.glob(File.join(dir, file_pattern))
end
replace_values(target, source) click to toggle source
# File lib/hiera/backend/fragment_backend.rb, line 106
def self.replace_values(target, source)
  if source.nil? or target.nil? or not source.is_a?(Hash) or not target.is_a?(Hash)
    return
  end
  keys = source.keys.to_set
  target.select {|key,value| keys.include? key}.each do |key, val|
    if val.is_a?(Hash) and not val.empty?
      replace_values val, source[key]
    else
      target[key] = source[key]
    end
  end
end
warn(message) click to toggle source
# File lib/hiera/backend/fragment_backend.rb, line 86
def self.warn(message)
  Hiera.warn("[fragment_backend]: #{message}")
end

Public Instance Methods

lookup(key, scope, order_override, resolution_type) click to toggle source
# File lib/hiera/backend/fragment_backend.rb, line 27
def lookup(key, scope, order_override, resolution_type)
  answer = nil
  case resolution_type
    when :array
      answer = []
    when :hash
      answer = {}
    end
  answer
end