From a8b1a27727c1831a1c1322a83fc35e90dfef1686 Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Tue, 6 Oct 2020 14:49:51 +0300 Subject: [PATCH 1/2] (FACT-2817) Only invalidate session cache on clear and reset. --- lib/facter.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/facter.rb b/lib/facter.rb index 15d80c297d..a893931661 100644 --- a/lib/facter.rb +++ b/lib/facter.rb @@ -83,6 +83,7 @@ def clear Options[:custom_dir] = [] LegacyFacter.collection.invalidate_custom_facts LegacyFacter.collection.reload_custom_facts + SessionCache.invalidate_all_caches end def core_value(user_query) @@ -170,7 +171,6 @@ def debugging(debug_bool) def each log_blocked_facts resolved_facts = Facter::FactManager.instance.resolve_facts - SessionCache.invalidate_all_caches resolved_facts.each do |fact| yield(fact.name, fact.value) @@ -206,6 +206,7 @@ def reset LegacyFacter.reset Options[:custom_dir] = [] Options[:external_dir] = [] + SessionCache.invalidate_all_caches nil end @@ -270,7 +271,6 @@ def to_hash log_blocked_facts resolved_facts = Facter::FactManager.instance.resolve_facts - Facter::SessionCache.invalidate_all_caches Facter::FactCollection.new.build_fact_collection!(resolved_facts) end @@ -308,7 +308,6 @@ def value(user_query) def values(options, user_queries) init_cli_options(options, user_queries) resolved_facts = Facter::FactManager.instance.resolve_facts(user_queries) - Facter::SessionCache.invalidate_all_caches if user_queries.count.zero? Facter::FactCollection.new.build_fact_collection!(resolved_facts) @@ -336,7 +335,6 @@ def to_user_output(cli_options, *args) logger.info("executed with command line: #{ARGV.drop(1).join(' ')}") log_blocked_facts resolved_facts = Facter::FactManager.instance.resolve_facts(args) - SessionCache.invalidate_all_caches fact_formatter = Facter::FormatterFactory.build(Facter::Options.get) status = error_check(resolved_facts) @@ -426,7 +424,6 @@ def add_fact_to_searched_facts(user_query, value) def resolve_fact(user_query) user_query = user_query.to_s resolved_facts = Facter::FactManager.instance.resolve_facts([user_query]) - SessionCache.invalidate_all_caches # we must make a distinction between custom facts that return nil and nil facts # Nil facts should not be packaged as ResolvedFacts! (add_fact_to_searched_facts packages facts) resolved_facts = resolved_facts.reject { |fact| fact.type == :nil } From bb6357e2d55e5a79faac85988af7961c6b090803 Mon Sep 17 00:00:00 2001 From: BogdanIrimie Date: Wed, 7 Oct 2020 15:44:58 +0300 Subject: [PATCH 2/2] (FACT-2817) Add acceptance test for session cache. --- ...sion_cached_is_not_refershed_in_session.rb | 27 +++++++++++++++++++ custom_facts/my_custom_fact.rb | 1 - 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 acceptance/tests/session_cached_is_not_refershed_in_session.rb diff --git a/acceptance/tests/session_cached_is_not_refershed_in_session.rb b/acceptance/tests/session_cached_is_not_refershed_in_session.rb new file mode 100644 index 0000000000..ebc31533c5 --- /dev/null +++ b/acceptance/tests/session_cached_is_not_refershed_in_session.rb @@ -0,0 +1,27 @@ +test_name 'facter should not update it`s session cache in same session' do + tag 'risk:high' + + fact_content = <<-EOM + require 'facter' + + seconds_before = Facter.value('system_uptime.seconds') + sleep(3) + seconds_after = Facter.value('system_uptime.seconds') + + puts seconds_before == seconds_after + EOM + + agents.each do |agent| + fact_dir = agent.tmpdir('test_scripts') + script_path = File.join(fact_dir, 'session_test.rb') + create_remote_file(agent, script_path, fact_content) + + teardown do + agent.rm_rf(script_path) + end + + on(agent, "#{ruby_command(agent)} #{script_path}") do |ruby_result| + assert_equal('true', ruby_result.stdout.chomp, 'Expect the session cache is not reset in same session') + end + end +end diff --git a/custom_facts/my_custom_fact.rb b/custom_facts/my_custom_fact.rb index efa2522382..0bdddf1902 100644 --- a/custom_facts/my_custom_fact.rb +++ b/custom_facts/my_custom_fact.rb @@ -3,7 +3,6 @@ Facter.add(:my_custom_fact) do has_weight(10_000) setcode do - # 'my_custom_fact' Facter.value('os') end end