diff options
author | paulczar <paul@paulcz.net> | 2014-10-11 17:56:41 -0500 |
---|---|---|
committer | Bryan McLellan <btm@opscode.com> | 2015-02-17 12:22:35 -0500 |
commit | 83bbd5cfc82e41086a7b69bc9b895eb3573a6cb3 (patch) | |
tree | e27ea0b779cdd1ed3b6abe0053756862e6261028 | |
parent | 4391f97158597395660f5d6cb1cecbdd0cd76dec (diff) | |
download | ohai-83bbd5cfc82e41086a7b69bc9b895eb3573a6cb3.tar.gz |
support for detecting if inside docker container.
-rw-r--r-- | lib/ohai/plugins/linux/virtualization.rb | 13 | ||||
-rw-r--r-- | spec/unit/plugins/linux/virtualization_spec.rb | 148 |
2 files changed, 137 insertions, 24 deletions
diff --git a/lib/ohai/plugins/linux/virtualization.rb b/lib/ohai/plugins/linux/virtualization.rb index e76398fa..1990b773 100644 --- a/lib/ohai/plugins/linux/virtualization.rb +++ b/lib/ohai/plugins/linux/virtualization.rb @@ -27,6 +27,10 @@ Ohai.plugin(:Virtualization) do which('lxc-version') end + def docker_exists? + which('docker') + end + collect_data(:linux) do virtualization Mash.new unless virtualization virtualization[:systems] = Mash.new unless virtualization[:systems] @@ -174,9 +178,9 @@ Ohai.plugin(:Virtualization) do # Kernel docs, https://www.kernel.org/doc/Documentation/cgroups if File.exists?("/proc/self/cgroup") if File.read("/proc/self/cgroup") =~ %r{^\d+:[^:]+:/(lxc|docker)/.+$} - virtualization[:system] = "lxc" + virtualization[:system] = $1 virtualization[:role] = "guest" - virtualization[:systems][:lxc] = "guest" + virtualization[:systems][$1.to_sym] = "guest" elsif lxc_version_exists? && File.read("/proc/self/cgroup") =~ %r{\d:[^:]+:/$} # lxc-version shouldn't be installed by default # Even so, it is likely we are on an LXC capable host that is not being used as such @@ -185,12 +189,15 @@ Ohai.plugin(:Virtualization) do virtualization[:system] = "lxc" virtualization[:role] = "host" end - # In general, the 'systems' framework from OHAI-182 is less susceptible to conflicts # But, this could overwrite virtualization[:systems][:lxc] = "guest" # If so, we may need to look further for a differentiator (OHAI-573) virtualization[:systems][:lxc] = "host" end + elsif File.exists?("/.dockerenv") || File.exists?("/.dockerinit") + virtualization[:system] = "docker" + virtualization[:role] = "guest" + virtualization[:systems][:docker] = "guest" end end end diff --git a/spec/unit/plugins/linux/virtualization_spec.rb b/spec/unit/plugins/linux/virtualization_spec.rb index 19a2a46f..a9e2ae10 100644 --- a/spec/unit/plugins/linux/virtualization_spec.rb +++ b/spec/unit/plugins/linux/virtualization_spec.rb @@ -33,6 +33,8 @@ describe Ohai::System, "Linux virtualization platform" do allow(File).to receive(:exists?).with("/proc/bc/0").and_return(false) allow(File).to receive(:exists?).with("/proc/vz").and_return(false) allow(File).to receive(:exists?).with("/proc/self/cgroup").and_return(false) + allow(File).to receive(:exists?).with("/.dockerenv").and_return(false) + allow(File).to receive(:exists?).with("/.dockerinit").and_return(false) end describe "when we are checking for xen" do @@ -357,27 +359,6 @@ CGROUP expect(@plugin[:virtualization][:systems][:lxc]).to eq("guest") end - it "should set lxc guest if /proc/self/cgroup exist and there are /docker/<name> mounts" do - self_cgroup=<<-CGROUP -11:hugetlb:/ -10:perf_event:/ -9:blkio:/ -8:net_cls:/ -7:freezer:/ -6:devices:/ -5:memory:/ -4:cpuacct,cpu:/docker/9c2adaa4c391ec0d3bf994fbd91ff30c3d317694d179e5b1dc7e1e4c8ed56b61 -3:cpuset:/ -2:name=systemd:/system.slice/docker.service -CGROUP - expect(File).to receive(:exists?).with("/proc/self/cgroup").and_return(true) - allow(File).to receive(:read).with("/proc/self/cgroup").and_return(self_cgroup) - @plugin.run - expect(@plugin[:virtualization][:system]).to eq("lxc") - expect(@plugin[:virtualization][:role]).to eq("guest") - expect(@plugin[:virtualization][:systems][:lxc]).to eq("guest") - end - it "should set not set anything if /proc/self/cgroup exist and the cgroup is named arbitrarily, it isn't necessarily lxc." do self_cgroup=<<-CGROUP 8:blkio:/Charlie @@ -446,6 +427,131 @@ CGROUP end end + describe "when we are checking for docker" do + it "should set docker guest if /proc/self/cgroup exist and there are /docker/<hexadecimal> mounts" do + self_cgroup=<<-CGROUP +8:blkio:/docker/baa660ed81bc81d262ac6e19486142aeec5fce2043e2a173eb2505c6fbed89bc +7:net_cls:/docker/baa660ed81bc81d262ac6e19486142aeec5fce2043e2a173eb2505c6fbed89bc +6:freezer:/docker/baa660ed81bc81d262ac6e19486142aeec5fce2043e2a173eb2505c6fbed89bc +5:devices:/docker/baa660ed81bc81d262ac6e19486142aeec5fce2043e2a173eb2505c6fbed89bc +4:memory:/docker/baa660ed81bc81d262ac6e19486142aeec5fce2043e2a173eb2505c6fbed89bc +3:cpuacct:/docker/baa660ed81bc81d262ac6e19486142aeec5fce2043e2a173eb2505c6fbed89bc +2:cpu:/docker/baa660ed81bc81d262ac6e19486142aeec5fce2043e2a173eb2505c6fbed89bc +1:cpuset:/ +CGROUP + allow(File).to receive(:exists?).with("/proc/self/cgroup").and_return(true) + allow(File).to receive(:read).with("/proc/self/cgroup").and_return(self_cgroup) + @plugin.run + expect(@plugin[:virtualization][:system]).to eq("docker") + expect(@plugin[:virtualization][:role]).to eq("guest") + expect(@plugin[:virtualization][:systems][:docker]).to eq("guest") + end + + it "should set docker guest if /proc/self/cgroup exist and there are /docker/<name> mounts" do + self_cgroup=<<-CGROUP +8:blkio:/docker/vanilla +7:net_cls:/docker/vanilla +6:freezer:/docker/vanilla +5:devices:/docker/vanilla +4:memory:/docker/vanilla +3:cpuacct:/docker/vanilla +2:cpu:/docker/vanilla +1:cpuset:/docker/vanilla +CGROUP + allow(File).to receive(:exists?).with("/proc/self/cgroup").and_return(true) + allow(File).to receive(:read).with("/proc/self/cgroup").and_return(self_cgroup) + @plugin.run + expect(@plugin[:virtualization][:system]).to eq("docker") + expect(@plugin[:virtualization][:role]).to eq("guest") + expect(@plugin[:virtualization][:systems][:docker]).to eq("guest") + end + + it "should set not set anything if /proc/self/cgroup exist and the cgroup is named arbitrarily, it isn't necessarily lxc." do + self_cgroup=<<-CGROUP +8:blkio:/Charlie +7:net_cls:/Charlie +6:freezer:/Charlie +5:devices:/Charlie +4:memory:/Charlie +3:cpuacct:/Charlie +2:cpu:/Charlie +1:cpuset:/Charlie +CGROUP + allow(File).to receive(:exists?).with("/proc/self/cgroup").and_return(true) + allow(File).to receive(:read).with("/proc/self/cgroup").and_return(self_cgroup) + @plugin.run + expect(@plugin[:virtualization]).to eq({'systems' => {}}) + end + + context "/proc/self/cgroup only has / mounts" do + before(:each) do + self_cgroup=<<-CGROUP +8:blkio:/ +7:net_cls:/ +6:freezer:/ +5:devices:/ +4:memory:/ +3:cpuacct:/ +2:cpu:/ +1:cpuset:/ +CGROUP + allow(File).to receive(:exists?).with("/proc/self/cgroup").and_return(true) + allow(File).to receive(:read).with("/proc/self/cgroup").and_return(self_cgroup) + @plugin.run + expect(@plugin[:virtualization]).to eq({'systems' => {}}) + end + + end + + it "does not set the old virtualization attributes if they are already set" do + allow(@plugin).to receive(:docker_exists?).and_return("/usr/bin/docker") + @plugin[:virtualization] = Mash.new + @plugin[:virtualization][:system] = "the cloud" + @plugin[:virtualization][:role] = "cumulonimbus" + @plugin.run + expect(@plugin[:virtualization][:system]).not_to eq("docker") + expect(@plugin[:virtualization][:role]).not_to eq("host") + end + + it "does not set docker host if docker does not exist" do + allow(@plugin).to receive(:docker_exists?).and_return(false) + @plugin.run + expect(@plugin[:virtualization][:system]).to be_nil + expect(@plugin[:virtualization][:role]).to be_nil + expect(@plugin[:virtualization]).to eq({'systems' => {}}) + end + + it "should not set virtualization if /proc/self/cgroup isn't there" do + allow(File).to receive(:exists?).with("/proc/self/cgroup").and_return(false) + @plugin.run + expect(@plugin[:virtualization]).to eq({'systems' => {}}) + end + + it "should set virtualization if /.dockerenv exists" do + allow(File).to receive(:exists?).with("/.dockerenv").and_return(true) + @plugin.run + expect(@plugin[:virtualization][:system]).to eq("docker") + expect(@plugin[:virtualization][:role]).to eq("guest") + expect(@plugin[:virtualization][:systems][:docker]).to eq("guest") + end + + it "should set virtualization if /.dockerinit exists" do + allow(File).to receive(:exists?).with("/.dockerinit").and_return(true) + @plugin.run + expect(@plugin[:virtualization][:system]).to eq("docker") + expect(@plugin[:virtualization][:role]).to eq("guest") + expect(@plugin[:virtualization][:systems][:docker]).to eq("guest") + end + + it "should not set virtualization if /.dockerenv or /.dockerinit doesn't exists" do + allow(File).to receive(:exists?).with("/.dockerenv").and_return(false) + allow(File).to receive(:exists?).with("/.dockerinit").and_return(false) + @plugin.run + expect(@plugin[:virtualization]).to eq({'systems' => {}}) + end + + end + it "should not set virtualization if no tests match" do @plugin.run expect(@plugin[:virtualization]).to eq({'systems' => {}}) |