diff options
author | Luke Kanies <luke@madstop.com> | 2008-03-16 17:52:46 -0500 |
---|---|---|
committer | Luke Kanies <luke@madstop.com> | 2008-03-16 17:52:46 -0500 |
commit | 4a45a1da0653f18df6bd41b009a30387df697909 (patch) | |
tree | 7b1012578d560e7f5964c096f686e1108877450a | |
parent | f3a304c557c096b5dbf319671cb84e5611eee30f (diff) | |
download | puppet-4a45a1da0653f18df6bd41b009a30387df697909.tar.gz puppet-4a45a1da0653f18df6bd41b009a30387df697909.tar.xz puppet-4a45a1da0653f18df6bd41b009a30387df697909.zip |
Caching node information in yaml (I figured caching in memory will
cause ever-larger memory growth), and changing the external node
terminus to use the version of the facts as their version. This
will usually result in the cached node information being used,
instead of always hitting the external node app during file
serving. Note that if the facts aren't changed by the client,
then this will result in the cached node being used, but at this
point, the client always updates its facts. (#1130)
-rw-r--r-- | CHANGELOG | 9 | ||||
-rw-r--r-- | lib/puppet/indirector/node/exec.rb | 7 | ||||
-rw-r--r-- | lib/puppet/node.rb | 2 | ||||
-rwxr-xr-x | spec/unit/indirector/node/exec.rb | 93 | ||||
-rwxr-xr-x | spec/unit/node.rb | 4 |
5 files changed, 70 insertions, 45 deletions
@@ -1,3 +1,12 @@ + Caching node information in yaml (I figured caching in memory will + cause ever-larger memory growth), and changing the external node + terminus to use the version of the facts as their version. This + will usually result in the cached node information being used, + instead of always hitting the external node app during file + serving. Note that if the facts aren't changed by the client, + then this will result in the cached node being used, but at this + point, the client always updates its facts. (#1130) + Fixing #1132 -- host names can now have dashes anywhere. (Patch by freiheit.) diff --git a/lib/puppet/indirector/node/exec.rb b/lib/puppet/indirector/node/exec.rb index 71f4fa8e1..dcfc625b2 100644 --- a/lib/puppet/indirector/node/exec.rb +++ b/lib/puppet/indirector/node/exec.rb @@ -24,6 +24,13 @@ class Puppet::Node::Exec < Puppet::Indirector::Exec return create_node(name, result) end + # Use the version of the facts, since we assume that's the main thing + # that changes. If someone wants their own way of defining version, + # they can easily provide their own, um, version of this class. + def version(name) + Puppet::Node::Facts.version(name) + end + private # Turn our outputted objects into a Puppet::Node instance. diff --git a/lib/puppet/node.rb b/lib/puppet/node.rb index c0628ecdc..c39f364bc 100644 --- a/lib/puppet/node.rb +++ b/lib/puppet/node.rb @@ -10,7 +10,7 @@ class Puppet::Node extend Puppet::Indirector # Use the node source as the indirection terminus. - indirects :node, :terminus_setting => :node_terminus, :doc => "Where to find node information. + indirects :node, :terminus_setting => :node_terminus, :cache_class => :yaml, :doc => "Where to find node information. A node is composed of its name, its facts, and its environment." # Retrieve a node from the node source, with some additional munging diff --git a/spec/unit/indirector/node/exec.rb b/spec/unit/indirector/node/exec.rb index 5e6a9b1da..b67e0fe97 100755 --- a/spec/unit/indirector/node/exec.rb +++ b/spec/unit/indirector/node/exec.rb @@ -4,65 +4,70 @@ require File.dirname(__FILE__) + '/../../../spec_helper' require 'puppet/indirector/node/exec' -describe Puppet::Node::Exec, " when constructing the command to run" do +describe Puppet::Node::Exec do before do @indirection = mock 'indirection' Puppet.settings.stubs(:value).with(:external_nodes).returns("/echo") @searcher = Puppet::Node::Exec.new end - it "should use the external_node script as the command" do - Puppet.expects(:[]).with(:external_nodes).returns("/bin/echo") - @searcher.command.should == %w{/bin/echo} + it "should use the version of the facts as its version" do + version = mock 'version' + Puppet::Node::Facts.expects(:version).with("me").returns version + @searcher.version("me").should equal(version) end - it "should throw an exception if no external node command is set" do - Puppet.expects(:[]).with(:external_nodes).returns("none") - proc { @searcher.find("foo") }.should raise_error(ArgumentError) - end -end + describe "when constructing the command to run" do + it "should use the external_node script as the command" do + Puppet.expects(:[]).with(:external_nodes).returns("/bin/echo") + @searcher.command.should == %w{/bin/echo} + end -describe Puppet::Node::Exec, " when handling the results of the command" do - before do - @indirection = mock 'indirection' - Puppet.settings.stubs(:value).with(:external_nodes).returns("/echo") - @searcher = Puppet::Node::Exec.new - @node = stub 'node', :fact_merge => nil - @name = "yay" - Puppet::Node.expects(:new).with(@name).returns(@node) - @result = {} - # Use a local variable so the reference is usable in the execute() definition. - result = @result - @searcher.meta_def(:execute) do |command| - return YAML.dump(result) + it "should throw an exception if no external node command is set" do + Puppet.expects(:[]).with(:external_nodes).returns("none") + proc { @searcher.find("foo") }.should raise_error(ArgumentError) end end - it "should translate the YAML into a Node instance" do - # Use an empty hash - @searcher.find(@name).should equal(@node) - end + describe "when handling the results of the command" do + before do + @node = stub 'node', :fact_merge => nil + @name = "yay" + Puppet::Node.expects(:new).with(@name).returns(@node) + @result = {} + # Use a local variable so the reference is usable in the execute() definition. + result = @result + @searcher.meta_def(:execute) do |command| + return YAML.dump(result) + end + end - it "should set the resulting parameters as the node parameters" do - @result[:parameters] = {"a" => "b", "c" => "d"} - @node.expects(:parameters=).with "a" => "b", "c" => "d" - @searcher.find(@name) - end + it "should translate the YAML into a Node instance" do + # Use an empty hash + @searcher.find(@name).should equal(@node) + end - it "should set the resulting classes as the node classes" do - @result[:classes] = %w{one two} - @node.expects(:classes=).with %w{one two} - @searcher.find(@name) - end + it "should set the resulting parameters as the node parameters" do + @result[:parameters] = {"a" => "b", "c" => "d"} + @node.expects(:parameters=).with "a" => "b", "c" => "d" + @searcher.find(@name) + end - it "should merge the node's facts with its parameters" do - @node.expects(:fact_merge) - @searcher.find(@name) - end + it "should set the resulting classes as the node classes" do + @result[:classes] = %w{one two} + @node.expects(:classes=).with %w{one two} + @searcher.find(@name) + end + + it "should merge the node's facts with its parameters" do + @node.expects(:fact_merge) + @searcher.find(@name) + end - it "should set the node's environment if one is provided" do - @result[:environment] = "yay" - @node.expects(:environment=).with "yay" - @searcher.find(@name) + it "should set the node's environment if one is provided" do + @result[:environment] = "yay" + @node.expects(:environment=).with "yay" + @searcher.find(@name) + end end end diff --git a/spec/unit/node.rb b/spec/unit/node.rb index 0ce702936..4861cb9e3 100755 --- a/spec/unit/node.rb +++ b/spec/unit/node.rb @@ -127,6 +127,10 @@ describe Puppet::Node, " when indirecting" do Puppet::Node.indirection.terminus_class.should == :plain end + it "should use yaml for caching" do + Puppet::Node.indirection.cache_class.should == :yaml + end + after do Puppet::Indirector::Indirection.clear_cache end |