summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2009-04-06 16:38:14 -0500
committerJames Turnbull <james@lovedthanlost.net>2009-04-22 14:39:35 +1000
commitb9c95ebf81eeb78297003de2d0ed4ca048412393 (patch)
tree184d2f5c693c6183ac59414ff339553744d110cd /lib
parent8d0e9976b199a637d82d70701db6c682a89b9d6a (diff)
downloadpuppet-b9c95ebf81eeb78297003de2d0ed4ca048412393.tar.gz
puppet-b9c95ebf81eeb78297003de2d0ed4ca048412393.tar.xz
puppet-b9c95ebf81eeb78297003de2d0ed4ca048412393.zip
Adding ActiveRecord terminus classes for Node and Facts.
This is most of the way to replacing standard StoreConfigs integration with the Indirector. We still need to convert the Catalog and then change all of the integraiton points (which is mostly the 'store' call in the Compiler). Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/indirector/active_record.rb28
-rw-r--r--lib/puppet/indirector/facts/active_record.rb35
-rw-r--r--lib/puppet/indirector/node/active_record.rb7
-rw-r--r--lib/puppet/rails/host.rb26
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