Skip to content

Commit 092217a

Browse files
committed
fix removing with multiple target files
1 parent 4f83690 commit 092217a

File tree

2 files changed

+111
-9
lines changed

2 files changed

+111
-9
lines changed

lib/puppet/provider/sysctl/augeas.rb

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ 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, target = default_file, resources)
4646
resources ||= []
4747

4848
augopen(res) do |aug|
@@ -82,14 +82,26 @@ def self.instances(reference_resources = nil)
8282

8383
if reference_resources
8484
reference_resource_titles = reference_resources.map { |_ref_name, ref_obj| ref_obj.title }
85-
resource_dup = reference_resources.first.last.dup
8685

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

94106
sysctl_args = if Facter.value(:kernel) == 'OpenBSD'
95107
# OpenBSD doesn't support -e
@@ -107,7 +119,7 @@ def self.instances(reference_resources = nil)
107119
sysctl_output += sysctl(sysctl_args.flatten)
108120
end
109121
else
110-
targets = ['/etc/sysctl.d/*.conf', '/etc/sysctl.conf']
122+
targets = ['/etc/sysctl.d/*.conf', default_file]
111123
targets = [target] if target
112124

113125
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)