2
2
require 'puppet/rails/param_name'
3
3
require 'puppet/rails/param_value'
4
4
require 'puppet/rails/puppet_tag'
5
require 'puppet/rails/benchmark'
5
6
require 'puppet/util/rails/collection_merger'
7
8
class Puppet::Rails::Resource < ActiveRecord::Base
8
9
include Puppet::Util::CollectionMerger
9
10
include Puppet::Util::ReferenceSerializer
11
include Puppet::Rails::Benchmark
11
13
has_many :param_values, :dependent => :destroy, :class_name => "Puppet::Rails::ParamValue"
12
14
has_many :param_names, :through => :param_values, :class_name => "Puppet::Rails::ParamName"
17
19
belongs_to :source_file
27
# Determine the basic details on the resource.
28
def self.rails_resource_initial_args(resource)
29
result = [:type, :title, :line].inject({}) do |hash, param|
30
# 'type' isn't a valid column name, so we have to use another name.
31
to = (param == :type) ? :restype : param
32
if value = resource.send(param)
38
# We always want a value here, regardless of what the resource has,
39
# so we break it out separately.
40
result[:exported] = resource.exported || false
20
45
def add_resource_tag(tag)
21
pt = Puppet::Rails::PuppetTag.find_or_create_by_name(tag, :include => :puppet_tag)
22
resource_tags.create(:puppet_tag => pt)
46
pt = Puppet::Rails::PuppetTag.accumulate_by_name(tag)
47
resource_tags.build(:puppet_tag => pt)
59
# returns a hash of param_names.name => [param_values]
60
def get_params_hash(values = nil)
61
values ||= @params_hash || Puppet::Rails::ParamValue.find_all_params_from_resource(self)
65
values.inject({}) do |hash, value|
66
hash[value['name']] ||= []
67
hash[value['name']] << value
72
def get_tag_hash(tags = nil)
73
tags ||= @tags_hash || Puppet::Rails::ResourceTag.find_all_tags_from_resource(self)
74
return tags.inject({}) do |hash, tag|
75
# We have to store the tag object, not just the tag name.
76
hash[tag['name']] = tag
82
85
return super || parameter(param)
88
# Make sure this resource is equivalent to the provided Parser resource.
89
def merge_parser_resource(resource)
90
accumulate_benchmark("Individual resource merger", :attributes) { merge_attributes(resource) }
91
accumulate_benchmark("Individual resource merger", :parameters) { merge_parameters(resource) }
92
accumulate_benchmark("Individual resource merger", :tags) { merge_tags(resource) }
96
def merge_attributes(resource)
97
args = self.class.rails_resource_initial_args(resource)
98
args.each do |param, value|
99
unless resource[param] == value
104
# Handle file specially
105
if (resource.file and (!resource.file or self.file != resource.file))
106
self.file = resource.file
110
def merge_parameters(resource)
112
resource.each do |param, value|
113
catalog_params[param.to_s] = value
119
@params_hash.each do |value|
120
# First remove any parameters our catalog resource doesn't have at all.
121
deletions << value['id'] and next unless catalog_params.include?(value['name'])
123
# Now store them for later testing.
124
db_params[value['name']] ||= []
125
db_params[value['name']] << value
128
# Now get rid of any parameters whose value list is different.
129
# This might be extra work in cases where an array has added or lost
130
# a single value, but in the most common case (a single value has changed)
132
db_params.each do |name, value_hashes|
133
values = value_hashes.collect { |v| v['value'] }
135
unless value_compare(catalog_params[name], values)
136
value_hashes.each { |v| deletions << v['id'] }
140
# Perform our deletions.
141
Puppet::Rails::ParamValue.delete(deletions) unless deletions.empty?
143
# Lastly, add any new parameters.
144
catalog_params.each do |name, value|
145
next if db_params.include?(name)
146
values = value.is_a?(Array) ? value : [value]
149
param_values.build(:value => serialize_value(v), :line => resource.line, :param_name => Puppet::Rails::ParamName.accumulate_by_name(name))
154
# Make sure the tag list is correct.
155
def merge_tags(resource)
158
resource_tags = resource.tags
159
@tags_hash.each do |tag|
160
deletions << tag['id'] and next unless resource_tags.include?(tag['name'])
163
Puppet::Rails::ResourceTag.delete(deletions) unless deletions.empty?
165
(resource_tags - in_db).each do |tag|
166
add_resource_tag(tag)
170
def value_compare(v,db_value)
171
v = [v] unless v.is_a?(Array)
89
180
def parameter(param)
90
181
if pn = param_names.find_by_name(param)
91
if pv = param_values.find(:first, :conditions => [ 'param_name_id = ?', pn] )
182
if pv = param_values.find(:first, :conditions => [ 'param_name_id = ?', pn])
112
203
"%s[%s]" % [self[:restype].split("::").collect { |s| s.capitalize }.join("::"), self.title.to_s]
206
# Returns a hash of parameter names and values, no ActiveRecord instances.
208
Puppet::Rails::ParamValue.find_all_params_from_resource(self).inject({}) do |hash, value|
209
hash[value['name']] ||= []
210
hash[value['name']] << value.value
115
215
# Convert our object to a resource. Do not retain whether the object
116
216
# is exported, though, since that would cause it to get stripped
117
217
# from the configuration.