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

Commit

Permalink
(FACT-2638) Use puppet AIO VERSION file to specify AIO version (#549)
Browse files Browse the repository at this point in the history
* (FACT-2638) Add AIO version to gem if it exists.
* (FACT-2638) Update AIO version resolver.
* (FACT-2638) Add aio_agent_version fact for all platforms.
* (FACT-2638) Remove AIO_VERSION file from gem, as the AIO version will be determined by other means.
* (FACT-2638) Add resolver that read puppet path from registry
* (FACT-2638) Read Puppet AIO path from registry.
* (FACT-2638) Append VERSION file to path.
* (FACT-2638) Rubocop fixes.
* (FACT-2638) Read from different registry record if os is 32 bit.
* (FACT-2638) Remove unused resolver and comment AIO agent facts for platforms that are not yet implemented.
* (FACT-2638) Move AioAgentVersion windows resolver to windows module.
* (FACT-2638) Add puppet aio version resolver for unix like systems.
* (FACT-2638) Add test for mscos.
* (FACT-2638) Add agent aio resolver for linux.
* (FACT-2638) Add logic to agent aio version resolver for AIX.
* (FACT-2638) Add logic to aio_agent_version fact for Solaris.
* (FACT-2638) Add test fro aio_agent_version resolver.
* (FACT-2638) Add test for aio_agent_version windows resolver.
* (FACT-2638) Use open block to avoid closing the register.
* (FACT-2638) Catch exception for incorrect registry path.
* (FACT-2638) Add test for incorrect registry path.
* (FACT-2638) Add nil check before chomp.
* (FACT-2638) Improve return condition when there is no path or an empty one detected in registry. Added tests for this case.
* (FACT-2638) Only consider the first 4 groups of digits.
* (FACT-2638) Add test for AIO dev builds.
  • Loading branch information
Bogdan Irimie authored Jun 16, 2020
1 parent 66470df commit cc66565
Show file tree
Hide file tree
Showing 16 changed files with 366 additions and 7 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/checks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
name: RuboCop TODO
steps:
- uses: actions/checkout@v1
- uses: gimmyxd/[email protected].0
- uses: gimmyxd/[email protected].1
env:
RTC_TOKEN: ${{ secrets.RTC_TOKEN }}
UPDATE_PR: false
Expand Down
14 changes: 14 additions & 0 deletions lib/facts/aix/aio_agent_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

module Facts
module Aix
class AioAgentVersion
FACT_NAME = 'aio_agent_version'

def call_the_resolver
fact_value = Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)
Facter::ResolvedFact.new(FACT_NAME, fact_value)
end
end
end
end
14 changes: 14 additions & 0 deletions lib/facts/linux/aio_agent_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

module Facts
module Linux
class AioAgentVersion
FACT_NAME = 'aio_agent_version'

def call_the_resolver
fact_value = Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)
Facter::ResolvedFact.new(FACT_NAME, fact_value)
end
end
end
end
14 changes: 14 additions & 0 deletions lib/facts/macosx/aio_agent_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

module Facts
module Macosx
class AioAgentVersion
FACT_NAME = 'aio_agent_version'

def call_the_resolver
fact_value = Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)
Facter::ResolvedFact.new(FACT_NAME, fact_value)
end
end
end
end
14 changes: 14 additions & 0 deletions lib/facts/solaris/aio_agent_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

module Facts
module Solaris
class AioAgentVersion
FACT_NAME = 'aio_agent_version'

def call_the_resolver
fact_value = Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)
Facter::ResolvedFact.new(FACT_NAME, fact_value)
end
end
end
end
14 changes: 14 additions & 0 deletions lib/facts/windows/aio_agent_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

module Facts
module Windows
class AioAgentVersion
FACT_NAME = 'aio_agent_version'

def call_the_resolver
fact_value = Facter::Resolvers::Windows::AioAgentVersion.resolve(:aio_agent_version)
Facter::ResolvedFact.new(FACT_NAME, fact_value)
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

module Facter
module Resolvers
class Agent < BaseResolver
class AioAgentVersion < BaseResolver
@semaphore = Mutex.new
@fact_list ||= {}

Expand All @@ -14,8 +14,9 @@ def post_resolve(fact_name)
end

def read_agent_version
version_file = ::File.join(ROOT_DIR, 'lib/puppet/VERSION')
@fact_list[:aio_agent_version] = ::File.read(version_file)
aio_agent_version = Util::FileHelper.safe_read('/opt/puppetlabs/puppet/VERSION', nil).chomp
aio_agent_version = aio_agent_version&.match(/^\d+\.\d+\.\d+(\.\d+){0,2}/)&.to_s
@fact_list[:aio_agent_version] = aio_agent_version
end
end
end
Expand Down
56 changes: 56 additions & 0 deletions lib/resolvers/windows/aio_agent_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# frozen_string_literal: true

module Facter
module Resolvers
module Windows
class AioAgentVersion < BaseResolver
REGISTRY_PATH = 'SOFTWARE\\Puppet Labs\\Puppet'
@semaphore = Mutex.new
@fact_list ||= {}

class << self
private

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

def read_version(fact_name)
::Win32::Registry::HKEY_LOCAL_MACHINE.open(REGISTRY_PATH) do |reg|
build_fact_list(reg)
end

@fact_list[fact_name]
rescue Win32::Registry::Error
log.debug("The registry path #{REGISTRY_PATH} does not exist")
end

def build_fact_list(reg)
puppet_aio_path = read_for_64_bit(reg) || read_for_32_bit(reg)

return if puppet_aio_path.nil? || puppet_aio_path.empty?

puppet_aio_version_path = File.join(puppet_aio_path, 'VERSION')
aio_agent_version = Util::FileHelper.safe_read(puppet_aio_version_path, nil)&.chomp

@fact_list[:aio_agent_version] = aio_agent_version&.match(/^\d+\.\d+\.\d+(\.\d+){0,2}/)&.to_s
end

def read_for_64_bit(reg)
reg.read('RememberedInstallDir64')[1]
rescue Win32::Registry::Error
log.debug('Could not read Puppet AIO path from 64 bit registry')
nil
end

def read_for_32_bit(reg)
reg.read('RememberedInstallDir')[1]
rescue Win32::Registry::Error
log.debug('Could not read Puppet AIO path from 32 bit registry')
nil
end
end
end
end
end
end
23 changes: 23 additions & 0 deletions spec/facter/facts/aix/aio_agent_version_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

describe Facts::Aix::AioAgentVersion do
describe '#call_the_resolver' do
subject(:fact) { Facts::Aix::AioAgentVersion.new }

let(:value) { '1.2.3' }

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

it 'calls Facter::Resolvers::Agent' do
fact.call_the_resolver
expect(Facter::Resolvers::AioAgentVersion).to have_received(:resolve).with(:aio_agent_version)
end

it 'returns aio_agent_version fact' do
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
have_attributes(name: 'aio_agent_version', value: value)
end
end
end
23 changes: 23 additions & 0 deletions spec/facter/facts/linux/aio_agent_version_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

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

let(:value) { '1.2.3' }

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

it 'calls Facter::Resolvers::Agent' do
fact.call_the_resolver
expect(Facter::Resolvers::AioAgentVersion).to have_received(:resolve).with(:aio_agent_version)
end

it 'returns aio_agent_version fact' do
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
have_attributes(name: 'aio_agent_version', value: value)
end
end
end
23 changes: 23 additions & 0 deletions spec/facter/facts/macosx/aio_agent_version_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

describe Facts::Macosx::AioAgentVersion do
describe '#call_the_resolver' do
subject(:fact) { Facts::Macosx::AioAgentVersion.new }

let(:value) { '1.2.3' }

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

it 'calls Facter::Resolvers::Agent' do
fact.call_the_resolver
expect(Facter::Resolvers::AioAgentVersion).to have_received(:resolve).with(:aio_agent_version)
end

it 'returns aio_agent_version fact' do
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
have_attributes(name: 'aio_agent_version', value: value)
end
end
end
23 changes: 23 additions & 0 deletions spec/facter/facts/solaris/aio_agent_version_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

describe Facts::Solaris::AioAgentVersion do
describe '#call_the_resolver' do
subject(:fact) { Facts::Solaris::AioAgentVersion.new }

let(:value) { '1.2.3' }

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

it 'calls Facter::Resolvers::Agent' do
fact.call_the_resolver
expect(Facter::Resolvers::AioAgentVersion).to have_received(:resolve).with(:aio_agent_version)
end

it 'returns aio_agent_version fact' do
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
have_attributes(name: 'aio_agent_version', value: value)
end
end
end
35 changes: 32 additions & 3 deletions spec/facter/resolvers/aio_agent_version_spec.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,39 @@
# frozen_string_literal: true

describe Facter::Resolvers::Agent do
describe Facter::Resolvers::AioAgentVersion do
describe '#resolve' do
before do
allow(Facter::Util::FileHelper)
.to receive(:safe_read)
.with('/opt/puppetlabs/puppet/VERSION', nil)
.and_return('7.0.1')
end

after do
Facter::Resolvers::AioAgentVersion.invalidate_cache
end

it 'calls FileHelper.safe_read' do
Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)

expect(Facter::Util::FileHelper).to have_received(:safe_read).with('/opt/puppetlabs/puppet/VERSION', nil)
end

it 'detects puppet version' do
allow(File).to receive(:read).with("#{ROOT_DIR}/lib/puppet/VERSION").and_return('7.0.1')
expect(Facter::Resolvers::Agent.resolve(:aio_agent_version)).to eql('7.0.1')
expect(Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)).to eql('7.0.1')
end

context 'when AIO puppet agent is a dev build' do
before do
allow(Facter::Util::FileHelper)
.to receive(:safe_read)
.with('/opt/puppetlabs/puppet/VERSION', nil)
.and_return('7.0.1.8.g12345678')
end

it 'only shows the first 4 groups of digits' do
expect(Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)).to eql('7.0.1.8')
end
end
end
end
Loading

0 comments on commit cc66565

Please sign in to comment.