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

(FACT-2235) Add Aix processors fact #483

Merged
merged 1 commit into from
May 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions lib/facts/aix/processors/count.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

module Facts
module Aix
module Processors
class Count
FACT_NAME = 'processors.count'
ALIASES = 'processorcount'

def call_the_resolver
fact_value = Facter::Resolvers::Aix::Processors.resolve(:logical_count)
[Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)]
end
end
end
end
end
18 changes: 18 additions & 0 deletions lib/facts/aix/processors/isa.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# frozen_string_literal: true

module Facts
module Aix
module Processors
class Isa
FACT_NAME = 'processors.isa'
ALIASES = 'hardwareisa'

def call_the_resolver
fact_value = Facter::Resolvers::Uname.resolve(:processor)

[Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)]
end
end
end
end
end
16 changes: 16 additions & 0 deletions lib/facts/aix/processors/models.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

module Facts
module Aix
module Processors
class Models
FACT_NAME = 'processors.models'

def call_the_resolver
fact_value = Facter::Resolvers::Aix::Processors.resolve(:models)
Facter::ResolvedFact.new(FACT_NAME, fact_value)
end
end
end
end
end
17 changes: 17 additions & 0 deletions lib/facts/aix/processors/speed.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

module Facts
module Aix
module Processors
class Speed
FACT_NAME = 'processors.speed'

def call_the_resolver
fact_value = Facter::Resolvers::Aix::Processors.resolve(:speed)
speed = Facter::FactsUtils::UnitConverter.hertz_to_human_readable(fact_value)
Facter::ResolvedFact.new(FACT_NAME, speed)
end
end
end
end
end
80 changes: 80 additions & 0 deletions lib/resolvers/aix/processors.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# frozen_string_literal: true

module Facter
module Resolvers
module Aix
class Processors < BaseResolver
@semaphore = Mutex.new
@fact_list ||= {}
class << self
private

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

def query_pddv(fact_name)
@fact_list[:models] = []
@fact_list[:logical_count] = 0

odmquery = Facter::ODMQuery.new
odmquery.equals('class', 'processor')

result = odmquery.execute

return unless result

proc_names = retrieve_from_array(result.scan(/uniquetype\s=\s.*/), 1)

proc_names.each { |name| populate_from_cudv(name) }

@fact_list[fact_name]
end

def populate_from_cudv(name)
odmquery = Facter::ODMQuery.new
odmquery.equals('PdDvLn', name)

result = odmquery.execute

return unless result

names = retrieve_from_array(result.scan(/name\s=\s.*/), 1)

names.each { |elem| query_cuat(elem) }
end

def query_cuat(name)
odmquery = Facter::ODMQuery.new
odmquery.equals('name', name)

result = odmquery.execute

return unless result

type, frequency, smt_threads, smt_enabled = process(result)

@fact_list[:speed] ||= frequency if frequency

threads = smt_enabled ? smt_threads : 1

@fact_list[:logical_count] += threads
@fact_list[:models].concat([type] * threads)
end

def process(stdout)
type = retrieve_from_array(stdout.scan(/attribute\s=\s"type"\n\s+value\s=\s.*/), 2).first
frequency = retrieve_from_array(stdout.scan(/attribute\s=\s"frequency"\n\s+value\s=\s.*/), 2).first
smt_threads = retrieve_from_array(stdout.scan(/attribute\s=\s"smt_threads"\n\s+value\s=\s.*/), 2).first
smt_enabled = retrieve_from_array(stdout.scan(/attribute\s=\s"smt_enabled"\n\s+value\s=\s.*/), 2).first
[type, frequency.to_i, smt_threads.to_i, smt_enabled]
end

def retrieve_from_array(array, pos)
array.map { |elem| elem.split('=')[pos].strip.delete('"') }
end
end
end
end
end
end
25 changes: 25 additions & 0 deletions spec/facter/facts/aix/processors/count_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# frozen_string_literal: true

describe Facts::Aix::Processors::Count do
describe '#call_the_resolver' do
subject(:fact) { Facts::Aix::Processors::Count.new }

let(:processors_count) { '32' }

before do
allow(Facter::Resolvers::Aix::Processors).to \
receive(:resolve).with(:logical_count).and_return(processors_count)
end

it 'calls Facter::Resolvers::Aix::Processors' do
fact.call_the_resolver
expect(Facter::Resolvers::Aix::Processors).to have_received(:resolve).with(:logical_count)
end

it 'returns processors count fact' do
expect(fact.call_the_resolver).to be_an_instance_of(Array).and \
contain_exactly(an_object_having_attributes(name: 'processors.count', value: processors_count),
an_object_having_attributes(name: 'processorcount', value: processors_count, type: :legacy))
end
end
end
25 changes: 25 additions & 0 deletions spec/facter/facts/aix/processors/isa_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# frozen_string_literal: true

describe Facts::Aix::Processors::Isa do
describe '#call_the_resolver' do
subject(:fact) { Facts::Aix::Processors::Isa.new }

let(:processors_arch) { 'powerpc' }

before do
allow(Facter::Resolvers::Uname).to \
receive(:resolve).with(:processor).and_return(processors_arch)
end

it 'calls Facter::Resolvers::Uname' do
fact.call_the_resolver
expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:processor)
end

it 'returns processors isa fact' do
expect(fact.call_the_resolver).to be_an_instance_of(Array).and \
contain_exactly(an_object_having_attributes(name: 'processors.isa', value: processors_arch),
an_object_having_attributes(name: 'hardwareisa', value: processors_arch, type: :legacy))
end
end
end
24 changes: 24 additions & 0 deletions spec/facter/facts/aix/processors/models_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# frozen_string_literal: true

describe Facts::Aix::Processors::Models do
describe '#call_the_resolver' do
subject(:fact) { Facts::Aix::Processors::Models.new }

let(:models) { %w[PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8] }

before do
allow(Facter::Resolvers::Aix::Processors).to \
receive(:resolve).with(:models).and_return(models)
end

it 'calls Facter::Resolvers::Aix::Processors' do
fact.call_the_resolver
expect(Facter::Resolvers::Aix::Processors).to have_received(:resolve).with(:models)
end

it 'returns processors models fact' do
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
have_attributes(name: 'processors.models', value: models)
end
end
end
25 changes: 25 additions & 0 deletions spec/facter/facts/aix/processors/speed_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# frozen_string_literal: true

describe Facts::Aix::Processors::Speed do
describe '#call_the_resolver' do
subject(:fact) { Facts::Aix::Processors::Speed.new }

let(:speed) { 1_800_000_000 }
let(:converted_speed) { '1.80 GHz' }

before do
allow(Facter::Resolvers::Aix::Processors).to \
receive(:resolve).with(:speed).and_return(speed)
end

it 'calls Facter::Resolvers::Aix::Processors' do
fact.call_the_resolver
expect(Facter::Resolvers::Aix::Processors).to have_received(:resolve).with(:speed)
end

it 'returns a resolved fact' do
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
have_attributes(name: 'processors.speed', value: converted_speed)
end
end
end
86 changes: 86 additions & 0 deletions spec/facter/resolvers/aix/processors_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# frozen_string_literal: true

describe Facter::Resolvers::Aix::Processors do
subject(:resolver) { Facter::Resolvers::Aix::Processors }

let(:odm_query_spy) { instance_spy(Facter::ODMQuery) }
let(:odm_query_spy2) { instance_spy(Facter::ODMQuery) }
let(:odm_query_spy3) { instance_spy(Facter::ODMQuery) }
let(:logger_spy) { instance_spy(Facter::Log) }

before do
resolver.instance_variable_set(:@log, logger_spy)
allow(Facter::ODMQuery).to receive(:new).ordered.and_return(odm_query_spy, odm_query_spy2, odm_query_spy3)
allow(odm_query_spy).to receive(:equals).with('class', 'processor').ordered
allow(odm_query_spy).to receive(:execute).ordered.and_return(result)
end

after do
resolver.invalidate_cache
end

context 'when PdDv query fails' do
let(:result) { nil }

it 'returns nil' do
expect(resolver.resolve(:speed)).to be_nil
end
end

context 'when PdDv query succesful but CuDv fails' do
let(:result) { load_fixture('processors_pddv').read }

before do
allow(odm_query_spy2).to receive(:equals).with('PdDvLn', 'processor/sys/proc_rspc').ordered
allow(odm_query_spy2).to receive(:execute).ordered.and_return(nil)
end

it 'returns nil' do
expect(resolver.resolve(:speed)).to be_nil
end
end

context 'when CuAt query fails' do
let(:result) { load_fixture('processors_pddv').read }

before do
allow(odm_query_spy2).to receive(:equals).with('PdDvLn', 'processor/sys/proc_rspc').ordered
allow(odm_query_spy2).to receive(:execute).ordered.and_return(load_fixture('processors_cudv').read)

allow(odm_query_spy3).to receive(:equals).with('name', 'proc0').ordered
allow(odm_query_spy3).to receive(:execute).ordered.and_return(nil)
end

it 'returns nil' do
expect(resolver.resolve(:speed)).to be_nil
end
end

context 'when all queries returns an output' do
let(:result) { load_fixture('processors_pddv').read }
let(:models) do
%w[PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8
PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8]
end

before do
allow(odm_query_spy2).to receive(:equals).with('PdDvLn', 'processor/sys/proc_rspc').ordered
allow(odm_query_spy2).to receive(:execute).and_return(load_fixture('processors_cudv').read)

allow(odm_query_spy3).to receive(:equals).with('name', 'proc0').ordered
allow(odm_query_spy3).to receive(:execute).ordered.and_return(load_fixture('processors_cuat').read)
end

it 'returns speed fact' do
expect(resolver.resolve(:speed)).to eq(3_425_000_000)
end

it 'returns models fact' do
expect(resolver.resolve(:models)).to eq(models)
end

it 'returns logical_count fact' do
expect(resolver.resolve(:logical_count)).to eq(8)
end
end
end
35 changes: 35 additions & 0 deletions spec/fixtures/processors_cuat
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
uAt:
name = "proc0"
attribute = "type"
value = "PowerPC_POWER8"
type = "R"
generic = "D"
rep = "sl"
nls_index = 49

CuAt:
name = "proc0"
attribute = "frequency"
value = "3425000000"
type = "R"
generic = "D"
rep = "s"
nls_index = 69

CuAt:
name = "proc0"
attribute = "smt_threads"
value = "8"
type = "R"
generic = "D"
rep = ""
nls_index = 82

CuAt:
name = "proc0"
attribute = "smt_enabled"
value = "true"
type = "R"
generic = "D"
rep = ""
nls_index = 83
4 changes: 4 additions & 0 deletions spec/fixtures/processors_cudv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CuDv:
name = "proc0"
status = 1
PdDvLn = "processor/sys/proc_rspc"
6 changes: 6 additions & 0 deletions spec/fixtures/processors_pddv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
PdDv:
type = "proc_rspc"
class = "processor"
Stop = ""
inventory_only = 0
uniquetype = "processor/sys/proc_rspc"