Skip to content

Commit 7d67eb5

Browse files
committed
fix removing with multiple target files
1 parent 4f83690 commit 7d67eb5

File tree

2 files changed

+113
-10
lines changed

2 files changed

+113
-10
lines changed

lib/puppet/provider/sysctl/augeas.rb

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def self.sysctl_get(key)
4242

4343
confine feature: :augeas
4444

45-
def self.collect_augeas_resources(res, entries, target = '/etc/sysctl.conf', resources)
45+
def self.collect_augeas_resources(res, entries, tgt = nil, resources = nil)
46+
tgt ||= target
4647
resources ||= []
4748

4849
augopen(res) do |aug|
@@ -58,7 +59,7 @@ def self.collect_augeas_resources(res, entries, target = '/etc/sysctl.conf', res
5859
ensure: :present,
5960
persist: :true,
6061
value: value,
61-
target: target
62+
target: tgt
6263
}
6364

6465
# Only match comments immediately before the entry and prefixed with
@@ -82,14 +83,26 @@ def self.instances(reference_resources = nil)
8283

8384
if reference_resources
8485
reference_resource_titles = reference_resources.map { |_ref_name, ref_obj| ref_obj.title }
85-
resource_dup = reference_resources.first.last.dup
8686

87-
collect_augeas_resources(
88-
resource_dup,
89-
reference_resource_titles,
90-
resource_dup[:target],
91-
resources
92-
)
87+
# Get all resources with their targets
88+
resources_by_target = {}
89+
reference_resources.each do |_ref_name, ref_obj|
90+
tgt = ref_obj[:target] || target
91+
resources_by_target[tgt] ||= []
92+
resources_by_target[tgt] << ref_obj.title
93+
end
94+
95+
# Now collect resources from each target
96+
resources_by_target.each do |target, res_titles|
97+
tmp_res = Puppet::Resource.new('sysctl', 'ignored')
98+
tmp_res[:target] = target
99+
collect_augeas_resources(
100+
tmp_res,
101+
res_titles,
102+
target,
103+
resources
104+
)
105+
end
93106

94107
sysctl_args = if Facter.value(:kernel) == 'OpenBSD'
95108
# OpenBSD doesn't support -e
@@ -107,7 +120,7 @@ def self.instances(reference_resources = nil)
107120
sysctl_output += sysctl(sysctl_args.flatten)
108121
end
109122
else
110-
targets = ['/etc/sysctl.d/*.conf', '/etc/sysctl.conf']
123+
targets = ['/etc/sysctl.d/*.conf', target]
111124
targets = [target] if target
112125

113126
Dir.glob(targets).reverse.each do |config_file|

spec/acceptance/sysctl_spec.rb

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,96 @@
261261
end
262262
end
263263
end
264+
265+
context 'with no value' do
266+
let(:manifest) do
267+
"sysctl { 'vm.swappiness': }"
268+
end
269+
270+
it 'works with no errors' do
271+
apply_manifest_on(host, manifest, catch_failures: true)
272+
end
273+
274+
it 'is idempotent' do
275+
apply_manifest_on(host, manifest, catch_changes: true)
276+
end
277+
end
278+
279+
context 'when setting multiple values' do
280+
let(:manifest) do
281+
<<-EOS
282+
sysctl { 'vm.swappiness': value => '60' }
283+
sysctl { 'net.ipv4.ip_forward': value => '0' }
284+
EOS
285+
end
286+
287+
it 'works with no errors' do
288+
apply_manifest_on(host, manifest, catch_failures: true)
289+
end
290+
291+
it 'is idempotent' do
292+
apply_manifest_on(host, manifest, catch_changes: true)
293+
end
294+
end
295+
296+
context 'when removing multiple values' do
297+
let(:manifest_one) do
298+
<<-EOS
299+
sysctl { 'vm.swappiness': value => '60' }
300+
sysctl { 'net.ipv4.ip_forward': value => '0' }
301+
EOS
302+
end
303+
let(:manifest_two) do
304+
<<-EOS
305+
sysctl { 'vm.swappiness': ensure => 'absent' }
306+
sysctl { 'net.ipv4.ip_forward': ensure => 'absent' }
307+
EOS
308+
end
309+
310+
it 'is idempotent' do
311+
apply_manifest_on(host, manifest_one, catch_failures: true)
312+
apply_manifest_on(host, manifest_two, catch_failures: true)
313+
apply_manifest_on(host, manifest_two, catch_changes: true)
314+
end
315+
end
316+
317+
context 'when managing multiple files' do
318+
let(:manifest) do
319+
<<-EOS
320+
sysctl{'net.ipv6.conf.all.disable_ipv6': ensure => present, value => 1, target => '/etc/sysctl.d/99-disable-ipv6.conf' }
321+
sysctl{'net.ipv4.tcp_syncookies': ensure => present, value => 2, target => '/etc/sysctl.d/99-ddos-abwehr.conf'}
322+
EOS
323+
end
324+
325+
it 'works with no errors' do
326+
apply_manifest_on(host, manifest, catch_failures: true)
327+
end
328+
329+
it 'is idempotent' do
330+
apply_manifest_on(host, manifest, catch_changes: true)
331+
end
332+
333+
describe 'removing one of two settings' do
334+
let(:manifest_one) do
335+
<<-EOS
336+
sysctl{'net.ipv6.conf.all.disable_ipv6': ensure => present, value => 1, target => '/etc/sysctl.d/99-disable-ipv6.conf' }
337+
sysctl{'net.ipv4.tcp_syncookies': ensure => present, value => 2, target => '/etc/sysctl.d/99-ddos-abwehr.conf'}
338+
EOS
339+
end
340+
let(:manifest_two) do
341+
<<-EOS
342+
sysctl{'net.ipv6.conf.all.disable_ipv6': ensure => present, value => 1, target => '/etc/sysctl.d/99-disable-ipv6.conf' }
343+
sysctl{'net.ipv4.tcp_syncookies': ensure => absent, target => '/etc/sysctl.d/99-ddos-abwehr.conf'}
344+
EOS
345+
end
346+
347+
it 'is idempotent' do
348+
apply_manifest_on(host, manifest_one, catch_failures: true)
349+
apply_manifest_on(host, manifest_two, catch_failures: true)
350+
apply_manifest_on(host, manifest_two, catch_changes: true)
351+
end
352+
end
353+
end
264354
end
265355
end
266356
end

0 commit comments

Comments
 (0)