Skip to content

Commit cc1b91d

Browse files
(FACT-2872_2) Reimplement linux networking resolver (#2219)
1 parent dac2dba commit cc1b91d

19 files changed

+701
-273
lines changed

.rubocop.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ AllCops:
66
Exclude:
77
- acceptance/**/*
88
- vendor/**/*
9+
- lib/facter/resolvers/networking_linux_resolver.rb
910

1011
require:
1112
- rubocop-performance

.rubocop_todo.yml

Lines changed: 96 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,85 @@
11
# This configuration was generated by
22
# `rubocop --auto-gen-config --exclude-limit 1000`
3-
# on 2020-09-22 15:44:45 +0300 using RuboCop version 0.81.0.
3+
# on 2020-12-10 18:21:07 +0200 using RuboCop version 0.81.0.
44
# The point is for the user to remove these configuration records
55
# one by one as the offenses are removed from the code base.
66
# Note that changes in the inspected code, or installation of new
77
# versions of RuboCop, may require this file to be generated again.
88

9-
# Offense count: 76
9+
# Offense count: 1
10+
# Cop supports --auto-correct.
11+
# Configuration parameters: AllowAdjacentOneLineDefs, NumberOfEmptyLines.
12+
Layout/EmptyLineBetweenDefs:
13+
Exclude:
14+
- 'lib/facter/resolvers/networking_linux_resolver.rb'
15+
16+
# Offense count: 1
17+
# Cop supports --auto-correct.
18+
Layout/EmptyLines:
19+
Exclude:
20+
- 'lib/facter/resolvers/networking_linux_resolver.rb'
21+
22+
# Offense count: 1
23+
# Cop supports --auto-correct.
24+
# Configuration parameters: EnforcedStyle.
25+
# SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines, beginning_only, ending_only
26+
Layout/EmptyLinesAroundClassBody:
27+
Exclude:
28+
- 'lib/facter/resolvers/networking_linux_resolver.rb'
29+
30+
# Offense count: 1
31+
# Cop supports --auto-correct.
32+
# Configuration parameters: AllowDoxygenCommentStyle, AllowGemfileRubyComment.
33+
Layout/LeadingCommentSpace:
34+
Exclude:
35+
- 'lib/facter/resolvers/networking_linux_resolver.rb'
36+
37+
# Offense count: 1
38+
# Cop supports --auto-correct.
39+
# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
40+
# URISchemes: http, https
41+
Layout/LineLength:
42+
Max: 127
43+
44+
# Offense count: 1
45+
# Configuration parameters: AllowedMethods.
46+
# AllowedMethods: present?, blank?, presence, try, try!
47+
Lint/SafeNavigationChain:
48+
Exclude:
49+
- 'lib/facter/resolvers/networking_linux_resolver.rb'
50+
51+
# Offense count: 1
52+
# Configuration parameters: AllowComments.
53+
Lint/SuppressedException:
54+
Exclude:
55+
- 'lib/facter/resolvers/networking_linux_resolver.rb'
56+
57+
# Offense count: 1
58+
Lint/UselessAssignment:
59+
Exclude:
60+
- 'lib/facter/resolvers/networking_linux_resolver.rb'
61+
62+
# Offense count: 6
63+
# Configuration parameters: IgnoredMethods.
64+
Metrics/AbcSize:
65+
Max: 46
66+
67+
# Offense count: 4
68+
# Configuration parameters: IgnoredMethods.
69+
Metrics/CyclomaticComplexity:
70+
Max: 10
71+
72+
# Offense count: 1
73+
# Configuration parameters: CountComments, ExcludedMethods.
74+
Metrics/MethodLength:
75+
Max: 23
76+
77+
# Offense count: 4
78+
# Configuration parameters: IgnoredMethods.
79+
Metrics/PerceivedComplexity:
80+
Max: 10
81+
82+
# Offense count: 72
1083
# Configuration parameters: CustomTransform, IgnoreMethods, SpecSuffixOnly.
1184
RSpec/FilePath:
1285
Exclude:
@@ -28,9 +101,6 @@ RSpec/FilePath:
28101
- 'spec/custom_facts/util/normalization_spec.rb'
29102
- 'spec/custom_facts/util/parser_spec.rb'
30103
- 'spec/custom_facts/util/resolution_spec.rb'
31-
- 'spec/facter/util/facts/uptime_parser_spec.rb'
32-
- 'spec/facter/util/facts/windows_release_finder_spec.rb'
33-
- 'spec/facter/util/facts/virtual_detector_spec.rb'
34104
- 'spec/facter/model/fact_collection_spec.rb'
35105
- 'spec/facter/model/resolved_fact_spec.rb'
36106
- 'spec/facter/resolvers/aix/architecture_resolver_spec.rb'
@@ -52,9 +122,6 @@ RSpec/FilePath:
52122
- 'spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb'
53123
- 'spec/facter/resolvers/suse_relese_resolver_spec.rb'
54124
- 'spec/facter/resolvers/system_profile_resolver_spec.rb'
55-
- 'spec/facter/resolvers/utils/aix/odm_query_spec.rb'
56-
- 'spec/facter/resolvers/utils/macosx/filesystem_helper_spec.rb'
57-
- 'spec/facter/util/windows/win32ole_spec.rb'
58125
- 'spec/facter/resolvers/windows/dmi_bios_resolver_spec.rb'
59126
- 'spec/facter/resolvers/windows/dmi_computersystem_resolver_spec.rb'
60127
- 'spec/facter/resolvers/windows/hardware_architecture_resolver_spec.rb'
@@ -67,6 +134,7 @@ RSpec/FilePath:
67134
- 'spec/facter/resolvers/windows/system32_resolver_spec.rb'
68135
- 'spec/facter/resolvers/windows/virtualization_resolver_spec.rb'
69136
- 'spec/facter/resolvers/windows/win_os_description_resolver_spec.rb'
137+
- 'spec/facter/util/windows/win32ole_spec.rb'
70138
- 'spec/framework/config/config_reader_spec.rb'
71139
- 'spec/framework/config/fact_groups_spec.rb'
72140
- 'spec/framework/core/fact/external/external_fact_manager_spec.rb'
@@ -106,7 +174,7 @@ RSpec/LeakyConstantDeclaration:
106174
- 'spec/facter/resolvers/macosx/mountpoints_resolver_spec.rb'
107175
- 'spec/facter/util/windows/network_utils_spec.rb'
108176

109-
# Offense count: 93
177+
# Offense count: 92
110178
# Configuration parameters: EnforcedStyle.
111179
# SupportedStyles: have_received, receive
112180
RSpec/MessageSpies:
@@ -172,7 +240,7 @@ RSpec/SubjectStub:
172240
- 'spec/custom_facts/util/fact_spec.rb'
173241
- 'spec/custom_facts/util/resolution_spec.rb'
174242

175-
# Offense count: 123
243+
# Offense count: 122
176244
# Configuration parameters: IgnoreNameless, IgnoreSymbolicNames.
177245
RSpec/VerifiedDoubles:
178246
Exclude:
@@ -201,15 +269,12 @@ RSpec/VerifiedDoubles:
201269
- 'spec/facter/facts/windows/virtualization/is_virtual_spec.rb'
202270
- 'spec/facter/facts/windows/virtualization/virtual_spec.rb'
203271
- 'spec/facter/query_parser_spec.rb'
204-
- 'spec/facter/resolvers/aix/architecture_resolver_spec.rb'
205272
- 'spec/facter/resolvers/aix/ffi_helper_spec.rb'
206273
- 'spec/facter/resolvers/aix/hardware_resolver_spec.rb'
207274
- 'spec/facter/resolvers/bsd/ffi_helper_spec.rb'
208275
- 'spec/facter/resolvers/freebsd/ffi_helper_spec.rb'
209276
- 'spec/facter/resolvers/macosx/mountpoints_resolver_spec.rb'
210277
- 'spec/facter/resolvers/mountpoints_resolver_spec.rb'
211-
- 'spec/facter/util/windows/network_utils_spec.rb'
212-
- 'spec/facter/util/windows/win32ole_spec.rb'
213278
- 'spec/facter/resolvers/windows/dmi_bios_resolver_spec.rb'
214279
- 'spec/facter/resolvers/windows/dmi_computersystem_resolver_spec.rb'
215280
- 'spec/facter/resolvers/windows/hardware_architecture_resolver_spec.rb'
@@ -220,9 +285,27 @@ RSpec/VerifiedDoubles:
220285
- 'spec/facter/resolvers/windows/system32_resolver_spec.rb'
221286
- 'spec/facter/resolvers/windows/uptime_resolver_spec.rb'
222287
- 'spec/facter/resolvers/windows/win_os_description_resolver_spec.rb'
288+
- 'spec/facter/util/windows/network_utils_spec.rb'
289+
- 'spec/facter/util/windows/win32ole_spec.rb'
223290
- 'spec/framework/core/fact_loaders/external_fact_loader_spec.rb'
224291
- 'spec/framework/core/fact_manager_spec.rb'
225292
- 'spec/framework/core/session_cache_spec.rb'
226293
- 'spec/framework/formatters/hocon_fact_formatter_spec.rb'
227294
- 'spec/framework/formatters/json_fact_formatter_spec.rb'
228295
- 'spec/mocks/util.rb'
296+
297+
# Offense count: 1
298+
# Cop supports --auto-correct.
299+
# Configuration parameters: Keywords.
300+
# Keywords: TODO, FIXME, OPTIMIZE, HACK, REVIEW
301+
Style/CommentAnnotation:
302+
Exclude:
303+
- 'lib/facter/resolvers/networking_linux_resolver.rb'
304+
305+
# Offense count: 1
306+
# Cop supports --auto-correct.
307+
# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
308+
# SupportedStyles: single_quotes, double_quotes
309+
Style/StringLiterals:
310+
Exclude:
311+
- 'lib/facter/resolvers/networking_linux_resolver.rb'

acceptance/lib/facter/acceptance/base_fact_utils.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,10 @@ def ubuntu_expected_facts(agent)
483483
os_arch = 'ppc64le'
484484
os_hardware = 'ppc64le'
485485
processor_model_pattern = // # facter doesn't figure out the processor type on these machines
486+
elsif agent['platform'] =~ /aarch64/
487+
os_arch = 'aarch64'
488+
os_hardware = 'aarch64'
489+
processor_model_pattern = // # facter doesn't figure out the processor type on these machines
486490
else
487491
os_arch = 'i386'
488492
os_hardware = 'i686'

acceptance/tests/facts/networking_facts.rb

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,96 @@
11
test_name 'C59029: networking facts should be fully populated' do
22
tag 'risk:high'
33

4-
#
5-
# This test is intended to ensure that networking facts resolves
6-
# as expected across supported platforms.
7-
#
4+
#
5+
# This test is intended to ensure that networking facts resolve
6+
# as expected across supported platforms.
7+
#
88

99
@ip_regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
1010
@netmask_regex = /^(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254)))$/
1111

1212
expected_networking = {
13-
"networking.dhcp" => agent['platform'] =~ /fedora-32|el-8-aarch64/ ? '' : @ip_regex, # https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/426
14-
"networking.ip" => @ip_regex,
15-
"networking.ip6" => /[a-f0-9]+:+/,
16-
"networking.mac" => /[a-f0-9]{2}:/,
17-
"networking.mtu" => /\d+/,
18-
"networking.netmask" => @netmask_regex,
19-
"networking.netmask6" => /[a-f0-9]+:/,
20-
"networking.network" => @ip_regex,
21-
"networking.network6" => /([a-f0-9]+)?:([a-f0-9]+)?/
13+
%w[networking dhcp] => agent['platform'] =~ /fedora-32|el-8-aarch64/ ? '' : @ip_regex, # https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/426
14+
%w[networking ip] => @ip_regex,
15+
%w[networking ip6] => /[a-f0-9]+:+/,
16+
%w[networking mac] => /[a-f0-9]{2}:/,
17+
%w[networking mtu] => /\d+/,
18+
%w[networking netmask] => @netmask_regex,
19+
%w[networking netmask6] => /[a-f0-9]+:/,
20+
%w[networking network] => @ip_regex,
21+
%w[networking network6] => /([a-f0-9]+)?:([a-f0-9]+)?/,
22+
%w[networking scope6] => /link|host|site|global|compat/
2223
}
2324

2425
agents.each do |agent|
2526
primary_interface = fact_on(agent, 'networking.primary')
2627
refute_empty(primary_interface)
2728

2829
expected_bindings = {
29-
"networking.interfaces.#{primary_interface}.bindings.0.address" => @ip_regex,
30-
"networking.interfaces.#{primary_interface}.bindings.0.netmask" => @netmask_regex,
31-
"networking.interfaces.#{primary_interface}.bindings.0.network" => @ip_regex,
32-
"networking.interfaces.#{primary_interface}.bindings6.0.address" => /[a-f0-9:]+/,
33-
"networking.interfaces.#{primary_interface}.bindings6.0.netmask" => /[a-f0-9:]+/,
34-
"networking.interfaces.#{primary_interface}.bindings6.0.network" => /[a-f0-9:]+/
30+
['networking', 'interfaces', primary_interface, 'bindings', 0, 'address'] => @ip_regex,
31+
['networking', 'interfaces', primary_interface, 'bindings', 0, 'netmask'] => @netmask_regex,
32+
['networking', 'interfaces', primary_interface, 'bindings', 0, 'network'] => @ip_regex,
33+
['networking', 'interfaces', primary_interface, 'bindings6', 0, 'address'] => /[a-f0-9:]+/,
34+
['networking', 'interfaces', primary_interface, 'bindings6', 0, 'netmask'] => /[a-f0-9:]+/,
35+
['networking', 'interfaces', primary_interface, 'bindings6', 0, 'network'] => /[a-f0-9:]+/,
36+
['networking', 'interfaces', primary_interface, 'bindings6', 0, 'scope6'] => /link|host|site|global|compat/
3537
}
3638

3739
if agent['platform'] =~ /eos|solaris|aix|cisco/
3840
#remove the invalid networking facts on eccentric platforms
39-
expected_networking.delete("networking.ip6")
40-
expected_networking.delete("networking.netmask6")
41-
expected_networking.delete("networking.network6")
41+
expected_networking.delete(%w[networking ip6])
42+
expected_networking.delete(%w[networking netmask6])
43+
expected_networking.delete(%w[networking network6])
44+
expected_networking.delete(%w[networking scope6])
4245

4346
#remove invalid bindings for the primary networking interface eccentric platforms
44-
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings6.0.address")
45-
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings6.0.netmask")
46-
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings6.0.network")
47+
expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings6', 0, 'address'])
48+
expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings6', 0, 'netmask'])
49+
expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings6', 0, 'network'])
50+
expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings6', 0, 'scope6'])
4751
end
4852

4953
if agent['platform'] =~ /aix|sparc|cisco|huawei|sles|s390x/
5054
# some of our testing platforms do not use DHCP
51-
expected_networking.delete("networking.dhcp")
55+
expected_networking.delete(%w[networking dhcp])
5256
end
5357

5458
if agent['platform'] =~ /cisco/
5559
# Cisco main interface does not define netmask or network
56-
expected_networking.delete("networking.network")
57-
expected_networking.delete("networking.netmask")
60+
expected_networking.delete(%w[networking network])
61+
expected_networking.delete(%w[networking netmask])
5862

5963
#remove invalid bindings for Cisco's primary networking interface
60-
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings.0.netmask")
61-
expected_bindings.delete("networking.interfaces.#{primary_interface}.bindings.0.network")
64+
expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings', 0, 'netmask'])
65+
expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings', 0, 'network'])
6266
end
6367

68+
networking_facts = JSON.parse(on(agent, facter('networking --json')).stdout)
69+
6470
step "Ensure the Networking fact resolves with reasonable values for at least one interface" do
65-
expected_networking.each do |fact, value|
66-
assert_match(value, fact_on(agent, fact).to_s)
71+
expected_networking.each do |fact_tokens, regex|
72+
assert_match(regex, networking_facts.dig(*fact_tokens).to_s)
6773
end
6874
end
6975

7076
step "Ensure bindings for the primary networking interface are present" do
71-
expected_bindings.each do |fact, value|
72-
assert_match(value, fact_on(agent, fact).to_s)
77+
expected_bindings.each do |fact_tokens, regex|
78+
assert_match(regex, networking_facts.dig(*fact_tokens).to_s)
7379
end
7480
end
7581
end
7682

7783
# Verify that IP Address v6 and network v6 is retrieved correctly and does not contain the interface identifier
7884
agents.each do |agent|
7985
if agent['platform'] =~ /windows/
80-
step("verify that ipaddress6 is retrieved correctly") do
81-
on(agent, facter("ipaddress6")) do |facter_result|
86+
step "verify that ipaddress6 is retrieved correctly" do
87+
on(agent, facter('ipaddress6')) do |facter_result|
8288
assert_match(/^[a-fA-F0-9:]+$/, facter_result.stdout.chomp)
8389
end
8490
end
8591

86-
step("verify that network6 is retrieved correctly") do
87-
on(agent, facter("network6")) do |facter_result|
92+
step "verify that network6 is retrieved correctly" do
93+
on(agent, facter('network6')) do |facter_result|
8894
assert_match(/([a-fA-F0-9:]+)?:([a-fA-F0-9:]+)?$/, facter_result.stdout.chomp)
8995
end
9096
end

0 commit comments

Comments
 (0)