From 067105bbf8c33e5496d5daabbe229eb3b7e351eb Mon Sep 17 00:00:00 2001 From: Florin Dragos Date: Wed, 29 Apr 2020 11:27:30 +0300 Subject: [PATCH 01/11] (maint) Bump version to 4.0.18 (#479) --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9d58a584e..029696b10 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.0.17 +4.0.18 From fca56f18238943a398f92345260553b4f18eee22 Mon Sep 17 00:00:00 2001 From: Florin Dragos Date: Wed, 29 Apr 2020 12:04:57 +0300 Subject: [PATCH 02/11] (maint) Update Changelog with Facter 4.0.18 (#480) --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3200db76e..7bc716167 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ +## [4.0.18](https://github.com/puppetlabs/facter-ng/tree/4.0.18) (2020-04-24) + +[Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.17...4.0.18) + +### Added + +- \(FACT-2564\) Add support for zpool\_featureflags and fix zpool\_version [\#443](https://github.com/puppetlabs/facter-ng/pull/443) ([smortex](https://github.com/smortex)) + +### Fixed + +- \(FACT-2553\) remove double backslashes from windows path [\#456](https://github.com/puppetlabs/facter-ng/pull/456) ([oanatmaria](https://github.com/oanatmaria)) +- \(FACT-2559\) Fix Facter.debugging? call when Facter not fully loaded [\#455](https://github.com/puppetlabs/facter-ng/pull/455) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) + + + ## [4.0.17](https://github.com/puppetlabs/facter-ng/tree/4.0.17) (2020-04-21) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.16...4.0.17) From a341e9ce8bbc90a8a2fe8de3e35fc3e2655a390a Mon Sep 17 00:00:00 2001 From: Bogdan Irimie Date: Wed, 29 Apr 2020 12:11:26 +0300 Subject: [PATCH 03/11] (maint) Build absolute path for os hierarchy json. (#481) --- lib/framework/detector/os_hierarchy.rb | 2 +- spec/framework/detector/os_hierarchy_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/framework/detector/os_hierarchy.rb b/lib/framework/detector/os_hierarchy.rb index 0b227df3e..294ae59aa 100644 --- a/lib/framework/detector/os_hierarchy.rb +++ b/lib/framework/detector/os_hierarchy.rb @@ -4,7 +4,7 @@ module Facter class OsHierarchy def initialize @log = Log.new(self) - json_file = Util::FileHelper.safe_read('os_hierarchy.json') + json_file = Util::FileHelper.safe_read(File.join(ROOT_DIR, 'os_hierarchy.json')) begin @json_os_hierarchy = JSON.parse(json_file) diff --git a/spec/framework/detector/os_hierarchy_spec.rb b/spec/framework/detector/os_hierarchy_spec.rb index df5daf166..325f4d16e 100644 --- a/spec/framework/detector/os_hierarchy_spec.rb +++ b/spec/framework/detector/os_hierarchy_spec.rb @@ -6,7 +6,7 @@ before do allow(Facter::Util::FileHelper) .to receive(:safe_read) - .with('os_hierarchy.json') + .with(File.join(ROOT_DIR, 'os_hierarchy.json')) .and_return(load_fixture('os_hierarchy').read) allow(Facter::Log).to receive(:new).and_return(log) end @@ -18,7 +18,7 @@ before do allow(Facter::Util::FileHelper) .to receive(:safe_read) - .with('os_hierarchy.json') + .with(File.join(ROOT_DIR, 'os_hierarchy.json')) .and_return(load_fixture('broken_os_hierarchy').read) end From 489bdb7f0558f512faeb91805905fc2a0f24c714 Mon Sep 17 00:00:00 2001 From: Filipovici-Andrei Date: Wed, 29 Apr 2020 12:50:38 +0300 Subject: [PATCH 04/11] (FACT-2542) refactored some tests, but they this is not complete (#478) Co-authored-by: Andrei Filipovici Co-authored-by: Bogdan Irimie --- lib/facts/debian/os/distro/codename.rb | 4 +- spec/facter/facter_spec.rb | 310 ++++++++++--------------- 2 files changed, 129 insertions(+), 185 deletions(-) diff --git a/lib/facts/debian/os/distro/codename.rb b/lib/facts/debian/os/distro/codename.rb index c0e055070..2135ad8d2 100644 --- a/lib/facts/debian/os/distro/codename.rb +++ b/lib/facts/debian/os/distro/codename.rb @@ -9,12 +9,12 @@ class Codename def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:version_codename) - fact_value ||= retreieve_from_version + fact_value ||= retrieve_from_version Facter::ResolvedFact.new(FACT_NAME, fact_value) end - def retreieve_from_version + def retrieve_from_version version = Facter::Resolvers::OsRelease.resolve(:version) return unless version diff --git a/spec/facter/facter_spec.rb b/spec/facter/facter_spec.rb index ce891e511..fa7736fc4 100644 --- a/spec/facter/facter_spec.rb +++ b/spec/facter/facter_spec.rb @@ -36,98 +36,86 @@ Facter.remove_instance_variable(:@logger) end + def mock_fact_manager(method, return_value) + allow(fact_manager_spy).to receive(method).and_return(return_value) + allow(fact_collection_spy) + .to receive(:build_fact_collection!) + .with(return_value) + .and_return(return_value.empty? ? empty_fact_collection : fact_collection_spy) + end + + def mock_collection(method, os_name = nil, error = nil) + if error + allow(fact_collection_spy).to receive(method).with('os', 'name').and_raise(error) + else + allow(fact_collection_spy).to receive(method).with('os', 'name').and_return(os_name) + end + end + describe '#to_hash' do it 'returns one resolved fact' do - allow(fact_manager_spy).to receive(:resolve_facts).and_return([os_fact]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([os_fact]) - .and_return(fact_collection_spy) + mock_fact_manager(:resolve_facts, [os_fact]) - resolved_facts_hash = Facter.to_hash - expect(resolved_facts_hash).to eq(fact_collection_spy) + expect(Facter.to_hash).to eq(fact_collection_spy) end it 'return no resolved facts' do - allow(fact_manager_spy).to receive(:resolve_facts).and_return([]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([]) - .and_return(empty_fact_collection) + mock_fact_manager(:resolve_facts, []) - resolved_facts_hash = Facter.to_hash - expect(resolved_facts_hash).to eq(empty_fact_collection) + expect(Facter.to_hash).to eq(empty_fact_collection) end end describe '#to_user_output' do - it 'returns one fact and status 0' do - user_query = 'os.name' - expected_json_output = '{"os" : {"name": "ubuntu"}' - - allow(fact_manager_spy).to receive(:resolve_facts).and_return([os_fact]) + before do |example| + resolved_fact = example.metadata[:resolved_fact] ? [os_fact] : [] + expected_json_output = example.metadata[:resolved_fact] ? '{"os" : {"name": "ubuntu"}' : '{}' + allow(fact_manager_spy).to receive(:resolve_facts).and_return(resolved_fact) json_fact_formatter = double(Facter::JsonFactFormatter) - allow(json_fact_formatter).to receive(:format).with([os_fact]).and_return(expected_json_output) - + allow(json_fact_formatter).to receive(:format).with(resolved_fact).and_return(expected_json_output) allow(Facter::FormatterFactory).to receive(:build).and_return(json_fact_formatter) + end + + it 'returns one fact and status 0', resolved_fact: true do + user_query = 'os.name' + expected_json_output = '{"os" : {"name": "ubuntu"}' formated_facts = Facter.to_user_output({}, [user_query]) + expect(formated_facts).to eq([expected_json_output, 0]) end - it 'returns no facts and status 0' do + it 'returns no facts and status 0', resolved_fact: false do user_query = 'os.name' expected_json_output = '{}' - allow(fact_manager_spy).to receive(:resolve_facts).and_return([]) - - json_fact_formatter = double(Facter::JsonFactFormatter) - allow(json_fact_formatter).to receive(:format).with([]).and_return(expected_json_output) - - allow(Facter::FormatterFactory).to receive(:build).and_return(json_fact_formatter) - formatted_facts = Facter.to_user_output({}, [user_query]) + expect(formatted_facts).to eq([expected_json_output, 0]) end context 'when provided with --strict option' do - before do - allow(Facter::Options).to receive(:[]).with(:config) - end - - it 'returns no fact and status 1' do + it 'returns no fact and status 1', resolved_fact: false do user_query = ['os.name', 'missing_fact'] expected_json_output = '{}' - - allow(fact_manager_spy).to receive(:resolve_facts).and_return([]) allow(Facter::Options).to receive(:[]).and_call_original allow(Facter::Options).to receive(:[]).with(:strict).and_return(true) allow(OsDetector).to receive(:detect).and_return(:solaris) - json_fact_formatter = double(Facter::JsonFactFormatter) - allow(json_fact_formatter).to receive(:format).and_return(expected_json_output) - - allow(Facter::FormatterFactory).to receive(:build).and_return(json_fact_formatter) - formatted_facts = Facter.to_user_output({}, *user_query) + expect(formatted_facts).to eq([expected_json_output, 1]) end - it 'returns one fact and status 0' do + it 'returns one fact and status 0', resolved_fact: true do user_query = 'os.name' expected_json_output = '{"os" : {"name": "ubuntu"}' - - allow(Facter::Options).to receive(:[]).with(:anything) + allow(Facter::Options).to receive(:[]).with(anything) allow(Facter::Options).to receive(:[]).with(:strict).and_return(true) - allow(fact_manager_spy).to receive(:resolve_facts).and_return([os_fact]) - - json_fact_formatter = double(Facter::JsonFactFormatter) - allow(json_fact_formatter).to receive(:format).with([os_fact]).and_return(expected_json_output) - - allow(Facter::FormatterFactory).to receive(:build).and_return(json_fact_formatter) formated_facts = Facter.to_user_output({}, user_query) + expect(formated_facts).to eq([expected_json_output, 0]) end end @@ -135,195 +123,148 @@ describe '#value' do it 'returns a value' do - user_query = 'os.name' - - allow(fact_manager_spy).to receive(:resolve_facts).and_return([os_fact]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([os_fact]) - .and_return(fact_collection_spy) - allow(fact_collection_spy).to receive(:value).with('os', 'name').and_return('Ubuntu') + mock_fact_manager(:resolve_facts, [os_fact]) + mock_collection(:value, 'Ubuntu') - resolved_facts_hash = Facter.value(user_query) - expect(resolved_facts_hash).to eq('Ubuntu') + expect(Facter.value('os.name')).to eq('Ubuntu') end it 'return no value' do - user_query = 'os.name' - - allow(fact_manager_spy).to receive(:resolve_facts).and_return([]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([]) - .and_return(empty_fact_collection) - allow(fact_collection_spy).to receive(:value).with('os', 'name').and_return(nil) + mock_fact_manager(:resolve_facts, []) + mock_collection(:value, nil) - resolved_facts_hash = Facter.value(user_query) - expect(resolved_facts_hash).to be nil + expect(Facter.value('os.name')).to be nil end end describe '#fact' do it 'returns a fact' do - user_query = 'os.name' - - allow(fact_manager_spy).to receive(:resolve_facts).and_return([os_fact]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([os_fact]) - .and_return(fact_collection_spy) - allow(fact_collection_spy).to receive(:value).with('os', 'name').and_return('Ubuntu') + mock_fact_manager(:resolve_facts, [os_fact]) + mock_collection(:value, 'Ubuntu') - result = Facter.fact(user_query) - expect(result).to be_instance_of(Facter::ResolvedFact).and(having_attributes(value: 'Ubuntu')) + expect(Facter.fact('os.name')).to be_instance_of(Facter::ResolvedFact).and have_attributes(value: 'Ubuntu') end it 'can be interpolated' do - user_query = 'os.name' + mock_fact_manager(:resolve_facts, [os_fact]) + mock_collection(:value, 'Ubuntu') - allow(fact_manager_spy).to receive(:resolve_facts).and_return([os_fact]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([os_fact]) - .and_return(fact_collection_spy) - allow(fact_collection_spy).to receive(:value).with('os', 'name').and_return('Ubuntu') # rubocop:disable Style/UnneededInterpolation - expect("#{Facter.fact(user_query)}").to eq('Ubuntu') + expect("#{Facter.fact('os.name')}").to eq('Ubuntu') # rubocop:enable Style/UnneededInterpolation end - it 'return no value' do - user_query = 'os.name' + it 'returns no value' do + mock_fact_manager(:resolve_facts, []) + mock_collection(:value, nil, key_error) - allow(fact_manager_spy).to receive(:resolve_facts).and_return([]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([]) - .and_return(fact_collection_spy) - - allow(fact_collection_spy).to receive(:value).with('os', 'name').and_raise(key_error) - - result = Facter.fact(user_query) - expect(result).to be_nil + expect(Facter.fact('os.name')).to be_nil end end describe '#[]' do it 'returns a fact' do - user_query = 'os.name' + mock_fact_manager(:resolve_facts, [os_fact]) + mock_collection(:value, 'Ubuntu') - allow(fact_manager_spy).to receive(:resolve_facts).and_return([os_fact]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([os_fact]) - .and_return(fact_collection_spy) - allow(fact_collection_spy).to receive(:value).with('os', 'name').and_return('Ubuntu') - - result = Facter[user_query] - expect(result).to be_instance_of(Facter::ResolvedFact).and(having_attributes(value: 'Ubuntu')) + expect(Facter['os.name']).to be_instance_of(Facter::ResolvedFact).and(having_attributes(value: 'Ubuntu')) end it 'return no value' do - user_query = 'os.name' + mock_fact_manager(:resolve_facts, []) + mock_collection(:value, nil, key_error) - allow(fact_manager_spy).to receive(:resolve_facts).and_return([]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([]) - .and_return(fact_collection_spy) - allow(fact_collection_spy).to receive(:value).with('os', 'name').and_raise(key_error) - - result = Facter[user_query] - expect(result).to be_nil + expect(Facter['os.name']).to be_nil end end describe '#core_value' do it 'searched in core facts and returns a value' do - user_query = 'os.name' - - allow(fact_manager_spy).to receive(:resolve_core).and_return([os_fact]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([os_fact]) - .and_return(fact_collection_spy) - allow(fact_collection_spy).to receive(:dig).with('os', 'name').and_return('Ubuntu') + mock_fact_manager(:resolve_core, [os_fact]) + mock_collection(:dig, 'Ubuntu') - resolved_facts_hash = Facter.core_value(user_query) - expect(resolved_facts_hash).to eq('Ubuntu') + expect(Facter.core_value('os.name')).to eq('Ubuntu') end - it 'searches ion core facts and return no value' do - user_query = 'os.name' - - allow(fact_manager_spy).to receive(:resolve_core).and_return([]) - allow(fact_collection_spy) - .to receive(:build_fact_collection!) - .with([]) - .and_return(fact_collection_spy) - allow(fact_collection_spy).to receive(:dig).with('os', 'name').and_return(nil) + it 'searches os core fact and returns no value' do + mock_fact_manager(:resolve_core, []) + mock_collection(:dig, nil) - resolved_facts_hash = Facter.core_value(user_query) - expect(resolved_facts_hash).to be nil + expect(Facter.core_value('os.name')).to be nil end end - describe '#clear' do - it 'sends call to LegacyFacter' do - expect(LegacyFacter).to receive(:clear).once - Facter.clear + describe 'LegacyFacter methods' do + before do + allow(LegacyFacter).to receive(:clear) + end + + describe '#clear' do + it 'sends call to LegacyFacter' do + Facter.clear + expect(LegacyFacter).to have_received(:clear).once + end end - end - describe '#search' do - it 'sends call to Facter::Options' do - dirs = ['/dir1', '/dir2'] + describe '#search' do + it 'sends call to Facter::Options' do + dirs = ['/dir1', '/dir2'] - expect(Facter::Options).to receive(:[]=).with(:custom_dir, dirs) - Facter.search(*dirs) + expect(Facter::Options).to receive(:[]=).with(:custom_dir, dirs) + Facter.search(*dirs) + end end - end - describe '#search_path' do - it 'sends call to Facter::Options' do - expect(Facter::Options).to receive(:custom_dir).once - Facter.search_path + describe '#search_path' do + it 'sends call to Facter::Options' do + expect(Facter::Options).to receive(:custom_dir).once + Facter.search_path + end end - end - describe '#search_external' do - it 'sends call to Facter::Options' do - dirs = ['/dir1', '/dir2'] - expect(Facter::Options).to receive(:[]=).with(:external_dir, dirs) + describe '#search_external' do + it 'sends call to Facter::Options' do + dirs = ['/dir1', '/dir2'] + expect(Facter::Options).to receive(:[]=).with(:external_dir, dirs) - Facter.search_external(dirs) + Facter.search_external(dirs) + end end - end - describe '#search_external_path' do - it 'sends call to Facter::Options' do - expect(Facter::Options).to receive(:external_dir).once - Facter.search_external_path - end - end + describe '#search_external_path' do + it 'sends call to Facter::Options' do + allow(Facter::Options).to receive(:external_dir) - describe '#reset' do - it 'sends call to LegacyFacter' do - allow(LegacyFacter).to receive(:reset) - Facter.reset - expect(LegacyFacter).to have_received(:reset).once - end + Facter.search_external_path - it 'adds custom facts dirs' do - allow(Facter::Options).to receive(:[]=) - Facter.reset - expect(Facter::Options).to have_received(:[]=).with(:custom_dir, []) + expect(Facter::Options).to have_received(:external_dir).once + end end - it 'add external facts dirs' do - allow(Facter::Options).to receive(:[]=) - Facter.reset - expect(Facter::Options).to have_received(:[]=).with(:external_dir, []) + describe '#reset' do + it 'sends call to LegacyFacter' do + allow(LegacyFacter).to receive(:reset) + + Facter.reset + + expect(LegacyFacter).to have_received(:reset).once + end + + it 'adds custom facts dirs' do + allow(Facter::Options).to receive(:[]=) + + Facter.reset + + expect(Facter::Options).to have_received(:[]=).with(:custom_dir, []) + end + + it 'add external facts dirs' do + allow(Facter::Options).to receive(:[]=) + + Facter.reset + + expect(Facter::Options).to have_received(:[]=).with(:external_dir, []) + end end end @@ -355,6 +296,7 @@ it 'logs a debug message' do allow(logger).to receive(:debug).with('test') + expect(Facter.debug(message)).to be(nil) end end @@ -400,7 +342,9 @@ it 'format exception to display backtrace' do exception.set_backtrace("prog.rb:2:in `a'") + Facter.log_exception(exception, message) + expect(logger).to have_received(:error).with(expected_message) end end From 3ce398d1c655792ab6b3b010670c71d79c1da654 Mon Sep 17 00:00:00 2001 From: Florin Dragos Date: Wed, 29 Apr 2020 14:47:17 +0300 Subject: [PATCH 05/11] (maint) Changelog update for 4.0.19 (#482) --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bc716167..813803764 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ +## [4.0.19](https://github.com/puppetlabs/facter-ng/tree/4.0.19) (2020-04-29) + +[Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.18...4.0.19) + +### Added + +- \(FACT-2555\)Create OS hierarchy and mechanism for loading it [\#470](https://github.com/puppetlabs/facter-ng/pull/470) ([IrimieBogdan](https://github.com/IrimieBogdan)) +- \(FACT-2552\) Add Solaris processors facts [\#451](https://github.com/puppetlabs/facter-ng/pull/451) ([oanatmaria](https://github.com/oanatmaria)) +- \(Fact 2486\) Add facts cache [\#430](https://github.com/puppetlabs/facter-ng/pull/430) ([florindragos](https://github.com/florindragos)) + +### Fixed + +- \(FACT-2585\) Mountpoints fact returns ASCI-8BIT instead of UTF-8 in some cases [\#472](https://github.com/puppetlabs/facter-ng/pull/472) ([IrimieBogdan](https://github.com/IrimieBogdan)) +- \(FACT-2570\) Use Facter options to store custom and external facts [\#467](https://github.com/puppetlabs/facter-ng/pull/467) ([IrimieBogdan](https://github.com/IrimieBogdan)) +- \(FACT-2565\) Debian development versions causes fatal error when resolving os.release [\#466](https://github.com/puppetlabs/facter-ng/pull/466) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) + + + ## [4.0.18](https://github.com/puppetlabs/facter-ng/tree/4.0.18) (2020-04-24) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.17...4.0.18) From 3eae28e37f7835cf303eb871c65d7d951a9bd428 Mon Sep 17 00:00:00 2001 From: Jenkins CI Date: Wed, 29 Apr 2020 11:54:11 +0000 Subject: [PATCH 06/11] (GEM) update facter version to 4.0.19 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 029696b10..805226c5a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.0.18 +4.0.19 From 186120f6a5041974e2f903cce59cd22d5e8fb91e Mon Sep 17 00:00:00 2001 From: oanatmaria <49147761+oanatmaria@users.noreply.github.com> Date: Wed, 29 Apr 2020 17:45:46 +0300 Subject: [PATCH 07/11] (FACT-2530) Fix for tests/facts/os_processors_and_kernel.rb (#449) --- lib/facts/debian/os/distro/release.rb | 27 ++++++---- lib/facts/debian/os/release.rb | 32 ++++++----- lib/resolvers/os_release_resolver.rb | 5 ++ .../facts/debian/os/distro/release_spec.rb | 4 +- spec/facter/facts/debian/os/release_spec.rb | 2 +- .../resolvers/os_release_resolver_spec.rb | 54 ++++++++++++++----- spec/fixtures/debian_os_release | 9 ++++ 7 files changed, 94 insertions(+), 39 deletions(-) create mode 100644 spec/fixtures/debian_os_release diff --git a/lib/facts/debian/os/distro/release.rb b/lib/facts/debian/os/distro/release.rb index cc7e8c6fb..b041bcd24 100644 --- a/lib/facts/debian/os/distro/release.rb +++ b/lib/facts/debian/os/distro/release.rb @@ -10,14 +10,7 @@ class Release def call_the_resolver fact_value = determine_release_for_os - return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value - - versions = fact_value.split('.') - release = {} - release['full'] = fact_value - release['major'] = versions[0] - release['minor'] = versions[1].gsub(/^0([1-9])/, '\1') if versions[1] - Facter::ResolvedFact.new(FACT_NAME, release) + Facter::ResolvedFact.new(FACT_NAME, fact_value) end private @@ -26,9 +19,23 @@ def determine_release_for_os os_name = Facter::Resolvers::OsRelease.resolve(:name) if os_name =~ /Debian|Raspbian/ - Facter::Resolvers::DebianVersion.resolve(:version) + release = Facter::Resolvers::DebianVersion.resolve(:version) + return unless release + + versions = release.split('.') + fact_value = {} + fact_value['full'] = release + fact_value['major'] = versions[0] + fact_value['minor'] = versions[1].gsub(/^0([1-9])/, '\1') if versions[1] + fact_value else - Facter::Resolvers::OsRelease.resolve(:version_id) + release = Facter::Resolvers::OsRelease.resolve(:version_id) + return unless release + + { + 'full' => release, + 'major' => release + } end end end diff --git a/lib/facts/debian/os/release.rb b/lib/facts/debian/os/release.rb index 3c1aa5e6d..06b0b041c 100644 --- a/lib/facts/debian/os/release.rb +++ b/lib/facts/debian/os/release.rb @@ -10,17 +10,11 @@ class Release def call_the_resolver fact_value = determine_release_for_os - return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value + return Facter::ResolvedFact.new(FACT_NAME, fact_value) unless fact_value - versions = fact_value.split('.') - release = {} - release['full'] = fact_value - release['major'] = versions[0] - release['minor'] = versions[1].gsub(/^0([1-9])/, '\1') if versions[1] - - [Facter::ResolvedFact.new(FACT_NAME, release), - Facter::ResolvedFact.new(ALIASES.first, versions[0], :legacy), - Facter::ResolvedFact.new(ALIASES.last, fact_value, :legacy)] + [Facter::ResolvedFact.new(FACT_NAME, fact_value), + Facter::ResolvedFact.new(ALIASES.first, fact_value['major'], :legacy), + Facter::ResolvedFact.new(ALIASES.last, fact_value['full'], :legacy)] end private @@ -29,9 +23,23 @@ def determine_release_for_os os_name = Facter::Resolvers::OsRelease.resolve(:name) if os_name =~ /Debian|Raspbian/ - Facter::Resolvers::DebianVersion.resolve(:version) + release = Facter::Resolvers::DebianVersion.resolve(:version) + return unless release + + versions = release.split('.') + fact_value = {} + fact_value['full'] = release + fact_value['major'] = versions[0] + fact_value['minor'] = versions[1].gsub(/^0([1-9])/, '\1') if versions[1] + fact_value else - Facter::Resolvers::OsRelease.resolve(:version_id) + release = Facter::Resolvers::OsRelease.resolve(:version_id) + return unless release + + { + 'full' => release, + 'major' => release + } end end end diff --git a/lib/resolvers/os_release_resolver.rb b/lib/resolvers/os_release_resolver.rb index 6d9c94781..b6e3139ad 100644 --- a/lib/resolvers/os_release_resolver.rb +++ b/lib/resolvers/os_release_resolver.rb @@ -36,6 +36,7 @@ def read_os_release_file(fact_name) fill_fact_list(pairs) process_name + pad_version_id @fact_list[fact_name] end @@ -47,6 +48,10 @@ def fill_fact_list(pairs) @fact_list[:identifier] = @fact_list[:id] end + def pad_version_id + @fact_list[:version_id] = "#{@fact_list[:version_id]}.0" unless @fact_list[:version_id] =~ /\./ + end + def process_name return unless @fact_list[:name] diff --git a/spec/facter/facts/debian/os/distro/release_spec.rb b/spec/facter/facts/debian/os/distro/release_spec.rb index 49457dfb5..25dab0e3f 100644 --- a/spec/facter/facts/debian/os/distro/release_spec.rb +++ b/spec/facter/facts/debian/os/distro/release_spec.rb @@ -26,9 +26,9 @@ let(:os_name) { 'Ubuntu' } - context 'when version_id is retrieved successfully' do + context 'when version_id is retrieved successful' do let(:os_release_value) { '18.04' } - let(:fact_value) { { 'full' => '18.04', 'major' => '18', 'minor' => '4' } } + let(:fact_value) { { 'full' => '18.04', 'major' => '18.04' } } it_behaves_like 'calls Facter::Resolvers::OsRelease with :name' diff --git a/spec/facter/facts/debian/os/release_spec.rb b/spec/facter/facts/debian/os/release_spec.rb index 47d8a95df..a1f17e546 100644 --- a/spec/facter/facts/debian/os/release_spec.rb +++ b/spec/facter/facts/debian/os/release_spec.rb @@ -41,7 +41,7 @@ context 'when version_id is retrieved successful' do let(:os_release_value) { '18.04' } - let(:fact_value) { { 'full' => '18.04', 'major' => '18', 'minor' => '4' } } + let(:fact_value) { { 'full' => '18.04', 'major' => '18.04' } } it_behaves_like 'calls Facter::Resolvers::OsRelease with :name' diff --git a/spec/facter/resolvers/os_release_resolver_spec.rb b/spec/facter/resolvers/os_release_resolver_spec.rb index 0a8e22e31..bb821e91b 100644 --- a/spec/facter/resolvers/os_release_resolver_spec.rb +++ b/spec/facter/resolvers/os_release_resolver_spec.rb @@ -1,16 +1,18 @@ # frozen_string_literal: true describe Facter::Resolvers::OsRelease do - context 'when /etc/os-release file is readable' do - before do - allow(Facter::Util::FileHelper).to receive(:safe_readlines) - .with('/etc/os-release') - .and_return(load_fixture('os_release').readlines) - end + after do + Facter::Resolvers::OsRelease.invalidate_cache + end - after do - Facter::Resolvers::OsRelease.invalidate_cache - end + before do + allow(Facter::Util::FileHelper).to receive(:safe_readlines) + .with('/etc/os-release') + .and_return(os_release_content) + end + + context 'when on Ubuntu' do + let(:os_release_content) { load_fixture('os_release').readlines } it 'returns os NAME' do result = Facter::Resolvers::OsRelease.resolve(:name) @@ -38,11 +40,7 @@ end context 'when /etc/os-release file is not readable' do - before do - allow(Facter::Util::FileHelper).to receive(:safe_readlines) - .with('/etc/os-release') - .and_return([]) - end + let(:os_release_content) { [] } it 'returns nil' do result = Facter::Resolvers::OsRelease.resolve(:version_codename) @@ -50,4 +48,32 @@ expect(result).to be(nil) end end + + context 'when on Debian' do + let(:os_release_content) { load_fixture('debian_os_release').readlines } + + it 'returns os NAME' do + result = Facter::Resolvers::OsRelease.resolve(:name) + + expect(result).to eq('Debian') + end + + it 'returns os PRETTY_NAME' do + result = Facter::Resolvers::OsRelease.resolve(:pretty_name) + + expect(result).to eq('Debian GNU/Linux 10 (buster)') + end + + it 'returns os VERSION_ID with padded 0' do + result = Facter::Resolvers::OsRelease.resolve(:version_id) + + expect(result).to eq('10.0') + end + + it 'returns os VERSION_CODENAME' do + result = Facter::Resolvers::OsRelease.resolve(:version_codename) + + expect(result).to eq('buster') + end + end end diff --git a/spec/fixtures/debian_os_release b/spec/fixtures/debian_os_release new file mode 100644 index 000000000..9dec8014a --- /dev/null +++ b/spec/fixtures/debian_os_release @@ -0,0 +1,9 @@ +PRETTY_NAME="Debian GNU/Linux 10 (buster)" +NAME="Debian GNU/Linux" +VERSION_ID="10" +VERSION="10 (buster)" +VERSION_CODENAME=buster +ID=debian +HOME_URL="https://www.debian.org/" +SUPPORT_URL="https://www.debian.org/support" +BUG_REPORT_URL="https://bugs.debian.org/" \ No newline at end of file From 717e08e2c155b633eda05c68ce9b451e85bb1a1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Tarti=C3=A8re?= Date: Wed, 29 Apr 2020 04:55:45 -1000 Subject: [PATCH 08/11] (maint) Add support for *BSD load averages (#460) --- .rubocop_todo.yml | 6 +++-- lib/facts/bsd/load_averages.rb | 14 ++++++++++ lib/resolvers/bsd/ffi/ffi_helper.rb | 25 ++++++++++++++++++ lib/resolvers/bsd/load_averages_resolver.rb | 26 +++++++++++++++++++ spec/facter/facts/bsd/load_averages_spec.rb | 23 ++++++++++++++++ spec/facter/resolvers/bsd/ffi_helper_spec.rb | 26 +++++++++++++++++++ .../bsd/load_averages_resolver_spec.rb | 16 ++++++++++++ 7 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 lib/facts/bsd/load_averages.rb create mode 100644 lib/resolvers/bsd/ffi/ffi_helper.rb create mode 100644 lib/resolvers/bsd/load_averages_resolver.rb create mode 100644 spec/facter/facts/bsd/load_averages_spec.rb create mode 100644 spec/facter/resolvers/bsd/ffi_helper_spec.rb create mode 100644 spec/facter/resolvers/bsd/load_averages_resolver_spec.rb diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 8078b8503..af1940bb2 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -6,7 +6,7 @@ # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. -# Offense count: 80 +# Offense count: 81 # Configuration parameters: CustomTransform, IgnoreMethods. RSpec/FilePath: Exclude: @@ -37,6 +37,7 @@ RSpec/FilePath: - 'spec/facter/resolvers/aix/architecture_resolver_spec.rb' - 'spec/facter/resolvers/aix/ffi_helper_spec.rb' - 'spec/facter/resolvers/aix/hardware_resolver_spec.rb' + - 'spec/facter/resolvers/bsd/ffi_helper_spec.rb' - 'spec/facter/resolvers/disk_resolver_spec.rb' - 'spec/facter/resolvers/dmi_resolver_spec.rb' - 'spec/facter/resolvers/filesystems_resolver_spec.rb' @@ -191,7 +192,7 @@ RSpec/SubjectStub: - 'spec/custom_facts/util/fact_spec.rb' - 'spec/custom_facts/util/resolution_spec.rb' -# Offense count: 169 +# Offense count: 180 # Configuration parameters: IgnoreNameless, IgnoreSymbolicNames. RSpec/VerifiedDoubles: Exclude: @@ -227,6 +228,7 @@ RSpec/VerifiedDoubles: - 'spec/facter/resolvers/aix/architecture_resolver_spec.rb' - 'spec/facter/resolvers/aix/ffi_helper_spec.rb' - 'spec/facter/resolvers/aix/hardware_resolver_spec.rb' + - 'spec/facter/resolvers/bsd/ffi_helper_spec.rb' - 'spec/facter/resolvers/macosx/mountpoints_resolver_spec.rb' - 'spec/facter/resolvers/mountpoints_resolver_spec.rb' - 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb' diff --git a/lib/facts/bsd/load_averages.rb b/lib/facts/bsd/load_averages.rb new file mode 100644 index 000000000..4a6ea615f --- /dev/null +++ b/lib/facts/bsd/load_averages.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Facts + module Bsd + class LoadAverages + FACT_NAME = 'load_averages' + + def call_the_resolver + fact_value = Facter::Resolvers::Bsd::LoadAverages.resolve(:load_averages) + Facter::ResolvedFact.new(FACT_NAME, fact_value) + end + end + end +end diff --git a/lib/resolvers/bsd/ffi/ffi_helper.rb b/lib/resolvers/bsd/ffi/ffi_helper.rb new file mode 100644 index 000000000..bf013b33e --- /dev/null +++ b/lib/resolvers/bsd/ffi/ffi_helper.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require 'ffi' + +module Facter + module Bsd + module FfiHelper + module Libc + extend FFI::Library + + ffi_lib 'c' + attach_function :getloadavg, %i[pointer int], :int + end + + def self.read_load_averages + raw_loadavg = FFI::MemoryPointer.new(:double, 3) + + res = Libc.getloadavg(raw_loadavg, 3) + return unless res == 3 + + raw_loadavg.read_array_of_double(res) + end + end + end +end diff --git a/lib/resolvers/bsd/load_averages_resolver.rb b/lib/resolvers/bsd/load_averages_resolver.rb new file mode 100644 index 000000000..b77f3b77c --- /dev/null +++ b/lib/resolvers/bsd/load_averages_resolver.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module Facter + module Resolvers + module Bsd + class LoadAverages < BaseResolver + @semaphore = Mutex.new + @fact_list ||= {} + class << self + private + + def post_resolve(fact_name) + @fact_list.fetch(fact_name) { read_load_averages(fact_name) } + end + + def read_load_averages(fact_name) + require_relative 'ffi/ffi_helper' + @fact_list[:load_averages] = %w[1m 5m 15m].zip(Facter::Bsd::FfiHelper.read_load_averages).to_h + + @fact_list[fact_name] + end + end + end + end + end +end diff --git a/spec/facter/facts/bsd/load_averages_spec.rb b/spec/facter/facts/bsd/load_averages_spec.rb new file mode 100644 index 000000000..8815ba90e --- /dev/null +++ b/spec/facter/facts/bsd/load_averages_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +describe Facts::Bsd::LoadAverages do + describe '#call_the_resolver' do + subject(:fact) { Facts::Bsd::LoadAverages.new } + + let(:value) { { '1m' => 0.01, '5m' => 0.02, '15m' => 0.03 } } + + before do + allow(Facter::Resolvers::Bsd::LoadAverages).to receive(:resolve).with(:load_averages).and_return(value) + end + + it 'calls Facter::Resolvers::Bsd::LoadAverages' do + fact.call_the_resolver + expect(Facter::Resolvers::Bsd::LoadAverages).to have_received(:resolve).with(:load_averages) + end + + it 'returns load_averages fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'load_averages', value: value) + end + end +end diff --git a/spec/facter/resolvers/bsd/ffi_helper_spec.rb b/spec/facter/resolvers/bsd/ffi_helper_spec.rb new file mode 100644 index 000000000..8ddb6d429 --- /dev/null +++ b/spec/facter/resolvers/bsd/ffi_helper_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +describe Facter::Bsd::FfiHelper do + let(:averages) { double('FFI::MemoryPointer') } + + before do + allow(FFI::MemoryPointer).to receive(:new).with(:double, 3).and_return(averages) + allow(averages).to receive(:size).and_return(24) + end + + after do + Facter::Resolvers::Bsd::LoadAverages.invalidate_cache + end + + it 'returns load average' do + allow(Facter::Bsd::FfiHelper::Libc).to receive(:getloadavg).and_return(3) + allow(averages).to receive(:read_array_of_double).with(3).and_return([0.19482421875, 0.2744140625, 0.29296875]) + + expect(Facter::Bsd::FfiHelper.read_load_averages).to eq([0.19482421875, 0.2744140625, 0.29296875]) + end + + it 'does not return load average' do + allow(Facter::Bsd::FfiHelper::Libc).to receive(:getloadavg).and_return(-1) + expect(Facter::Bsd::FfiHelper.read_load_averages).to be_nil + end +end diff --git a/spec/facter/resolvers/bsd/load_averages_resolver_spec.rb b/spec/facter/resolvers/bsd/load_averages_resolver_spec.rb new file mode 100644 index 000000000..1fad37062 --- /dev/null +++ b/spec/facter/resolvers/bsd/load_averages_resolver_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +describe Facter::Resolvers::Bsd::LoadAverages do + let(:load_averages) { [0.01, 0.02, 0.03] } + + before do + allow(Facter::Bsd::FfiHelper).to receive(:read_load_averages) + .and_return(load_averages) + end + + it 'returns load average' do + result = Facter::Resolvers::Bsd::LoadAverages.resolve(:load_averages) + + expect(result).to eq('15m' => 0.03, '1m' => 0.01, '5m' => 0.02) + end +end From ecba97625e1f286deb992861f18d0537afe65ad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Tarti=C3=A8re?= Date: Wed, 29 Apr 2020 05:12:43 -1000 Subject: [PATCH 09/11] (maint) Add support for *BSD os.family (#461) --- lib/facts/bsd/os/family.rb | 18 ++++++++++++++++++ spec/facter/facts/bsd/os/family_spec.rb | 24 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 lib/facts/bsd/os/family.rb create mode 100644 spec/facter/facts/bsd/os/family_spec.rb diff --git a/lib/facts/bsd/os/family.rb b/lib/facts/bsd/os/family.rb new file mode 100644 index 000000000..c4f54b411 --- /dev/null +++ b/lib/facts/bsd/os/family.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Facts + module Bsd + module Os + class Family + FACT_NAME = 'os.family' + ALIASES = 'osfamily' + + def call_the_resolver + fact_value = Facter::Resolvers::Uname.resolve(:kernelname) + + [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] + end + end + end + end +end diff --git a/spec/facter/facts/bsd/os/family_spec.rb b/spec/facter/facts/bsd/os/family_spec.rb new file mode 100644 index 000000000..ac6ab8033 --- /dev/null +++ b/spec/facter/facts/bsd/os/family_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +describe Facts::Bsd::Os::Family do + describe '#call_the_resolver' do + subject(:fact) { Facts::Bsd::Os::Family.new } + + let(:value) { 'FreeBSD' } + + before do + allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) + end + + it 'calls Facter::Resolvers::Uname' do + fact.call_the_resolver + expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:kernelname) + end + + it 'returns os family fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ + contain_exactly(an_object_having_attributes(name: 'os.family', value: value), + an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) + end + end +end From 60117e298bc685fd70bf6adf8b4aac3980348cc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Tarti=C3=A8re?= Date: Wed, 29 Apr 2020 05:20:39 -1000 Subject: [PATCH 10/11] (maint) Add *BSD kernelversion and kernelmajversion facts (#462) --- lib/facts/bsd/kernelmajversion.rb | 16 +++++++++++++ lib/facts/bsd/kernelversion.rb | 14 +++++++++++ .../facter/facts/bsd/kernelmajversion_spec.rb | 24 +++++++++++++++++++ spec/facter/facts/bsd/kernelversion_spec.rb | 24 +++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 lib/facts/bsd/kernelmajversion.rb create mode 100644 lib/facts/bsd/kernelversion.rb create mode 100644 spec/facter/facts/bsd/kernelmajversion_spec.rb create mode 100644 spec/facter/facts/bsd/kernelversion_spec.rb diff --git a/lib/facts/bsd/kernelmajversion.rb b/lib/facts/bsd/kernelmajversion.rb new file mode 100644 index 000000000..34415587c --- /dev/null +++ b/lib/facts/bsd/kernelmajversion.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module Facts + module Bsd + class Kernelmajversion + FACT_NAME = 'kernelmajversion' + + def call_the_resolver + full_version = Facter::Resolvers::Uname.resolve(:kernelrelease) + versions_split = full_version.split('.') + major_version = versions_split[0] + Facter::ResolvedFact.new(FACT_NAME, major_version) + end + end + end +end diff --git a/lib/facts/bsd/kernelversion.rb b/lib/facts/bsd/kernelversion.rb new file mode 100644 index 000000000..0b704d2c9 --- /dev/null +++ b/lib/facts/bsd/kernelversion.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Facts + module Bsd + class Kernelversion + FACT_NAME = 'kernelversion' + + def call_the_resolver + fact_value = Facter::Resolvers::Uname.resolve(:kernelrelease).sub(/\A(\d+(\.\d+)*).*/, '\1') + Facter::ResolvedFact.new(FACT_NAME, fact_value) + end + end + end +end diff --git a/spec/facter/facts/bsd/kernelmajversion_spec.rb b/spec/facter/facts/bsd/kernelmajversion_spec.rb new file mode 100644 index 000000000..243ea9c45 --- /dev/null +++ b/spec/facter/facts/bsd/kernelmajversion_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +describe Facts::Bsd::Kernelmajversion do + describe '#call_the_resolver' do + subject(:fact) { Facts::Bsd::Kernelmajversion.new } + + let(:fact_value) { '12' } + let(:resolver_value) { '12.1-RELEASE-p3' } + + before do + allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(resolver_value) + end + + it 'calls Facter::Resolvers::OsLevel' do + fact.call_the_resolver + expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:kernelrelease) + end + + it 'returns kernelmajversion fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'kernelmajversion', value: fact_value) + end + end +end diff --git a/spec/facter/facts/bsd/kernelversion_spec.rb b/spec/facter/facts/bsd/kernelversion_spec.rb new file mode 100644 index 000000000..c8ffdce79 --- /dev/null +++ b/spec/facter/facts/bsd/kernelversion_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +describe Facts::Bsd::Kernelversion do + describe '#call_the_resolver' do + subject(:fact) { Facts::Bsd::Kernelversion.new } + + let(:resolver_value) { '12.1-RELEASE-p3' } + let(:fact_value) { '12.1' } + + before do + allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(resolver_value) + end + + it 'calls Facter::Resolvers::OsLevel' do + fact.call_the_resolver + expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:kernelrelease) + end + + it 'returns kernelversion fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'kernelversion', value: fact_value) + end + end +end From 993364238f59630b6f5a6a3e51ec637b95b1d109 Mon Sep 17 00:00:00 2001 From: Bogdan Irimie Date: Thu, 30 Apr 2020 11:05:24 +0300 Subject: [PATCH 11/11] (FACT-2590) No facts are displayed on Redhat 5 and Centos6 (#484) * (FACT-2590) Add Rhel to hierarchy. * (FACT-2590) Add test for debug messages. --- lib/framework/detector/os_detector.rb | 12 +++++++-- os_hierarchy.json | 3 ++- spec/framework/detector/os_detector_spec.rb | 30 +++++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/lib/framework/detector/os_detector.rb b/lib/framework/detector/os_detector.rb index 1a1ad8fb1..01a5baab5 100644 --- a/lib/framework/detector/os_detector.rb +++ b/lib/framework/detector/os_detector.rb @@ -8,6 +8,7 @@ class OsDetector attr_reader :identifier, :version, :hierarchy def initialize(*_args) + @log = Facter::Log.new(self) @os_hierarchy = Facter::OsHierarchy.new @identifier = detect end @@ -39,8 +40,15 @@ def detect def detect_hierarchy(identifier) hierarchy = @os_hierarchy.construct_hierarchy(identifier) - hierarchy = @os_hierarchy.construct_hierarchy(detect_family) if hierarchy.empty? - hierarchy = @os_hierarchy.construct_hierarchy(:linux) if hierarchy.empty? + if hierarchy.empty? + @log.debug("Could not detect hierarchy using os identifier: #{identifier} , trying with family") + hierarchy = @os_hierarchy.construct_hierarchy(detect_family) + end + + if hierarchy.empty? + @log.debug("Could not detect hierarchy using family #{detect_family}, falling back to Linux") + hierarchy = @os_hierarchy.construct_hierarchy(:linux) + end hierarchy end diff --git a/os_hierarchy.json b/os_hierarchy.json index f8f523596..5fa482fc2 100644 --- a/os_hierarchy.json +++ b/os_hierarchy.json @@ -12,7 +12,8 @@ "El": [ "Fedora", "Amzn", - "Centos" + "Centos", + "Rhel" ] }, { diff --git a/spec/framework/detector/os_detector_spec.rb b/spec/framework/detector/os_detector_spec.rb index 190156255..a354876e7 100644 --- a/spec/framework/detector/os_detector_spec.rb +++ b/spec/framework/detector/os_detector_spec.rb @@ -4,10 +4,12 @@ describe OsDetector do let(:os_hierarchy) { instance_spy(Facter::OsHierarchy) } + let(:logger) { instance_spy(Facter::Log) } before do Singleton.__init__(OsDetector) + allow(Facter::Log).to receive(:new).and_return(logger) allow(Facter::OsHierarchy).to receive(:new).and_return(os_hierarchy) end @@ -169,6 +171,26 @@ expect(OsDetector.instance.identifier).to eq(:my_linux_distro) end + context 'when no hierarchy for os identifier' do + it 'logs debug message' do + OsDetector.instance + + expect(logger) + .to have_received(:debug) + .with('Could not detect hierarchy using os identifier: my_linux_distro , trying with family') + end + end + + context 'when no os family detected' do + it 'logs debug message' do + OsDetector.instance + + expect(logger) + .to have_received(:debug) + .with('Could not detect hierarchy using family , falling back to Linux') + end + end + it 'constructs hierarchy with linux' do expect(OsDetector.instance.hierarchy).to eq(['linux']) end @@ -183,6 +205,14 @@ it 'constructs hierarchy with linux' do expect(OsDetector.instance.hierarchy).to eq(%w[Linux Debian Ubuntu]) end + + it 'logs debug message' do + OsDetector.instance + + expect(logger) + .to have_received(:debug) + .with('Could not detect hierarchy using os identifier: my_linux_distro , trying with family') + end end end end