[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, experimental, updated. debian/2.6.8-1-844-g7ec39d5

Nick Lewis nick at puppetlabs.com
Tue May 10 08:01:48 UTC 2011


The following commit has been merged in the experimental branch:
commit 8efdc769db2e144fe61eccbb1663a1c9594b09ab
Author: Stefan Schulte <stefan.schulte at taunusstein.net>
Date:   Wed Nov 17 22:59:47 2010 +0100

    (#5274) Tests for hostprovider removes comments
    
    I noticed that the hostprovider will remove all inline comments from the
    /etc/hosts file, when puppet updates at least one entry. Puppet will also
    remove comments from entries, the user doesnt want to manage with
    puppet.
    
    To split up changes a bit this commit will only introduce tests for the
    host type and the hostprovider. A few will fail, indicating the bug:
    
    The hostprovider parses all entries and builds a hash. When building
    the recordhash all comments are discarded. When puppet has to update at
    least one entry it uses the to_line function to convert the record hash
    back to a file. Because the comments are not stored in the hash, they
    cannot be written back to the file.

diff --git a/spec/unit/provider/host/parsed_spec.rb b/spec/unit/provider/host/parsed_spec.rb
new file mode 100755
index 0000000..08254e6
--- /dev/null
+++ b/spec/unit/provider/host/parsed_spec.rb
@@ -0,0 +1,152 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+require 'puppet_spec/files'
+require 'puppettest/support/utils'
+require 'puppettest/fileparsing'
+
+provider_class = Puppet::Type.type(:host).provider(:parsed)
+
+describe provider_class do
+  include PuppetSpec::Files
+  extend  PuppetTest::Support::Utils
+  include PuppetTest::FileParsing
+
+  before do
+    @host_class = Puppet::Type.type(:host)
+    @provider = @host_class.provider(:parsed)
+    @hostfile = tmpfile('hosts')
+    @provider.any_instance.stubs(:target).returns @hostfile
+  end
+
+  after :each do
+    @provider.initvars
+  end
+
+  def mkhost(args)
+    hostresource = Puppet::Type::Host.new(:name => args[:name])
+    hostresource.stubs(:should).with(:target).returns @hostfile
+
+    # Using setters of provider
+    host = @provider.new(hostresource)
+    args.each do |property,value|
+      host.send("#{property}=", value)
+    end
+    host
+  end
+
+  def genhost(host)
+    @provider.stubs(:filetype).returns(Puppet::Util::FileType::FileTypeRam)
+    File.stubs(:chown)
+    File.stubs(:chmod)
+    Puppet::Util::SUIDManager.stubs(:asuser).yields
+    host.flush
+    @provider.target_object(@hostfile).read
+  end
+
+  describe "when parsing a line with ip and hostname" do
+
+    it "should parse an ipv4 from the first field" do
+      @provider.parse_line("127.0.0.1    localhost")[:ip].should == "127.0.0.1"
+    end
+
+    it "should parse an ipv6 from the first field" do
+      @provider.parse_line("::1     localhost")[:ip].should == "::1"
+    end
+
+    it "should parse the name from the second field" do
+      @provider.parse_line("::1     localhost")[:name].should == "localhost"
+    end
+
+  end
+
+  describe "when parsing a line with ip, hostname and comment" do
+    before do
+      @testline = "127.0.0.1   localhost # A comment with a #-char"
+    end
+
+    it "should parse the ip from the first field" do
+      @provider.parse_line(@testline)[:ip].should == "127.0.0.1"
+    end
+
+    it "should parse the hostname from the second field" do
+      @provider.parse_line(@testline)[:name].should == "localhost"
+    end
+
+  end
+
+  describe "when parsing a line with ip, hostname and aliases" do
+
+    it "should parse alias from the third field" do
+      @provider.parse_line("127.0.0.1   localhost   localhost.localdomain")[:host_aliases].should == ["localhost.localdomain"]
+    end
+
+    it "should parse multiple aliases" do
+      @provider.parse_line("127.0.0.1 host alias1 alias2")[:host_aliases].should == ['alias1', 'alias2']
+      @provider.parse_line("127.0.0.1 host alias1\talias2")[:host_aliases].should == ['alias1', 'alias2']
+      @provider.parse_line("127.0.0.1 host alias1\talias2   alias3")[:host_aliases].should == ['alias1', 'alias2', 'alias3']
+    end
+
+  end
+
+  describe "when parsing a line with ip, hostname, aliases and comment" do
+
+    before do
+      # Just playing with a few different delimiters
+      @testline = "127.0.0.1\t   host  alias1\talias2   alias3   #   A comment with a #-char"
+    end
+
+    it "should parse the ip from the first field" do
+      @provider.parse_line(@testline)[:ip].should == "127.0.0.1"
+    end
+
+    it "should parse the hostname from the second field" do
+      @provider.parse_line(@testline)[:name].should == "host"
+    end
+
+    it "should parse all host_aliases from the third field" do
+      @provider.parse_line(@testline)[:host_aliases].should == ['alias1' ,'alias2', 'alias3']
+    end
+
+  end
+
+  describe "when operating on /etc/hosts like files" do
+    fakedata("data/providers/host/parsed","valid*").each do |file|
+      it "should be able to parse #{file}" do
+       fakedataparse(file)
+      end
+    end
+
+    it "should be able to generate a simple hostfile entry" do
+      host = mkhost(
+        :name   => 'localhost',
+        :ip     => '127.0.0.1',
+        :ensure => :present
+      )
+      genhost(host).should == "127.0.0.1\tlocalhost\n"
+    end
+
+    it "should be able to generate an entry with one alias" do
+      host = mkhost(
+        :name   => 'localhost.localdomain',
+        :ip     => '127.0.0.1',
+        :host_aliases => ['localhost'],
+        :ensure => :present
+      )
+      genhost(host).should == "127.0.0.1\tlocalhost.localdomain\tlocalhost\n"
+    end
+
+    it "should be able to generate an entry with more than one alias" do
+      host = mkhost(
+        :name       => 'host',
+        :ip         => '192.0.0.1',
+        :host_aliases => [ 'a1','a2','a3','a4' ],
+        :ensure     => :present
+      )
+      genhost(host).should == "192.0.0.1\thost\ta1\ta2\ta3\ta4\n"
+    end
+
+  end
+
+end
diff --git a/spec/unit/type/host_spec.rb b/spec/unit/type/host_spec.rb
new file mode 100755
index 0000000..43846b2
--- /dev/null
+++ b/spec/unit/type/host_spec.rb
@@ -0,0 +1,85 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+ssh_authorized_key = Puppet::Type.type(:ssh_authorized_key)
+
+describe Puppet::Type.type(:host) do
+  before do
+    @class = Puppet::Type.type(:host)
+    @catalog = Puppet::Resource::Catalog.new
+  end
+
+  it "should have :name be its namevar" do
+    @class.key_attributes.should == [:name]
+  end
+
+  describe "when validating attributes" do
+    [:name, :provider ].each do |param|
+      it "should have a #{param} parameter" do
+        @class.attrtype(param).should == :param
+      end
+    end
+
+    [:ip, :target, :host_aliases, :ensure].each do |property|
+      it "should have a #{property} property" do
+        @class.attrtype(property).should == :property
+      end
+    end
+  end
+
+  describe "when validating values" do
+    it "should support present as a value for ensure" do
+      proc { @class.new(:name => "foo", :ensure => :present) }.should_not raise_error
+    end
+
+    it "should support absent as a value for ensure" do
+      proc { @class.new(:name => "foo", :ensure => :absent) }.should_not raise_error
+    end
+
+    it "should accept IPv4 addresses" do
+      proc { @class.new(:name => "foo", :ip => '10.96.0.1') }.should_not raise_error
+    end
+
+    it "should accept long IPv6 addresses" do
+      # Taken from wikipedia article about ipv6
+      proc { @class.new(:name => "foo", :ip => '2001:0db8:85a3:08d3:1319:8a2e:0370:7344') }.should_not raise_error
+    end
+
+    it "should accept one host_alias" do
+      proc { @class.new(:name => "foo", :host_aliases => 'alias1') }.should_not raise_error
+    end
+
+    it "should accept multiple host_aliases" do
+      proc { @class.new(:name => "foo", :host_aliases => [ 'alias1', 'alias2' ]) }.should_not raise_error
+    end
+
+    it "should accept shortened IPv6 addresses" do
+      proc { @class.new(:name => "foo", :ip => '2001:db8:0:8d3:0:8a2e:70:7344') }.should_not raise_error
+      proc { @class.new(:name => "foo", :ip => '::ffff:192.0.2.128') }.should_not raise_error
+      proc { @class.new(:name => "foo", :ip => '::1') }.should_not raise_error
+    end
+
+    it "should not accept malformed IPv4 addresses like 192.168.0.300" do
+      pending
+      proc { @class.new(:name => "foo", :ip => '192.168.0.300') }.should raise_error
+    end
+
+    it "should not accept malformed IP addresses like 2001:0dg8:85a3:08d3:1319:8a2e:0370:7344" do
+      proc { @class.new(:name => "foo", :ip => '2001:0dg8:85a3:08d3:1319:8a2e:0370:7344') }.should raise_error
+    end
+
+    it "should not accept spaces in resourcename" do
+      proc { @class.new(:name => "foo bar") }.should raise_error
+    end
+
+    it "should not accept host_aliases with spaces" do
+      proc { @class.new(:name => "foo", :host_aliases => [ 'well_formed', 'not wellformed' ]) }.should raise_error
+    end
+
+    it "should not accept empty host_aliases" do
+      pending
+      proc { @class.new(:name => "foo", :host_aliases => ['alias1','']) }.should raise_error
+    end
+  end
+end
diff --git a/test/data/providers/host/parsed/valid_hosts b/test/data/providers/host/parsed/valid_hosts
new file mode 100644
index 0000000..de5caf7
--- /dev/null
+++ b/test/data/providers/host/parsed/valid_hosts
@@ -0,0 +1,14 @@
+# Some leading comment, that should be ignored
+# The next line is empty so it should be ignored
+
+::1 localhost
+
+# We now try another delimiter: Several tabs
+127.0.0.1         localhost
+
+# No test trailing spaces
+10.0.0.1         host1         
+
+# Ok its time to test aliases
+2001:252:0:1::2008:8 ipv6host alias1
+192.168.0.1 ipv4host alias2 alias3

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list