summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/configuration.rb6
-rw-r--r--lib/puppet/network/client/master.rb17
-rwxr-xr-xtest/network/client/master.rb34
3 files changed, 52 insertions, 5 deletions
diff --git a/lib/puppet/configuration.rb b/lib/puppet/configuration.rb
index c6ca53d98..3b90916c6 100644
--- a/lib/puppet/configuration.rb
+++ b/lib/puppet/configuration.rb
@@ -396,7 +396,11 @@ module Puppet
change or if the server changes."
],
:downcasefacts => [false,
- "Whether facts should be made all lowercase when sent to the server."]
+ "Whether facts should be made all lowercase when sent to the server."],
+ :dynamicfacts => ["memorysize,memoryfree,swapsize,swapfree",
+ "Facts that are dynamic; these facts will be ignored when deciding whether
+ changed facts should result in a recompile. Multiple facts should be
+ comma-separated."]
)
self.setdefaults(:puppetd,
diff --git a/lib/puppet/network/client/master.rb b/lib/puppet/network/client/master.rb
index 6db2e98c7..e7739ba34 100644
--- a/lib/puppet/network/client/master.rb
+++ b/lib/puppet/network/client/master.rb
@@ -41,6 +41,11 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
facts
end
+ # Return the list of dynamic facts as an array of symbols
+ def self.dynamic_facts
+ Puppet.config[:dynamicfacts].split(/\s*,\s*/).collect { |fact| fact.downcase }
+ end
+
# This method actually applies the configuration.
def apply(tags = nil, ignoreschedules = false)
unless defined? @objects
@@ -536,13 +541,17 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
end
loadfacts()
-
- private
# Have the facts changed since we last compiled?
def facts_changed?(facts)
- oldfacts = Puppet::Util::Storage.cache(:configuration)[:facts]
- newfacts = facts
+ oldfacts = Puppet::Util::Storage.cache(:configuration)[:facts].dup
+ newfacts = facts.dup
+ self.class.dynamic_facts.each do |fact|
+ [oldfacts, newfacts].each do |facthash|
+ facthash.delete(fact) if facthash.include?(fact)
+ end
+ end
+
if oldfacts == newfacts
return false
else
diff --git a/test/network/client/master.rb b/test/network/client/master.rb
index ffdb8a0ce..1e14d9ce2 100755
--- a/test/network/client/master.rb
+++ b/test/network/client/master.rb
@@ -640,6 +640,40 @@ end
assert_equal(100, master.timeout, "Did not get changed integer default value for timeout")
assert_equal(100, master.timeout, "Did not get changed integer default value for timeout on second run")
end
+
+ # #569 -- Make sure we can ignore dynamic facts.
+ def test_dynamic_facts
+ client = mkclient
+
+ assert_equal(%w{memorysize memoryfree swapsize swapfree}, client.class.dynamic_facts,
+ "Did not get correct defaults for dynamic facts")
+
+ # Cache some values for comparison
+ cached = {"one" => "yep", "two" => "nope"}
+ Puppet::Util::Storage.cache(:configuration)[:facts] = cached
+
+ assert(! client.send(:facts_changed?, cached), "Facts incorrectly considered to be changed")
+
+ # Now add some values to the passed result and make sure we get a positive
+ newfacts = cached.dup
+ newfacts["changed"] = "something"
+
+ assert(client.send(:facts_changed?, newfacts), "Did not catch changed fact")
+
+ # Now add a dynamic fact and make sure it's ignored
+ newfacts = cached.dup
+ newfacts["memorysize"] = "something"
+
+ assert(! client.send(:facts_changed?, newfacts), "Dynamic facts resulted in a false positive")
+
+ # And try it with both
+ cached["memorysize"] = "something else"
+ assert(! client.send(:facts_changed?, newfacts), "Dynamic facts resulted in a false positive")
+
+ # And finally, with only in the cache
+ newfacts.delete("memorysize")
+ assert(! client.send(:facts_changed?, newfacts), "Dynamic facts resulted in a false positive")
+ end
end
# $Id$