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

Commit

Permalink
(FACT-2569) changed how facter is replaced
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrei Filipovici committed May 5, 2020
2 parents 1cf9bf5 + b59a0d2 commit f24ec56
Show file tree
Hide file tree
Showing 15 changed files with 262 additions and 4 deletions.
6 changes: 2 additions & 4 deletions .github/actions/presuite.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
export DEBIAN_DISABLE_RUBYGEMS_INTEGRATION=no_wornings
cwd=$(pwd)

printf '\nInstall bundler\n\n'
gem install bundler
#printf '\nInstall bundler\n\n'
#gem install bundler

#printf '\nInstall facter 4 dependencies\n\n'
#cd $cwd/$FACTER_4_ROOT && bundle install
Expand All @@ -30,8 +30,6 @@ beaker exec pre-suite --pre-suite $BP_ROOT/setup/aio/010_Install_Puppet_Agent.rb
printf '\nConfigure facter 4 as facter 3\n\n'
puppet config set facterng true

agent_facter_ng_version=`facter-ng --version | tr -d '\r'`

cd $cwd/$FACTER_4_ROOT
/opt/puppetlabs/puppet/bin/gem build agent/facter-ng.gemspec
/opt/puppetlabs/puppet/bin/gem uninstall facter-ng
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,4 @@ jobs:
- name: Run acceptance tests
run: sudo -E bash -c facter_4/.github/actions/presuite.sh

16 changes: 16 additions & 0 deletions lib/facts/bsd/kernelmajversion.rb
Original file line number Diff line number Diff line change
@@ -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
14 changes: 14 additions & 0 deletions lib/facts/bsd/kernelversion.rb
Original file line number Diff line number Diff line change
@@ -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
14 changes: 14 additions & 0 deletions lib/facts/bsd/load_averages.rb
Original file line number Diff line number Diff line change
@@ -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
18 changes: 18 additions & 0 deletions lib/facts/bsd/os/family.rb
Original file line number Diff line number Diff line change
@@ -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
25 changes: 25 additions & 0 deletions lib/resolvers/bsd/ffi/ffi_helper.rb
Original file line number Diff line number Diff line change
@@ -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
26 changes: 26 additions & 0 deletions lib/resolvers/bsd/load_averages_resolver.rb
Original file line number Diff line number Diff line change
@@ -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
24 changes: 24 additions & 0 deletions spec/facter/facts/bsd/kernelmajversion_spec.rb
Original file line number Diff line number Diff line change
@@ -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
24 changes: 24 additions & 0 deletions spec/facter/facts/bsd/kernelversion_spec.rb
Original file line number Diff line number Diff line change
@@ -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
23 changes: 23 additions & 0 deletions spec/facter/facts/bsd/load_averages_spec.rb
Original file line number Diff line number Diff line change
@@ -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
24 changes: 24 additions & 0 deletions spec/facter/facts/bsd/os/family_spec.rb
Original file line number Diff line number Diff line change
@@ -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
26 changes: 26 additions & 0 deletions spec/facter/resolvers/bsd/ffi_helper_spec.rb
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions spec/facter/resolvers/bsd/load_averages_resolver_spec.rb
Original file line number Diff line number Diff line change
@@ -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
9 changes: 9 additions & 0 deletions spec/fixtures/debian_os_release
Original file line number Diff line number Diff line change
@@ -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/"

0 comments on commit f24ec56

Please sign in to comment.