From c6dccd445422def53dd3bf3b237a6c282442cdf1 Mon Sep 17 00:00:00 2001 From: Andrei Filipovici Date: Mon, 13 Jul 2020 20:49:03 +0300 Subject: [PATCH] (FACT-2690) Added Hyper-V fact for Linux --- lib/facter/facts/linux/hypervisors/hyper_v.rb | 25 +++++++ .../facts/linux/hypervisors/hyper_v_spec.rb | 66 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 lib/facter/facts/linux/hypervisors/hyper_v.rb create mode 100644 spec/facter/facts/linux/hypervisors/hyper_v_spec.rb 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..7003203350 --- /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..a43fe600bc --- /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, but product name is Virtual Machine' do + let(:manufacturer) { 'unknown' } + let(:product_name) { 'Virtual Machine' } + let(:value) { {} } + + 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 manufacturer is Microsoft and product name is not Virtual Machine' do + let(:manufacturer) { 'Microsoft' } + let(:product_name) { 'something_else' } + let(:value) { {} } + + 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 + end +end