diff --git a/lib/facter/facts/linux/hypervisors/hyper_v.rb b/lib/facter/facts/linux/hypervisors/hyper_v.rb new file mode 100644 index 0000000000..98e888aa02 --- /dev/null +++ b/lib/facter/facts/linux/hypervisors/hyper_v.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Facts + module Linux + module Hypervisors + class HyperV + FACT_NAME = 'hypervisors.hyperv' + + def call_the_resolver + fact_value = check_hyper_v + Facter::ResolvedFact.new(FACT_NAME, fact_value) + end + + def check_hyper_v + manufacturer = Facter::Resolvers::Linux::DmiBios.resolve(:sys_vendor) + product_name = Facter::Resolvers::Linux::DmiBios.resolve(:product_name) + + return {} if manufacturer =~ /Microsoft/ && product_name == 'Virtual Machine' + + nil + end + end + end + end +end diff --git a/spec/facter/facts/linux/hypervisors/hyper_v_spec.rb b/spec/facter/facts/linux/hypervisors/hyper_v_spec.rb new file mode 100644 index 0000000000..b1e5bddb7c --- /dev/null +++ b/spec/facter/facts/linux/hypervisors/hyper_v_spec.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +describe Facts::Linux::Hypervisors::HyperV do + describe '#call_the_resolver' do + subject(:fact) { Facts::Linux::Hypervisors::HyperV.new } + + before do + allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:sys_vendor).and_return(manufacturer) + allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return(product_name) + end + + context 'when resolver returns hyper_v' do + let(:manufacturer) { 'Microsoft' } + let(:product_name) { 'Virtual Machine' } + let(:value) { {} } + + it 'calls Facter::Resolvers::DMIBios with :sys_vendor' do + fact.call_the_resolver + expect(Facter::Resolvers::Linux::DmiBios).to have_received(:resolve).with(:sys_vendor) + end + + it 'calls Facter::Resolvers::DMIBios with :product_name' do + fact.call_the_resolver + expect(Facter::Resolvers::Linux::DmiBios).to have_received(:resolve).with(:product_name) + end + + it 'returns hyper_v fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'hypervisors.hyperv', value: value) + end + end + + context 'when resolver returns nil' do + let(:manufacturer) { nil } + let(:product_name) { nil } + let(:value) { nil } + + it 'returns virtual fact as nil' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'hypervisors.hyperv', value: value) + end + end + + context 'when manufacturer is not Microsoft' do + let(:manufacturer) { 'unknown' } + let(:product_name) { 'Virtual Machine' } + let(:value) { nil } + + it 'returns virtual fact as nil' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'hypervisors.hyperv', value: value) + end + end + + context 'when manufacturer is Microsoft and product name is not Virtual Machine' do + let(:manufacturer) { 'Microsoft' } + let(:product_name) { 'something_else' } + let(:value) { nil } + + it 'returns virtual fact as nil' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'hypervisors.hyperv', value: value) + end + end + end +end