]> gitweb.fluxo.info Git - puppet-stdlib.git/commitdiff
implement #11017 - make file_line type ensurable
authorPeter Meier <peter.meier@immerda.ch>
Thu, 9 Feb 2012 14:56:09 +0000 (15:56 +0100)
committerPeter Meier <peter.meier@immerda.ch>
Thu, 9 Feb 2012 14:56:09 +0000 (15:56 +0100)
* Implement a simple destroy method.
* Add tests for it
* Refactor code, so file is actually read only once. However, due
  to the nature how provider tests are run, we need to ensure that
  the file is read before we open it to write it.

lib/puppet/provider/file_line/ruby.rb
lib/puppet/type/file_line.rb
spec/unit/puppet/provider/file_line/ruby_spec.rb

index 63bbd8e819b9c125b717d78ad2e12cc4c51a5d95..f5d3a32f96a280c1533c2ae705378d82286ac780 100644 (file)
@@ -1,7 +1,7 @@
 Puppet::Type.type(:file_line).provide(:ruby) do
 
   def exists?
-    File.readlines(resource[:path]).find do |line|
+    lines.find do |line|
       line.chomp == resource[:line].chomp
     end
   end
@@ -12,4 +12,16 @@ Puppet::Type.type(:file_line).provide(:ruby) do
     end
   end
 
+  def destroy
+    local_lines = lines
+    File.open(resource[:path],'w') do |fh|
+      fh.write(local_lines.reject{|l| l.chomp == resource[:line] }.join(''))
+    end
+  end
+
+  private
+  def lines
+    @lines ||= File.readlines(resource[:path])
+  end
+
 end
index 8b458978864edc62c6bc041d1a8257a55a9fdebb..9f03771ad2af0b36b7c87706fbe34b741d79a150 100644 (file)
@@ -23,12 +23,7 @@ Puppet::Type.newtype(:file_line) do
 
   EOT
 
-  ensurable do
-    defaultto :present
-    newvalue(:present) do
-      provider.create
-    end
-  end
+  ensurable
 
   newparam(:name, :namevar => true) do
     desc 'arbitrary name used as identity'
index b03fc0ea9787398ecb6845f44b7538d375b3be51..b62e3a822e49c176feff97d7223f39a24fb452d6 100644 (file)
@@ -2,29 +2,66 @@ require 'puppet'
 require 'tempfile'
 provider_class = Puppet::Type.type(:file_line).provider(:ruby)
 describe provider_class do
-  before :each do
-    tmp = Tempfile.new('tmp')
-    @tmpfile = tmp.path
-    tmp.close!
-    @resource = Puppet::Type::File_line.new(
-      {:name => 'foo', :path => @tmpfile, :line => 'foo'}
-    )
-    @provider = provider_class.new(@resource)
-  end
-  it 'should detect if the line exists in the file' do
-    File.open(@tmpfile, 'w') do |fh|
-      fh.write('foo')
+  context "add" do
+    before :each do
+      tmp = Tempfile.new('tmp')
+      @tmpfile = tmp.path
+      tmp.close!
+      @resource = Puppet::Type::File_line.new(
+        {:name => 'foo', :path => @tmpfile, :line => 'foo'}
+      )
+      @provider = provider_class.new(@resource)
     end
-    @provider.exists?.should be_true
-  end
-  it 'should detect if the line does not exist in the file' do
-    File.open(@tmpfile, 'w') do |fh|
-      fh.write('foo1')
+    it 'should detect if the line exists in the file' do
+      File.open(@tmpfile, 'w') do |fh|
+        fh.write('foo')
+      end
+      @provider.exists?.should be_true
+    end
+    it 'should detect if the line does not exist in the file' do
+      File.open(@tmpfile, 'w') do |fh|
+        fh.write('foo1')
+      end
+      @provider.exists?.should be_nil
+    end
+    it 'should append to an existing file when creating' do
+      @provider.create
+      File.read(@tmpfile).chomp.should == 'foo'
     end
-    @provider.exists?.should be_nil
   end
-  it 'should append to an existing file when creating' do
-    @provider.create
-    File.read(@tmpfile).chomp.should == 'foo'
+
+  context "remove" do
+    before :each do
+      tmp = Tempfile.new('tmp')
+      @tmpfile = tmp.path
+      tmp.close!
+      @resource = Puppet::Type::File_line.new(
+        {:name => 'foo', :path => @tmpfile, :line => 'foo', :ensure => 'absent' }
+      )
+      @provider = provider_class.new(@resource)
+    end
+    it 'should remove the line if it exists' do
+      File.open(@tmpfile, 'w') do |fh|
+        fh.write("foo1\nfoo\nfoo2")
+      end
+      @provider.destroy
+      File.read(@tmpfile).should eql("foo1\nfoo2")
+    end
+
+    it 'should remove the line without touching the last new line' do
+      File.open(@tmpfile, 'w') do |fh|
+        fh.write("foo1\nfoo\nfoo2\n")
+      end
+      @provider.destroy
+      File.read(@tmpfile).should eql("foo1\nfoo2\n")
+    end
+
+    it 'should remove any occurence of the line' do
+      File.open(@tmpfile, 'w') do |fh|
+        fh.write("foo1\nfoo\nfoo2\nfoo\nfoo")
+      end
+      @provider.destroy
+      File.read(@tmpfile).should eql("foo1\nfoo2\n")
+    end
   end
 end