]> gitweb.fluxo.info Git - puppet-inifile.git/commitdiff
Add purging support to ini file
authorDan Bode <dan@puppetlabs.com>
Mon, 7 Jan 2013 23:54:41 +0000 (15:54 -0800)
committerDan Bode <dan@puppetlabs.com>
Mon, 4 Mar 2013 23:38:58 +0000 (15:38 -0800)
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.

lib/puppet/provider/ini_setting/ruby.rb
lib/puppet/util/ini_file.rb
lib/puppet/util/ini_file/section.rb
spec/unit/puppet/provider/ini_setting/ruby_spec.rb

index 2c1384782bec9fb007cddf027f66b79eed359aae..af7a073b67f13acfb2742462764ce44e3e4942fe 100644 (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
index 90b0c7b822e8084f95f977f7e1a4e04b19444e56..48600ea137433dbc9c6cd1d12e910ec618ae4cbd 100644 (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)
index ba1a783fa991ed31f51a98b8b35244786820acf1..9682d7ff92ccd57305083167b3cea8d7d17c07e1 100644 (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
index 4f8bdc106e76e84b9e1ddb70669ad5d43845fed4..7204f88594ff6fa22878d53799f6067747712f44 100644 (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