diff options
Diffstat (limited to 'lib/puppet')
| -rw-r--r-- | lib/puppet/indirector/active_record.rb | 28 | ||||
| -rw-r--r-- | lib/puppet/indirector/facts/active_record.rb | 35 | ||||
| -rw-r--r-- | lib/puppet/indirector/node/active_record.rb | 7 | ||||
| -rw-r--r-- | lib/puppet/rails/host.rb | 26 |
4 files changed, 95 insertions, 1 deletions
diff --git a/lib/puppet/indirector/active_record.rb b/lib/puppet/indirector/active_record.rb new file mode 100644 index 000000000..531109a18 --- /dev/null +++ b/lib/puppet/indirector/active_record.rb @@ -0,0 +1,28 @@ +require 'puppet/indirector' + +class Puppet::Indirector::ActiveRecord < Puppet::Indirector::Terminus + class << self + attr_accessor :ar_model + end + + def self.use_ar_model(klass) + self.ar_model = klass + end + + def ar_model + self.class.ar_model + end + + def initialize + Puppet::Rails.init + end + + def find(request) + return nil unless instance = ar_model.find_by_name(request.key) + instance.to_puppet + end + + def save(request) + ar_model.from_puppet(request.instance).save + end +end diff --git a/lib/puppet/indirector/facts/active_record.rb b/lib/puppet/indirector/facts/active_record.rb new file mode 100644 index 000000000..5fb2596d7 --- /dev/null +++ b/lib/puppet/indirector/facts/active_record.rb @@ -0,0 +1,35 @@ +require 'puppet/rails/fact_name' +require 'puppet/rails/fact_value' +require 'puppet/indirector/active_record' + +class Puppet::Node::Facts::ActiveRecord < Puppet::Indirector::ActiveRecord + use_ar_model Puppet::Rails::Host + + # Find the Rails host and pull its facts as a Facts instance. + def find(request) + return nil unless host = ar_model.find_by_name(request.key, :include => {:fact_values => :fact_name}) + + facts = Puppet::Node::Facts.new(host.name) + facts.values = host.get_facts_hash.inject({}) do |hash, ary| + # Convert all single-member arrays into plain values. + param = ary[0] + values = ary[1].collect { |v| v.value } + values = values[0] if values.length == 1 + hash[param] = values + hash + end + + facts + end + + # Save the values from a Facts instance as the facts on a Rails Host instance. + def save(request) + facts = request.instance + + host = ar_model.find_by_name(facts.name) || ar_model.create(:name => facts.name) + + host.setfacts(facts.values) + + host.save + end +end diff --git a/lib/puppet/indirector/node/active_record.rb b/lib/puppet/indirector/node/active_record.rb new file mode 100644 index 000000000..ab33af4b0 --- /dev/null +++ b/lib/puppet/indirector/node/active_record.rb @@ -0,0 +1,7 @@ +require 'puppet/rails/host' +require 'puppet/indirector/active_record' +require 'puppet/node' + +class Puppet::Node::ActiveRecord < Puppet::Indirector::ActiveRecord + use_ar_model Puppet::Rails::Host +end diff --git a/lib/puppet/rails/host.rb b/lib/puppet/rails/host.rb index 851cc21d9..23a22553d 100644 --- a/lib/puppet/rails/host.rb +++ b/lib/puppet/rails/host.rb @@ -22,6 +22,18 @@ class Puppet::Rails::Host < ActiveRecord::Base end end + def self.from_puppet(node) + host = find_by_name(node.name) || new(:name => node.name) + + {"ipaddress" => "ip", "environment" => "environment"}.each do |myparam, itsparam| + if value = node.send(myparam) + host.send(itsparam + "=", value) + end + end + + host + end + # Store our host in the database. def self.store(node, resources) args = {} @@ -70,6 +82,8 @@ class Puppet::Rails::Host < ActiveRecord::Base end # returns a hash of fact_names.name => [ fact_values ] for this host. + # Note that 'fact_values' is actually a list of the value instances, not + # just actual values. def get_facts_hash fact_values = self.fact_values.find(:all, :include => :fact_name) return fact_values.inject({}) do | hash, value | @@ -202,5 +216,15 @@ class Puppet::Rails::Host < ActiveRecord::Base self.last_connect = Time.now save end -end + def to_puppet + node = Puppet::Node.new(self.name) + {"ip" => "ipaddress", "environment" => "environment"}.each do |myparam, itsparam| + if value = send(myparam) + node.send(itsparam + "=", value) + end + end + + node + end +end |
