Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(FACT-2693) Add systemd_nspawn fact #1958

Merged
merged 1 commit into from
Jul 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/facts/linux/hypervisors/docker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def call_the_resolver
end

def check_docker
info = Facter::Resolvers::DockerLxc.resolve(:hypervisor)
info = Facter::Resolvers::Containers.resolve(:hypervisor)
info[:docker] if info
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/linux/hypervisors/lxc.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def call_the_resolver
end

def check_lxc
info = Facter::Resolvers::DockerLxc.resolve(:hypervisor)
info = Facter::Resolvers::Containers.resolve(:hypervisor)
info[:lxc] if info
end
end
Expand Down
21 changes: 21 additions & 0 deletions lib/facts/linux/hypervisors/systemd_nspawn.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# frozen_string_literal: true

module Facts
module Linux
module Hypervisors
class SystemdNspawn
FACT_NAME = 'hypervisors.systemd_nspawn'

def call_the_resolver
fact_value = check_nspawn
Facter::ResolvedFact.new(FACT_NAME, fact_value)
end

def check_nspawn
info = Facter::Resolvers::Containers.resolve(:hypervisor)
info[:systemd_nspawn] if info
end
end
end
end
end
2 changes: 1 addition & 1 deletion lib/facts/linux/is_virtual.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def check_gce
end

def check_docker_lxc
Facter::Resolvers::DockerLxc.resolve(:vm)
Facter::Resolvers::Containers.resolve(:vm)
end

def check_vmware
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/linux/virtual.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def check_gce
end

def check_docker_lxc
Facter::Resolvers::DockerLxc.resolve(:vm)
Facter::Resolvers::Containers.resolve(:vm)
end

def check_vmware
Expand Down
14 changes: 12 additions & 2 deletions lib/resolvers/docker_lxc.rb → lib/resolvers/containers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

module Facter
module Resolvers
class DockerLxc < BaseResolver
class Containers < BaseResolver
# :virtual
# :hypervisor

Expand All @@ -20,13 +20,14 @@ def post_resolve(fact_name)
def read_cgroup(fact_name)
output_cgroup = Util::FileHelper.safe_read('/proc/1/cgroup', nil)
output_environ = Util::FileHelper.safe_read('/proc/1/environ', nil)
return if output_cgroup.nil? || output_environ.nil?
return unless output_cgroup && output_environ

output_docker = %r{docker/(.+)}.match(output_cgroup)
output_lxc = %r{^/lxc/([^/]+)}.match(output_cgroup)
lxc_from_environ = /container=lxc/ =~ output_environ

info, vm = extract_vm_and_info(output_docker, output_lxc, lxc_from_environ)
info, vm = extract_for_nspawn(output_environ) unless vm
@fact_list[:vm] = vm
@fact_list[:hypervisor] = { vm.to_sym => info } if vm
@fact_list[fact_name]
Expand All @@ -43,6 +44,15 @@ def extract_vm_and_info(output_docker, output_lxc, lxc_from_environ)

[info ? { INFO[vm] => info } : {}, vm]
end

def extract_for_nspawn(output_environ)
nspawn = /container=systemd-nspawn/ =~ output_environ
if nspawn
vm = 'systemd_nspawn'
info = Util::FileHelper.safe_read('/etc/machine-id', nil)
end
[info ? { 'id' => info.strip } : {}, vm]
end
end
end
end
Expand Down
6 changes: 3 additions & 3 deletions spec/facter/facts/linux/hypervisors/docker_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
subject(:fact) { Facts::Linux::Hypervisors::Docker.new }

before do
allow(Facter::Resolvers::DockerLxc).to \
allow(Facter::Resolvers::Containers).to \
receive(:resolve).with(:hypervisor).and_return(hv)
end

context 'when resolver returns docker' do
let(:hv) { { docker: { 'id' => 'testid' } } }
let(:value) { { 'id' => 'testid' } }

it 'calls Facter::Resolvers::DockerLxc' do
it 'calls Facter::Resolvers::Containers' do
fact.call_the_resolver
expect(Facter::Resolvers::DockerLxc).to have_received(:resolve).with(:hypervisor)
expect(Facter::Resolvers::Containers).to have_received(:resolve).with(:hypervisor)
end

it 'returns virtual fact' do
Expand Down
6 changes: 3 additions & 3 deletions spec/facter/facts/linux/hypervisors/lxc_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
subject(:fact) { Facts::Linux::Hypervisors::Lxc.new }

before do
allow(Facter::Resolvers::DockerLxc).to \
allow(Facter::Resolvers::Containers).to \
receive(:resolve).with(:hypervisor).and_return(hv)
end

context 'when resolver returns lxc' do
let(:hv) { { lxc: { 'name' => 'test_name' } } }
let(:value) { { 'name' => 'test_name' } }

it 'calls Facter::Resolvers::DockerLxc' do
it 'calls Facter::Resolvers::Containers' do
fact.call_the_resolver
expect(Facter::Resolvers::DockerLxc).to have_received(:resolve).with(:hypervisor)
expect(Facter::Resolvers::Containers).to have_received(:resolve).with(:hypervisor)
end

it 'returns virtual fact' do
Expand Down
55 changes: 55 additions & 0 deletions spec/facter/facts/linux/hypervisors/systemd_nspawn_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# frozen_string_literal: true

describe Facts::Linux::Hypervisors::SystemdNspawn do
describe '#call_the_resolver' do
subject(:fact) { Facts::Linux::Hypervisors::SystemdNspawn.new }

before do
allow(Facter::Resolvers::Containers).to \
receive(:resolve).with(:hypervisor).and_return(hv)
end

context 'when resolver returns systemd_nspawn' do
let(:hv) { { systemd_nspawn: { 'id' => 'testid00' } } }
let(:value) { { 'id' => 'testid00' } }

it 'calls Facter::Resolvers::Containers' do
fact.call_the_resolver
expect(Facter::Resolvers::Containers).to have_received(:resolve).with(:hypervisor)
end

it 'returns virtual fact' do
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
have_attributes(name: 'hypervisors.systemd_nspawn', value: value)
end
end

context 'when resolver returns docker' do
let(:hv) { { docker: { 'id' => 'testid' } } }

it 'returns virtual fact as nil' do
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
have_attributes(name: 'hypervisors.systemd_nspawn', value: nil)
end
end

context 'when resolver returns nil' do
let(:hv) { 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.systemd_nspawn', value: hv)
end
end

context 'when systemd_nspawn info is empty' do
let(:hv) { { systemd_nspawn: {} } }
let(:value) { {} }

it 'returns virtual fact as empty array' do
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
have_attributes(name: 'hypervisors.systemd_nspawn', value: value)
end
end
end
end
6 changes: 3 additions & 3 deletions spec/facter/facts/linux/is_virtual_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
let(:value) { true }

before do
allow(Facter::Resolvers::DockerLxc).to \
allow(Facter::Resolvers::Containers).to \
receive(:resolve).with(:vm).and_return(vm)
end

it 'calls Facter::Resolvers::DockerLxc' do
it 'calls Facter::Resolvers::Containers' do
fact.call_the_resolver
expect(Facter::Resolvers::DockerLxc).to have_received(:resolve).with(:vm)
expect(Facter::Resolvers::Containers).to have_received(:resolve).with(:vm)
end

it 'returns virtual fact' do
Expand Down
6 changes: 3 additions & 3 deletions spec/facter/facts/linux/virtual_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
let(:vm) { 'docker' }

before do
allow(Facter::Resolvers::DockerLxc).to \
allow(Facter::Resolvers::Containers).to \
receive(:resolve).with(:vm).and_return(vm)
end

it 'calls Facter::Resolvers::DockerLxc' do
it 'calls Facter::Resolvers::Containers' do
fact.call_the_resolver
expect(Facter::Resolvers::DockerLxc).to have_received(:resolve).with(:vm)
expect(Facter::Resolvers::Containers).to have_received(:resolve).with(:vm)
end

it 'returns virtual fact' do
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# frozen_string_literal: true

describe Facter::Resolvers::DockerLxc do
subject(:docker_lxc_resolver) { Facter::Resolvers::DockerLxc }
describe Facter::Resolvers::Containers do
subject(:containers_resolver) { Facter::Resolvers::Containers }

before do
allow(Facter::Util::FileHelper).to receive(:safe_read)
Expand All @@ -13,7 +13,7 @@
end

after do
docker_lxc_resolver.invalidate_cache
containers_resolver.invalidate_cache
end

context 'when hypervisor is docker' do
Expand All @@ -22,11 +22,31 @@
let(:result) { { docker: { 'id' => 'ee6e3c05422f1273c9b41a26f2b4ec64bdb4480d63a1ad9741e05cafc1651b90' } } }

it 'return docker for vm' do
expect(docker_lxc_resolver.resolve(:vm)).to eq('docker')
expect(containers_resolver.resolve(:vm)).to eq('docker')
end

it 'return docker info for hypervisor' do
expect(docker_lxc_resolver.resolve(:hypervisor)).to eq(result)
expect(containers_resolver.resolve(:hypervisor)).to eq(result)
end
end

context 'when hypervisor is nspawn' do
let(:cgroup_output) { load_fixture('cgroup_file').read }
let(:environ_output) { 'PATH=/usr/local/sbin:/bincontainer=systemd-nspawnTERM=xterm-256color' }
let(:result) { { systemd_nspawn: { 'id' => 'ee6e3c05422f1273c9b41a26f2b4ec64bdb4480d63a1ad9741e05cafc1651b90' } } }

before do
allow(Facter::Util::FileHelper).to receive(:safe_read)
.with('/etc/machine-id', nil)
.and_return("ee6e3c05422f1273c9b41a26f2b4ec64bdb4480d63a1ad9741e05cafc1651b90\n")
end

it 'return nspawn for vm' do
expect(containers_resolver.resolve(:vm)).to eq('systemd_nspawn')
end

it 'return nspawn info for hypervisor' do
expect(containers_resolver.resolve(:hypervisor)).to eq(result)
end
end

Expand All @@ -36,11 +56,11 @@
let(:result) { { lxc: { 'name' => 'lxc_container' } } }

it 'return lxc for vm' do
expect(docker_lxc_resolver.resolve(:vm)).to eq('lxc')
expect(containers_resolver.resolve(:vm)).to eq('lxc')
end

it 'return lxc info for hypervisor' do
expect(docker_lxc_resolver.resolve(:hypervisor)).to eq(result)
expect(containers_resolver.resolve(:hypervisor)).to eq(result)
end
end

Expand All @@ -50,11 +70,11 @@
let(:result) { { lxc: {} } }

it 'return lxc for vm' do
expect(docker_lxc_resolver.resolve(:vm)).to eq('lxc')
expect(containers_resolver.resolve(:vm)).to eq('lxc')
end

it 'return lxc info for hypervisor' do
expect(docker_lxc_resolver.resolve(:hypervisor)).to eq(result)
expect(containers_resolver.resolve(:hypervisor)).to eq(result)
end
end

Expand All @@ -64,11 +84,11 @@
let(:result) { nil }

it 'return lxc for vm' do
expect(docker_lxc_resolver.resolve(:vm)).to eq(nil)
expect(containers_resolver.resolve(:vm)).to eq(nil)
end

it 'return lxc info for hypervisor' do
expect(docker_lxc_resolver.resolve(:hypervisor)).to eq(result)
expect(containers_resolver.resolve(:hypervisor)).to eq(result)
end
end
end