class Puppet::DataBinding::Jerakiaserver

Attributes

jerakia[R]
scope_cache[R]

Public Class Methods

new(*args) click to toggle source
Calls superclass method
# File lib/puppet/indirector/data_binding/jerakiaserver.rb, line 13
def initialize(*args)
  @jerakia=::Jerakia::Client.new
  @scope_cache = {}
  super
end

Public Instance Methods

find(request) click to toggle source
# File lib/puppet/indirector/data_binding/jerakiaserver.rb, line 37
def find(request)

  # 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 request.key == 'lookup_options'

  lookupdata=request.key.split(/::/)
  key=lookupdata.pop
  namespace=lookupdata.join('/')
  metadata =  request.options[:variables].to_hash.reject { |k, v| v.is_a?(Puppet::Resource) }

  # If we are on an earlier version of Puppet that doesn't have trusted facts,
  # use the fqdn fact to identify us. Puppet 4 uses trusted.
  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',
    :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)
  rescue => e
    raise Puppet::DataBinding::LookupError.new("Jerakia data lookup failed #{e.class}", e.message)
  end

  if lookup.is_a?(Hash)
    raise Puppet::DataBinding::LookupError.new("Jerakia data lookup failed", lookup['message']) unless lookup['status'] = 'ok'
    return lookup['payload']
  else
    raise Puppet::DataBinding::LookupError.new("Jerakia data lookup failed", "Expected a hash but got a #{lookup.class}")
  end
end
scope_valid?(identifier, metadata) click to toggle source
# File lib/puppet/indirector/data_binding/jerakiaserver.rb, line 31
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/puppet/indirector/data_binding/jerakiaserver.rb, line 26
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/puppet/indirector/data_binding/jerakiaserver.rb, line 19
def store_scope(identifier, uuid, scope)
  @scope_cache[identifier] = {
    :uuid => uuid,
    :scope  => scope
  }
end