class Hiera::Backend::Jerakiaserver_backend

Public Class Methods

new() click to toggle source
# File lib/hiera/backend/jerakiaserver_backend.rb, line 9
def initialize()
  @config = Hiera::Config[:jerakia] || {}
  @jerakia = ::Jerakia::Client.new(@config)
  @scope_cache = {}
end

Public Instance Methods

lookup(key, scope, order_override, resolution_type) click to toggle source
# File lib/hiera/backend/jerakiaserver_backend.rb, line 33
def lookup(key, scope, order_override, resolution_type)

  # Jerakia doesn't do anything with lookup_options, this behaviour is achieved
  # using schemas, therefore we always return nil here for the key

  return nil if key == 'lookup_options'

  lookup_type = :first
  merge_type = :none

  case resolution_type
  when :array
    lookup_type = :cascade
    merge_type = :array
  when :hash
    lookup_type = :cascade
    merge_type = :hash
  end

  namespace = []

  if key.include?('::')
     lookup_key = key.split('::')
     key = lookup_key.pop
     namespace = lookup_key.join('/')
  end




  metadata={}
  if scope.is_a?(Hash)
    metadata=scope.reject { |k, v| v.is_a?(Puppet::Resource) }
  else
    metadata = scope.real.to_hash.reject { |k, v| v.is_a?(Puppet::Resource) }
  end


  if metadata['trusted']
    identifier = metadata['trusted']['certname']
  else
    identifier = metadata['fqdn']
  end

  send_scope(identifier, metadata) unless scope_valid?(identifier, metadata)

  lookup_options = {
    :namespace => namespace,
    :scope => 'server',
    :lookup_type => lookup_type.to_s,
    :merge  => merge_type.to_s,
    :scope_opts => {
      'identifier' => identifier,
      'realm' => 'puppet'
    }
  }

  begin
    lookup = @jerakia.lookup(key, lookup_options)
  rescue Jerakia::Client::ScopeNotFoundError => e
    send_scope(identifier, metadata)
    lookup = @jerakia.lookup(key, lookup_options)
  end

  if lookup.is_a?(Hash)
    raise Puppet::Error, "Jerakia data lookup failed #{lookup['message']}" unless lookup['status'] = 'ok'

    payload = lookup['payload']
    case resolution_type
    when :array
      return [] if payload.nil?
      return payload
    when :hash
      return {} if payload.nil?
      return payload
    else
      return payload
    end
  else
    raise Puppet::Error, "Jerakia data lookup failed Expected a hash but got a #{lookup.class}"
  end
end
scope_valid?(identifier, metadata) click to toggle source
# File lib/hiera/backend/jerakiaserver_backend.rb, line 27
 def scope_valid?(identifier, metadata)
   return false unless @scope_cache.include?(identifier)
   return false unless @scope_cache[identifier][:scope] == metadata
   return true
end
send_scope(identifier, scope) click to toggle source
# File lib/hiera/backend/jerakiaserver_backend.rb, line 22
def send_scope(identifier, scope)
  returndata = @jerakia.send_scope('puppet', identifier, scope)
  store_scope(identifier, returndata['uuid'], scope)
end
store_scope(identifier, uuid, scope) click to toggle source
# File lib/hiera/backend/jerakiaserver_backend.rb, line 15
def store_scope(identifier, uuid, scope)
  @scope_cache[identifier] = {
    :uuid => uuid,
    :scope  => scope
  }
end