Skip to content

Commit a594085

Browse files
committed
Namespace the container resolver into Linux
FreeBSD has containers (jails) but already handled through the 'virutal' resolver, so for now we just consider Linux being able to handle containers as the code aleady depend on Linux-specific resolvers.
1 parent ab513fc commit a594085

File tree

20 files changed

+119
-117
lines changed

20 files changed

+119
-117
lines changed

lib/facter/facts/linux/hypervisors/docker.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def call_the_resolver
1212
end
1313

1414
def check_docker
15-
info = Facter::Resolvers::Containers.resolve(:hypervisor)
15+
info = Facter::Resolvers::Linux::Containers.resolve(:hypervisor)
1616
info[:docker] if info
1717
end
1818
end

lib/facter/facts/linux/hypervisors/lxc.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def call_the_resolver
1212
end
1313

1414
def check_lxc
15-
info = Facter::Resolvers::Containers.resolve(:hypervisor)
15+
info = Facter::Resolvers::Linux::Containers.resolve(:hypervisor)
1616
info[:lxc] if info
1717
end
1818
end

lib/facter/facts/linux/hypervisors/systemd_nspawn.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def call_the_resolver
1212
end
1313

1414
def check_nspawn
15-
info = Facter::Resolvers::Containers.resolve(:hypervisor)
15+
info = Facter::Resolvers::Linux::Containers.resolve(:hypervisor)
1616
info[:systemd_nspawn] if info
1717
end
1818
end

lib/facter/facts/linux/system_uptime/days.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class Days
88
ALIASES = 'uptime_days'
99

1010
def call_the_resolver
11-
hypervisors = Facter::Resolvers::Containers.resolve(:hypervisor)
11+
hypervisors = Facter::Resolvers::Linux::Containers.resolve(:hypervisor)
1212

1313
fact_value = if hypervisors && hypervisors[:docker]
1414
Facter::Resolvers::Linux::DockerUptime.resolve(:days)

lib/facter/facts/linux/system_uptime/hours.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class Hours
88
ALIASES = 'uptime_hours'
99

1010
def call_the_resolver
11-
hypervisors = Facter::Resolvers::Containers.resolve(:hypervisor)
11+
hypervisors = Facter::Resolvers::Linux::Containers.resolve(:hypervisor)
1212

1313
fact_value = if hypervisors && hypervisors[:docker]
1414
Facter::Resolvers::Linux::DockerUptime.resolve(:hours)

lib/facter/facts/linux/system_uptime/seconds.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class Seconds
88
ALIASES = 'uptime_seconds'
99

1010
def call_the_resolver
11-
hypervisors = Facter::Resolvers::Containers.resolve(:hypervisor)
11+
hypervisors = Facter::Resolvers::Linux::Containers.resolve(:hypervisor)
1212

1313
fact_value = if hypervisors && hypervisors[:docker]
1414
Facter::Resolvers::Linux::DockerUptime.resolve(:seconds)

lib/facter/facts/linux/system_uptime/uptime.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class Uptime
88
ALIASES = 'uptime'
99

1010
def call_the_resolver
11-
hypervisors = Facter::Resolvers::Containers.resolve(:hypervisor)
11+
hypervisors = Facter::Resolvers::Linux::Containers.resolve(:hypervisor)
1212

1313
fact_value = if hypervisors && hypervisors[:docker]
1414
Facter::Resolvers::Linux::DockerUptime.resolve(:uptime)

lib/facter/framework/core/file_loader.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
require_relative '../../resolvers/augeas'
5353
require_relative '../../resolvers/az'
5454
require_relative '../../resolvers/base_resolver'
55-
require_relative '../../resolvers/containers'
5655
require_relative '../../resolvers/debian_version'
5756
require_relative '../../resolvers/dmi_decode'
5857
require_relative '../../resolvers/ec2'
@@ -503,6 +502,7 @@
503502
require_relative '../../facts/linux/virtual'
504503
require_relative '../../facts/linux/xen'
505504

505+
require_relative '../../resolvers/linux/containers'
506506
require_relative '../../resolvers/linux/disks'
507507
require_relative '../../resolvers/linux/dmi'
508508
require_relative '../../resolvers/linux/docker_uptime'

lib/facter/resolvers/containers.rb

-79
This file was deleted.
+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# frozen_string_literal: true
2+
3+
module Facter
4+
module Resolvers
5+
module Linux
6+
class Containers < BaseResolver
7+
# :virtual
8+
# :hypervisor
9+
10+
init_resolver
11+
12+
INFO = { 'docker' => 'id', 'lxc' => 'name' }.freeze
13+
14+
class << self
15+
private
16+
17+
def post_resolve(fact_name, _options)
18+
@fact_list.fetch(fact_name) do
19+
read_environ(fact_name) || read_cgroup(fact_name)
20+
end
21+
end
22+
23+
def read_cgroup(fact_name)
24+
output_cgroup = Facter::Util::FileHelper.safe_read('/proc/1/cgroup', nil)
25+
return unless output_cgroup
26+
27+
output_docker = %r{docker/(.+)}.match(output_cgroup)
28+
output_lxc = %r{^/lxc/([^/]+)}.match(output_cgroup)
29+
30+
info, vm = extract_vm_and_info(output_docker, output_lxc)
31+
@fact_list[:vm] = vm
32+
@fact_list[:hypervisor] = { vm.to_sym => info } if vm
33+
@fact_list[fact_name]
34+
end
35+
36+
def read_environ(fact_name)
37+
begin
38+
container = Facter::Util::Linux::Proc.getenv_for_pid(1, 'container')
39+
rescue StandardError => e
40+
log.warn("Unable to getenv for pid 1, '#{e}'")
41+
return nil
42+
end
43+
return if container.nil? || container.empty?
44+
45+
info = {}
46+
case container
47+
when 'lxc'
48+
vm = 'lxc'
49+
when 'podman'
50+
vm = 'podman'
51+
when 'crio'
52+
vm = 'crio'
53+
when 'systemd-nspawn'
54+
vm = 'systemd_nspawn'
55+
info = { 'id' => Facter::Util::FileHelper.safe_read('/etc/machine-id', nil).strip }
56+
else
57+
vm = 'container_other'
58+
log.warn("Container runtime, '#{container}', is unsupported, setting to '#{vm}'")
59+
end
60+
@fact_list[:vm] = vm
61+
@fact_list[:hypervisor] = { vm.to_sym => info } if vm
62+
@fact_list[fact_name]
63+
end
64+
65+
def extract_vm_and_info(output_docker, output_lxc)
66+
vm = nil
67+
if output_docker
68+
vm = 'docker'
69+
info = output_docker[1]
70+
elsif output_lxc
71+
vm = 'lxc'
72+
info = output_lxc[1]
73+
end
74+
75+
[info ? { INFO[vm] => info } : {}, vm]
76+
end
77+
end
78+
end
79+
end
80+
end
81+
end

lib/facter/util/facts/posix/virtual_detector.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def platform
1616
private
1717

1818
def check_docker_lxc
19-
Facter::Resolvers::Containers.resolve(:vm)
19+
Facter::Resolvers::Linux::Containers.resolve(:vm)
2020
end
2121

2222
def check_gce

spec/facter/facts/linux/hypervisors/docker_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
subject(:fact) { Facts::Linux::Hypervisors::Docker.new }
66

77
before do
8-
allow(Facter::Resolvers::Containers).to \
8+
allow(Facter::Resolvers::Linux::Containers).to \
99
receive(:resolve).with(:hypervisor).and_return(hv)
1010
end
1111

spec/facter/facts/linux/hypervisors/lxc_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
subject(:fact) { Facts::Linux::Hypervisors::Lxc.new }
66

77
before do
8-
allow(Facter::Resolvers::Containers).to \
8+
allow(Facter::Resolvers::Linux::Containers).to \
99
receive(:resolve).with(:hypervisor).and_return(hv)
1010
end
1111

spec/facter/facts/linux/hypervisors/systemd_nspawn_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
subject(:fact) { Facts::Linux::Hypervisors::SystemdNspawn.new }
66

77
before do
8-
allow(Facter::Resolvers::Containers).to \
8+
allow(Facter::Resolvers::Linux::Containers).to \
99
receive(:resolve).with(:hypervisor).and_return(hv)
1010
end
1111

spec/facter/facts/linux/system_uptime/days_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
context 'when on linux' do
1010
before do
11-
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return(nil)
11+
allow(Facter::Resolvers::Linux::Containers).to receive(:resolve).with(:hypervisor).and_return(nil)
1212
allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:days).and_return(value)
1313
end
1414

@@ -21,7 +21,7 @@
2121

2222
context 'when in docker container' do
2323
before do
24-
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' })
24+
allow(Facter::Resolvers::Linux::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' })
2525
allow(Facter::Resolvers::Linux::DockerUptime).to receive(:resolve).with(:days).and_return(value)
2626
end
2727

spec/facter/facts/linux/system_uptime/hours_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
context 'when on linux' do
1010
before do
11-
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return(nil)
11+
allow(Facter::Resolvers::Linux::Containers).to receive(:resolve).with(:hypervisor).and_return(nil)
1212
allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:hours).and_return(value)
1313
end
1414

@@ -21,7 +21,7 @@
2121

2222
context 'when in docker container' do
2323
before do
24-
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' })
24+
allow(Facter::Resolvers::Linux::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' })
2525
allow(Facter::Resolvers::Linux::DockerUptime).to receive(:resolve).with(:hours).and_return(value)
2626
end
2727

spec/facter/facts/linux/system_uptime/seconds_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
context 'when on linux' do
1010
before do
11-
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return(nil)
11+
allow(Facter::Resolvers::Linux::Containers).to receive(:resolve).with(:hypervisor).and_return(nil)
1212
allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:seconds).and_return(value)
1313
end
1414

@@ -21,7 +21,7 @@
2121

2222
context 'when in docker container' do
2323
before do
24-
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' })
24+
allow(Facter::Resolvers::Linux::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' })
2525
allow(Facter::Resolvers::Linux::DockerUptime).to receive(:resolve).with(:seconds).and_return(value)
2626
end
2727

spec/facter/facts/linux/system_uptime/uptime_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
context 'when on linux' do
1010
before do
11-
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return(nil)
11+
allow(Facter::Resolvers::Linux::Containers).to receive(:resolve).with(:hypervisor).and_return(nil)
1212
allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:uptime).and_return(value)
1313
end
1414

@@ -21,7 +21,7 @@
2121

2222
context 'when in docker container' do
2323
before do
24-
allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' })
24+
allow(Facter::Resolvers::Linux::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' })
2525
allow(Facter::Resolvers::Linux::DockerUptime).to receive(:resolve).with(:uptime).and_return(value)
2626
end
2727

spec/facter/resolvers/containers_spec.rb renamed to spec/facter/resolvers/linux/containers_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22

3-
describe Facter::Resolvers::Containers do
4-
subject(:containers_resolver) { Facter::Resolvers::Containers }
3+
describe Facter::Resolvers::Linux::Containers do
4+
subject(:containers_resolver) { Facter::Resolvers::Linux::Containers }
55

66
before do
77
allow(Facter::Util::FileHelper).to receive(:safe_read)

0 commit comments

Comments
 (0)