From 0ef4e67e38d476266dff1ccb8bef1906b861802b Mon Sep 17 00:00:00 2001 From: Oana Tanasoiu Date: Wed, 25 Mar 2020 18:49:17 +0200 Subject: [PATCH 1/2] (FACT-2475) Fix os.release for Debian 10 --- lib/facts/debian/os/name.rb | 2 +- lib/facts/debian/os/release.rb | 4 +- lib/resolvers/debian_version_resolver.rb | 34 ------ lib/resolvers/os_release_resolver.rb | 9 ++ spec/facter/facts/debian/os/name_spec.rb | 6 +- spec/facter/facts/debian/os/release_spec.rb | 10 +- .../resolvers/debian_version_resolver_spec.rb | 27 ----- .../resolvers/os_release_resolver_spec.rb | 103 ++++++++++++++---- spec/fixtures/os_release_debian | 9 ++ 9 files changed, 109 insertions(+), 95 deletions(-) delete mode 100644 lib/resolvers/debian_version_resolver.rb delete mode 100644 spec/facter/resolvers/debian_version_resolver_spec.rb create mode 100644 spec/fixtures/os_release_debian diff --git a/lib/facts/debian/os/name.rb b/lib/facts/debian/os/name.rb index 2b7b021d6..ad13db282 100644 --- a/lib/facts/debian/os/name.rb +++ b/lib/facts/debian/os/name.rb @@ -8,7 +8,7 @@ class Name ALIASES = 'operatingsystem' def call_the_resolver - fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id) + fact_value = Facter::Resolvers::OsRelease.resolve(:name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end diff --git a/lib/facts/debian/os/release.rb b/lib/facts/debian/os/release.rb index c64752bd1..f4fe3ce93 100644 --- a/lib/facts/debian/os/release.rb +++ b/lib/facts/debian/os/release.rb @@ -8,7 +8,7 @@ class Release ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver - fact_value = Facter::Resolvers::LsbRelease.resolve(:release) + fact_value = Facter::Resolvers::OsRelease.resolve(:release) return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value @@ -16,7 +16,7 @@ def call_the_resolver release = { 'full' => fact_value, 'major' => versions[0], - 'minor' => versions[1] + 'minor' => versions[1].gsub(/^0([1-9])/, '\1') } [Facter::ResolvedFact.new(FACT_NAME, release), diff --git a/lib/resolvers/debian_version_resolver.rb b/lib/resolvers/debian_version_resolver.rb deleted file mode 100644 index 0eebca6b1..000000000 --- a/lib/resolvers/debian_version_resolver.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -module Facter - module Resolvers - class DebianVersion < BaseResolver - # :major - # :minor - # :full - - @semaphore = Mutex.new - @fact_list ||= {} - - class << self - private - - def post_resolve(fact_name) - @fact_list.fetch(fact_name) { read_debian_version(fact_name) } - end - - def read_debian_version(fact_name) - output, _status = Open3.capture2('cat /etc/debian_version') - full_version = output.delete("\n") - versions = full_version.split('.') - - @fact_list[:full] = full_version - @fact_list[:major] = versions[0] - @fact_list[:minor] = versions[1].gsub(/^0([1-9])/, '\1') - - @fact_list[fact_name] - end - end - end - end -end diff --git a/lib/resolvers/os_release_resolver.rb b/lib/resolvers/os_release_resolver.rb index c82dc924b..b48ba720d 100644 --- a/lib/resolvers/os_release_resolver.rb +++ b/lib/resolvers/os_release_resolver.rb @@ -39,6 +39,7 @@ def read_os_release_file(fact_name) fill_fact_list(pairs) process_name + find_debian_release if @fact_list[:name].match?(/Debian/) @fact_list[fact_name] end @@ -48,6 +49,7 @@ def fill_fact_list(pairs) result.each { |k, v| @fact_list[k.downcase.to_sym] = v } @fact_list[:identifier] = @fact_list[:id] + @fact_list[:release] = @fact_list[:version_id] end def process_name @@ -59,6 +61,13 @@ def process_name @fact_list[:name].split(' ')[0].strip end end + + def find_debian_release + return unless File.readable?('/etc/debian_version') + + version = File.read('/etc/debian_version') + @fact_list[:release] = version.strip + end end end end diff --git a/spec/facter/facts/debian/os/name_spec.rb b/spec/facter/facts/debian/os/name_spec.rb index aaf193478..3b04652d7 100644 --- a/spec/facter/facts/debian/os/name_spec.rb +++ b/spec/facter/facts/debian/os/name_spec.rb @@ -7,12 +7,12 @@ let(:value) { 'Debian' } before do - allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:distributor_id).and_return(value) + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:name).and_return(value) end - it 'calls Facter::Resolvers::LsbRelease' do + it 'calls Facter::Resolvers::OsRelease' do fact.call_the_resolver - expect(Facter::Resolvers::LsbRelease).to have_received(:resolve).with(:distributor_id) + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:name) end it 'returns operating system name fact' do diff --git a/spec/facter/facts/debian/os/release_spec.rb b/spec/facter/facts/debian/os/release_spec.rb index 526ce17e9..079654870 100644 --- a/spec/facter/facts/debian/os/release_spec.rb +++ b/spec/facter/facts/debian/os/release_spec.rb @@ -5,16 +5,16 @@ subject(:fact) { Facts::Debian::Os::Release.new } before do - allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:release).and_return(value) end context 'when lsb_release installed' do - let(:value) { '10.9' } - let(:value_final) { { 'full' => '10.9', 'major' => '10', 'minor' => '9' } } + let(:value) { '10.09' } + let(:value_final) { { 'full' => '10.09', 'major' => '10', 'minor' => '9' } } - it 'calls Facter::Resolvers::LsbRelease' do + it 'calls Facter::Resolvers::OsRelease' do fact.call_the_resolver - expect(Facter::Resolvers::LsbRelease).to have_received(:resolve).with(:release) + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:release) end it 'returns release fact' do diff --git a/spec/facter/resolvers/debian_version_resolver_spec.rb b/spec/facter/resolvers/debian_version_resolver_spec.rb deleted file mode 100644 index f53232602..000000000 --- a/spec/facter/resolvers/debian_version_resolver_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -describe Facter::Resolvers::DebianVersion do - before do - allow(Open3).to receive(:capture2) - .with('cat /etc/debian_version') - .and_return("10.01\n") - end - - it 'returns full' do - result = Facter::Resolvers::DebianVersion.resolve(:full) - - expect(result).to eq('10.01') - end - - it 'returns major' do - result = Facter::Resolvers::DebianVersion.resolve(:major) - - expect(result).to eq('10') - end - - it 'returns minor' do - result = Facter::Resolvers::DebianVersion.resolve(:minor) - - expect(result).to eq('1') - end -end diff --git a/spec/facter/resolvers/os_release_resolver_spec.rb b/spec/facter/resolvers/os_release_resolver_spec.rb index af90aa3df..67f0d23ba 100644 --- a/spec/facter/resolvers/os_release_resolver_spec.rb +++ b/spec/facter/resolvers/os_release_resolver_spec.rb @@ -1,39 +1,96 @@ # frozen_string_literal: true describe Facter::Resolvers::OsRelease do - before do - allow(File).to receive(:readable?) - .with('/etc/os-release') - .and_return(true) + context 'when os is ubuntu' do + before do + allow(File).to receive(:readable?) + .with('/etc/os-release') + .and_return(true) - allow(File).to receive(:read) - .with('/etc/os-release') - .and_return(load_fixture('os_release').read) + allow(File).to receive(:read) + .with('/etc/os-release') + .and_return(load_fixture('os_release').read) + end - Facter::Resolvers::OsRelease.invalidate_cache - end + after do + Facter::Resolvers::OsRelease.invalidate_cache + end - it 'returns os NAME' do - result = Facter::Resolvers::OsRelease.resolve(:name) + it 'returns os NAME' do + result = Facter::Resolvers::OsRelease.resolve(:name) - expect(result).to eq('Ubuntu') - end + expect(result).to eq('Ubuntu') + end - it 'returns os PRETTY_NAME' do - result = Facter::Resolvers::OsRelease.resolve(:pretty_name) + it 'returns os PRETTY_NAME' do + result = Facter::Resolvers::OsRelease.resolve(:pretty_name) - expect(result).to eq('Ubuntu 18.04.1 LTS') - end + expect(result).to eq('Ubuntu 18.04.1 LTS') + end + + it 'returns os VERSION_ID' do + result = Facter::Resolvers::OsRelease.resolve(:version_id) + + expect(result).to eq('18.04') + end - it 'returns os VERSION_ID' do - result = Facter::Resolvers::OsRelease.resolve(:version_id) + it 'returns os release' do + result = Facter::Resolvers::OsRelease.resolve(:release) - expect(result).to eq('18.04') + expect(result).to eq('18.04') + end + + it 'returns os VERSION_CODENAME' do + result = Facter::Resolvers::OsRelease.resolve(:version_codename) + + expect(result).to eq('bionic') + end end - it 'returns os VERSION_CODENAME' do - result = Facter::Resolvers::OsRelease.resolve(:version_codename) + context 'when os is Debian' do + before do + allow(File).to receive(:readable?).with('/etc/os-release').and_return(true) + + allow(File).to receive(:read) + .with('/etc/os-release') + .and_return(load_fixture('os_release_debian').read) + + allow(File).to receive(:readable?).with('/etc/debian_version').and_return(true) + allow(File).to receive(:read).with('/etc/debian_version').and_return("10.0\n") + end + + after do + Facter::Resolvers::OsRelease.invalidate_cache + end + + it 'returns os release' do + result = Facter::Resolvers::OsRelease.resolve(:release) + + expect(result).to eq('10.0') + end + + 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' do + result = Facter::Resolvers::OsRelease.resolve(:version_id) + + expect(result).to eq('10') + end + + it 'returns os VERSION_CODENAME' do + result = Facter::Resolvers::OsRelease.resolve(:version_codename) - expect(result).to eq('bionic') + expect(result).to eq('buster') + end end end diff --git a/spec/fixtures/os_release_debian b/spec/fixtures/os_release_debian new file mode 100644 index 000000000..9dec8014a --- /dev/null +++ b/spec/fixtures/os_release_debian @@ -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 2481a6a2addea2d7dc7687ad87bf459669c9dd05 Mon Sep 17 00:00:00 2001 From: Oana Tanasoiu Date: Wed, 25 Mar 2020 19:48:19 +0200 Subject: [PATCH 2/2] (FACT-2475) os.distro use os-release --- .rubocop.yml | 3 + .rubocop_todo.yml | 379 +++++++++++++++++- lib/facts/debian/os/distro/release.rb | 25 +- lib/facts/debian/os/release.rb | 14 +- lib/resolvers/debian_version.rb | 32 ++ lib/resolvers/os_release_resolver.rb | 9 - .../facts/debian/os/distro/release_spec.rb | 97 +++-- spec/facter/facts/debian/os/release_spec.rb | 94 ++++- spec/facter/resolvers/debian_version_spec.rb | 14 + .../resolvers/os_release_resolver_spec.rb | 107 ++--- spec/framework/core/session_cache_spec.rb | 6 +- 11 files changed, 621 insertions(+), 159 deletions(-) create mode 100644 lib/resolvers/debian_version.rb create mode 100644 spec/facter/resolvers/debian_version_spec.rb diff --git a/.rubocop.yml b/.rubocop.yml index cbe9646dd..295ec5b11 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -136,3 +136,6 @@ RSpec/ExampleLength: RSpec/DescribedClass: EnforcedStyle: explicit + +RSpec/NestedGroups: + Max: 5 diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 282b5c74b..37b8571d4 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,20 +1,59 @@ # This configuration was generated by -# `rubocop --auto-gen-config` -# on 2020-03-24 15:03:01 +0200 using RuboCop version 0.74.0. +# `rubocop --auto-gen-config --exclude-limit 1000` +# on 2020-03-26 14:40:44 +0200 using RuboCop version 0.74.0. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. -# Offense count: 76 +# Offense count: 75 RSpec/AnyInstance: - Enabled: false + Exclude: + - 'spec/custom_facts/core/aggregate_spec.rb' + - 'spec/facter/facter_spec.rb' + - 'spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb' + - 'spec/facter/resolvers/utils/windows/network_utils_spec.rb' + - 'spec/facter/resolvers/windows/dmi_bios_resolver_spec.rb' + - 'spec/facter/resolvers/windows/dmi_computersystem_resolver_spec.rb' + - 'spec/facter/resolvers/windows/identity_resolver_spec.rb' + - 'spec/facter/resolvers/windows/kernel_resolver_spec.rb' + - 'spec/facter/resolvers/windows/memory_resolver_spec.rb' + - 'spec/facter/resolvers/windows/networking_resolver_spec.rb' + - 'spec/facter/resolvers/windows/processors_resolver_spec.rb' + - 'spec/facter/resolvers/windows/system32_resolver_spec.rb' + - 'spec/facter/resolvers/windows/uptime_resolver_spec.rb' + - 'spec/facter/resolvers/windows/virtualization_resolver_spec.rb' + - 'spec/facter/resolvers/windows/win_os_description_resolver_spec.rb' + - 'spec/framework/core/fact_loaders/class_discoverer_spec.rb' + - 'spec/framework/core/fact_loaders/internal_fact_loader_spec.rb' + - 'spec/framework/core/fact_manager_spec.rb' + - 'spec/framework/core/options/options_validator_spec.rb' + - 'spec/mocks/util.rb' # Offense count: 70 # Configuration parameters: Prefixes. # Prefixes: when, with, without RSpec/ContextWording: - Enabled: false + Exclude: + - 'spec/custom_facts/core/execution/posix_spec.rb' + - 'spec/custom_facts/core/execution/windows_spec.rb' + - 'spec/custom_facts/shared_contexts/platform.rb' + - 'spec/custom_facts/util/parser_spec.rb' + - 'spec/facter/fact_filter_spec.rb' + - 'spec/facter/facter_spec.rb' + - 'spec/facter/facts/macosx/is_virtual_spec.rb' + - 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zfs_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zone_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zpool_resolver_spec.rb' + - 'spec/facter/resolvers/ssh_resolver_spec.rb' + - 'spec/facter/resolvers/utils/windows/network_utils_spec.rb' + - 'spec/framework/config/config_reader_spec.rb' + - 'spec/framework/core/fact_loaders/external_fact_loader_spec.rb' + - 'spec/framework/core/fact_loaders/internal_fact_loader_spec.rb' + - 'spec/framework/core/options_spec.rb' + - 'spec/framework/formatters/legacy_fact_formatter_spec.rb' # Offense count: 29 RSpec/ExpectInHook: @@ -35,7 +74,86 @@ RSpec/ExpectInHook: # Offense count: 79 # Configuration parameters: CustomTransform, IgnoreMethods. RSpec/FilePath: - Enabled: false + Exclude: + - 'spec/custom_facts/core/aggregate_spec.rb' + - 'spec/custom_facts/core/directed_graph_spec.rb' + - 'spec/custom_facts/core/execution/fact_manager_spec.rb' + - 'spec/custom_facts/core/execution/posix_spec.rb' + - 'spec/custom_facts/core/execution/windows_spec.rb' + - 'spec/custom_facts/core/execution_spec.rb' + - 'spec/custom_facts/core/logging_spec.rb' + - 'spec/custom_facts/core/resolvable_spec.rb' + - 'spec/custom_facts/core/suitable_spec.rb' + - 'spec/custom_facts/util/collection_spec.rb' + - 'spec/custom_facts/util/config_spec.rb' + - 'spec/custom_facts/util/confine_spec.rb' + - 'spec/custom_facts/util/directory_loader_spec.rb' + - 'spec/custom_facts/util/fact_spec.rb' + - 'spec/custom_facts/util/loader_spec.rb' + - 'spec/custom_facts/util/normalization_spec.rb' + - 'spec/custom_facts/util/parser_spec.rb' + - 'spec/custom_facts/util/resolution_spec.rb' + - 'spec/facter/facts_utils/bytes_to_human_readable_spec.rb' + - 'spec/facter/facts_utils/uptime_parser_spec.rb' + - 'spec/facter/facts_utils/windows_release_finder_spec.rb' + - 'spec/facter/model/fact_collection_spec.rb' + - 'spec/facter/model/resolved_fact_spec.rb' + - 'spec/facter/resolvers/aio_agent_version_spec.rb' + - '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/disk_resolver_spec.rb' + - 'spec/facter/resolvers/dmi_resolver_spec.rb' + - 'spec/facter/resolvers/filesystems_resolver_spec.rb' + - 'spec/facter/resolvers/fips_enabled_resolver_spec.rb' + - 'spec/facter/resolvers/identity_resolver_spec.rb' + - 'spec/facter/resolvers/load_averages_resolver_spec.rb' + - 'spec/facter/resolvers/macosx/dmi_resolver_spec.rb' + - 'spec/facter/resolvers/memory_resolver_spec.rb' + - 'spec/facter/resolvers/mountpoints_resolver_spec.rb' + - 'spec/facter/resolvers/processors_resolver_spec.rb' + - 'spec/facter/resolvers/redhat_release_resolver_spec.rb' + - 'spec/facter/resolvers/selinux_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zone_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zpool_resolver_spec.rb' + - 'spec/facter/resolvers/suse_relese_resolver_spec.rb' + - 'spec/facter/resolvers/system_profile_resolver_spec.rb' + - 'spec/facter/resolvers/utils/aix/odm_query_spec.rb' + - 'spec/facter/resolvers/utils/macosx/filesystem_helper_spec.rb' + - 'spec/facter/resolvers/utils/windows/win32ole_spec.rb' + - 'spec/facter/resolvers/windows/dmi_bios_resolver_spec.rb' + - 'spec/facter/resolvers/windows/dmi_computersystem_resolver_spec.rb' + - 'spec/facter/resolvers/windows/hardware_architecture_resolver_spec.rb' + - 'spec/facter/resolvers/windows/identity_resolver_spec.rb' + - 'spec/facter/resolvers/windows/kernel_resolver_spec.rb' + - 'spec/facter/resolvers/windows/memory_resolver_spec.rb' + - 'spec/facter/resolvers/windows/netkvm_resolver_spec.rb' + - 'spec/facter/resolvers/windows/networking_resolver_spec.rb' + - 'spec/facter/resolvers/windows/processors_resolver_spec.rb' + - 'spec/facter/resolvers/windows/product_release_resolver_spec.rb' + - 'spec/facter/resolvers/windows/system32_resolver_spec.rb' + - 'spec/facter/resolvers/windows/virtualization_resolver_spec.rb' + - 'spec/facter/resolvers/windows/win_os_description_resolver_spec.rb' + - 'spec/framework/config/block_list_spec.rb' + - 'spec/framework/config/config_reader_spec.rb' + - 'spec/framework/core/fact/external/external_fact_manager_spec.rb' + - 'spec/framework/core/fact/internal/internal_fact_manager_spec.rb' + - 'spec/framework/core/fact_loaders/class_discoverer_spec.rb' + - 'spec/framework/core/fact_loaders/external_fact_loader_spec.rb' + - 'spec/framework/core/fact_loaders/fact_loader_spec.rb' + - 'spec/framework/core/fact_loaders/internal_fact_loader_spec.rb' + - 'spec/framework/core/fact_manager_spec.rb' + - 'spec/framework/core/options/options_validator_spec.rb' + - 'spec/framework/core/options_spec.rb' + - 'spec/framework/core/session_cache_spec.rb' + - 'spec/framework/formatters/fact_formatter_spec.rb' + - 'spec/framework/formatters/hocon_fact_formatter_spec.rb' + - 'spec/framework/formatters/json_fact_formatter_spec.rb' + - 'spec/framework/formatters/legacy_fact_formatter_spec.rb' + - 'spec/framework/formatters/yaml_fact_formatter_spec.rb' + - 'spec/framework/utils/utils_spec.rb' # Offense count: 15 # Configuration parameters: AssignmentOnly. @@ -61,13 +179,142 @@ RSpec/LeakyConstantDeclaration: - 'spec/facter/resolvers/macosx/mountpoints_resolver_spec.rb' - 'spec/facter/resolvers/utils/windows/network_utils_spec.rb' -# Offense count: 321 +# Offense count: 317 # Configuration parameters: EnforcedStyle. # SupportedStyles: have_received, receive RSpec/MessageSpies: - Enabled: false + Exclude: + - 'spec/custom_facts/core/aggregate_spec.rb' + - 'spec/custom_facts/core/execution/fact_manager_spec.rb' + - 'spec/custom_facts/core/execution/posix_spec.rb' + - 'spec/custom_facts/core/execution/windows_spec.rb' + - 'spec/custom_facts/core/execution_spec.rb' + - 'spec/custom_facts/core/logging_spec.rb' + - 'spec/custom_facts/core/resolvable_spec.rb' + - 'spec/custom_facts/core/suitable_spec.rb' + - 'spec/custom_facts/util/collection_spec.rb' + - 'spec/custom_facts/util/confine_spec.rb' + - 'spec/custom_facts/util/directory_loader_spec.rb' + - 'spec/custom_facts/util/fact_spec.rb' + - 'spec/custom_facts/util/loader_spec.rb' + - 'spec/custom_facts/util/parser_spec.rb' + - 'spec/custom_facts/util/resolution_spec.rb' + - 'spec/facter/facter_spec.rb' + - 'spec/facter/facts/aix/load_averages_spec.rb' + - 'spec/facter/facts/aix/networking/domain_spec.rb' + - 'spec/facter/facts/aix/networking/fqdn_spec.rb' + - 'spec/facter/facts/aix/networking/hostname_spec.rb' + - 'spec/facter/facts/aix/networking/ip_spec.rb' + - 'spec/facter/facts/aix/networking/primary_spec.rb' + - 'spec/facter/facts/aix/os/name_spec.rb' + - 'spec/facter/facts/aix/os/release_spec.rb' + - 'spec/facter/facts/aix/ruby/version_spec.rb' + - 'spec/facter/facts/debian/networking/domain_spec.rb' + - 'spec/facter/facts/debian/networking/fqdn_spec.rb' + - 'spec/facter/facts/debian/networking/hostname_spec.rb' + - 'spec/facter/facts/debian/networking/interfaces_spec.rb' + - 'spec/facter/facts/debian/networking/ip_spec.rb' + - 'spec/facter/facts/debian/networking/primary_spec.rb' + - 'spec/facter/facts/debian/os/family_spec.rb' + - 'spec/facter/facts/debian/ruby/version_spec.rb' + - 'spec/facter/facts/el/networking/domain_spec.rb' + - 'spec/facter/facts/el/networking/fqdn_spec.rb' + - 'spec/facter/facts/el/networking/hostname_spec.rb' + - 'spec/facter/facts/el/networking/interfaces_spec.rb' + - 'spec/facter/facts/el/networking/ip_spec.rb' + - 'spec/facter/facts/el/networking/primary_spec.rb' + - 'spec/facter/facts/macosx/filesystems_spec.rb' + - 'spec/facter/facts/macosx/is_virtual_spec.rb' + - 'spec/facter/facts/macosx/memory/swap/used_spec.rb' + - 'spec/facter/facts/macosx/memory/system/used_spec.rb' + - 'spec/facter/facts/macosx/mountpoints_spec.rb' + - 'spec/facter/facts/macosx/networking/domain_spec.rb' + - 'spec/facter/facts/macosx/networking/fqdn_spec.rb' + - 'spec/facter/facts/macosx/networking/hostname_spec.rb' + - 'spec/facter/facts/macosx/os/architecture_spec.rb' + - 'spec/facter/facts/macosx/os/family_spec.rb' + - 'spec/facter/facts/macosx/os/name_spec.rb' + - 'spec/facter/facts/macosx/ruby/version_spec.rb' + - 'spec/facter/facts/sles/facterversion_spec.rb' + - 'spec/facter/facts/sles/networking/domain_spec.rb' + - 'spec/facter/facts/sles/networking/fqdn_spec.rb' + - 'spec/facter/facts/sles/networking/hostname_spec.rb' + - 'spec/facter/facts/sles/networking/interfaces_spec.rb' + - 'spec/facter/facts/sles/networking/ip_spec.rb' + - 'spec/facter/facts/sles/networking/primary_spec.rb' + - 'spec/facter/facts/sles/os/architecture_spec.rb' + - 'spec/facter/facts/sles/os/name_spec.rb' + - 'spec/facter/facts/sles/os/release_spec.rb' + - 'spec/facter/facts/solaris/facterversion_spec.rb' + - 'spec/facter/facts/solaris/networking/domain_spec.rb' + - 'spec/facter/facts/solaris/networking/fqdn_spec.rb' + - 'spec/facter/facts/solaris/networking/hostname_spec.rb' + - 'spec/facter/facts/solaris/os/architecture_spec.rb' + - 'spec/facter/facts/solaris/os/name_spec.rb' + - 'spec/facter/facts/solaris/os/release_spec.rb' + - 'spec/facter/facts/solaris/ruby/platform_spec.rb' + - 'spec/facter/facts/solaris/ruby/sitedir_spec.rb' + - 'spec/facter/facts/solaris/ruby/version_spec.rb' + - 'spec/facter/facts/windows/dmi/manufacturer_spec.rb' + - 'spec/facter/facts/windows/dmi/product/name_spec.rb' + - 'spec/facter/facts/windows/dmi/product/serial_number_spec.rb' + - 'spec/facter/facts/windows/dmi/product/uuid_spec.rb' + - 'spec/facter/facts/windows/fips_enabled_spec.rb' + - 'spec/facter/facts/windows/identity/user_spec.rb' + - 'spec/facter/facts/windows/ipaddress6_interfaces_spec.rb' + - 'spec/facter/facts/windows/ipaddress_interfaces_spec.rb' + - 'spec/facter/facts/windows/macaddress_interfaces_spec.rb' + - 'spec/facter/facts/windows/memory/system/available_bytes_spec.rb' + - 'spec/facter/facts/windows/memory/system/available_spec.rb' + - 'spec/facter/facts/windows/memory/system/total_bytes_spec.rb' + - 'spec/facter/facts/windows/memory/system/total_spec.rb' + - 'spec/facter/facts/windows/mtu_interfaces_spec.rb' + - 'spec/facter/facts/windows/netmask6_interfaces_spec.rb' + - 'spec/facter/facts/windows/netmask_interfaces_spec.rb' + - 'spec/facter/facts/windows/network6_interfaces_spec.rb' + - 'spec/facter/facts/windows/network_interfaces_spec.rb' + - 'spec/facter/facts/windows/networking/domain_spec.rb' + - 'spec/facter/facts/windows/networking/fqdn_spec.rb' + - 'spec/facter/facts/windows/networking/hostname_spec.rb' + - 'spec/facter/facts/windows/networking/ip6_spec.rb' + - 'spec/facter/facts/windows/networking/mac_spec.rb' + - 'spec/facter/facts/windows/networking/netmask6_spec.rb' + - 'spec/facter/facts/windows/networking/netmask_spec.rb' + - 'spec/facter/facts/windows/networking/network6_spec.rb' + - 'spec/facter/facts/windows/networking/network_spec.rb' + - 'spec/facter/facts/windows/networking/scope6_spec.rb' + - 'spec/facter/facts/windows/os/architecture_spec.rb' + - 'spec/facter/facts/windows/os/family_spec.rb' + - 'spec/facter/facts/windows/os/hardware_spec.rb' + - 'spec/facter/facts/windows/os/name_spec.rb' + - 'spec/facter/facts/windows/os/release_spec.rb' + - 'spec/facter/facts/windows/os/windows/edition_id_spec.rb' + - 'spec/facter/facts/windows/os/windows/installation_type_spec.rb' + - 'spec/facter/facts/windows/os/windows/product_name_spec.rb' + - 'spec/facter/facts/windows/os/windows/release_id_spec.rb' + - 'spec/facter/facts/windows/os/windows/system32_spec.rb' + - 'spec/facter/facts/windows/processors/count_spec.rb' + - 'spec/facter/facts/windows/processors/isa_spec.rb' + - 'spec/facter/facts/windows/processors/physicalcount_spec.rb' + - 'spec/facter/facts/windows/ruby/platform_spec.rb' + - 'spec/facter/facts/windows/ruby/sitedir_spec.rb' + - 'spec/facter/facts/windows/ruby/version_spec.rb' + - 'spec/facter/facts/windows/scope6_interfaces_spec.rb' + - 'spec/facter/resolvers/aix/ffi_helper_spec.rb' + - 'spec/facter/resolvers/lpar_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zfs_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zone_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zpool_resolver_spec.rb' + - 'spec/facter/resolvers/ssh_resolver_spec.rb' + - 'spec/facter/resolvers/utils/aix/odm_query_spec.rb' + - 'spec/facter/resolvers/wpar_resolver_spec.rb' + - 'spec/framework/config/block_list_spec.rb' + - 'spec/framework/config/config_reader_spec.rb' + - 'spec/framework/core/fact_loaders/external_fact_loader_spec.rb' + - 'spec/framework/detector/os_detector_spec.rb' -# Offense count: 122 +# Offense count: 121 # Configuration parameters: AggregateFailuresByDefault. RSpec/MultipleExpectations: Max: 9 @@ -86,10 +333,6 @@ RSpec/NamedSubject: - 'spec/custom_facts/util/normalization_spec.rb' - 'spec/framework/core/options_spec.rb' -# Offense count: 29 -RSpec/NestedGroups: - Max: 4 - # Offense count: 33 RSpec/SubjectStub: Exclude: @@ -105,4 +348,112 @@ RSpec/SubjectStub: # Offense count: 242 # Configuration parameters: IgnoreNameless, IgnoreSymbolicNames. RSpec/VerifiedDoubles: - Enabled: false + Exclude: + - 'spec/custom_facts/core/aggregate_spec.rb' + - 'spec/custom_facts/util/collection_spec.rb' + - 'spec/custom_facts/util/confine_spec.rb' + - 'spec/custom_facts/util/directory_loader_spec.rb' + - 'spec/custom_facts/util/fact_spec.rb' + - 'spec/custom_facts/util/resolution_spec.rb' + - 'spec/facter/facter_spec.rb' + - 'spec/facter/facts/aix/facterversion_spec.rb' + - 'spec/facter/facts/aix/kernel_spec.rb' + - 'spec/facter/facts/aix/kernelmajversion_spec.rb' + - 'spec/facter/facts/aix/kernelrelease_spec.rb' + - 'spec/facter/facts/aix/kernelversion_spec.rb' + - 'spec/facter/facts/aix/load_averages_spec.rb' + - 'spec/facter/facts/aix/path_spec.rb' + - 'spec/facter/facts/aix/ssh_spec.rb' + - 'spec/facter/facts/debian/facterversion_spec.rb' + - 'spec/facter/facts/debian/kernel_spec.rb' + - 'spec/facter/facts/debian/kernelmajversion_spec.rb' + - 'spec/facter/facts/debian/kernelrelease_spec.rb' + - 'spec/facter/facts/debian/kernelversion_spec.rb' + - 'spec/facter/facts/debian/path_spec.rb' + - 'spec/facter/facts/el/facterversion_spec.rb' + - 'spec/facter/facts/el/kernel_spec.rb' + - 'spec/facter/facts/el/kernelmajversion_spec.rb' + - 'spec/facter/facts/el/kernelrelease_spec.rb' + - 'spec/facter/facts/el/kernelversion_spec.rb' + - 'spec/facter/facts/el/path_spec.rb' + - 'spec/facter/facts/macosx/facterversion_spec.rb' + - 'spec/facter/facts/macosx/filesystems_spec.rb' + - 'spec/facter/facts/macosx/kernel_spec.rb' + - 'spec/facter/facts/macosx/kernelmajversion_spec.rb' + - 'spec/facter/facts/macosx/kernelrelease_spec.rb' + - 'spec/facter/facts/macosx/kernelversion_spec.rb' + - 'spec/facter/facts/macosx/memory/swap/capacity_spec.rb' + - 'spec/facter/facts/macosx/memory/swap/used_bytes_spec.rb' + - 'spec/facter/facts/macosx/memory/swap/used_spec.rb' + - 'spec/facter/facts/macosx/memory/system/capacity_spec.rb' + - 'spec/facter/facts/macosx/memory/system/used_bytes_spec.rb' + - 'spec/facter/facts/macosx/memory/system/used_spec.rb' + - 'spec/facter/facts/macosx/path_spec.rb' + - 'spec/facter/facts/sles/kernel_spec.rb' + - 'spec/facter/facts/sles/kernelmajversion_spec.rb' + - 'spec/facter/facts/sles/kernelrelease_spec.rb' + - 'spec/facter/facts/sles/kernelversion_spec.rb' + - 'spec/facter/facts/sles/path_spec.rb' + - 'spec/facter/facts/solaris/kernel_spec.rb' + - 'spec/facter/facts/solaris/kernelmajversion_spec.rb' + - 'spec/facter/facts/solaris/kernelrelease_spec.rb' + - 'spec/facter/facts/solaris/kernelversion_spec.rb' + - 'spec/facter/facts/solaris/path_spec.rb' + - 'spec/facter/facts/windows/dmi/product/serial_number_spec.rb' + - 'spec/facter/facts/windows/facterversion_spec.rb' + - 'spec/facter/facts/windows/hypervisors/hyperv_spec.rb' + - 'spec/facter/facts/windows/hypervisors/kvm_spec.rb' + - 'spec/facter/facts/windows/hypervisors/virtualbox_spec.rb' + - 'spec/facter/facts/windows/hypervisors/vmware_spec.rb' + - 'spec/facter/facts/windows/hypervisors/xen_spec.rb' + - 'spec/facter/facts/windows/identity/privileged_spec.rb' + - 'spec/facter/facts/windows/memory/system/capacity_spec.rb' + - 'spec/facter/facts/windows/memory/system/used_bytes_spec.rb' + - 'spec/facter/facts/windows/memory/system/used_spec.rb' + - 'spec/facter/facts/windows/networking/dhcp_spec.rb' + - 'spec/facter/facts/windows/networking/interfaces_spec.rb' + - 'spec/facter/facts/windows/networking/mtu_spec.rb' + - 'spec/facter/facts/windows/networking/primary_spec.rb' + - 'spec/facter/facts/windows/path_spec.rb' + - 'spec/facter/facts/windows/processors/models_spec.rb' + - 'spec/facter/facts/windows/virtualization/is_virtual_spec.rb' + - 'spec/facter/facts/windows/virtualization/virtual_spec.rb' + - 'spec/facter/query_parser_spec.rb' + - '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/macosx/mountpoints_resolver_spec.rb' + - 'spec/facter/resolvers/mountpoints_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zfs_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zone_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/zpool_resolver_spec.rb' + - 'spec/facter/resolvers/ssh_resolver_spec.rb' + - 'spec/facter/resolvers/utils/windows/network_utils_spec.rb' + - 'spec/facter/resolvers/utils/windows/win32ole_spec.rb' + - 'spec/facter/resolvers/windows/dmi_bios_resolver_spec.rb' + - 'spec/facter/resolvers/windows/dmi_computersystem_resolver_spec.rb' + - 'spec/facter/resolvers/windows/hardware_architecture_resolver_spec.rb' + - 'spec/facter/resolvers/windows/identity_resolver_spec.rb' + - 'spec/facter/resolvers/windows/kernel_resolver_spec.rb' + - 'spec/facter/resolvers/windows/memory_resolver_spec.rb' + - 'spec/facter/resolvers/windows/networking_resolver_spec.rb' + - 'spec/facter/resolvers/windows/processors_resolver_spec.rb' + - 'spec/facter/resolvers/windows/system32_resolver_spec.rb' + - 'spec/facter/resolvers/windows/uptime_resolver_spec.rb' + - 'spec/facter/resolvers/windows/virtualization_resolver_spec.rb' + - 'spec/facter/resolvers/windows/win_os_description_resolver_spec.rb' + - 'spec/framework/config/block_list_spec.rb' + - 'spec/framework/core/fact/external/external_fact_manager_spec.rb' + - 'spec/framework/core/fact/internal/internal_fact_manager_spec.rb' + - 'spec/framework/core/fact_loaders/external_fact_loader_spec.rb' + - 'spec/framework/core/fact_loaders/fact_loader_spec.rb' + - 'spec/framework/core/fact_manager_spec.rb' + - 'spec/framework/core/options_spec.rb' + - 'spec/framework/core/session_cache_spec.rb' + - 'spec/framework/formatters/hocon_fact_formatter_spec.rb' + - 'spec/framework/formatters/json_fact_formatter_spec.rb' + - 'spec/framework/formatters/legacy_fact_formatter_spec.rb' + - 'spec/framework/formatters/yaml_fact_formatter_spec.rb' + - 'spec/mocks/util.rb' diff --git a/lib/facts/debian/os/distro/release.rb b/lib/facts/debian/os/distro/release.rb index 437b3dfbc..69b9410fa 100644 --- a/lib/facts/debian/os/distro/release.rb +++ b/lib/facts/debian/os/distro/release.rb @@ -9,20 +9,29 @@ class Release ALIASES = %w[lsbdistrelease lsbmajdistrelease lsbminordistrelease].freeze def call_the_resolver - fact_value = Facter::Resolvers::LsbRelease.resolve(:release) + fact_value = determine_release_for_os + return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value versions = fact_value.split('.') - release = { - 'full' => fact_value, - 'major' => versions[0], - 'minor' => versions[1] - } + release = { 'full' => fact_value, 'major' => versions[0], 'minor' => versions[1].gsub(/^0([1-9])/, '\1') } [Facter::ResolvedFact.new(FACT_NAME, release), Facter::ResolvedFact.new(ALIASES[0], fact_value, :legacy), - Facter::ResolvedFact.new(ALIASES[1], versions[0], :legacy), - Facter::ResolvedFact.new(ALIASES[2], versions[1], :legacy)] + Facter::ResolvedFact.new(ALIASES[1], release['major'], :legacy), + Facter::ResolvedFact.new(ALIASES[2], release['minor'], :legacy)] + end + + private + + def determine_release_for_os + os_name = Facter::Resolvers::OsRelease.resolve(:name) + + if os_name =~ /Debian/ + Facter::Resolvers::DebianVersion.resolve(:version) + else + Facter::Resolvers::OsRelease.resolve(:version_id) + end end end end diff --git a/lib/facts/debian/os/release.rb b/lib/facts/debian/os/release.rb index f4fe3ce93..994d4e0e9 100644 --- a/lib/facts/debian/os/release.rb +++ b/lib/facts/debian/os/release.rb @@ -8,7 +8,7 @@ class Release ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver - fact_value = Facter::Resolvers::OsRelease.resolve(:release) + fact_value = determine_release_for_os return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value @@ -23,6 +23,18 @@ def call_the_resolver Facter::ResolvedFact.new(ALIASES.first, versions[0], :legacy), Facter::ResolvedFact.new(ALIASES.last, fact_value, :legacy)] end + + private + + def determine_release_for_os + os_name = Facter::Resolvers::OsRelease.resolve(:name) + + if os_name =~ /Debian/ + Facter::Resolvers::DebianVersion.resolve(:version) + else + Facter::Resolvers::OsRelease.resolve(:version_id) + end + end end end end diff --git a/lib/resolvers/debian_version.rb b/lib/resolvers/debian_version.rb new file mode 100644 index 000000000..6ce621f90 --- /dev/null +++ b/lib/resolvers/debian_version.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Facter + module Resolvers + class DebianVersion < BaseResolver + # :major + # :minor + # :full + + @semaphore = Mutex.new + @fact_list ||= {} + + class << self + private + + def post_resolve(fact_name) + @fact_list.fetch(fact_name) { read_debian_version(fact_name) } + end + + def read_debian_version(fact_name) + return unless File.readable?('/etc/debian_version') + + verion = File.read('/etc/debian_version') + + @fact_list[:version] = verion.strip + + @fact_list[fact_name] + end + end + end + end +end diff --git a/lib/resolvers/os_release_resolver.rb b/lib/resolvers/os_release_resolver.rb index b48ba720d..c82dc924b 100644 --- a/lib/resolvers/os_release_resolver.rb +++ b/lib/resolvers/os_release_resolver.rb @@ -39,7 +39,6 @@ def read_os_release_file(fact_name) fill_fact_list(pairs) process_name - find_debian_release if @fact_list[:name].match?(/Debian/) @fact_list[fact_name] end @@ -49,7 +48,6 @@ def fill_fact_list(pairs) result.each { |k, v| @fact_list[k.downcase.to_sym] = v } @fact_list[:identifier] = @fact_list[:id] - @fact_list[:release] = @fact_list[:version_id] end def process_name @@ -61,13 +59,6 @@ def process_name @fact_list[:name].split(' ')[0].strip end end - - def find_debian_release - return unless File.readable?('/etc/debian_version') - - version = File.read('/etc/debian_version') - @fact_list[:release] = version.strip - end end end end diff --git a/spec/facter/facts/debian/os/distro/release_spec.rb b/spec/facter/facts/debian/os/distro/release_spec.rb index d45e19249..9e00bec48 100644 --- a/spec/facter/facts/debian/os/distro/release_spec.rb +++ b/spec/facter/facts/debian/os/distro/release_spec.rb @@ -4,38 +4,89 @@ describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Os::Distro::Release.new } - let(:value) { '9.0' } - let(:release) { { 'full' => '9.0', 'major' => '9', 'minor' => '0' } } + context 'when os is Ubuntu' do + before do + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:name).and_return(name) + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(value) + end - before do - allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) - end + let(:name) { 'Ubuntu' } - it 'calls Facter::Resolvers::LsbRelease' do - fact.call_the_resolver - expect(Facter::Resolvers::LsbRelease).to have_received(:resolve).with(:release) - end + context 'when version_id is retrieved successful' do + let(:value) { '18.04' } + let(:value_final) { { 'full' => '18.04', 'major' => '18', 'minor' => '4' } } + + it 'calls Facter::Resolvers::OsRelease with :name' do + fact.call_the_resolver + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:name) + end + + it 'calls Facter::Resolvers::OsRelease with :version_id' do + fact.call_the_resolver + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:version_id) + end + + it 'returns release fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ + contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: value_final), + an_object_having_attributes(name: 'lsbdistrelease', value: value, type: :legacy), + an_object_having_attributes(name: 'lsbmajdistrelease', + value: value_final['major'], type: :legacy), + an_object_having_attributes(name: 'lsbminordistrelease', + value: value_final['minor'], type: :legacy)) + end + end - it 'returns release fact' do - expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ - contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), - an_object_having_attributes(name: 'lsbdistrelease', value: value, type: :legacy), - an_object_having_attributes(name: 'lsbmajdistrelease', - value: release['major'], type: :legacy), - an_object_having_attributes(name: 'lsbminordistrelease', - value: release['minor'], type: :legacy)) + context 'when version_id could not be retrieve' do + let(:value) { nil } + + it 'returns release fact as nil' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'os.distro.release', value: value) + end + end end - context 'when lsb_release is not installed' do - let(:value) { nil } + context 'when os is Debian' do + let(:name) { 'Debian' } before do - allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:name).and_return(name) + allow(Facter::Resolvers::DebianVersion).to receive(:resolve).with(:version).and_return(value) + end + + context 'when version_id is retrieved successful' do + let(:value) { '10.02' } + let(:value_final) { { 'full' => '10.02', 'major' => '10', 'minor' => '2' } } + + it 'calls Facter::Resolvers::OsRelease with :name' do + fact.call_the_resolver + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:name) + end + + it 'calls Facter::Resolvers::DebianVersion' do + fact.call_the_resolver + expect(Facter::Resolvers::DebianVersion).to have_received(:resolve).with(:version) + end + + it 'returns release fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ + contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: value_final), + an_object_having_attributes(name: 'lsbdistrelease', value: value, type: :legacy), + an_object_having_attributes(name: 'lsbmajdistrelease', + value: value_final['major'], type: :legacy), + an_object_having_attributes(name: 'lsbminordistrelease', + value: value_final['minor'], type: :legacy)) + end end - it 'returns release fact' do - expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) - .and have_attributes(name: 'os.distro.release', value: value) + context 'when version_id could not be retrieve' do + let(:value) { nil } + + it 'returns release fact as nil' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'os.distro.release', value: value) + end end end end diff --git a/spec/facter/facts/debian/os/release_spec.rb b/spec/facter/facts/debian/os/release_spec.rb index 079654870..aec3e93bd 100644 --- a/spec/facter/facts/debian/os/release_spec.rb +++ b/spec/facter/facts/debian/os/release_spec.rb @@ -4,35 +4,87 @@ describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Os::Release.new } - before do - allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:release).and_return(value) - end + context 'when os is Ubuntu' do + before do + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:name).and_return(name) + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(value) + end + + let(:name) { 'Ubuntu' } + + context 'when version_id is retrieved successful' do + let(:value) { '18.04' } + let(:value_final) { { 'full' => '18.04', 'major' => '18', 'minor' => '4' } } - context 'when lsb_release installed' do - let(:value) { '10.09' } - let(:value_final) { { 'full' => '10.09', 'major' => '10', 'minor' => '9' } } + it 'calls Facter::Resolvers::OsRelease with :name' do + fact.call_the_resolver + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:name) + end - it 'calls Facter::Resolvers::OsRelease' do - fact.call_the_resolver - expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:release) + it 'calls Facter::Resolvers::OsRelease with :version_id' do + fact.call_the_resolver + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:version_id) + end + + it 'returns release fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ + contain_exactly(an_object_having_attributes(name: 'os.release', value: value_final), + an_object_having_attributes(name: 'operatingsystemmajrelease', value: value_final['major'], + type: :legacy), + an_object_having_attributes(name: 'operatingsystemrelease', value: value_final['full'], + type: :legacy)) + end end - it 'returns release fact' do - expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ - contain_exactly(an_object_having_attributes(name: 'os.release', value: value_final), - an_object_having_attributes(name: 'operatingsystemmajrelease', value: value_final['major'], - type: :legacy), - an_object_having_attributes(name: 'operatingsystemrelease', value: value_final['full'], - type: :legacy)) + context 'when version_id could not be retrieve' do + let(:value) { nil } + + it 'returns release fact as nil' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'os.release', value: value) + end end end - context 'when lsb_release uninstalled' do - let(:value) { nil } + context 'when os is Debian' do + let(:name) { 'Debian' } + + before do + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:name).and_return(name) + allow(Facter::Resolvers::DebianVersion).to receive(:resolve).with(:version).and_return(value) + end + + context 'when version_id is retrieved successful' do + let(:value) { '10.02' } + let(:value_final) { { 'full' => '10.02', 'major' => '10', 'minor' => '2' } } + + it 'calls Facter::Resolvers::OsRelease with :name' do + fact.call_the_resolver + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:name) + end + + it 'calls Facter::Resolvers::DebianVersion' do + fact.call_the_resolver + expect(Facter::Resolvers::DebianVersion).to have_received(:resolve).with(:version) + end + + it 'returns release fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ + contain_exactly(an_object_having_attributes(name: 'os.release', value: value_final), + an_object_having_attributes(name: 'operatingsystemmajrelease', value: value_final['major'], + type: :legacy), + an_object_having_attributes(name: 'operatingsystemrelease', value: value_final['full'], + type: :legacy)) + end + end + + context 'when version_id could not be retrieve' do + let(:value) { nil } - it 'returns release fact as nil' do - expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ - have_attributes(name: 'os.release', value: value) + it 'returns release fact as nil' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'os.release', value: value) + end end end end diff --git a/spec/facter/resolvers/debian_version_spec.rb b/spec/facter/resolvers/debian_version_spec.rb new file mode 100644 index 000000000..b96a5e2ee --- /dev/null +++ b/spec/facter/resolvers/debian_version_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +describe Facter::Resolvers::DebianVersion do + before do + allow(File).to receive(:readable?).with('/etc/debian_version').and_return(true) + allow(File).to receive(:read).with('/etc/debian_version').and_return("10.01\n") + end + + it 'returns version' do + result = Facter::Resolvers::DebianVersion.resolve(:version) + + expect(result).to eq('10.01') + end +end diff --git a/spec/facter/resolvers/os_release_resolver_spec.rb b/spec/facter/resolvers/os_release_resolver_spec.rb index 67f0d23ba..8a379a62b 100644 --- a/spec/facter/resolvers/os_release_resolver_spec.rb +++ b/spec/facter/resolvers/os_release_resolver_spec.rb @@ -1,96 +1,41 @@ # frozen_string_literal: true describe Facter::Resolvers::OsRelease do - context 'when os is ubuntu' do - before do - allow(File).to receive(:readable?) - .with('/etc/os-release') - .and_return(true) - - allow(File).to receive(:read) - .with('/etc/os-release') - .and_return(load_fixture('os_release').read) - end - - after do - Facter::Resolvers::OsRelease.invalidate_cache - end - - it 'returns os NAME' do - result = Facter::Resolvers::OsRelease.resolve(:name) - - expect(result).to eq('Ubuntu') - end - - it 'returns os PRETTY_NAME' do - result = Facter::Resolvers::OsRelease.resolve(:pretty_name) - - expect(result).to eq('Ubuntu 18.04.1 LTS') - end - - it 'returns os VERSION_ID' do - result = Facter::Resolvers::OsRelease.resolve(:version_id) - - expect(result).to eq('18.04') - end - - it 'returns os release' do - result = Facter::Resolvers::OsRelease.resolve(:release) - - expect(result).to eq('18.04') - end - - it 'returns os VERSION_CODENAME' do - result = Facter::Resolvers::OsRelease.resolve(:version_codename) - - expect(result).to eq('bionic') - end + before do + allow(File).to receive(:readable?) + .with('/etc/os-release') + .and_return(true) + + allow(File).to receive(:read) + .with('/etc/os-release') + .and_return(load_fixture('os_release').read) end - context 'when os is Debian' do - before do - allow(File).to receive(:readable?).with('/etc/os-release').and_return(true) - - allow(File).to receive(:read) - .with('/etc/os-release') - .and_return(load_fixture('os_release_debian').read) - - allow(File).to receive(:readable?).with('/etc/debian_version').and_return(true) - allow(File).to receive(:read).with('/etc/debian_version').and_return("10.0\n") - end - - after do - Facter::Resolvers::OsRelease.invalidate_cache - end - - it 'returns os release' do - result = Facter::Resolvers::OsRelease.resolve(:release) - - expect(result).to eq('10.0') - end + after do + Facter::Resolvers::OsRelease.invalidate_cache + end - it 'returns os NAME' do - result = Facter::Resolvers::OsRelease.resolve(:name) + it 'returns os NAME' do + result = Facter::Resolvers::OsRelease.resolve(:name) - expect(result).to eq('Debian') - end + expect(result).to eq('Ubuntu') + end - it 'returns os PRETTY_NAME' do - result = Facter::Resolvers::OsRelease.resolve(:pretty_name) + it 'returns os PRETTY_NAME' do + result = Facter::Resolvers::OsRelease.resolve(:pretty_name) - expect(result).to eq('Debian GNU/Linux 10 (buster)') - end + expect(result).to eq('Ubuntu 18.04.1 LTS') + end - it 'returns os VERSION_ID' do - result = Facter::Resolvers::OsRelease.resolve(:version_id) + it 'returns os VERSION_ID' do + result = Facter::Resolvers::OsRelease.resolve(:version_id) - expect(result).to eq('10') - end + expect(result).to eq('18.04') + end - it 'returns os VERSION_CODENAME' do - result = Facter::Resolvers::OsRelease.resolve(:version_codename) + it 'returns os VERSION_CODENAME' do + result = Facter::Resolvers::OsRelease.resolve(:version_codename) - expect(result).to eq('buster') - end + expect(result).to eq('bionic') end end diff --git a/spec/framework/core/session_cache_spec.rb b/spec/framework/core/session_cache_spec.rb index 33ff152dc..4b0c9da82 100644 --- a/spec/framework/core/session_cache_spec.rb +++ b/spec/framework/core/session_cache_spec.rb @@ -1,10 +1,12 @@ # frozen_string_literal: true describe Facter::SessionCache do + let(:uname_resolver) { spy(Facter::Resolvers::Uname) } + it 'registers resolver subscription' do - uname_resolver = double(Facter::Resolvers::Uname) Facter::SessionCache.subscribe(uname_resolver) - expect(uname_resolver).to receive(:invalidate_cache) Facter::SessionCache.invalidate_all_caches + + expect(uname_resolver).to have_received(:invalidate_cache) end end