Skip to content
This repository has been archived by the owner on Jun 19, 2020. It is now read-only.

Commit

Permalink
Add os.release facts on FreeBSD (#485)
Browse files Browse the repository at this point in the history
* (maint) Add os.release facts on FreeBSD
* (maint) Improve freebsd-version failure management

This program is always supposed to be found and return the expected
output on FreeBSD but make sure it runs successfully, catpure stderr in
case it becomes used at some point, and do not raise exceptions if the
resolver fails.

* (maint) Improve failing fact resolution
If the resolver fails to gather the fact, return an empty resolved fact
instead of an empty array.
  • Loading branch information
smortex committed May 6, 2020
1 parent 5bcacc8 commit b0de928
Show file tree
Hide file tree
Showing 6 changed files with 191 additions and 1 deletion.
43 changes: 43 additions & 0 deletions lib/facts/freebsd/os/release.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# frozen_string_literal: true

module Facts
module Freebsd
module Os
class Release
FACT_NAME = 'os.release'
ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze

def call_the_resolver
installed_userland = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:installed_userland)

return Facter::ResolvedFact.new(FACT_NAME, nil) if !installed_userland || installed_userland.empty?

value = build_release_hash_from_version(installed_userland)

[Facter::ResolvedFact.new(FACT_NAME, value),
Facter::ResolvedFact.new(ALIASES.first, value[:major], :legacy),
Facter::ResolvedFact.new(ALIASES.last, installed_userland, :legacy)]
end

private

def build_release_hash_from_version(version_string)
version, branch_value = version_string.split('-', 2)
major_value, minor_value = version.split('.')
patchlevel_value = branch_value.split('-p')[1]

value = {
full: version_string,
major: major_value,
branch: branch_value
}

value[:minor] = minor_value if minor_value
value[:patchlevel] = patchlevel_value if patchlevel_value

value
end
end
end
end
end
2 changes: 2 additions & 0 deletions lib/framework/detector/os_detector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ def detect
:macosx
when /linux/
detect_distro
when /freebsd/
:freebsd
when /bsd/
:bsd
when /solaris/
Expand Down
39 changes: 39 additions & 0 deletions lib/resolvers/freebsd/freebsd_version_resolver.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# frozen_string_literal: true

module Facter
module Resolvers
module Freebsd
class FreebsdVersion < BaseResolver
@semaphore = Mutex.new
@fact_list ||= {}

class << self
private

def post_resolve(fact_name)
@fact_list.fetch(fact_name) { freebsd_version_system_call(fact_name) }
end

def freebsd_version_system_call(fact_name)
output, _stderr, status = Open3.capture3('/bin/freebsd-version -kru')
return nil unless status.success?

build_fact_list(output)

@fact_list[fact_name]
rescue Errno::ENOENT
nil
end

def build_fact_list(output)
freebsd_version_results = output.split("\n")

@fact_list[:installed_kernel] = freebsd_version_results[0].strip
@fact_list[:running_kernel] = freebsd_version_results[1].strip
@fact_list[:installed_userland] = freebsd_version_results[2].strip
end
end
end
end
end
end
6 changes: 5 additions & 1 deletion os_hierarchy.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@
},
{
"Solaris": [
"Bsd"
{
"Bsd": [
"Freebsd"
]
}
]
},
"Macosx",
Expand Down
71 changes: 71 additions & 0 deletions spec/facter/facts/freebsd/os/release_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# frozen_string_literal: true

describe Facts::Freebsd::Os::Release do
describe '#call_the_resolver' do
subject(:fact) { Facts::Freebsd::Os::Release.new }

before do
allow(Facter::Resolvers::Freebsd::FreebsdVersion).to receive(:resolve).with(:installed_userland).and_return(value)
end

context 'when FreeBSD RELEASE' do
let(:value) { '12.1-RELEASE-p3' }

it 'calls Facter::Resolvers::Freebsd::FreebsdVersion' do
fact.call_the_resolver
expect(Facter::Resolvers::Freebsd::FreebsdVersion).to have_received(:resolve).with(:installed_userland)
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: { 'full' => value,
'major' => '12',
'minor' => '1',
'branch' => 'RELEASE-p3',
'patchlevel' => '3' }),
an_object_having_attributes(name: 'operatingsystemmajrelease', value: '12',
type: :legacy),
an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy))
end
end

context 'when FreeBSD STABLE' do
let(:value) { '12.1-STABLE' }

it 'calls Facter::Resolvers::Freebsd::FreebsdVersion' do
fact.call_the_resolver
expect(Facter::Resolvers::Freebsd::FreebsdVersion).to have_received(:resolve).with(:installed_userland)
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: { 'full' => value,
'major' => '12',
'minor' => '1',
'branch' => 'STABLE' }),
an_object_having_attributes(name: 'operatingsystemmajrelease', value: '12',
type: :legacy),
an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy))
end
end

context 'when FreeBSD CURRENT' do
let(:value) { '13-CURRENT' }

it 'calls Facter::Resolvers::Freebsd::FreebsdVersion' do
fact.call_the_resolver
expect(Facter::Resolvers::Freebsd::FreebsdVersion).to have_received(:resolve).with(:installed_userland)
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: { 'full' => value,
'major' => '13',
'branch' => 'CURRENT' }),
an_object_having_attributes(name: 'operatingsystemmajrelease', value: '13',
type: :legacy),
an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy))
end
end
end
end
31 changes: 31 additions & 0 deletions spec/facter/resolvers/freebsd/freebsd_version_resolver_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# frozen_string_literal: true

describe Facter::Resolvers::Freebsd::FreebsdVersion do
before do
status = instance_double('Process::Status')
allow(status).to receive(:success?).and_return(true)
allow(Open3).to receive(:capture3)
.with('/bin/freebsd-version -kru')
.and_return(['13.0-CURRENT
12.1-RELEASE-p3
12.0-STABLE', nil, status])
end

it 'returns installed kernel' do
result = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:installed_kernel)

expect(result).to eq('13.0-CURRENT')
end

it 'returns running kernel' do
result = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:running_kernel)

expect(result).to eq('12.1-RELEASE-p3')
end

it 'returns installed userland' do
result = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:installed_userland)

expect(result).to eq('12.0-STABLE')
end
end

0 comments on commit b0de928

Please sign in to comment.