diff options
Diffstat (limited to 'puppet/modules/augeas/spec')
18 files changed, 525 insertions, 0 deletions
diff --git a/puppet/modules/augeas b/puppet/modules/augeas deleted file mode 160000 -Subproject 58ab2b90c52a5d951fa41596827bc3b6f52310e diff --git a/puppet/modules/augeas/spec/.rspec b/puppet/modules/augeas/spec/.rspec new file mode 100644 index 00000000..91cd6427 --- /dev/null +++ b/puppet/modules/augeas/spec/.rspec @@ -0,0 +1,6 @@ +--format +s +--colour +--loadby +mtime +--backtrace diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/centos-7-x86_64-docker.yml b/puppet/modules/augeas/spec/acceptance/nodesets/centos-7-x86_64-docker.yml new file mode 100644 index 00000000..599a681f --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/centos-7-x86_64-docker.yml @@ -0,0 +1,12 @@ +HOSTS: + centos-7-x64: + default_apply_opts: + strict_variables: + platform: el-7-x86_64 + hypervisor : docker + image: centos:7 + # This stops the image from being deleted on completion, speeding up the process. + docker_preserve_image: true +CONFIG: + type: foss + log_level: debug diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/centos-7-x86_64-openstack.yml b/puppet/modules/augeas/spec/acceptance/nodesets/centos-7-x86_64-openstack.yml new file mode 100644 index 00000000..37dfc5f9 --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/centos-7-x86_64-openstack.yml @@ -0,0 +1,13 @@ +HOSTS: + centos-7-x64: + default_apply_opts: + strict_variables: + platform: el-7-x86_64 + hypervisor : openstack + flavor: m1.small + image: centos-7-x86_64-genericcloud-20140929_01 + user: centos +CONFIG: + type: foss + log_level: debug + openstack_network: default diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/centos-7-x86_64-vagrant.yml b/puppet/modules/augeas/spec/acceptance/nodesets/centos-7-x86_64-vagrant.yml new file mode 100644 index 00000000..fe0f83b8 --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/centos-7-x86_64-vagrant.yml @@ -0,0 +1,10 @@ +HOSTS: + centos-7-x64: + default_apply_opts: + strict_variables: + platform: el-7-x86_64 + hypervisor : vagrant + box : puppetlabs/centos-7.0-64-nocm +CONFIG: + type: foss + log_level: debug diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/debian-6-x86_64-docker.yml b/puppet/modules/augeas/spec/acceptance/nodesets/debian-6-x86_64-docker.yml new file mode 100644 index 00000000..0296d129 --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/debian-6-x86_64-docker.yml @@ -0,0 +1,12 @@ +HOSTS: + debian-6-x64: + default_apply_opts: + strict_variables: + platform: debian-6-amd64 + hypervisor : docker + image: debian:6 + # This stops the image from being deleted on completion, speeding up the process. + docker_preserve_image: true +CONFIG: + type: foss + log_level: debug diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/debian-6-x86_64-vagrant.yml b/puppet/modules/augeas/spec/acceptance/nodesets/debian-6-x86_64-vagrant.yml new file mode 100644 index 00000000..23dae1b0 --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/debian-6-x86_64-vagrant.yml @@ -0,0 +1,10 @@ +HOSTS: + debian-6-x64: + default_apply_opts: + strict_variables: + platform: debian-6-amd64 + hypervisor : vagrant + box : puppetlabs/debian-6.0.10-64-nocm +CONFIG: + type: foss + log_level: debug diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/debian-7-x86_64-docker.yml b/puppet/modules/augeas/spec/acceptance/nodesets/debian-7-x86_64-docker.yml new file mode 100644 index 00000000..ef1c9b22 --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/debian-7-x86_64-docker.yml @@ -0,0 +1,12 @@ +HOSTS: + debian-7-x64: + default_apply_opts: + strict_variables: + platform: debian-7-amd64 + hypervisor : docker + image: debian:7 + # This stops the image from being deleted on completion, speeding up the process. + docker_preserve_image: true +CONFIG: + type: foss + log_level: debug diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/debian-7-x86_64-openstack.yml b/puppet/modules/augeas/spec/acceptance/nodesets/debian-7-x86_64-openstack.yml new file mode 100644 index 00000000..e52336be --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/debian-7-x86_64-openstack.yml @@ -0,0 +1,13 @@ +HOSTS: + debian-7-x64: + default_apply_opts: + strict_variables: + platform: debian-7-amd64 + hypervisor : openstack + flavor: m1.small + image: debian-7-amd64-20141121 + user: debian +CONFIG: + type: foss + log_level: debug + openstack_network: default diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/debian-7-x86_64-vagrant.yml b/puppet/modules/augeas/spec/acceptance/nodesets/debian-7-x86_64-vagrant.yml new file mode 100644 index 00000000..86c2165d --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/debian-7-x86_64-vagrant.yml @@ -0,0 +1,10 @@ +HOSTS: + debian-7-x64: + default_apply_opts: + strict_variables: + platform: debian-7-amd64 + hypervisor : vagrant + box : puppetlabs/debian-7.8-64-nocm +CONFIG: + type: foss + log_level: debug diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/debian-8-x86_64-docker.yml b/puppet/modules/augeas/spec/acceptance/nodesets/debian-8-x86_64-docker.yml new file mode 100644 index 00000000..28c3e02f --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/debian-8-x86_64-docker.yml @@ -0,0 +1,12 @@ +HOSTS: + debian-8-x64: + default_apply_opts: + strict_variables: + platform: debian-8-amd64 + hypervisor : docker + image: debian:8 + # This stops the image from being deleted on completion, speeding up the process. + docker_preserve_image: true +CONFIG: + type: foss + log_level: debug diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/debian-8-x86_64-openstack.yml b/puppet/modules/augeas/spec/acceptance/nodesets/debian-8-x86_64-openstack.yml new file mode 100644 index 00000000..194ca460 --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/debian-8-x86_64-openstack.yml @@ -0,0 +1,13 @@ +HOSTS: + debian-8-x64: + default_apply_opts: + strict_variables: + platform: debian-8-amd64 + hypervisor : openstack + flavor: m1.small + image: debian-8-amd64-20141121 + user: debian +CONFIG: + type: foss + openstack_network: default + log_level: debug diff --git a/puppet/modules/augeas/spec/acceptance/nodesets/ubuntu-14.04-x86_64-vagrant.yml b/puppet/modules/augeas/spec/acceptance/nodesets/ubuntu-14.04-x86_64-vagrant.yml new file mode 100644 index 00000000..a3edb70f --- /dev/null +++ b/puppet/modules/augeas/spec/acceptance/nodesets/ubuntu-14.04-x86_64-vagrant.yml @@ -0,0 +1,10 @@ +HOSTS: + ubuntu-14.04-x64: + default_apply_opts: + strict_variables: + platform: ubuntu-14.04-amd64 + hypervisor : vagrant + box : puppetlabs/ubuntu-14.04-64-nocm +CONFIG: + type: foss + log_level: debug diff --git a/puppet/modules/augeas/spec/classes/augeas_spec.rb b/puppet/modules/augeas/spec/classes/augeas_spec.rb new file mode 100644 index 00000000..ab4241f4 --- /dev/null +++ b/puppet/modules/augeas/spec/classes/augeas_spec.rb @@ -0,0 +1,149 @@ +require 'spec_helper' + +describe 'augeas' do + + context 'when on an unsupported Operating System' do + let (:facts) do + { + :osfamily => 'MS-DOS', + } + end + + it 'should fail' do + expect { is_expected.to contain_package('ruby-augeas') }.to raise_error(Puppet::Error, /Unsupported OS family/) + end + end + + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts + end + + context 'without params' do + case facts[:osfamily] + when 'Debian' + it { is_expected.to contain_package('libaugeas0').with( + :ensure => 'present' + ) } + it { is_expected.to contain_package('augeas-tools').with( + :ensure => 'present' + ) } + it { is_expected.to contain_package('augeas-lenses').with( + :ensure => 'present' + ) } + case facts[:lsbdistcodename] + when 'squeeze', 'lucid', 'precise' + it { is_expected.to contain_package('ruby-augeas').with( + :ensure => 'present', + :name => 'libaugeas-ruby1.8' + ) } + else + it { is_expected.to contain_package('ruby-augeas').with( + :ensure => 'present', + :name => 'libaugeas-ruby1.9.1' + ) } + end + when 'RedHat' + it { is_expected.to contain_package('augeas').with( + :ensure => 'present' + ) } + it { is_expected.to contain_package('augeas-libs').with( + :ensure => 'present' + ) } + it { is_expected.to contain_package('ruby-augeas').with( + :ensure => 'present', + :name => 'ruby-augeas' + ) } + end + it { is_expected.to contain_file('/usr/share/augeas/lenses').with( + :ensure => 'directory', + :purge => 'true', + :force => 'true', + :recurse => 'true', + :recurselimit => 1 + ) } + it { is_expected.to contain_file('/usr/share/augeas/lenses/dist').with( + :ensure => 'directory', + :purge => 'false' + ) } + it { is_expected.to contain_file('/usr/share/augeas/lenses/tests').with( + :ensure => 'directory', + :purge => 'true', + :force => 'true' + ).without(:recurse) } + end + + context 'when versions are specified' do + let (:params) do + { + :version => '1.2.3', + :ruby_version => '3.2.1', + } + end + + case facts[:osfamily] + when 'Debian' + it { is_expected.to contain_package('libaugeas0').with( + :ensure => '1.2.3' + ) } + it { is_expected.to contain_package('augeas-tools').with( + :ensure => '1.2.3' + ) } + it { is_expected.to contain_package('augeas-lenses').with( + :ensure => '1.2.3' + ) } + case facts[:lsbdistcodename] + when 'squeeze', 'lucid', 'precise' + it { is_expected.to contain_package('ruby-augeas').with( + :ensure => '3.2.1', + :name => 'libaugeas-ruby1.8' + ) } + else + it { is_expected.to contain_package('ruby-augeas').with( + :ensure => '3.2.1', + :name => 'libaugeas-ruby1.9.1' + ) } + end + when 'RedHat' + it { is_expected.to contain_package('augeas').with( + :ensure => '1.2.3' + ) } + it { is_expected.to contain_package('augeas-libs').with( + :ensure => '1.2.3' + ) } + it { is_expected.to contain_package('ruby-augeas').with( + :ensure => '3.2.1', + :name => 'ruby-augeas' + ) } + end + + end + + context 'with a non standard lens_dir' do + let (:params) do + { + :lens_dir => '/opt/augeas/lenses', + } + end + + it { is_expected.to contain_file('/opt/augeas/lenses').with( + :ensure => 'directory', + :purge => 'true', + :force => 'true', + :recurse => 'true', + :recurselimit => 1 + ) } + it { is_expected.to contain_file('/opt/augeas/lenses/dist').with( + :ensure => 'directory', + :purge => 'false' + ) } + it { is_expected.to contain_file('/opt/augeas/lenses/tests').with( + :ensure => 'directory', + :purge => 'true', + :force => 'true' + ).without(:recurse) } + end + end + end +end diff --git a/puppet/modules/augeas/spec/defines/augeas_lens_spec.rb b/puppet/modules/augeas/spec/defines/augeas_lens_spec.rb new file mode 100644 index 00000000..7feeefbd --- /dev/null +++ b/puppet/modules/augeas/spec/defines/augeas_lens_spec.rb @@ -0,0 +1,112 @@ +require 'spec_helper' + +describe 'augeas::lens' do + let (:title) { 'foo' } + + context 'when not declaring augeas class first' do + let (:params) do + { + :lens_source => '/tmp/foo.aug', + } + end + + it 'should error' do + expect { + is_expected.to contain_file('/usr/share/augeas/lenses/foo.aug') + }.to raise_error(Puppet::Error, /You must declare the augeas class/) + end + end + + context 'when declaring augeas class first' do + + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts.merge({ + :augeasversion => :undef, + }) + end + + context 'With standard augeas version' do + + let(:pre_condition) do + "class { '::augeas': }" + end + + context 'when no lens_source is passed' do + it 'should error' do + expect { + is_expected.to contain_file('/usr/share/augeas/lenses/foo.aug') + }.to raise_error(Puppet::Error, /Must pass lens_source/) + end + end + + context 'when lens_source is passed' do + let (:params) do + { + :lens_source => '/tmp/foo.aug', + } + end + + it { is_expected.to contain_file('/usr/share/augeas/lenses/foo.aug') } + it { is_expected.to contain_exec('Typecheck lens foo') } + it { is_expected.not_to contain_file('/usr/share/augeas/lenses/tests/test_foo.aug') } + it { is_expected.not_to contain_exec('Test lens foo') } + end + + context 'when lens_source and test_source are passed' do + let (:params) do + { + :lens_source => '/tmp/foo.aug', + :test_source => '/tmp/test_foo.aug', + } + end + + it { is_expected.to contain_file('/usr/share/augeas/lenses/foo.aug') } + it { is_expected.to contain_exec('Typecheck lens foo') } + it { is_expected.to contain_file('/usr/share/augeas/lenses/tests/test_foo.aug') } + it { is_expected.to contain_exec('Test lens foo') } + end + end + + context 'when stock_since is passed and augeas is older' do + let (:params) do + { + :lens_source => '/tmp/foo.aug', + :stock_since => '1.2.3', + } + end + + let(:pre_condition) do + "class { '::augeas': version => '1.0.0' }" + end + + it { is_expected.to contain_file('/usr/share/augeas/lenses/foo.aug') } + it { is_expected.to contain_exec('Typecheck lens foo') } + end + + context 'when stock_since is passed and augeas is newer' do + let (:params) do + { + :lens_source => '/tmp/foo.aug', + :stock_since => '1.2.3', + } + end + + let(:pre_condition) do + "class { '::augeas': version => '1.3.0' }" + end + + it do + pending "undefined method `negative_failure_message'" + is_expected.not_to contain_file('/usr/share/augeas/lenses/foo.aug') + end + it do + pending "undefined method `negative_failure_message'" + is_expected.not_to contain_exec('Typecheck lens foo') + end + end + end + end + end +end diff --git a/puppet/modules/augeas/spec/spec.opts b/puppet/modules/augeas/spec/spec.opts new file mode 100644 index 00000000..91cd6427 --- /dev/null +++ b/puppet/modules/augeas/spec/spec.opts @@ -0,0 +1,6 @@ +--format +s +--colour +--loadby +mtime +--backtrace diff --git a/puppet/modules/augeas/spec/spec_helper.rb b/puppet/modules/augeas/spec/spec_helper.rb new file mode 100644 index 00000000..86cc740a --- /dev/null +++ b/puppet/modules/augeas/spec/spec_helper.rb @@ -0,0 +1,42 @@ +require 'puppetlabs_spec_helper/module_spec_helper' +require 'rspec-puppet-facts' +include RspecPuppetFacts + + +RSpec.configure do |c| + c.include PuppetlabsSpec::Files + + c.before :each do + # Store any environment variables away to be restored later + @old_env = {} + ENV.each_key {|k| @old_env[k] = ENV[k]} + + Puppet.settings[:strict_variables]=true if Gem::Version.new(Puppet::PUPPETVERSION) >= Gem::Version.new('3.5') + Puppet.features.stubs(:root?).returns(true) + end + + c.after :each do + PuppetlabsSpec::Files.cleanup + end +end + +require 'pathname' +dir = Pathname.new(__FILE__).parent +Puppet[:modulepath] = File.join(dir, 'fixtures', 'modules') + +# There's no real need to make this version dependent, but it helps find +# regressions in Puppet +# +# 1. Workaround for issue #16277 where default settings aren't initialised from +# a spec and so the libdir is never initialised (3.0.x) +# 2. Workaround for 2.7.20 that now only loads types for the current node +# environment (#13858) so Puppet[:modulepath] seems to get ignored +# 3. Workaround for 3.5 where context hasn't been configured yet, +# ticket https://tickets.puppetlabs.com/browse/MODULES-823 +# +ver = Gem::Version.new(Puppet.version.split('-').first) +if Gem::Requirement.new("~> 2.7.20") =~ ver || Gem::Requirement.new("~> 3.0.0") =~ ver || Gem::Requirement.new("~> 3.5") =~ ver + puts "augeasproviders: setting Puppet[:libdir] to work around broken type autoloading" + # libdir is only a single dir, so it can only workaround loading of one external module + Puppet[:libdir] = "#{Puppet[:modulepath]}/augeasproviders_core/lib" +end diff --git a/puppet/modules/augeas/spec/unit/puppet/parser/functions/augeas_spec.rb b/puppet/modules/augeas/spec/unit/puppet/parser/functions/augeas_spec.rb new file mode 100644 index 00000000..b34fa5b5 --- /dev/null +++ b/puppet/modules/augeas/spec/unit/puppet/parser/functions/augeas_spec.rb @@ -0,0 +1,83 @@ +#! /usr/bin/env ruby -S rspec +require 'spec_helper' + +describe 'the augeas function' do + let(:scope) { PuppetlabsSpec::PuppetInternals.scope } + + it "should fail if the augeas feature is not present" do + Puppet.features.expects(:augeas?).returns(false) + expect { scope.function_augeas([]) }.to raise_error(Puppet::ParseError, /requires the augeas feature/) + end + + it "should exist" do + expect(Puppet::Parser::Functions.function("augeas")).to eq("function_augeas") + end + + context "when passing wrong arguments" do + before :each do + Puppet.features.stubs(:augeas?).returns(true) + end + + it "should raise a ParseError if there are no arguments" do + expect { scope.function_augeas([]) }.to raise_error(Puppet::ParseError, /Wrong number of arguments/) + end + + it "should raise a ParseError if content is not a string" do + expect { scope.function_augeas([['foo'], 'Fstab.lns', []]) }.to raise_error(Puppet::ParseError, /content must be a string/) + end + + it "should raise a ParseError if lens is not a string" do + expect { scope.function_augeas(['foo', ['Fstab.lns'], []]) }.to raise_error(Puppet::ParseError, /lens must be a string/) + end + + it "should raise a ParseError if changes is not an array" do + expect { scope.function_augeas(['foo', 'Fstab.lns', 'changes']) }.to raise_error(Puppet::ParseError, /changes must be an array/) + end + end + + if Puppet.features.augeas? + context "when passing invalid input" do + it "should fail to parse input with lens" do + expect { scope.function_augeas(['foo', 'Fstab.lns', []]) }.to raise_error(Puppet::ParseError, /Failed to parse string with lens Fstab.lns:/) + end + end + + context "when passing illegal changes" do + it "should fail to apply illegal change" do + expect { scope.function_augeas(["\n", 'Fstab.lns', ['foo bar']]) }.to raise_error(Puppet::ParseError, /Failed to apply change to tree/) + end + end + + context "when generating an invalid tree" do + it "should fail to apply changes with wrong tree" do + expect { scope.function_augeas(["\n", 'Fstab.lns', ['set ./1/opt 3']]) }.to raise_error(Puppet::ParseError, /Failed to apply changes with lens Fstab.lns:/) + end + end + + context "when applying valid changes" do + it "should remove the 3rd option" do + result = scope.function_augeas(["proc /proc proc nodev,noexec,nosuid 0 0\n", 'Fstab.lns', ['rm ./1/opt[3]']]) + expect(result.class).to eq(String) + #result.should == "proc /proc proc nodev,noexec 0 0\n" + end + + it "should set a 4th option" do + result = scope.function_augeas(["proc /proc proc nodev,noexec,nosuid 0 0\n", 'Fstab.lns', ['ins opt after ./1/opt[last()]', 'set ./1/opt[last()] nofoo']]) + expect(result.class).to eq(String) + #result.should == "proc /proc proc nodev,noexec,nosuid,nofoo 0 0\n" + end + end + + context "when using old libs" do + it "should not work with Augeas prior to 1.0.0" do + Augeas.any_instance.expects(:get).with('/augeas/version').returns('0.10.0') + expect { scope.function_augeas(["\n", 'Fstab.lns', []]) }.to raise_error(Puppet::ParseError, /requires Augeas 1\.0\.0/) + end + + it "should not work with ruby-augeas prior to 0.5.0" do + Augeas.any_instance.expects(:methods).returns([]) + expect { scope.function_augeas(["\n", 'Fstab.lns', []]) }.to raise_error(Puppet::ParseError, /requires ruby-augeas 0\.5\.0/) + end + end + end +end |