From f69c181514861661b51825bbd9ecaa5c0e57a426 Mon Sep 17 00:00:00 2001 From: Corey Osman Date: Thu, 24 Sep 2020 21:33:08 -0700 Subject: [PATCH] (FACT-2816) - Fix ec2 fact issues when on non ec2 systems * previously when ec2 facts are executed the check_product_name was run which incorrectly returned a hash of values when the product name did not exist in the hypervisor hash. This is an edge case on linux systems not in ec2. --- lib/facter/facts/linux/ec2_metadata.rb | 3 ++- lib/facter/facts/linux/ec2_userdata.rb | 3 ++- spec/facter/facts/linux/ec2_metadata_spec.rb | 19 +++++++++++++++++++ spec/facter/facts/linux/ec2_userdata_spec.rb | 19 +++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/lib/facter/facts/linux/ec2_metadata.rb b/lib/facter/facts/linux/ec2_metadata.rb index 492b3314e6..fa2868441f 100644 --- a/lib/facter/facts/linux/ec2_metadata.rb +++ b/lib/facter/facts/linux/ec2_metadata.rb @@ -35,7 +35,8 @@ def check_product_name product_name = Facter::Resolvers::Linux::DmiBios.resolve(:product_name) return unless product_name - Facter::FactsUtils::HYPERVISORS_HASH.each { |key, value| return value if product_name.include?(key) } + _, value = Facter::FactsUtils::HYPERVISORS_HASH.find { |key, _value| product_name.include?(key) } + value end def check_bios_vendor diff --git a/lib/facter/facts/linux/ec2_userdata.rb b/lib/facter/facts/linux/ec2_userdata.rb index 9babb9b319..f925985487 100644 --- a/lib/facter/facts/linux/ec2_userdata.rb +++ b/lib/facter/facts/linux/ec2_userdata.rb @@ -33,7 +33,8 @@ def check_product_name product_name = Facter::Resolvers::Linux::DmiBios.resolve(:product_name) return unless product_name - Facter::FactsUtils::HYPERVISORS_HASH.each { |key, value| return value if product_name.include?(key) } + _, value = Facter::FactsUtils::HYPERVISORS_HASH.find { |key, _value| product_name.include?(key) } + value end def check_bios_vendor diff --git a/spec/facter/facts/linux/ec2_metadata_spec.rb b/spec/facter/facts/linux/ec2_metadata_spec.rb index c430cd1cb8..30e4df9cad 100644 --- a/spec/facter/facts/linux/ec2_metadata_spec.rb +++ b/spec/facter/facts/linux/ec2_metadata_spec.rb @@ -13,6 +13,25 @@ allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) end + context 'when physical machine with no hypervisor' do + let(:hypervisor) { nil } + let(:value) { nil } + + before do + allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('MS-7A71') + end + + it 'returns ec2 metadata fact as nil' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'ec2_metadata', value: nil) + end + + it "doesn't call Ec2 resolver" do + fact.call_the_resolver + expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:metadata) + end + end + context 'when hypervisor is not kvm or xen' do let(:hypervisor) { nil } let(:value) { nil } diff --git a/spec/facter/facts/linux/ec2_userdata_spec.rb b/spec/facter/facts/linux/ec2_userdata_spec.rb index f1c9dacb78..18ae912d0f 100644 --- a/spec/facter/facts/linux/ec2_userdata_spec.rb +++ b/spec/facter/facts/linux/ec2_userdata_spec.rb @@ -13,6 +13,25 @@ allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) end + context 'when physical machine with no hypervisor' do + let(:hypervisor) { nil } + let(:value) { nil } + + before do + allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('MS-7A71') + end + + it 'returns ec2 metadata fact as nil' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'ec2_userdata', value: nil) + end + + it "doesn't call Ec2 resolver" do + fact.call_the_resolver + expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:userdata) + end + end + context 'when hypervisor is not kvm or xen' do let(:hypervisor) { nil } let(:value) { nil }