Skip to content

Commit abba895

Browse files
committed
(FACT-3451) extend amazon linux os release fact
1 parent 352e2a8 commit abba895

File tree

10 files changed

+138
-24
lines changed

10 files changed

+138
-24
lines changed

.rubocop.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ Style/ClassVars:
119119
Exclude:
120120
- !ruby/regexp /(?:(?!.+_resolver.rb).)*$/
121121

122+
Style/FormatStringToken:
123+
Exclude:
124+
- 'lib/facter/resolvers/amzn/os_release_rpm.rb'
125+
- 'spec/facter/resolvers/amzn/os_release_rpm_spec.rb'
126+
122127
Style/FrozenStringLiteralComment:
123128
Exclude:
124129
- 'spec/custom_facts/util/normalization_spec.rb'

lib/facter/facts/amzn/os/distro/release.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ def call_the_resolver
2020
end
2121

2222
def determine_release_version
23-
version = Facter::Resolvers::ReleaseFromFirstLine.resolve(:release, release_file: '/etc/system-release')
23+
version = Facter::Resolvers::Amzn::OsReleaseRpm.resolve(:version)
2424
version ||= Facter::Resolvers::OsRelease.resolve(:version_id)
2525

26-
Facter::Util::Facts.release_hash_from_string(version)
26+
Facter::Util::Facts.release_hash_from_string(version, include_patch: true)
2727
end
2828
end
2929
end

lib/facter/facts/amzn/os/release.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def call_the_resolver
1818
end
1919

2020
def determine_release_version
21-
version = Facter::Resolvers::ReleaseFromFirstLine.resolve(:release, release_file: '/etc/system-release')
21+
version = Facter::Resolvers::Amzn::OsReleaseRpm.resolve(:version)
2222
version ||= Facter::Resolvers::OsRelease.resolve(:version_id)
2323

2424
Facter::Util::Facts.release_hash_from_string(version)

lib/facter/framework/core/file_loader.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,8 @@
244244
require_relative '../../facts/amzn/os/distro/release.rb'
245245
require_relative '../../facts/amzn/os/release.rb'
246246

247+
require_relative '../../resolvers/amzn/os_release_rpm'
248+
247249
when 'bsd'
248250
require_relative '../../facts/bsd/kernelmajversion.rb'
249251
require_relative '../../facts/bsd/kernelversion.rb'
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# frozen_string_literal: true
2+
3+
module Facter
4+
module Resolvers
5+
module Amzn
6+
class OsReleaseRpm < BaseResolver
7+
init_resolver
8+
9+
class << self
10+
private
11+
12+
def post_resolve(fact_name, _options)
13+
@fact_list.fetch(fact_name) { rpm_system_call(fact_name) }
14+
end
15+
16+
def rpm_system_call(fact_name)
17+
output = Facter::Core::Execution.execute(
18+
'rpm -q --qf \'%{NAME}\n%{VERSION}\n%{RELEASE}\n%{VENDOR}\' -f /etc/os-release',
19+
logger: log
20+
)
21+
build_fact_list(output)
22+
23+
@fact_list[fact_name]
24+
end
25+
26+
def build_fact_list(output)
27+
rpm_results = output.split("\n")
28+
29+
return if rpm_results.empty?
30+
31+
@fact_list[:package],
32+
@fact_list[:version],
33+
@fact_list[:release],
34+
@fact_list[:vendor] = rpm_results.map(&:strip)
35+
end
36+
end
37+
end
38+
end
39+
end
40+
end

lib/facter/util/facts/facts_utils.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,15 @@ def discover_family(os)
2525
os
2626
end
2727

28-
def release_hash_from_string(output)
28+
def release_hash_from_string(output, include_patch: false)
2929
return unless output
3030

3131
versions = output.split('.')
3232
{}.tap do |release|
3333
release['full'] = output
3434
release['major'] = versions[0]
3535
release['minor'] = versions[1] if versions[1]
36+
release['patch'] = versions[2] if versions[2] && include_patch
3637
end
3738
end
3839

spec/facter/facts/amzn/os/distro/release_spec.rb

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@
55
subject(:fact) { Facts::Amzn::Os::Distro::Release.new }
66

77
before do
8-
allow(Facter::Resolvers::ReleaseFromFirstLine).to receive(:resolve)
9-
.with(:release, { release_file: '/etc/system-release' })
8+
allow(Facter::Resolvers::Amzn::OsReleaseRpm).to receive(:resolve)
9+
.with(:version)
1010
.and_return(value)
1111
end
1212

13-
context 'when version is retrieved from specific file' do
13+
context 'when version is retrieved from rpm' do
1414
let(:value) { '2.13.0' }
15-
let(:release) { { 'full' => '2.13.0', 'major' => '2', 'minor' => '13' } }
15+
let(:release) { { 'full' => '2.13.0', 'major' => '2', 'minor' => '13', 'patch' => '0' } }
1616

17-
it 'calls Facter::Resolvers::ReleaseFromFirstLine with version' do
17+
it 'calls Facter::Resolvers::Amzn::OsReleaseRpm with version' do
1818
fact.call_the_resolver
19-
expect(Facter::Resolvers::ReleaseFromFirstLine).to have_received(:resolve)
20-
.with(:release, release_file: '/etc/system-release')
19+
expect(Facter::Resolvers::Amzn::OsReleaseRpm).to have_received(:resolve)
20+
.with(:version)
2121
end
2222

23-
it 'returns operating system name fact' do
23+
it 'returns os distro release fact' do
2424
expect(fact.call_the_resolver).to be_an_instance_of(Array).and \
2525
contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release),
2626
an_object_having_attributes(name: 'lsbdistrelease',
@@ -46,7 +46,7 @@
4646
expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:version_id)
4747
end
4848

49-
it 'returns operating system name fact' do
49+
it 'returns os distro release fact' do
5050
expect(fact.call_the_resolver).to be_an_instance_of(Array).and \
5151
contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release),
5252
an_object_having_attributes(name: 'lsbdistrelease',
@@ -60,7 +60,7 @@
6060
context 'when release can\'t be received' do
6161
let(:os_release) { nil }
6262

63-
it 'returns operating system name fact' do
63+
it 'returns os distro release fact as nil' do
6464
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
6565
have_attributes(name: 'os.distro.release', value: nil)
6666
end

spec/facter/facts/amzn/os/release_spec.rb

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@
55
subject(:fact) { Facts::Amzn::Os::Release.new }
66

77
before do
8-
allow(Facter::Resolvers::ReleaseFromFirstLine).to receive(:resolve)
9-
.with(:release, { release_file: '/etc/system-release' })
8+
allow(Facter::Resolvers::Amzn::OsReleaseRpm).to receive(:resolve)
9+
.with(:version)
1010
.and_return(value)
1111
end
1212

13-
context 'when version is retrieved from specific file' do
13+
context 'when version is retrieved from rpm' do
1414
let(:value) { '2.13.0' }
1515
let(:release) { { 'full' => '2.13.0', 'major' => '2', 'minor' => '13' } }
1616

17-
it 'calls Facter::Resolvers::ReleaseFromFirstLine with version' do
17+
it 'calls Facter::Resolvers::Amzn::OsReleaseRpm with version' do
1818
fact.call_the_resolver
19-
expect(Facter::Resolvers::ReleaseFromFirstLine).to have_received(:resolve)
20-
.with(:release, release_file: '/etc/system-release')
19+
expect(Facter::Resolvers::Amzn::OsReleaseRpm).to have_received(:resolve)
20+
.with(:version)
2121
end
2222

23-
it 'returns operating system name fact' do
23+
it 'returns os release fact' do
2424
expect(fact.call_the_resolver).to be_an_instance_of(Array).and \
2525
contain_exactly(an_object_having_attributes(name: 'os.release', value: release),
2626
an_object_having_attributes(name: 'operatingsystemmajrelease',
@@ -44,7 +44,7 @@
4444
expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:version_id)
4545
end
4646

47-
it 'returns operating system name fact' do
47+
it 'returns os release fact' do
4848
expect(fact.call_the_resolver).to be_an_instance_of(Array).and \
4949
contain_exactly(an_object_having_attributes(name: 'os.release', value: release),
5050
an_object_having_attributes(name: 'operatingsystemmajrelease',
@@ -53,10 +53,10 @@
5353
value: release['full'], type: :legacy))
5454
end
5555

56-
context 'when release can\'t be received' do
56+
context 'when version can\'t be retrieved' do
5757
let(:os_release) { nil }
5858

59-
it 'returns operating system name fact' do
59+
it 'returns os release fact as nil' do
6060
expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \
6161
have_attributes(name: 'os.release', value: nil)
6262
end
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# frozen_string_literal: true
2+
3+
describe Facter::Resolvers::Amzn::OsReleaseRpm do
4+
subject(:os_release_resolver) { Facter::Resolvers::Amzn::OsReleaseRpm }
5+
6+
let(:log_spy) { Facter::Log }
7+
8+
before do
9+
os_release_resolver.instance_variable_set(:@log, log_spy)
10+
allow(Facter::Core::Execution).to receive(:execute)
11+
.with("rpm -q --qf '%{NAME}\\n%{VERSION}\\n%{RELEASE}\\n%{VENDOR}' -f /etc/os-release", { logger: log_spy })
12+
.and_return(os_release_content)
13+
end
14+
15+
after do
16+
os_release_resolver.invalidate_cache
17+
end
18+
19+
context 'when on AmazonLinux 2023' do
20+
let(:os_release_content) { "system-release\n2023.2.20231113\n1.amzn2023\nAmazon Linux" }
21+
22+
it 'returns os release package version' do
23+
expect(os_release_resolver.resolve(:version)).to eq('2023.2.20231113')
24+
end
25+
26+
it 'returns os release package release' do
27+
expect(os_release_resolver.resolve(:release)).to eq('1.amzn2023')
28+
end
29+
30+
it 'returns os release package vendor' do
31+
expect(os_release_resolver.resolve(:vendor)).to eq('Amazon Linux')
32+
end
33+
end
34+
35+
context 'when on AmazonLinux 2' do
36+
let(:os_release_content) { "system-release\n2\n16.amzn2\nAmazon Linux" }
37+
38+
it 'returns os release package version' do
39+
expect(os_release_resolver.resolve(:version)).to eq('2')
40+
end
41+
42+
it 'returns os release package release' do
43+
expect(os_release_resolver.resolve(:release)).to eq('16.amzn2')
44+
end
45+
end
46+
47+
context 'when on os-release file missing' do
48+
let(:os_release_content) { '' }
49+
50+
it 'returns nil VERSION' do
51+
expect(os_release_resolver.resolve(:version)).to be_nil
52+
end
53+
end
54+
end

spec/facter/util/facts/facts_utils_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,18 @@
6262
expect(facts_util.release_hash_from_string('6')['minor']).to be_nil
6363
end
6464

65+
it 'returns valid patch release if requested' do
66+
expect(facts_util.release_hash_from_string('6.2.1', include_patch: true)['patch']).to eq('1')
67+
end
68+
69+
it 'returns patch release as nil if not requested' do
70+
expect(facts_util.release_hash_from_string('6.2.1')['patch']).to be_nil
71+
end
72+
73+
it 'returns patch release as nil if requested but not in version' do
74+
expect(facts_util.release_hash_from_string('6.2')['patch']).to be_nil
75+
end
76+
6577
it 'returns nil if data is nil' do
6678
expect(facts_util.release_hash_from_string(nil)).to be_nil
6779
end

0 commit comments

Comments
 (0)