diff --git a/lib/facts/linux/virtual.rb b/lib/facts/linux/virtual.rb index 383a3788f..329fd7fa4 100644 --- a/lib/facts/linux/virtual.rb +++ b/lib/facts/linux/virtual.rb @@ -6,7 +6,7 @@ class Virtual FACT_NAME = 'virtual' def call_the_resolver - fact_value = check_docker_lxc || check_gce + fact_value = check_docker_lxc || check_gce || check_vmware Facter::ResolvedFact.new(FACT_NAME, fact_value) end @@ -18,6 +18,10 @@ def check_gce def check_docker_lxc Facter::Resolvers::DockerLxc.resolve(:vm) end + + def check_vmware + Facter::Resolvers::Vmware.resolve(:vm) + end end end end diff --git a/lib/resolvers/vmware.rb b/lib/resolvers/vmware.rb new file mode 100644 index 000000000..c9d7f7aec --- /dev/null +++ b/lib/resolvers/vmware.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Facter + module Resolvers + class Vmware < BaseResolver + @semaphore = Mutex.new + @fact_list ||= {} + + class << self + private + + def post_resolve(fact_name) + @fact_list.fetch(fact_name) { vmware_command(fact_name) } + end + + def vmware_command(fact_name) + output = Facter::Core::Execution.execute('vmware -v', logger: log) + return if output.empty? + + parts = out.split("\n") + return unless parts.size.equal?(2) + + @fact_list[:vm] = "#{parts[0].downcase}_#{parts[1].downcase}" + @fact_list[fact_name] + end + end + end + end +end diff --git a/spec/facter/facts/linux/virtual_spec.rb b/spec/facter/facts/linux/virtual_spec.rb index 3686edd8a..9b07b6347 100644 --- a/spec/facter/facts/linux/virtual_spec.rb +++ b/spec/facter/facts/linux/virtual_spec.rb @@ -35,6 +35,20 @@ end end + context 'when is vmware' do + let(:vm) { nil } + let(:value) { 'vmware_fusion' } + + before do + allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(value) + end + + it 'returns virtual fact' do + expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ + have_attributes(name: 'virtual', value: value) + end + end + context 'when resolver returns nil' do let(:vm) { nil }