From 6d772968d20074e1ac739347c15e61a9d5c11d73 Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Tue, 27 Oct 2020 15:19:18 +0200 Subject: [PATCH 1/9] (maint) Rework cache mechanism to skip many group checks. --- lib/facter/custom_facts/util/config.rb | 2 +- .../custom_facts/util/directory_loader.rb | 1 + lib/facter/framework/config/fact_groups.rb | 2 + lib/facter/framework/core/cache_manager.rb | 48 +++++++++++++++++-- .../fact/external/external_fact_manager.rb | 2 +- .../fact/internal/internal_fact_manager.rb | 2 +- lib/facter/framework/core/fact_augmenter.rb | 1 + lib/facter/framework/core/fact_manager.rb | 1 + lib/facter/models/resolved_fact.rb | 5 +- lib/facter/models/searched_fact.rb | 2 +- 10 files changed, 56 insertions(+), 10 deletions(-) diff --git a/lib/facter/custom_facts/util/config.rb b/lib/facter/custom_facts/util/config.rb index eb4b9bca5b..11788dd53a 100644 --- a/lib/facter/custom_facts/util/config.rb +++ b/lib/facter/custom_facts/util/config.rb @@ -78,7 +78,7 @@ def self.setup_default_cache_dir @facts_cache_dir = if windows_dir File.join(windows_dir, 'PuppetLabs', 'facter', 'cache', 'cached_facts') else - '/opt/puppetlabs/facter/cache/cached_facts' + '/Users/bogdan.irimie/cached_facts' end end diff --git a/lib/facter/custom_facts/util/directory_loader.rb b/lib/facter/custom_facts/util/directory_loader.rb index e363208c95..b05b6358fe 100644 --- a/lib/facter/custom_facts/util/directory_loader.rb +++ b/lib/facter/custom_facts/util/directory_loader.rb @@ -69,6 +69,7 @@ def load_directory_entries(_collection) end end + cm.add_searched_facts(facts) cm.resolve_facts(facts) end diff --git a/lib/facter/framework/config/fact_groups.rb b/lib/facter/framework/config/fact_groups.rb index 374a123593..54c1045960 100644 --- a/lib/facter/framework/config/fact_groups.rb +++ b/lib/facter/framework/config/fact_groups.rb @@ -78,12 +78,14 @@ def load_facts_ttls @groups_ttls.reduce(:merge).each do |group, ttls| ttls = ttls_to_seconds(ttls) if @groups[group] + # the ttls is for a group @groups[group].each do |fact| if (@facts_ttls[fact] && @facts_ttls[fact][:ttls] < ttls) || @facts_ttls[fact].nil? @facts_ttls[fact] = { ttls: ttls, group: group } end end else + # the ttls is for a fact not a group @facts_ttls[group] = { ttls: ttls, group: group } end end diff --git a/lib/facter/framework/core/cache_manager.rb b/lib/facter/framework/core/cache_manager.rb index db6b832862..dc36289be3 100644 --- a/lib/facter/framework/core/cache_manager.rb +++ b/lib/facter/framework/core/cache_manager.rb @@ -1,5 +1,15 @@ # frozen_string_literal: true +# class CachedFacts +# attr_accessor :name, :ttls, :group +# +# def initialize(name, ttls, group) +# @name = name +# @ttls = ttls +# @group = group +# end +# end + module Facter class CacheManager def initialize @@ -7,14 +17,39 @@ def initialize @log = Log.new(self) @fact_groups = Facter::FactGroups.new @cache_dir = LegacyFacter::Util::Config.facts_cache_dir + # @cf = [] + end + + def add_searched_facts(searched_facts) + ttls = @fact_groups.facts_ttls + + searched_facts.each do |fact| + fact_name = if fact.file + File.basename(fact.file) + else + fact.name + end + + ttls.each do |fact_key, details| + fact.group = details[:group] if fact_name =~ /^#{fact_key}/ + end + end + + puts "^^" + # @cf end def resolve_facts(searched_facts) return searched_facts, [] if (!File.directory?(@cache_dir) || !Options[:cache]) && Options[:ttls].any? + facts = [] - searched_facts.delete_if do |fact| - res = resolve_fact(fact) + searched_facts.delete_if do |searched_fact| + # next unless @cf.map{|cf| cf.name}.select { |name| name == searched_fact.name } + + # group = extract_group(searched_fact) + + res = read_fact(searched_fact, searched_fact.group) if searched_fact.group if res facts << res true @@ -26,6 +61,11 @@ def resolve_facts(searched_facts) [searched_facts, facts.flatten] end + # def extract_group(searched_fact) + # matching_fact = @cf.select{ |cf| cf.name == searched_fact.name } + # matching_fact.first&.group + # end + def cache_facts(resolved_facts) return unless Options[:cache] && Options[:ttls].any? @@ -90,14 +130,14 @@ def create_facts(searched_fact, data) facts = [] data.each do |fact_name, fact_value| fact = Facter::ResolvedFact.new(fact_name, fact_value, searched_fact.type, - searched_fact.user_query, searched_fact.filter_tokens) + searched_fact.user_query, searched_fact.filter_tokens, searched_fact.group) fact.file = searched_fact.file facts << fact end facts else [Facter::ResolvedFact.new(searched_fact.name, data[searched_fact.name], searched_fact.type, - searched_fact.user_query, searched_fact.filter_tokens)] + searched_fact.user_query, searched_fact.filter_tokens, searched_fact.group)] end end diff --git a/lib/facter/framework/core/fact/external/external_fact_manager.rb b/lib/facter/framework/core/fact/external/external_fact_manager.rb index f696dbf81b..03e11bde9b 100644 --- a/lib/facter/framework/core/fact/external/external_fact_manager.rb +++ b/lib/facter/framework/core/fact/external/external_fact_manager.rb @@ -18,7 +18,7 @@ def external_facts(custom_facts) custom_facts.each do |custom_fact| fact = LegacyFacter[custom_fact.name] - resolved_fact = ResolvedFact.new(custom_fact.name, fact.value, :custom) + resolved_fact = ResolvedFact.new(custom_fact.name, fact.value, :custom, nil, [], custom_fact.group) resolved_fact.filter_tokens = [] resolved_fact.user_query = custom_fact.user_query resolved_fact.file = fact.options[:file] diff --git a/lib/facter/framework/core/fact/internal/internal_fact_manager.rb b/lib/facter/framework/core/fact/internal/internal_fact_manager.rb index 25afd2e066..76fb3f53fa 100644 --- a/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +++ b/lib/facter/framework/core/fact/internal/internal_fact_manager.rb @@ -22,7 +22,7 @@ def filter_internal_facts(searched_facts) def resolve_nil_facts(searched_facts) resolved_facts = [] searched_facts.select { |fact| fact.type == :nil }.each do |fact| - resolved_facts << ResolvedFact.new(fact.name, nil, :nil, fact.name) + resolved_facts << ResolvedFact.new(fact.name, nil, :nil, fact.name,[], fact.group) end resolved_facts diff --git a/lib/facter/framework/core/fact_augmenter.rb b/lib/facter/framework/core/fact_augmenter.rb index a87f4d8f1c..de01ae8c75 100644 --- a/lib/facter/framework/core/fact_augmenter.rb +++ b/lib/facter/framework/core/fact_augmenter.rb @@ -31,6 +31,7 @@ def self.augment_resolved_facts(searched_facts, resolved_facts) matched_facts.each do |matched_fact| matched_fact.user_query = searched_fact.user_query matched_fact.filter_tokens = searched_fact.filter_tokens + matched_fact.group = searched_fact.group end end end diff --git a/lib/facter/framework/core/fact_manager.rb b/lib/facter/framework/core/fact_manager.rb index dfa005a509..c6dc721092 100644 --- a/lib/facter/framework/core/fact_manager.rb +++ b/lib/facter/framework/core/fact_manager.rb @@ -21,6 +21,7 @@ def resolve_facts(user_query = []) searched_facts = QueryParser.parse(user_query, loaded_facts) cache_manager = Facter::CacheManager.new + cache_manager.add_searched_facts(searched_facts) searched_facts, cached_facts = cache_manager.resolve_facts(searched_facts) internal_facts = @internal_fact_mgr.resolve_facts(searched_facts) external_facts = @external_fact_mgr.resolve_facts(searched_facts) diff --git a/lib/facter/models/resolved_fact.rb b/lib/facter/models/resolved_fact.rb index 1d2597f47e..acbd0335cc 100644 --- a/lib/facter/models/resolved_fact.rb +++ b/lib/facter/models/resolved_fact.rb @@ -3,14 +3,15 @@ module Facter class ResolvedFact attr_reader :name, :type - attr_accessor :user_query, :filter_tokens, :value, :file + attr_accessor :user_query, :filter_tokens, :value, :file, :group - def initialize(name, value = '', type = :core, user_query = nil, filter_tokens = []) + def initialize(name, value = '', type = :core, user_query = nil, filter_tokens = [], group = nil) @name = name @value = Utils.deep_stringify_keys(value) @type = type @user_query = user_query @filter_tokens = filter_tokens + @group = group end def legacy? diff --git a/lib/facter/models/searched_fact.rb b/lib/facter/models/searched_fact.rb index 40374f215a..2eb58805d9 100644 --- a/lib/facter/models/searched_fact.rb +++ b/lib/facter/models/searched_fact.rb @@ -3,7 +3,7 @@ module Facter class SearchedFact attr_reader :name, :fact_class, :filter_tokens, :user_query, :type - attr_accessor :file + attr_accessor :file, :group def initialize(fact_name, fact_class, filter_tokens, user_query, type) @name = fact_name From 1b7ea03c8618a581ebb56b9cd57165a462b7c899 Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Thu, 29 Oct 2020 12:20:55 +0200 Subject: [PATCH 2/9] (FACT-2848) Remove dead code. --- lib/facter/framework/core/cache_manager.rb | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/lib/facter/framework/core/cache_manager.rb b/lib/facter/framework/core/cache_manager.rb index dc36289be3..135f36f9ed 100644 --- a/lib/facter/framework/core/cache_manager.rb +++ b/lib/facter/framework/core/cache_manager.rb @@ -1,15 +1,5 @@ # frozen_string_literal: true -# class CachedFacts -# attr_accessor :name, :ttls, :group -# -# def initialize(name, ttls, group) -# @name = name -# @ttls = ttls -# @group = group -# end -# end - module Facter class CacheManager def initialize @@ -17,7 +7,6 @@ def initialize @log = Log.new(self) @fact_groups = Facter::FactGroups.new @cache_dir = LegacyFacter::Util::Config.facts_cache_dir - # @cf = [] end def add_searched_facts(searched_facts) @@ -36,7 +25,6 @@ def add_searched_facts(searched_facts) end puts "^^" - # @cf end def resolve_facts(searched_facts) @@ -45,10 +33,6 @@ def resolve_facts(searched_facts) facts = [] searched_facts.delete_if do |searched_fact| - # next unless @cf.map{|cf| cf.name}.select { |name| name == searched_fact.name } - - # group = extract_group(searched_fact) - res = read_fact(searched_fact, searched_fact.group) if searched_fact.group if res facts << res @@ -61,11 +45,6 @@ def resolve_facts(searched_facts) [searched_facts, facts.flatten] end - # def extract_group(searched_fact) - # matching_fact = @cf.select{ |cf| cf.name == searched_fact.name } - # matching_fact.first&.group - # end - def cache_facts(resolved_facts) return unless Options[:cache] && Options[:ttls].any? From d6b8839cadebd1d197a24a727f090405d766e05d Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Thu, 29 Oct 2020 12:58:21 +0200 Subject: [PATCH 3/9] (FACT-2848) Rework cache writer. --- lib/facter/framework/core/cache_manager.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/facter/framework/core/cache_manager.rb b/lib/facter/framework/core/cache_manager.rb index 135f36f9ed..73543d197f 100644 --- a/lib/facter/framework/core/cache_manager.rb +++ b/lib/facter/framework/core/cache_manager.rb @@ -30,7 +30,6 @@ def add_searched_facts(searched_facts) def resolve_facts(searched_facts) return searched_facts, [] if (!File.directory?(@cache_dir) || !Options[:cache]) && Options[:ttls].any? - facts = [] searched_facts.delete_if do |searched_fact| res = read_fact(searched_fact, searched_fact.group) if searched_fact.group @@ -48,8 +47,12 @@ def resolve_facts(searched_facts) def cache_facts(resolved_facts) return unless Options[:cache] && Options[:ttls].any? - resolved_facts.each do |fact| - cache_fact(fact) + resolved_facts + .select { |resolved_fact| resolved_fact.group != nil } + .group_by { |resolved_fact| resolved_fact.group } + .each do |group_name, array_of_facts| + @groups[group_name] ||= {} + array_of_facts.each { |resolved_fact| @groups[group_name][resolved_fact.name] = resolved_fact.value} end begin From edabf702605b12bdcdbdd8ecb2376f11644d52c6 Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Thu, 29 Oct 2020 13:14:34 +0200 Subject: [PATCH 4/9] (FACT-2848) Imrpove regex. --- lib/facter/framework/core/cache_manager.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/facter/framework/core/cache_manager.rb b/lib/facter/framework/core/cache_manager.rb index 73543d197f..26e5a253ae 100644 --- a/lib/facter/framework/core/cache_manager.rb +++ b/lib/facter/framework/core/cache_manager.rb @@ -20,11 +20,10 @@ def add_searched_facts(searched_facts) end ttls.each do |fact_key, details| - fact.group = details[:group] if fact_name =~ /^#{fact_key}/ + fact.group = details[:group] if fact_name =~ /^#{fact_key}[\.]?.*/ end end - puts "^^" end def resolve_facts(searched_facts) From 282c69d550db0cc3b1876c2b323787d176fdc742 Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Thu, 29 Oct 2020 14:22:24 +0200 Subject: [PATCH 5/9] (FACT-2848) Remove dead code. --- lib/facter/framework/core/cache_manager.rb | 33 ---------------------- 1 file changed, 33 deletions(-) diff --git a/lib/facter/framework/core/cache_manager.rb b/lib/facter/framework/core/cache_manager.rb index 26e5a253ae..753a6b8010 100644 --- a/lib/facter/framework/core/cache_manager.rb +++ b/lib/facter/framework/core/cache_manager.rb @@ -76,23 +76,7 @@ def fact_cache_enabled?(fact_name) private - def resolve_fact(searched_fact) - fact_name = if searched_fact.file - File.basename(searched_fact.file) - else - searched_fact.name - end - return unless fact_cache_enabled?(fact_name) - - fact = @fact_groups.get_fact(fact_name) - - return unless fact - - return unless check_ttls?(fact[:group], fact[:ttls]) - - read_fact(searched_fact, fact[:group]) - end def read_fact(searched_fact, fact_group) data = nil @@ -122,23 +106,6 @@ def create_facts(searched_fact, data) end end - def cache_fact(fact) - fact_name = if fact.file - File.basename(fact.file) - else - fact.name - end - - group_name = @fact_groups.get_fact_group(fact_name) - - return if !group_name || fact.value.nil? - - return unless fact_cache_enabled?(fact_name) - - @groups[group_name] ||= {} - @groups[group_name][fact.name] = fact.value - end - def write_cache unless File.directory?(@cache_dir) require 'fileutils' From a4df89ea2940845199dfeedc74d2504159bced8e Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Thu, 29 Oct 2020 16:10:53 +0200 Subject: [PATCH 6/9] (FACT-2848) Replace the way cached facts were discovered in directory loader --- .../custom_facts/util/directory_loader.rb | 9 +++--- lib/facter/facts/aix/identity/group.rb | 2 +- lib/facter/facts/freebsd/identity/group.rb | 2 +- lib/facter/facts/linux/identity/group.rb | 2 +- lib/facter/facts/macosx/identity/group.rb | 2 +- lib/facter/facts/solaris/identity/group.rb | 2 +- lib/facter/framework/config/fact_groups.rb | 21 ++------------ lib/facter/framework/core/cache_manager.rb | 29 +++++-------------- .../fact/external/external_fact_manager.rb | 2 +- .../fact/internal/internal_fact_manager.rb | 2 +- lib/facter/framework/core/fact_augmenter.rb | 2 +- lib/facter/framework/core/fact_manager.rb | 2 +- lib/facter/models/resolved_fact.rb | 6 ++-- lib/facter/models/searched_fact.rb | 2 +- lib/facter/resolvers/identity_resolver.rb | 2 +- spec/facter/cache_manager_spec.rb | 4 +-- spec/facter/facts/aix/identity/group_spec.rb | 4 +-- .../facts/freebsd/identity/group_spec.rb | 4 +-- .../facter/facts/linux/identity/group_spec.rb | 4 +-- .../facts/macosx/identity/group_spec.rb | 4 +-- .../facts/solaris/identity/group_spec.rb | 4 +-- .../resolvers/identity_resolver_spec.rb | 2 +- 22 files changed, 42 insertions(+), 71 deletions(-) diff --git a/lib/facter/custom_facts/util/directory_loader.rb b/lib/facter/custom_facts/util/directory_loader.rb index b05b6358fe..b997fdf1d4 100644 --- a/lib/facter/custom_facts/util/directory_loader.rb +++ b/lib/facter/custom_facts/util/directory_loader.rb @@ -59,17 +59,18 @@ def load_directory_entries(_collection) basename = File.basename(file) next if file_blocked?(basename) - if facts.find { |f| f.name == basename } && cm.fact_cache_enabled?(basename) + searched_fact = Facter::SearchedFact.new(basename, nil, [], nil, :file) + searched_fact.file = file + cm.augment_with_cache_group([searched_fact]) + + if facts.find { |f| f.name == basename } && searched_fact.cache_group != nil Facter.log_exception(Exception.new("Caching is enabled for group \"#{basename}\" while "\ 'there are at least two external facts files with the same filename')) else - searched_fact = Facter::SearchedFact.new(basename, nil, [], nil, :file) - searched_fact.file = file facts << searched_fact end end - cm.add_searched_facts(facts) cm.resolve_facts(facts) end diff --git a/lib/facter/facts/aix/identity/group.rb b/lib/facter/facts/aix/identity/group.rb index 0f15acbb1d..6134e37de0 100644 --- a/lib/facter/facts/aix/identity/group.rb +++ b/lib/facter/facts/aix/identity/group.rb @@ -8,7 +8,7 @@ class Group ALIASES = 'gid' def call_the_resolver - fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) + fact_value = Facter::Resolvers::PosxIdentity.resolve(:cache_group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end diff --git a/lib/facter/facts/freebsd/identity/group.rb b/lib/facter/facts/freebsd/identity/group.rb index fb0da1df20..acd7705cd0 100644 --- a/lib/facter/facts/freebsd/identity/group.rb +++ b/lib/facter/facts/freebsd/identity/group.rb @@ -8,7 +8,7 @@ class Group ALIASES = 'gid' def call_the_resolver - fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) + fact_value = Facter::Resolvers::PosxIdentity.resolve(:cache_group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end diff --git a/lib/facter/facts/linux/identity/group.rb b/lib/facter/facts/linux/identity/group.rb index e881f9138e..1ad9b9a049 100644 --- a/lib/facter/facts/linux/identity/group.rb +++ b/lib/facter/facts/linux/identity/group.rb @@ -8,7 +8,7 @@ class Group ALIASES = 'gid' def call_the_resolver - fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) + fact_value = Facter::Resolvers::PosxIdentity.resolve(:cache_group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end diff --git a/lib/facter/facts/macosx/identity/group.rb b/lib/facter/facts/macosx/identity/group.rb index d9aa094bca..328fcf7dd5 100644 --- a/lib/facter/facts/macosx/identity/group.rb +++ b/lib/facter/facts/macosx/identity/group.rb @@ -8,7 +8,7 @@ class Group ALIASES = 'gid' def call_the_resolver - fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) + fact_value = Facter::Resolvers::PosxIdentity.resolve(:cache_group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end diff --git a/lib/facter/facts/solaris/identity/group.rb b/lib/facter/facts/solaris/identity/group.rb index ff5828f7f7..ddaa46d821 100644 --- a/lib/facter/facts/solaris/identity/group.rb +++ b/lib/facter/facts/solaris/identity/group.rb @@ -8,7 +8,7 @@ class Group ALIASES = 'gid' def call_the_resolver - fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) + fact_value = Facter::Resolvers::PosxIdentity.resolve(:cache_group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end diff --git a/lib/facter/framework/config/fact_groups.rb b/lib/facter/framework/config/fact_groups.rb index 54c1045960..003b898464 100644 --- a/lib/facter/framework/config/fact_groups.rb +++ b/lib/facter/framework/config/fact_groups.rb @@ -33,14 +33,6 @@ def blocked_facts fact_list end - # Get the group name a fact is part of - def get_fact_group(fact_name) - fact = get_fact(fact_name) - return fact[:group] if fact - - @groups.detect { |k, v| break k if Array(v).find { |f| fact_name =~ /^#{f}.*/ } } - end - # Get config ttls for a given group def get_group_ttls(group_name) return unless (ttls = @groups_ttls.find { |g| g[group_name] }) @@ -48,15 +40,6 @@ def get_group_ttls(group_name) ttls_to_seconds(ttls[group_name]) end - def get_fact(fact_name) - return @facts_ttls[fact_name] if @facts_ttls[fact_name] - - result = @facts_ttls.select { |name, fact| break fact if fact_name =~ /^#{name}\..*/ } - return nil if result == {} - - result - end - private def load_groups_from_options @@ -81,12 +64,12 @@ def load_facts_ttls # the ttls is for a group @groups[group].each do |fact| if (@facts_ttls[fact] && @facts_ttls[fact][:ttls] < ttls) || @facts_ttls[fact].nil? - @facts_ttls[fact] = { ttls: ttls, group: group } + @facts_ttls[fact] = {ttls: ttls, cache_group: group } end end else # the ttls is for a fact not a group - @facts_ttls[group] = { ttls: ttls, group: group } + @facts_ttls[group] = {ttls: ttls, cache_group: group } end end end diff --git a/lib/facter/framework/core/cache_manager.rb b/lib/facter/framework/core/cache_manager.rb index 753a6b8010..378babe647 100644 --- a/lib/facter/framework/core/cache_manager.rb +++ b/lib/facter/framework/core/cache_manager.rb @@ -9,7 +9,7 @@ def initialize @cache_dir = LegacyFacter::Util::Config.facts_cache_dir end - def add_searched_facts(searched_facts) + def augment_with_cache_group(searched_facts) ttls = @fact_groups.facts_ttls searched_facts.each do |fact| @@ -20,10 +20,11 @@ def add_searched_facts(searched_facts) end ttls.each do |fact_key, details| - fact.group = details[:group] if fact_name =~ /^#{fact_key}[\.]?.*/ + fact.cache_group = details[:cache_group] if fact_name =~ /^#{fact_key}[\.]?.*/ end end + puts "!!!" end def resolve_facts(searched_facts) @@ -31,7 +32,7 @@ def resolve_facts(searched_facts) facts = [] searched_facts.delete_if do |searched_fact| - res = read_fact(searched_fact, searched_fact.group) if searched_fact.group + res = read_fact(searched_fact, searched_fact.cache_group) if searched_fact.cache_group if res facts << res true @@ -47,8 +48,8 @@ def cache_facts(resolved_facts) return unless Options[:cache] && Options[:ttls].any? resolved_facts - .select { |resolved_fact| resolved_fact.group != nil } - .group_by { |resolved_fact| resolved_fact.group } + .select { |resolved_fact| resolved_fact.cache_group != nil } + .group_by { |resolved_fact| resolved_fact.cache_group } .each do |group_name, array_of_facts| @groups[group_name] ||= {} array_of_facts.each { |resolved_fact| @groups[group_name][resolved_fact.name] = resolved_fact.value} @@ -61,23 +62,9 @@ def cache_facts(resolved_facts) end end - def fact_cache_enabled?(fact_name) - fact = @fact_groups.get_fact(fact_name) - cached = if fact - !fact[:ttls].nil? - else - false - end - - fact_group = @fact_groups.get_fact_group(fact_name) - delete_cache(fact_group) if fact_group && !cached - cached - end - private - def read_fact(searched_fact, fact_group) data = nil Facter::Framework::Benchmarking::Timer.measure(searched_fact.name, 'cached') do @@ -95,14 +82,14 @@ def create_facts(searched_fact, data) facts = [] data.each do |fact_name, fact_value| fact = Facter::ResolvedFact.new(fact_name, fact_value, searched_fact.type, - searched_fact.user_query, searched_fact.filter_tokens, searched_fact.group) + searched_fact.user_query, searched_fact.filter_tokens, searched_fact.cache_group) fact.file = searched_fact.file facts << fact end facts else [Facter::ResolvedFact.new(searched_fact.name, data[searched_fact.name], searched_fact.type, - searched_fact.user_query, searched_fact.filter_tokens, searched_fact.group)] + searched_fact.user_query, searched_fact.filter_tokens, searched_fact.cache_group)] end end diff --git a/lib/facter/framework/core/fact/external/external_fact_manager.rb b/lib/facter/framework/core/fact/external/external_fact_manager.rb index 03e11bde9b..fa8624b36d 100644 --- a/lib/facter/framework/core/fact/external/external_fact_manager.rb +++ b/lib/facter/framework/core/fact/external/external_fact_manager.rb @@ -18,7 +18,7 @@ def external_facts(custom_facts) custom_facts.each do |custom_fact| fact = LegacyFacter[custom_fact.name] - resolved_fact = ResolvedFact.new(custom_fact.name, fact.value, :custom, nil, [], custom_fact.group) + resolved_fact = ResolvedFact.new(custom_fact.name, fact.value, :custom, nil, [], custom_fact.cache_group) resolved_fact.filter_tokens = [] resolved_fact.user_query = custom_fact.user_query resolved_fact.file = fact.options[:file] diff --git a/lib/facter/framework/core/fact/internal/internal_fact_manager.rb b/lib/facter/framework/core/fact/internal/internal_fact_manager.rb index 76fb3f53fa..2c3001b104 100644 --- a/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +++ b/lib/facter/framework/core/fact/internal/internal_fact_manager.rb @@ -22,7 +22,7 @@ def filter_internal_facts(searched_facts) def resolve_nil_facts(searched_facts) resolved_facts = [] searched_facts.select { |fact| fact.type == :nil }.each do |fact| - resolved_facts << ResolvedFact.new(fact.name, nil, :nil, fact.name,[], fact.group) + resolved_facts << ResolvedFact.new(fact.name, nil, :nil, fact.name,[], fact.cache_group) end resolved_facts diff --git a/lib/facter/framework/core/fact_augmenter.rb b/lib/facter/framework/core/fact_augmenter.rb index de01ae8c75..65e891aaf9 100644 --- a/lib/facter/framework/core/fact_augmenter.rb +++ b/lib/facter/framework/core/fact_augmenter.rb @@ -31,7 +31,7 @@ def self.augment_resolved_facts(searched_facts, resolved_facts) matched_facts.each do |matched_fact| matched_fact.user_query = searched_fact.user_query matched_fact.filter_tokens = searched_fact.filter_tokens - matched_fact.group = searched_fact.group + matched_fact.cache_group = searched_fact.cache_group end end end diff --git a/lib/facter/framework/core/fact_manager.rb b/lib/facter/framework/core/fact_manager.rb index c6dc721092..b189170079 100644 --- a/lib/facter/framework/core/fact_manager.rb +++ b/lib/facter/framework/core/fact_manager.rb @@ -21,7 +21,7 @@ def resolve_facts(user_query = []) searched_facts = QueryParser.parse(user_query, loaded_facts) cache_manager = Facter::CacheManager.new - cache_manager.add_searched_facts(searched_facts) + cache_manager.augment_with_cache_group(searched_facts) searched_facts, cached_facts = cache_manager.resolve_facts(searched_facts) internal_facts = @internal_fact_mgr.resolve_facts(searched_facts) external_facts = @external_fact_mgr.resolve_facts(searched_facts) diff --git a/lib/facter/models/resolved_fact.rb b/lib/facter/models/resolved_fact.rb index acbd0335cc..628b832722 100644 --- a/lib/facter/models/resolved_fact.rb +++ b/lib/facter/models/resolved_fact.rb @@ -3,15 +3,15 @@ module Facter class ResolvedFact attr_reader :name, :type - attr_accessor :user_query, :filter_tokens, :value, :file, :group + attr_accessor :user_query, :filter_tokens, :value, :file, :cache_group - def initialize(name, value = '', type = :core, user_query = nil, filter_tokens = [], group = nil) + def initialize(name, value = '', type = :core, user_query = nil, filter_tokens = [], cache_group = nil) @name = name @value = Utils.deep_stringify_keys(value) @type = type @user_query = user_query @filter_tokens = filter_tokens - @group = group + @cache_group = cache_group end def legacy? diff --git a/lib/facter/models/searched_fact.rb b/lib/facter/models/searched_fact.rb index 2eb58805d9..e4dcff224a 100644 --- a/lib/facter/models/searched_fact.rb +++ b/lib/facter/models/searched_fact.rb @@ -3,7 +3,7 @@ module Facter class SearchedFact attr_reader :name, :fact_class, :filter_tokens, :user_query, :type - attr_accessor :file, :group + attr_accessor :file, :cache_group def initialize(fact_name, fact_class, filter_tokens, user_query, type) @name = fact_name diff --git a/lib/facter/resolvers/identity_resolver.rb b/lib/facter/resolvers/identity_resolver.rb index c63291b61e..d304772551 100644 --- a/lib/facter/resolvers/identity_resolver.rb +++ b/lib/facter/resolvers/identity_resolver.rb @@ -18,7 +18,7 @@ def retrieve_identity(fact_name) login_info = Etc.getpwuid @fact_list[:gid] = login_info.gid - @fact_list[:group] = Etc.getgrgid(login_info.gid).name + @fact_list[:cache_group] = Etc.getgrgid(login_info.gid).name @fact_list[:privileged] = login_info.uid.zero? @fact_list[:uid] = login_info.uid @fact_list[:user] = login_info.name diff --git a/spec/facter/cache_manager_spec.rb b/spec/facter/cache_manager_spec.rb index a07020bf56..4e3112e474 100644 --- a/spec/facter/cache_manager_spec.rb +++ b/spec/facter/cache_manager_spec.rb @@ -25,8 +25,8 @@ let(:group_name) { 'operating system' } let(:cache_file_name) { File.join(cache_dir, group_name) } let(:fact_groups) { instance_spy(Facter::FactGroups) } - let(:os_fact) { { ttls: 60, group: 'operating system' } } - let(:external_fact) { { ttls: 60, group: 'ext_file.txt' } } + let(:os_fact) { {ttls: 60, cache_group: 'operating system' } } + let(:external_fact) { {ttls: 60, cache_group: 'ext_file.txt' } } before do allow(LegacyFacter::Util::Config).to receive(:facts_cache_dir).and_return(cache_dir) diff --git a/spec/facter/facts/aix/identity/group_spec.rb b/spec/facter/facts/aix/identity/group_spec.rb index b2142d7d66..7b9a657cd5 100644 --- a/spec/facter/facts/aix/identity/group_spec.rb +++ b/spec/facter/facts/aix/identity/group_spec.rb @@ -7,12 +7,12 @@ let(:value) { 'staff' } before do - allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) + allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:cache_group).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver - expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:group) + expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:cache_group) end it 'returns identity group fact' do diff --git a/spec/facter/facts/freebsd/identity/group_spec.rb b/spec/facter/facts/freebsd/identity/group_spec.rb index 9998055370..eb23f21c2b 100644 --- a/spec/facter/facts/freebsd/identity/group_spec.rb +++ b/spec/facter/facts/freebsd/identity/group_spec.rb @@ -7,12 +7,12 @@ let(:value) { 'staff' } before do - allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) + allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:cache_group).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver - expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:group) + expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:cache_group) end it 'returns identity group fact' do diff --git a/spec/facter/facts/linux/identity/group_spec.rb b/spec/facter/facts/linux/identity/group_spec.rb index 7962f7433c..4266dd8f3b 100644 --- a/spec/facter/facts/linux/identity/group_spec.rb +++ b/spec/facter/facts/linux/identity/group_spec.rb @@ -7,12 +7,12 @@ let(:value) { 'staff' } before do - allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) + allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:cache_group).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver - expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:group) + expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:cache_group) end it 'returns identity group fact' do diff --git a/spec/facter/facts/macosx/identity/group_spec.rb b/spec/facter/facts/macosx/identity/group_spec.rb index 57d0bc2783..140ee70ef8 100644 --- a/spec/facter/facts/macosx/identity/group_spec.rb +++ b/spec/facter/facts/macosx/identity/group_spec.rb @@ -7,12 +7,12 @@ let(:value) { 'staff' } before do - allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) + allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:cache_group).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver - expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:group) + expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:cache_group) end it 'returns identity group fact' do diff --git a/spec/facter/facts/solaris/identity/group_spec.rb b/spec/facter/facts/solaris/identity/group_spec.rb index 333d0589af..ea4c8fb4b2 100644 --- a/spec/facter/facts/solaris/identity/group_spec.rb +++ b/spec/facter/facts/solaris/identity/group_spec.rb @@ -7,12 +7,12 @@ let(:value) { 'staff' } before do - allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) + allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:cache_group).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver - expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:group) + expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:cache_group) end it 'returns identity group fact' do diff --git a/spec/facter/resolvers/identity_resolver_spec.rb b/spec/facter/resolvers/identity_resolver_spec.rb index d789483db9..39f6657046 100644 --- a/spec/facter/resolvers/identity_resolver_spec.rb +++ b/spec/facter/resolvers/identity_resolver_spec.rb @@ -35,7 +35,7 @@ end describe 'GROUP' do - it_behaves_like 'a resolved fact', :group, 'staff' + it_behaves_like 'a resolved fact', :cache_group, 'staff' end describe 'PRIVILEGED' do From f06e59da1464a838dade9242859779915a7d0a39 Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Thu, 29 Oct 2020 18:17:21 +0200 Subject: [PATCH 7/9] (FACT-2848) Use name instead of user_query in fact augmenter. --- lib/facter/framework/core/fact_augmenter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/facter/framework/core/fact_augmenter.rb b/lib/facter/framework/core/fact_augmenter.rb index 65e891aaf9..892a8da7b1 100644 --- a/lib/facter/framework/core/fact_augmenter.rb +++ b/lib/facter/framework/core/fact_augmenter.rb @@ -16,7 +16,7 @@ def self.augment_resolved_facts(searched_facts, resolved_facts) private_class_method def self.get_resolved_facts_for_searched_fact(searched_fact, resolved_facts) if searched_fact.name.include?('.*') resolved_facts - .select { |resolved_fact| resolved_fact.name.match(searched_fact.user_query) } + .select { |resolved_fact| resolved_fact.name.match(searched_fact.name) } .reject(&:user_query) .uniq(&:name) else From fb861aeeb75f5881a41c6e6a834f9df54a3d7637 Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Fri, 30 Oct 2020 18:31:08 +0200 Subject: [PATCH 8/9] (FACT-2848) Replace CacheManager with CacheAugmenter, CacheReader and CacheWriter. --- .../custom_facts/util/directory_loader.rb | 7 +- .../framework/core/cache/cache_augmenter.rb | 27 ++++ .../framework/core/cache/cache_reader.rb | 79 ++++++++++ .../framework/core/cache/cache_writer.rb | 68 ++++++++ lib/facter/framework/core/cache_manager.rb | 148 ------------------ lib/facter/framework/core/fact_manager.rb | 11 +- lib/facter/framework/core/file_loader.rb | 1 + 7 files changed, 186 insertions(+), 155 deletions(-) create mode 100644 lib/facter/framework/core/cache/cache_augmenter.rb create mode 100644 lib/facter/framework/core/cache/cache_reader.rb create mode 100644 lib/facter/framework/core/cache/cache_writer.rb delete mode 100644 lib/facter/framework/core/cache_manager.rb diff --git a/lib/facter/custom_facts/util/directory_loader.rb b/lib/facter/custom_facts/util/directory_loader.rb index b997fdf1d4..ac5441d665 100644 --- a/lib/facter/custom_facts/util/directory_loader.rb +++ b/lib/facter/custom_facts/util/directory_loader.rb @@ -53,7 +53,8 @@ def load(collection) private def load_directory_entries(_collection) - cm = Facter::CacheManager.new + cache_reader = Facter::Cache::CacheReader.new + cache_augmenter = Facter::Cache::CacheAugmenter.new facts = [] entries.each do |file| basename = File.basename(file) @@ -61,7 +62,7 @@ def load_directory_entries(_collection) searched_fact = Facter::SearchedFact.new(basename, nil, [], nil, :file) searched_fact.file = file - cm.augment_with_cache_group([searched_fact]) + cache_augmenter.augment_with_cache_group([searched_fact]) if facts.find { |f| f.name == basename } && searched_fact.cache_group != nil Facter.log_exception(Exception.new("Caching is enabled for group \"#{basename}\" while "\ @@ -71,7 +72,7 @@ def load_directory_entries(_collection) end end - cm.resolve_facts(facts) + cache_reader.read_from_cache(facts) end def load_cached_facts(collection, cached_facts, weight) diff --git a/lib/facter/framework/core/cache/cache_augmenter.rb b/lib/facter/framework/core/cache/cache_augmenter.rb new file mode 100644 index 0000000000..1e95d061ef --- /dev/null +++ b/lib/facter/framework/core/cache/cache_augmenter.rb @@ -0,0 +1,27 @@ + +module Facter + module Cache + class CacheAugmenter + + def initialize + @fact_groups = Facter::FactGroups.new + end + + def augment_with_cache_group(searched_facts) + ttls = @fact_groups.facts_ttls + + searched_facts.each do |fact| + fact_name = if fact.file + File.basename(fact.file) + else + fact.name + end + + ttls.each do |fact_key, details| + fact.cache_group = details[:cache_group] if fact_name =~ /^#{fact_key}[\.]?.*/ + end + end + end + end + end +end diff --git a/lib/facter/framework/core/cache/cache_reader.rb b/lib/facter/framework/core/cache/cache_reader.rb new file mode 100644 index 0000000000..953c1895b2 --- /dev/null +++ b/lib/facter/framework/core/cache/cache_reader.rb @@ -0,0 +1,79 @@ + +module Facter + module Cache + class CacheReader + + def initialize + @groups = {} + @log = Log.new(self) + @cache_dir = LegacyFacter::Util::Config.facts_cache_dir + end + + def read_from_cache(searched_facts) + return searched_facts, [] if (!File.directory?(@cache_dir) || !Options[:cache]) && Options[:ttls].any? + + facts = [] + searched_facts.delete_if do |searched_fact| + res = read_fact(searched_fact, searched_fact.cache_group) if searched_fact.cache_group + if res + facts << res + true + else + false + end + end + + [searched_facts, facts.flatten] + end + + private + + def read_fact(searched_fact, fact_group) + data = nil + Facter::Framework::Benchmarking::Timer.measure(searched_fact.name, 'cached') do + data = read_group_json(fact_group) + end + return unless data + + @log.debug("loading cached values for #{searched_fact.name} facts") + + create_facts(searched_fact, data) + end + + def read_group_json(group_name) + return @groups[group_name] if @groups.key?(group_name) + + cache_file_name = File.join(@cache_dir, group_name) + data = nil + file = Util::FileHelper.safe_read(cache_file_name) + begin + data = JSON.parse(file) + rescue JSON::ParserError + delete_cache(group_name) + end + @groups[group_name] = data + end + + def delete_cache(group_name) + cache_file_name = File.join(@cache_dir, group_name) + File.delete(cache_file_name) if File.readable?(cache_file_name) + end + + def create_facts(searched_fact, data) + if searched_fact.type == :file + facts = [] + data.each do |fact_name, fact_value| + fact = Facter::ResolvedFact.new(fact_name, fact_value, searched_fact.type, + searched_fact.user_query, searched_fact.filter_tokens, searched_fact.cache_group) + fact.file = searched_fact.file + facts << fact + end + facts + else + [Facter::ResolvedFact.new(searched_fact.name, data[searched_fact.name], searched_fact.type, + searched_fact.user_query, searched_fact.filter_tokens, searched_fact.cache_group)] + end + end + end + end +end diff --git a/lib/facter/framework/core/cache/cache_writer.rb b/lib/facter/framework/core/cache/cache_writer.rb new file mode 100644 index 0000000000..3d8b19efef --- /dev/null +++ b/lib/facter/framework/core/cache/cache_writer.rb @@ -0,0 +1,68 @@ + +module Facter + module Cache + class CacheWriter + + def initialize + @log = Log.new(self) + @groups = {} + @fact_groups = Facter::FactGroups.new + @cache_dir = LegacyFacter::Util::Config.facts_cache_dir + end + + def cache_facts(resolved_facts) + return unless Options[:cache] && Options[:ttls].any? + + resolved_facts + .select { |resolved_fact| resolved_fact.cache_group != nil } + .group_by { |resolved_fact| resolved_fact.cache_group } + .each do |group_name, array_of_facts| + @groups[group_name] ||= {} + array_of_facts.each { |resolved_fact| @groups[group_name][resolved_fact.name] = resolved_fact.value} + end + + begin + write_cache unless @groups.empty? + rescue Errno::EACCES => e + @log.warn("Could not write cache: #{e.message}") + end + end + + private + + def write_cache + unless File.directory?(@cache_dir) + require 'fileutils' + FileUtils.mkdir_p(@cache_dir) + end + + @groups.each do |group_name, data| + next unless check_ttls?(group_name, @fact_groups.get_group_ttls(group_name)) + + cache_file_name = File.join(@cache_dir, group_name) + next if File.readable?(cache_file_name) + + @log.debug("caching values for #{group_name} facts") + File.write(cache_file_name, JSON.pretty_generate(data)) + end + end + + def check_ttls?(group_name, ttls) + return false unless ttls + + cache_file_name = File.join(@cache_dir, group_name) + if File.readable?(cache_file_name) + file_time = File.mtime(cache_file_name) + expire_date = file_time + ttls + return true if expire_date > Time.now + + File.delete(cache_file_name) + end + + @log.debug("#{group_name} facts cache file expired/missing") + true + end + end + end +end + diff --git a/lib/facter/framework/core/cache_manager.rb b/lib/facter/framework/core/cache_manager.rb deleted file mode 100644 index 378babe647..0000000000 --- a/lib/facter/framework/core/cache_manager.rb +++ /dev/null @@ -1,148 +0,0 @@ -# frozen_string_literal: true - -module Facter - class CacheManager - def initialize - @groups = {} - @log = Log.new(self) - @fact_groups = Facter::FactGroups.new - @cache_dir = LegacyFacter::Util::Config.facts_cache_dir - end - - def augment_with_cache_group(searched_facts) - ttls = @fact_groups.facts_ttls - - searched_facts.each do |fact| - fact_name = if fact.file - File.basename(fact.file) - else - fact.name - end - - ttls.each do |fact_key, details| - fact.cache_group = details[:cache_group] if fact_name =~ /^#{fact_key}[\.]?.*/ - end - end - - puts "!!!" - end - - def resolve_facts(searched_facts) - return searched_facts, [] if (!File.directory?(@cache_dir) || !Options[:cache]) && Options[:ttls].any? - - facts = [] - searched_facts.delete_if do |searched_fact| - res = read_fact(searched_fact, searched_fact.cache_group) if searched_fact.cache_group - if res - facts << res - true - else - false - end - end - - [searched_facts, facts.flatten] - end - - def cache_facts(resolved_facts) - return unless Options[:cache] && Options[:ttls].any? - - resolved_facts - .select { |resolved_fact| resolved_fact.cache_group != nil } - .group_by { |resolved_fact| resolved_fact.cache_group } - .each do |group_name, array_of_facts| - @groups[group_name] ||= {} - array_of_facts.each { |resolved_fact| @groups[group_name][resolved_fact.name] = resolved_fact.value} - end - - begin - write_cache unless @groups.empty? - rescue Errno::EACCES => e - @log.warn("Could not write cache: #{e.message}") - end - end - - private - - - def read_fact(searched_fact, fact_group) - data = nil - Facter::Framework::Benchmarking::Timer.measure(searched_fact.name, 'cached') do - data = read_group_json(fact_group) - end - return unless data - - @log.debug("loading cached values for #{searched_fact.name} facts") - - create_facts(searched_fact, data) - end - - def create_facts(searched_fact, data) - if searched_fact.type == :file - facts = [] - data.each do |fact_name, fact_value| - fact = Facter::ResolvedFact.new(fact_name, fact_value, searched_fact.type, - searched_fact.user_query, searched_fact.filter_tokens, searched_fact.cache_group) - fact.file = searched_fact.file - facts << fact - end - facts - else - [Facter::ResolvedFact.new(searched_fact.name, data[searched_fact.name], searched_fact.type, - searched_fact.user_query, searched_fact.filter_tokens, searched_fact.cache_group)] - end - end - - def write_cache - unless File.directory?(@cache_dir) - require 'fileutils' - FileUtils.mkdir_p(@cache_dir) - end - - @groups.each do |group_name, data| - next unless check_ttls?(group_name, @fact_groups.get_group_ttls(group_name)) - - cache_file_name = File.join(@cache_dir, group_name) - next if File.readable?(cache_file_name) - - @log.debug("caching values for #{group_name} facts") - File.write(cache_file_name, JSON.pretty_generate(data)) - end - end - - def read_group_json(group_name) - return @groups[group_name] if @groups.key?(group_name) - - cache_file_name = File.join(@cache_dir, group_name) - data = nil - file = Util::FileHelper.safe_read(cache_file_name) - begin - data = JSON.parse(file) - rescue JSON::ParserError - delete_cache(group_name) - end - @groups[group_name] = data - end - - def check_ttls?(group_name, ttls) - return false unless ttls - - cache_file_name = File.join(@cache_dir, group_name) - if File.readable?(cache_file_name) - file_time = File.mtime(cache_file_name) - expire_date = file_time + ttls - return true if expire_date > Time.now - - File.delete(cache_file_name) - end - - @log.debug("#{group_name} facts cache file expired/missing") - true - end - - def delete_cache(group_name) - cache_file_name = File.join(@cache_dir, group_name) - File.delete(cache_file_name) if File.readable?(cache_file_name) - end - end -end diff --git a/lib/facter/framework/core/fact_manager.rb b/lib/facter/framework/core/fact_manager.rb index b189170079..c84699d016 100644 --- a/lib/facter/framework/core/fact_manager.rb +++ b/lib/facter/framework/core/fact_manager.rb @@ -20,15 +20,18 @@ def resolve_facts(user_query = []) loaded_facts = @fact_loader.load(Options.get) searched_facts = QueryParser.parse(user_query, loaded_facts) - cache_manager = Facter::CacheManager.new - cache_manager.augment_with_cache_group(searched_facts) - searched_facts, cached_facts = cache_manager.resolve_facts(searched_facts) + cache_augmenter = Facter::Cache::CacheAugmenter.new + cache_reader = Facter::Cache::CacheReader.new + cache_writer = Facter::Cache::CacheWriter.new + + cache_augmenter.augment_with_cache_group(searched_facts) + searched_facts, cached_facts = cache_reader.read_from_cache(searched_facts) internal_facts = @internal_fact_mgr.resolve_facts(searched_facts) external_facts = @external_fact_mgr.resolve_facts(searched_facts) resolved_facts = override_core_facts(internal_facts, external_facts) - cache_manager.cache_facts(resolved_facts) + cache_writer.cache_facts(resolved_facts) resolved_facts = resolved_facts.concat(cached_facts) FactFilter.new.filter_facts!(resolved_facts) diff --git a/lib/facter/framework/core/file_loader.rb b/lib/facter/framework/core/file_loader.rb index 69d52b27cf..5e2f63c7a5 100644 --- a/lib/facter/framework/core/file_loader.rb +++ b/lib/facter/framework/core/file_loader.rb @@ -37,6 +37,7 @@ def load_dir(*dirs) load_dir(%w[resolvers utils]) load_dir(['resolvers']) load_dir(['facts_utils']) +load_dir(%w[framework core cache]) load_dir(%w[framework core]) load_dir(['models']) load_dir(%w[framework benchmarking]) From 877fd0b4db50ae81f7ff77a6e312ff4738fd45bd Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Fri, 30 Oct 2020 18:38:13 +0200 Subject: [PATCH 9/9] (FACT-2848) Improve regex to allow child matching, exact matching and regex matching. --- lib/facter/framework/core/cache/cache_augmenter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/facter/framework/core/cache/cache_augmenter.rb b/lib/facter/framework/core/cache/cache_augmenter.rb index 1e95d061ef..e2bd9493c4 100644 --- a/lib/facter/framework/core/cache/cache_augmenter.rb +++ b/lib/facter/framework/core/cache/cache_augmenter.rb @@ -18,7 +18,7 @@ def augment_with_cache_group(searched_facts) end ttls.each do |fact_key, details| - fact.cache_group = details[:cache_group] if fact_name =~ /^#{fact_key}[\.]?.*/ + fact.cache_group = details[:cache_group] if fact_name =~ /^#{fact_key}\..*/ || fact_name =~ /^#{fact_key}$/ end end end