1
require 'puppet/indirector/active_record'
3
class Puppet::Resource::ActiveRecord < Puppet::Indirector::ActiveRecord
5
type = request_to_type_name(request)
6
host = request.options[:host]
7
filter = request.options[:filter]
9
if filter and filter[1] =~ /^(and|or)$/i then
10
raise Puppet::Error, "Complex search on StoreConfigs resources is not supported"
13
query = build_active_record_query(type, host, filter)
14
Puppet::Rails::Resource.find(:all, query)
18
def request_to_type_name(request)
19
request.key.split('/', 2)[0] or
20
raise "No key found in the request, failing: #{request.inspect}"
23
def filter_to_active_record(filter)
24
# Don't call me if you don't have a filter, please.
25
filter.is_a?(Array) or raise ArgumentError, "active record filters must be arrays"
29
when /^(and|or)$/i then
31
first, args = filter_to_active_record a
34
second, args = filter_to_active_record b
37
return "(#{first}) #{op.upcase} (#{second})", extra
40
op = '=' if op == '==' # SQL, yayz!
43
return "title #{op} ?", [b]
46
return "puppet_tags.name #{op} ?", [b]
49
return "param_names.name = ? AND param_values.value #{op} ?", [a, b]
53
raise ArgumentError, "unknown operator #{op.inspect} in #{filter.inspect}"
57
def build_active_record_query(type, host, filter)
58
raise Puppet::DevError, "Cannot collect resources for a nil host" unless host
60
search = "(exported=? AND restype=?)"
61
arguments = [true, type]
64
sql, values = filter_to_active_record(filter)
65
search += " AND #{sql}"
69
# note: we're not eagerly including any relations here because it can
70
# create large numbers of objects that we will just throw out later. We
71
# used to eagerly include param_names/values but the way the search filter
72
# is built ruined those efforts and we were eagerly loading only the
73
# searched parameter and not the other ones.
77
query = { :joins => { :resource_tags => :puppet_tag } }
79
query = { :joins => { :param_values => :param_name } }
82
# We're going to collect objects from rails, but we don't want any
83
# objects from this host.
84
if host = Puppet::Rails::Host.find_by_name(host)
85
search += " AND (host_id != ?)"
89
query[:conditions] = [search, *arguments]