Skip to content

Commit f4bbdd3

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 f817e0d commit f4bbdd3

File tree

20 files changed

+119
-117
lines changed

20 files changed

+119
-117
lines changed

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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 0 additions & 79 deletions
This file was deleted.
Lines changed: 81 additions & 0 deletions
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 'lxcroot'
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

0 commit comments

Comments
 (0)