Skip to content

Commit b499f70

Browse files
committed
Merge pull request redhat-openstack#182 from mhaskel/MODULES-2212
MODULES-2212 - Add use_exact_match parameter for subsettings
2 parents 7a45b38 + 2ab4710 commit b499f70

5 files changed

Lines changed: 144 additions & 80 deletions

File tree

README.markdown

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ Specifies whether the subsetting should be present. Valid options: 'present' and
226226

227227
##### `key_val_separator`
228228

229-
*Optional.* Specifies a string to use between subsetting name and value (e.g., to determine whether the separator includes whitespace). Valid options: a string. Default value: ' = '.
229+
*Optional.* Specifies a string to use between setting name and value (e.g., to determine whether the separator includes whitespace). Valid options: a string. Default value: ' = '.
230230

231231
##### `path`
232232

@@ -253,6 +253,10 @@ Specifies whether the subsetting should be present. Valid options: 'present' and
253253

254254
*Optional.* Specifies a string to use between subsettings. Valid options: a string. Default value: " ".
255255

256+
##### `use_exact_match`
257+
258+
*Optional.* Whether to use partial or exact matching for subsetting. Should be set to true if the subsettings do not have values. Valid options: true, false. Default value: false.
259+
256260
##### `value`
257261

258262
*Optional.* Supplies a value for the specified subsetting. Valid options: a string. Default value: undefined.

lib/puppet/provider/ini_subsetting/ruby.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@
44
Puppet::Type.type(:ini_subsetting).provide(:ruby) do
55

66
def exists?
7-
setting_value.get_subsetting_value(subsetting)
7+
setting_value.get_subsetting_value(subsetting, resource[:use_exact_match])
88
end
99

1010
def create
11-
setting_value.add_subsetting(subsetting, resource[:value])
11+
setting_value.add_subsetting(subsetting, resource[:value], resource[:use_exact_match])
1212
ini_file.set_value(section, setting, setting_value.get_value)
1313
ini_file.save
1414
@ini_file = nil
1515
@setting_value = nil
1616
end
1717

1818
def destroy
19-
setting_value.remove_subsetting(subsetting)
19+
setting_value.remove_subsetting(subsetting, resource[:use_exact_match])
2020
ini_file.set_value(section, setting, setting_value.get_value)
2121
ini_file.save
2222
@ini_file = nil
@@ -28,7 +28,7 @@ def value
2828
end
2929

3030
def value=(value)
31-
setting_value.add_subsetting(subsetting, resource[:value])
31+
setting_value.add_subsetting(subsetting, resource[:value], resource[:use_exact_match])
3232
ini_file.set_value(section, setting, setting_value.get_value)
3333
ini_file.save
3434
end

lib/puppet/type/ini_subsetting.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@
5656
end
5757
end
5858

59+
newparam(:use_exact_match) do
60+
desc 'Set to true if your subsettings don\'t have values and you want to use exact matches to determine if the subsetting exists. See MODULES-2212'
61+
newvalues(:true, :false)
62+
defaultto(:false)
63+
end
64+
5965
newproperty(:value) do
6066
desc 'The value of the subsetting to be defined.'
6167
end

lib/puppet/util/setting_value.rb

Lines changed: 83 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,103 @@
11
module Puppet
2-
module Util
2+
module Util
33

4-
class SettingValue
4+
class SettingValue
55

6-
def initialize(setting_value, subsetting_separator = ' ', default_quote_char = nil)
7-
@setting_value = setting_value
8-
@subsetting_separator = subsetting_separator
6+
def initialize(setting_value, subsetting_separator = ' ', default_quote_char = nil)
7+
@setting_value = setting_value
8+
@subsetting_separator = subsetting_separator
99

10-
default_quote_char ||= ''
10+
default_quote_char ||= ''
1111

12-
if @setting_value
13-
unquoted, @quote_char = unquote_setting_value(setting_value)
14-
@subsetting_items = unquoted.scan(Regexp.new("(?:(?:[^\\#{@subsetting_separator}]|\\.)+)")) # an item can contain escaped separator
15-
@subsetting_items.map! { |item| item.strip }
16-
@quote_char = default_quote_char if @quote_char.empty?
17-
else
18-
@subsetting_items = []
19-
@quote_char = default_quote_char
20-
end
21-
end
12+
if @setting_value
13+
unquoted, @quote_char = unquote_setting_value(setting_value)
14+
@subsetting_items = unquoted.scan(Regexp.new("(?:(?:[^\\#{@subsetting_separator}]|\\.)+)")) # an item can contain escaped separator
15+
@subsetting_items.map! { |item| item.strip }
16+
@quote_char = default_quote_char if @quote_char.empty?
17+
else
18+
@subsetting_items = []
19+
@quote_char = default_quote_char
20+
end
21+
end
22+
23+
def unquote_setting_value(setting_value)
24+
quote_char = ""
25+
if (setting_value.start_with?('"') and setting_value.end_with?('"'))
26+
quote_char = '"'
27+
elsif (setting_value.start_with?("'") and setting_value.end_with?("'"))
28+
quote_char = "'"
29+
end
30+
31+
unquoted = setting_value
2232

23-
def unquote_setting_value(setting_value)
24-
quote_char = ""
25-
if (setting_value.start_with?('"') and setting_value.end_with?('"'))
26-
quote_char = '"'
27-
elsif (setting_value.start_with?("'") and setting_value.end_with?("'"))
28-
quote_char = "'"
33+
if (quote_char != "")
34+
unquoted = setting_value[1, setting_value.length - 2]
35+
end
36+
37+
[unquoted, quote_char]
2938
end
3039

31-
unquoted = setting_value
40+
def get_value
41+
42+
result = ""
43+
first = true
44+
45+
@subsetting_items.each { |item|
46+
result << @subsetting_separator unless first
47+
result << item
48+
first = false
49+
}
3250

33-
if (quote_char != "")
34-
unquoted = setting_value[1, setting_value.length - 2]
51+
@quote_char + result + @quote_char
3552
end
3653

37-
[unquoted, quote_char]
38-
end
54+
def get_subsetting_value(subsetting, use_exact_match=:false)
3955

40-
def get_value
41-
42-
result = ""
43-
first = true
44-
45-
@subsetting_items.each { |item|
46-
result << @subsetting_separator unless first
47-
result << item
48-
first = false
49-
}
50-
51-
@quote_char + result + @quote_char
52-
end
56+
value = nil
57+
58+
@subsetting_items.each { |item|
59+
if(use_exact_match == :false and item.start_with?(subsetting))
60+
value = item[subsetting.length, item.length - subsetting.length]
61+
break
62+
elsif(use_exact_match == :true and item.eql?(subsetting))
63+
return true
64+
end
65+
}
5366

54-
def get_subsetting_value(subsetting)
55-
56-
value = nil
57-
58-
@subsetting_items.each { |item|
59-
if(item.start_with?(subsetting))
60-
value = item[subsetting.length, item.length - subsetting.length]
61-
break
67+
value
68+
end
69+
70+
def add_subsetting(subsetting, subsetting_value, use_exact_match=:false)
71+
72+
new_item = subsetting + (subsetting_value || '')
73+
found = false
74+
75+
@subsetting_items.map! { |item|
76+
if use_exact_match == :false and item.start_with?(subsetting)
77+
value = new_item
78+
found = true
79+
elsif use_exact_match == :true and item.eql?(subsetting)
80+
value = new_item
81+
found = true
82+
else
83+
value = item
84+
end
85+
86+
value
87+
}
88+
89+
unless found
90+
@subsetting_items.push(new_item)
6291
end
63-
}
64-
65-
value
66-
end
67-
68-
def add_subsetting(subsetting, subsetting_value)
69-
70-
new_item = subsetting + (subsetting_value || '')
71-
found = false
72-
73-
@subsetting_items.map! { |item|
74-
if item.start_with?(subsetting)
75-
value = new_item
76-
found = true
92+
end
93+
94+
def remove_subsetting(subsetting, use_exact_match=:false)
95+
if use_exact_match == :false
96+
@subsetting_items = @subsetting_items.map { |item| item.start_with?(subsetting) ? nil : item }.compact
7797
else
78-
value = item
98+
@subsetting_items = @subsetting_items.map { |item| item.eql?(subsetting) ? nil : item }.compact
7999
end
80-
81-
value
82-
}
83-
84-
unless found
85-
@subsetting_items.push(new_item)
86100
end
87101
end
88-
89-
def remove_subsetting(subsetting)
90-
@subsetting_items = @subsetting_items.map { |item| item.start_with?(subsetting) ? nil : item }.compact
91-
end
92-
93102
end
94103
end
95-
end

spec/unit/puppet/provider/ini_subsetting/ruby_spec.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,50 @@ def validate_file(expected_content,tmpfile = tmpfile)
132132
end
133133

134134
end
135+
136+
context "when working with subsettings in files with use_exact_match" do
137+
let(:common_params) { {
138+
:title => 'ini_setting_ensure_present_test',
139+
:path => tmpfile,
140+
:section => 'master',
141+
:setting => 'reports',
142+
:use_exact_match => true,
143+
} }
144+
145+
let(:orig_content) {
146+
<<-EOS
147+
[master]
148+
149+
reports = http,foo
150+
EOS
151+
}
152+
153+
it "should add a new subsetting when the 'parent' setting already exists" do
154+
resource = Puppet::Type::Ini_subsetting.new(common_params.merge(
155+
:subsetting => 'fo', :subsetting_separator => ','))
156+
provider = described_class.new(resource)
157+
provider.value=('')
158+
validate_file(<<-eos
159+
[master]
160+
161+
reports = http,foo,fo
162+
eos
163+
)
164+
end
165+
166+
it "should not remove substring subsettings" do
167+
resource = Puppet::Type::Ini_subsetting.new(common_params.merge(
168+
:subsetting => 'fo', :subsetting_separator => ','))
169+
provider = described_class.new(resource)
170+
provider.value=('')
171+
provider.destroy
172+
validate_file(<<-EOS
173+
[master]
174+
175+
reports = http,foo
176+
EOS
177+
)
178+
end
179+
end
180+
135181
end

0 commit comments

Comments
 (0)