From 25a7e76fda4ce86bf4c1b7460a00c9866c3e244f Mon Sep 17 00:00:00 2001 From: Kasumi Hanazuki Date: Wed, 6 Mar 2024 16:16:25 +0000 Subject: [PATCH] host_inventory/linux/virtualization: Fallback to systemd-detect-virt In detecting virtualization, if system-product-name from DMI is unknown to Specinfra, fallback to `systemd-detect-virt`, which has better heuristics. It currently returns `{system: nil}` in such a case. --- lib/specinfra/host_inventory/virtualization.rb | 4 ++-- spec/host_inventory/linux/virtualization_spec.rb | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/specinfra/host_inventory/virtualization.rb b/lib/specinfra/host_inventory/virtualization.rb index cb97de91e..1416b387b 100644 --- a/lib/specinfra/host_inventory/virtualization.rb +++ b/lib/specinfra/host_inventory/virtualization.rb @@ -17,8 +17,8 @@ def get cmd = backend.command.get(:get_inventory_system_product_name) ret = backend.run_command(cmd) - if ret.exit_status == 0 and ret.stdout.length > 0 - res[:system] = parse_system_product_name(ret.stdout) + if ret.success? and (parsed = parse_system_product_name(ret.stdout)) + res[:system] = parsed return res end diff --git a/spec/host_inventory/linux/virtualization_spec.rb b/spec/host_inventory/linux/virtualization_spec.rb index d96e586ab..d3bbc5042 100644 --- a/spec/host_inventory/linux/virtualization_spec.rb +++ b/spec/host_inventory/linux/virtualization_spec.rb @@ -25,6 +25,22 @@ expect(virt.get).to include(:system => 'openvz') end + it 'Debian on QEMU KVM should return :system => "kvm"' do + allow(virt.backend).to receive(:run_command).with('grep -Eqa \'docker(/|-[0-9a-f]+)\' /proc/1/cgroup||test -e /.dockerinit') do + CommandResult.new(:stdout => '', :exit_status => 1) + end + allow(virt.backend).to receive(:run_command).with('test -d /proc/vz -a ! -d /proc/bc') do + CommandResult.new(:stdout => '', :exit_status => 1) + end + allow(virt.backend).to receive(:run_command).with('dmidecode -s system-product-name') do + CommandResult.new(:stdout => "Standard PC (Q35 + ICH9, 2009)\n", :exit_status => 0) + end + allow(virt.backend).to receive(:run_command).with('systemd-detect-virt') do + CommandResult.new(:stdout => "kvm\n", :exit_status => 0) + end + expect(virt.get).to include(:system => 'kvm') + end + let(:host_inventory) { nil } it 'Debian Jessie on KVM should return :system => "kvm"' do ret = virt.parse_system_product_name("KVM\n")