From 5452fe973a11ee38afd01d7b2365d94f05d3941b Mon Sep 17 00:00:00 2001 From: Ewoud Kohl van Wijngaarden Date: Mon, 9 Nov 2020 19:03:51 +0100 Subject: [PATCH] Do not query for the exact facter version This assumes that no exact match can be found in most cases. This saves a call to Facterdb. Some testing on puppet-nginx this reduced the time for a dry run by about 1 to 2 seconds, from about ~11 to ~9 seconds. Actual results will vary on the FacterDB. Note that a new Facter version will trigger the bad code unless all operating systems are updated so this is a very likely code path. It also makes the easier to read. --- lib/rspec-puppet-facts.rb | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/lib/rspec-puppet-facts.rb b/lib/rspec-puppet-facts.rb index 7f38b5b..661a3d7 100644 --- a/lib/rspec-puppet-facts.rb +++ b/lib/rspec-puppet-facts.rb @@ -118,26 +118,19 @@ def on_supported_os_implementation(opts = {}) # facter data (see FacterDB 0.5.2 for Facter releases 3.8 and 3.9). In this situation we need to # cycle through and downgrade Facter versions per platform type until we find matching Facter data. filter.each do |filter_spec| - facter_version_filter = RspecPuppetFacts.facter_version_to_filter(facterversion) - db = FacterDB.get_facts(filter_spec.merge({ :facterversion => facter_version_filter })) + version = FacterDB.get_facts(filter_spec).map { |facts| Gem::Version.new(facts[:facterversion]) }.sort.reverse.detect { |v| v <= facterversion_obj } + next unless version + version = version.to_s - if db.empty? + unless version == facterversion if RspecPuppetFacts.spec_facts_strict? raise ArgumentError, "No facts were found in the FacterDB for Facter v#{facterversion} on #{filter_spec}, aborting" end - version = FacterDB.get_facts(filter_spec).map { |facts| Gem::Version.new(facts[:facterversion]) }.sort.reverse.detect { |v| v <= facterversion_obj } - - next unless version - version = version.to_s - facter_version_filter = "/\\A#{Regexp.escape(version)}/" - - unless version == facterversion - RspecPuppetFacts.warning "No facts were found in the FacterDB for Facter v#{facterversion} on #{filter_spec}, using v#{version} instead" - end + RspecPuppetFacts.warning "No facts were found in the FacterDB for Facter v#{facterversion} on #{filter_spec}, using v#{version} instead" end - filter_spec[:facterversion] = facter_version_filter + filter_spec[:facterversion] = "/\\A#{Regexp.escape(version)}/" end received_facts = FacterDB::get_facts(filter)