Skip to content
This repository has been archived by the owner on Jun 19, 2020. It is now read-only.

(FACT-2607) Add Openvz detector #531

Merged
merged 1 commit into from
Jun 2, 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
9 changes: 9 additions & 0 deletions lib/facts/linux/virtual.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class Virtual

def call_the_resolver
fact_value = check_docker_lxc || check_gce || retrieve_from_virt_what || check_vmware
fact_value ||= check_open_vz || check_vserver

Facter::ResolvedFact.new(FACT_NAME, fact_value)
end
Expand All @@ -27,6 +28,14 @@ def check_vmware
def retrieve_from_virt_what
Facter::Resolvers::VirtWhat.resolve(:vm)
end

def check_open_vz
Facter::Resolvers::OpenVz.resolve(:vm)
end

def check_vserver
Facter::Resolvers::VirtWhat.resolve(:vserver)
end
end
end
end
45 changes: 45 additions & 0 deletions lib/resolvers/open_vz.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# frozen_string_literal: true

module Facter
module Resolvers
class OpenVz < BaseResolver
# build

@semaphore = Mutex.new
@fact_list ||= {}

class << self
private

def post_resolve(fact_name)
@fact_list.fetch(fact_name) { check_proc_vz(fact_name) }
end

def check_proc_vz(fact_name)
if !Dir.exist?('/proc/vz') || !File.executable?('/proc/lve/list') || Dir.entries('/proc/vz').count.equal?(2)
return
end

@fact_list[:vm] = read_proc_status
@fact_list[fact_name]
end

def read_proc_status
proc_status_content = Facter::Util::FileHelper.safe_readlines('/proc/self/status', nil)
return unless proc_status_content

proc_status_content.each do |line|
parts = line.split("\s")
next unless parts.size.equal?(2)

next unless /^envID:/ =~ parts[0]

return 'openvzhn' if parts[1] == '0'

return 'openvzve'
end
end
end
end
end
end
29 changes: 29 additions & 0 deletions spec/facter/facts/linux/virtual_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,35 @@
end
end

context 'when is openVz' do
let(:vm) { nil }
let(:value) { 'openvzve' }

before do
allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(value)
end

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

context 'when is vserver' do
let(:vm) { nil }
let(:value) { 'vserver_host' }

before do
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil)
allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(value)
end

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

context 'when resolver returns nil' do
let(:vm) { nil }

Expand Down
50 changes: 50 additions & 0 deletions spec/facter/resolvers/open_vz_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# frozen_string_literal: true

describe Facter::Resolvers::OpenVz do
subject(:openvz_resolver) { Facter::Resolvers::OpenVz }

let(:vz_dir) { true }
let(:list_executable) { true }

after do
openvz_resolver.invalidate_cache
end

before do
allow(Dir).to receive(:exist?).with('/proc/vz').and_return(vz_dir)
allow(File).to receive(:executable?).with('/proc/lve/list').and_return(list_executable)
allow(Dir).to receive(:entries).with('/proc/vz').and_return(vz_dir_entries)
end

context 'when /proc/vz dir is empty' do
let(:vz_dir_entries) { ['.', '..'] }

it 'returns nil' do
expect(openvz_resolver.resolve(:vm)).to be_nil
end
end

context 'when /proc/vz dir is not empty' do
let(:vz_dir_entries) { ['.', '..', 'some_file.txt'] }

before do
allow(Facter::Util::FileHelper).to receive(:safe_readlines).with('/proc/self/status', nil).and_return(status_file)
end

context 'when /proc/self/status is nil' do
let(:status_file) { nil }

it 'returns nil' do
expect(openvz_resolver.resolve(:vm)).to be_nil
end
end

context 'when /proc/self/status is readable' do
let(:status_file) { load_fixture('proc_self_status').readlines }

it 'returns openvzhn' do
expect(openvz_resolver.resolve(:vm)).to eql('openvzhn')
end
end
end
end
1 change: 1 addition & 0 deletions spec/fixtures/proc_self_status
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ Groups: 4 20 24 25 27 29 30 44 46 108 114 1000
NStgid: 14437
NSpid: 14437
NSpgid: 14437
envID: 0
NSsid: 14122
VxID: 0