Add purging support to ini file

This commit adds purging to ini file native types.

Purging will only work for child providers that
implement the method: self.file_path. This is
because collecting all instances of the type (
which is a requirement for purging) is only possible
when the path of the file that is being managed
can be accessed by the class instance (in the
method self.instances.)

This commit adds the following method to the internal
of the ini_file:
- get_settings - has of all settings/values for
a given section

It also adds the following method to the section
class:
- setting_names - list of all setting names in a
section.

These methods are required for the instances method
to be able to list the values for all settings of
each section.
This commit is contained in:
Dan Bode 2013-01-07 15:54:41 -08:00
parent 5e1d203a39
commit 2f22483c87
4 changed files with 117 additions and 1 deletions

View file

@ -2,6 +2,28 @@ require File.expand_path('../../../util/ini_file', __FILE__)
Puppet::Type.type(:ini_setting).provide(:ruby) do
def self.instances
if self.respond_to?(:file_path)
# figure out what to do about the seperator
ini_file = Puppet::Util::IniFile.new(file_path, '=')
resources = []
ini_file.section_names.each do |section_name|
ini_file.get_settings(section_name).each do |setting, value|
resources.push(
new(
:name => "#{section_name}/#{setting}",
:value => value,
:ensure => :present
)
)
end
end
resources
else
raise(Puppet::Error, 'Ini_settings only support collecting instances when a file path is hard coded')
end
end
def exists?
ini_file.get_value(section, setting)
end
@ -36,7 +58,11 @@ Puppet::Type.type(:ini_setting).provide(:ruby) do
end
def file_path
resource[:path]
if self.class.respond_to?(:file_path)
self.class.file_path
else
resource[:path]
end
end
def separator

View file

@ -23,6 +23,14 @@ module Util
@section_names
end
def get_settings(section_name)
section = @sections_hash[section_name]
section.setting_names.inject({}) do |result, setting|
result[setting] = section.get_value(setting)
result
end
end
def get_value(section_name, setting)
if (@sections_hash.has_key?(section_name))
@sections_hash[section_name].get_value(setting)

View file

@ -32,6 +32,10 @@ class IniFile
@end_line.nil?
end
def setting_names
@existing_settings.keys | @additional_settings.keys
end
def get_value(setting_name)
@existing_settings[setting_name] || @additional_settings[setting_name]
end

View file

@ -28,6 +28,84 @@ describe provider_class do
end
end
context 'when calling instances' do
let :orig_content do
''
end
it 'should fail when file path is not set' do
expect {
described_class.instances
}.to raise_error(Puppet::Error, 'Ini_settings only support collecting instances when a file path is hard coded')
end
context 'when file path is set' do
it 'should return [] when file is empty' do
provider_class.stubs(:file_path).returns(emptyfile)
provider_class.instances.should == []
end
it 'should override the provider instances file_path' do
provider_class.stubs(:file_path).returns('/some/file/path')
resource = Puppet::Type::Ini_setting.new(common_params)
provider = provider_class.new(resource)
provider.file_path.should == '/some/file/path'
end
context 'when file has contecnts' do
let(:orig_content) {
<<-EOS
# This is a comment
[section1]
; This is also a comment
foo=foovalue
bar = barvalue
master = true
[section2]
foo= foovalue2
baz=bazvalue
url = http://192.168.1.1:8080
[section:sub]
subby=bar
#another comment
; yet another comment
EOS
}
it 'should be able to parse the results' do
provider_class.stubs(:file_path).returns(tmpfile)
provider_class.instances.size == 7
expected_array = [
{:name => 'section1/foo', :value => 'foovalue' },
{:name => 'section1/bar', :value => 'barvalue' },
{:name => 'section1/master', :value => 'true' },
{:name => 'section2/foo', :value => 'foovalue2' },
{:name => 'section2/baz', :value => 'bazvalue' },
{:name => 'section2/url', :value => 'http://192.168.1.1:8080' },
{:name => 'section:sub/subby', :value => 'bar' }
]
real_array = []
ensure_array = []
provider_class.instances.each do |x|
prop_hash = x.instance_variable_get(:@property_hash)
ensure_value = prop_hash.delete(:ensure)
ensure_array.push(ensure_value)
real_array.push(prop_hash)
end
puts ensure_array.inspect
puts real_array.inspect
ensure_array.uniq.should == [:present]
((real_array - expected_array) && (expected_array - real_array)).should == []
end
end
end
end
context "when ensuring that a setting is present" do
let(:orig_content) {
<<-EOS