diff --git a/.sync.yml b/.sync.yml index ace7fcbcf94b82464c36c11ffc7dba34b8375926..563ac7c2097c80ca88847c0735324a0594ecded7 100644 --- a/.sync.yml +++ b/.sync.yml @@ -1,3 +1,5 @@ --- .travis.yml: forge_password: "XAv4O363tng0KuRnu1ZhhwORy+2CF9UQwdwlFmS+NG9jOaTZZN+PMK8iC7OSIvZN6cfKlYjHRHNuxFBnYlnMrLsM9fVxt4NjjznOgIKQpQDleWk4UitZj5ntyHmUtYtofUd5Bhi/sdYXwGN9pVRCrcfFBmsIRq/dOhXD7Wy5KcQ=" +#README.md: +# include: ['.sync/simple_usage.md', '.sync/classes.md'] diff --git a/.sync/classes.md b/.sync/classes.md new file mode 100644 index 0000000000000000000000000000000000000000..1764de09b8783d46e5744c2d526c6e25354120c5 --- /dev/null +++ b/.sync/classes.md @@ -0,0 +1,24 @@ +## Classes + +### postfix + +The top-level class, to install and configure Postfix. + +## Definitions + +### postfix::config + +Add/alter/remove options in Postfix main configuration file (main.cf) + +### postfix::hash + +Creates Postfix hashed "map" files, and build the corresponding db file. + +### postfix::transport + +Manages content in the transport map. + +### postfix::virtual + +Manages content in the virtual map. + diff --git a/.sync/simple_usage.md b/.sync/simple_usage.md new file mode 100644 index 0000000000000000000000000000000000000000..34f5e887e442a556350721ea4e8e08a239d61000 --- /dev/null +++ b/.sync/simple_usage.md @@ -0,0 +1,22 @@ +This module requires Augeas. + +## Simple usage + + include postfix + + postfix::config { "relay_domains": value => "localhost host.foo.com" } + +## Exec paths + +In order to not have any path problem, you should add the following line in +some globally included .pp file: + + Exec { + path => '/some/relevant/path:/some/other:...', + } + +For example: + + Exec { + path => '/bin:/sbin:/usr/sbin:/usr/bin', + } diff --git a/CHANGELOG.md b/CHANGELOG.md index 29c65aa9477b0dac016ddd41c957da22ca0ab265..d4a2ffb38cb620533f1d78dbc2af31b64c5df1d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## 2015-03-24 - Release 1.1.1 + +- Various spec improvements + +## 2015-02-19 - Release 1.1.0 + +- Various specs improvements +- Fix specs for postfix::config with ensure => blank +- Simplify relationships and avoid spaceship operators +- nexthop parameter is not necessary for postfix::canonical + ## 2015-01-07 - Release 1.0.5 - Fix unquoted strings in cases diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..2c179eb44baa690449648ba61fdaecba146b9d2b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,8 @@ +# How to contribute + +Please report bugs and feature request using [GitHub issue +tracker](https://github.com/camptocamp/puppet-postfix/issues). + +For pull requests, it is very much appreciated to check your Puppet manifest +with [puppet-lint](https://github.com/rodjek/puppet-lint) to follow the recommended Puppet style guidelines from the +[Puppet Labs style guide](http://docs.puppetlabs.com/guides/style_guide.html). diff --git a/Gemfile b/Gemfile index f0887eca4eb8a5c53216c1643611f82c669d56da..57fcd0869e031067285929287ee20395b5b8af72 100644 --- a/Gemfile +++ b/Gemfile @@ -2,8 +2,10 @@ source ENV['GEM_SOURCE'] || "https://rubygems.org" group :development, :unit_tests do gem 'rake', :require => false - gem 'rspec-puppet', '~> 2.0', :require => false + gem 'rspec', '< 3.2', :require => false if RUBY_VERSION =~ /^1.8/ + gem 'rspec-puppet', :require => false gem 'puppetlabs_spec_helper', :require => false + gem 'metadata-json-lint', :require => false gem 'puppet-lint', :require => false gem 'puppet-lint-unquoted_string-check', :require => false gem 'puppet-lint-empty_string-check', :require => false @@ -14,15 +16,12 @@ group :development, :unit_tests do gem 'puppet-lint-leading_zero-check', :require => false gem 'puppet-lint-trailing_comma-check', :require => false gem 'puppet-lint-file_ensure-check', :require => false - gem 'simplecov', :require => false + gem 'puppet-lint-version_comparison-check', :require => false gem 'rspec-puppet-facts', :require => false - gem 'json', :require => false - gem 'metadata-json-lint', :require => false - gem 'docker-api', '1.15.0', :require => false end group :system_tests do - gem 'beaker', :require => false, :git => 'https://github.com/raphink/beaker', :branch => 'openstack' + gem 'beaker', :require => false gem 'beaker-rspec', :require => false gem 'serverspec', :require => false end diff --git a/README.md b/README.md index 3672aaf3c4952af8249e8eb5eb139c7e45b06086..7ac19f93414085a5790e7940540a971fe8da231d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,10 @@ -# Postfix module for Puppet +# Postfix Puppet Module -[](https://forge.puppetlabs.com/camptocamp/postfix) -[](https://travis-ci.org/camptocamp/puppet-postfix) - -**Manages Postfix configuration.** - -This module is provided by [Camptocamp](http://www.camptocamp.com/) +[](https://forge.puppetlabs.com/camptocamp/postfix) +[](https://forge.puppetlabs.com/camptocamp/postfix) +[](https://travis-ci.org/camptocamp/puppet-postfix) +[](https://gemnasium.com/camptocamp/puppet-postfix) +[](http://www.camptocamp.com) This module requires Augeas. @@ -54,29 +53,4 @@ Manages content in the transport map. Manages content in the virtual map. -## Contributing - -Please report bugs and feature request using [GitHub issue -tracker](https://github.com/camptocamp/puppet-postfix/issues). - -For pull requests, it is very much appreciated to check your Puppet manifest -with [puppet-lint](https://github.com/camptocamp/puppet-postfix/issues) to follow the recommended Puppet style guidelines from the -[Puppet Labs style guide](http://docs.puppetlabs.com/guides/style_guide.html). - -## License - -Copyright (c) 2013 <mailto:puppet@camptocamp.com> All rights reserved. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. diff --git a/Rakefile b/Rakefile index a334275d122d38cad9ff43f047fecaa00c277537..f87e6088627e5180b4de958f0b7ec1c9c8b6756c 100644 --- a/Rakefile +++ b/Rakefile @@ -2,14 +2,10 @@ require 'puppetlabs_spec_helper/rake_tasks' require 'puppet-lint/tasks/puppet-lint' Rake::Task[:lint].clear -PuppetLint.configuration.fail_on_warnings -PuppetLint.configuration.send('relative') -PuppetLint.configuration.send('disable_80chars') -PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp", "vendor/**/*.pp"] +PuppetLint::RakeTask.new :lint do |config| + config.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp", "vendor/**/*.pp"] + config.disable_checks = ['80chars'] + config.fail_on_warnings = true +end PuppetSyntax.exclude_paths = ["spec/fixtures/**/*.pp", "vendor/**/*"] - -desc "Lint metadata.json file" -task :metadata do - sh "metadata-json-lint metadata.json" -end diff --git a/manifests/hash.pp b/manifests/hash.pp index 076f7450fcdefa1a47bbd5a878bbcbe74fa0d4a0..1d5e630034c149df280c7a7ec4376ddf8d7832a9 100644 --- a/manifests/hash.pp +++ b/manifests/hash.pp @@ -31,8 +31,10 @@ define postfix::hash ( include ::postfix::params validate_absolute_path($name) - validate_string($source) - validate_string($content) +# validate_string($source) +# validate_string($content) + if !is_string($source) and !is_array($source) { fail("value for source should be either String type or Array type got ${source}") } + if !is_string($content) and !is_array($content) { fail("value for source should be either String type or Array type got ${content}") } validate_string($ensure) validate_re($ensure, ['present', 'absent'], "\$ensure must be either 'present' or 'absent', got '${ensure}'") @@ -66,6 +68,7 @@ define postfix::hash ( exec {"generate ${name}.db": command => "postmap ${name}", + path => $::path, #creates => "${name}.db", # this prevents postmap from being run ! subscribe => File[$name], refreshonly => true, diff --git a/manifests/init.pp b/manifests/init.pp index db2a097a70c6391c6e8f37f9a8bfce990ead6d14..0af6148b888676c40a287c12c34e81a78ee5b1a2 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -82,7 +82,7 @@ class postfix ( $master_submission = undef, # postfix_master_submission $mta = false, $mydestination = '$myorigin', # postfix_mydestination - $mynetworks = '127.0.0.0/8', # postfix_mynetworks + $mynetworks = '127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128', # postfix_mynetworks $myorigin = $::fqdn, $relayhost = undef, # postfix_relayhost $root_mail_recipient = 'nobody', # root_mail_recipient diff --git a/manifests/ldap.pp b/manifests/ldap.pp index dbc9fd08306d3004bf98bedf8732318fbe439e5c..679cf1e3d685623e4fe944bea8205906613bb9f5 100644 --- a/manifests/ldap.pp +++ b/manifests/ldap.pp @@ -14,9 +14,10 @@ # include postfix::ldap # class postfix::ldap { - case $::osfamily { - 'debian': { package {'postfix-ldap': } } - default: {} + if $::osfamily == 'Debian' { + package {'postfix-ldap': + before => File['/etc/postfix/ldap-aliases.cf'], + } } if ! $postfix::ldap_base { @@ -38,6 +39,5 @@ class postfix::ldap { owner => 'root', group => 'postfix', content => template('postfix/postfix-ldap-aliases.cf.erb'), - #TODO: Figure out if should have require package here } } diff --git a/manifests/mta.pp b/manifests/mta.pp index 7df275ebb192db557dc67d61bd9edd2b778e753a..b96927d14d2412e367bdea7fdff92331c29490ad 100644 --- a/manifests/mta.pp +++ b/manifests/mta.pp @@ -35,7 +35,7 @@ class postfix::mta ( 'Wrong value for $relayhost') validate_re($mydestination, '^\S+(?:,\s*\S+)*$', 'Wrong value for $mydestination') - validate_re($mynetworks, '^\S+$', + validate_re($mynetworks, '^(?:\S+?(?:(?:,\s)|(?:\s))?)*$', 'Wrong value for $mynetworks') # If direct is specified then relayhost should be blank diff --git a/manifests/params.pp b/manifests/params.pp index dde5339dd1d315d5421cdd6e92ce20cd9679ec1f..74e55d79098893c3ebe01efb2f8052c56fafba27 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -7,6 +7,11 @@ class postfix::params { default => undef, } + $restart_cmd = $::operatingsystemmajrelease ? { + '7' => '/bin/systemctl reload postfix', + default => '/etc/init.d/postfix reload', + } + $mailx_package = 'mailx' $master_os_template = "${module_name}/master.cf.redhat.erb" @@ -15,9 +20,11 @@ class postfix::params { 'Debian': { $seltype = undef + $restart_cmd = '/etc/init.d/postfix reload' + $mailx_package = $::lsbdistcodename ? { - /sarge|etch|lenny|lucid/ => 'mailx', - default => 'bsd-mailx', + /sarge|etch|lenny/ => 'mailx', + default => 'bsd-mailx', } $master_os_template = "${module_name}/master.cf.debian.erb" @@ -26,6 +33,8 @@ class postfix::params { 'Suse': { $seltype = undef + $restart_cmd = '/etc/init.d/postfix reload' + $mailx_package = 'mailx' if $::operatingsystem != 'SLES' { diff --git a/manifests/service.pp b/manifests/service.pp index c3f185dac97b757c2491555130aa8495b1d5be73..9d56cd2ee1a29639957e56b273af78c9de7722de 100644 --- a/manifests/service.pp +++ b/manifests/service.pp @@ -3,6 +3,6 @@ class postfix::service { ensure => running, enable => true, hasstatus => true, - restart => '/etc/init.d/postfix reload', + restart => $::postfix::params::restart_cmd, } } diff --git a/metadata.json b/metadata.json index 1dcc057631734223fe818b22ac6963bbb2704076..c50c05d297bbece74a4d70a1db48dd0329c7d89c 100644 --- a/metadata.json +++ b/metadata.json @@ -1,6 +1,6 @@ { "name": "camptocamp-postfix", - "version": "1.0.5", + "version": "1.1.1", "author": "Camptocamp", "summary": "Camptocamp Postfix Module", "license": "Apache-2.0", @@ -48,7 +48,8 @@ "operatingsystem": "RedHat", "operatingsystemrelease": [ "5", - "6" + "6", + "7" ] } ], diff --git a/spec/acceptance/nodesets/centos-7-x86_64-openstack.yml b/spec/acceptance/nodesets/centos-7-x86_64-openstack.yml index 37dfc5f9e7732a47b862d202a6360a205bc90ff2..2036c0b894fab62b35f3aa6ab4e1943a377f2002 100644 --- a/spec/acceptance/nodesets/centos-7-x86_64-openstack.yml +++ b/spec/acceptance/nodesets/centos-7-x86_64-openstack.yml @@ -4,7 +4,7 @@ HOSTS: strict_variables: platform: el-7-x86_64 hypervisor : openstack - flavor: m1.small + flavor: m1.medium image: centos-7-x86_64-genericcloud-20140929_01 user: centos CONFIG: diff --git a/spec/acceptance/nodesets/centos-7-x86_64-vagrant.yml b/spec/acceptance/nodesets/centos-7-x86_64-vagrant.yml index a9c461bad630ebf550a025d0a5c1cffe797eef0b..fe0f83b84c07db5009b5374f8e3c8bc8bdedbcce 100644 --- a/spec/acceptance/nodesets/centos-7-x86_64-vagrant.yml +++ b/spec/acceptance/nodesets/centos-7-x86_64-vagrant.yml @@ -4,7 +4,7 @@ HOSTS: strict_variables: platform: el-7-x86_64 hypervisor : vagrant - box : puppetlabs/centos-6.5-64-nocm + box : puppetlabs/centos-7.0-64-nocm CONFIG: type: foss log_level: debug diff --git a/spec/acceptance/nodesets/debian-6-x86_64-vagrant.yml b/spec/acceptance/nodesets/debian-6-x86_64-vagrant.yml new file mode 100644 index 0000000000000000000000000000000000000000..23dae1b0d374b93f42ec9ac905485efdc70ccf3d --- /dev/null +++ b/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/spec/acceptance/nodesets/debian-7-x86_64-openstack.yml b/spec/acceptance/nodesets/debian-7-x86_64-openstack.yml index e52336be85664f6bfec9fe1a98bfc57200e53daa..c44f917e5e0f9c6a446a34a85aeca13c47a5467c 100644 --- a/spec/acceptance/nodesets/debian-7-x86_64-openstack.yml +++ b/spec/acceptance/nodesets/debian-7-x86_64-openstack.yml @@ -4,7 +4,7 @@ HOSTS: strict_variables: platform: debian-7-amd64 hypervisor : openstack - flavor: m1.small + flavor: m1.medium image: debian-7-amd64-20141121 user: debian CONFIG: diff --git a/spec/acceptance/nodesets/debian-7-x86_64-vagrant.yml b/spec/acceptance/nodesets/debian-7-x86_64-vagrant.yml index 97099de3c2e8ec5b39cc36e54cea6b8840a42576..86c2165d0bf17bd145e4f35d89250fdddc52b0cb 100644 --- a/spec/acceptance/nodesets/debian-7-x86_64-vagrant.yml +++ b/spec/acceptance/nodesets/debian-7-x86_64-vagrant.yml @@ -4,8 +4,7 @@ HOSTS: strict_variables: platform: debian-7-amd64 hypervisor : vagrant - box : debian-73-x64-virtualbox-nocm - box_url : http://puppet-vagrant-boxes.puppetlabs.com/debian-73-x64-virtualbox-nocm.box + box : puppetlabs/debian-7.8-64-nocm CONFIG: type: foss log_level: debug diff --git a/spec/acceptance/nodesets/debian-8-x86_64-openstack.yml b/spec/acceptance/nodesets/debian-8-x86_64-openstack.yml index 194ca460ea605fd33db9c7e69bfce05a95b02bd5..f7b2e5000b2d2a3fb5d5066fbe86878dc58bbd3a 100644 --- a/spec/acceptance/nodesets/debian-8-x86_64-openstack.yml +++ b/spec/acceptance/nodesets/debian-8-x86_64-openstack.yml @@ -4,10 +4,10 @@ HOSTS: strict_variables: platform: debian-8-amd64 hypervisor : openstack - flavor: m1.small + flavor: m1.medium image: debian-8-amd64-20141121 user: debian CONFIG: type: foss - openstack_network: default log_level: debug + openstack_network: default diff --git a/spec/acceptance/nodesets/debian-8-x86_64-vagrant.yml b/spec/acceptance/nodesets/debian-8-x86_64-vagrant.yml new file mode 100644 index 0000000000000000000000000000000000000000..38c844be647d1efa35ad9f0415f9fb46e19eeef0 --- /dev/null +++ b/spec/acceptance/nodesets/debian-8-x86_64-vagrant.yml @@ -0,0 +1,10 @@ +HOSTS: + debian-8-x64: + default_apply_opts: + strict_variables: + platform: debian-8-amd64 + hypervisor : vagrant + box : camptocamp/debian-8-amd64 +CONFIG: + type: foss + log_level: debug diff --git a/spec/acceptance/nodesets/ubuntu-14.04-x86_64-vagrant.yml b/spec/acceptance/nodesets/ubuntu-14.04-x86_64-vagrant.yml new file mode 100644 index 0000000000000000000000000000000000000000..a3edb70f36a86549c1a03fc77d87aa009f0c256f --- /dev/null +++ b/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/spec/classes/postfix_augeas_spec.rb b/spec/classes/postfix_augeas_spec.rb index ff068e9b287f58cadf6674cdea585adeed505e28..4ea74766e0085ef6e6ec4ce0f2efa00481d1c6b4 100644 --- a/spec/classes/postfix_augeas_spec.rb +++ b/spec/classes/postfix_augeas_spec.rb @@ -1,28 +1,33 @@ require 'spec_helper' describe 'postfix::augeas' do - let (:facts) { { - :augeasversion => '1.2.0', - :lsbdistcodename => 'wheezy', - :operatingsystem => 'Debian', - :osfamily => 'Debian', - :rubyversion => '1.9.3', - :path => '/foo/bar', - } } + let :pre_condition do "include ::augeas" end - it { is_expected.to contain_augeas__lens('postfix_transport').with( - :ensure => 'present', - :lens_source => 'puppet:///modules/postfix/lenses/postfix_transport.aug', - :test_source => 'puppet:///modules/postfix/lenses/test_postfix_transport.aug', - :stock_since => '1.0.0' - ) } - it { is_expected.to contain_augeas__lens('postfix_virtual').with( - :ensure => 'present', - :lens_source => 'puppet:///modules/postfix/lenses/postfix_virtual.aug', - :test_source => 'puppet:///modules/postfix/lenses/test_postfix_virtual.aug', - :stock_since => '1.0.0' - ) } + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts.merge({ + :augeasversion => '1.2.0', + }) + end + + it { is_expected.to compile.with_all_deps } + + it { is_expected.to contain_augeas__lens('postfix_transport').with({ + :ensure => 'present', + :lens_source => 'puppet:///modules/postfix/lenses/postfix_transport.aug', + :test_source => 'puppet:///modules/postfix/lenses/test_postfix_transport.aug', + :stock_since => '1.0.0', + } ) } + it { is_expected.to contain_augeas__lens('postfix_virtual').with({ + :ensure => 'present', + :lens_source => 'puppet:///modules/postfix/lenses/postfix_virtual.aug', + :test_source => 'puppet:///modules/postfix/lenses/test_postfix_virtual.aug', + :stock_since => '1.0.0', + }) } + end + end end diff --git a/spec/classes/postfix_mailman_spec.rb b/spec/classes/postfix_mailman_spec.rb index 15217b46cd87fb8e03ec9257a68c374222a3b6ad..86623d33266b88991f244680fb032928b21c6221 100644 --- a/spec/classes/postfix_mailman_spec.rb +++ b/spec/classes/postfix_mailman_spec.rb @@ -1,4 +1,18 @@ require 'spec_helper' describe 'postfix::mailman' do + + let :pre_condition do + "include ::postfix" + end + + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts + end + + it { is_expected.to compile.with_all_deps } + end + end end diff --git a/spec/classes/postfix_mta_spec.rb b/spec/classes/postfix_mta_spec.rb index 395beaedf97c793790b38f19fada21e18e3d78c1..c6be6c75d32ff9a95f2bbfa4b9ccfb86dcc8b650 100644 --- a/spec/classes/postfix_mta_spec.rb +++ b/spec/classes/postfix_mta_spec.rb @@ -1,19 +1,24 @@ require 'spec_helper' describe 'postfix::mta' do - let (:facts) { { - :lsbdistcodename => 'wheezy', - :osfamily => 'Debian', - } } let :pre_condition do "class { 'postfix': mydestination => 'bar', - mynetworks => 'baz', + mynetworks => '127.0.0.1/8, [::1]/128 ![::2]/128', relayhost => 'foo', }" end - it { is_expected.to contain_postfix__config('mydestination').with_value('bar') } - it { is_expected.to contain_postfix__config('mynetworks').with_value('baz') } - it { is_expected.to contain_postfix__config('relayhost').with_value('foo') } + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts + end + + it { is_expected.to compile.with_all_deps } + it { is_expected.to contain_postfix__config('mydestination').with_value('bar') } + it { is_expected.to contain_postfix__config('mynetworks').with_value('127.0.0.1/8, [::1]/128 ![::2]/128') } + it { is_expected.to contain_postfix__config('relayhost').with_value('foo') } + end + end end diff --git a/spec/classes/postfix_satellite_spec.rb b/spec/classes/postfix_satellite_spec.rb index a3cf4d53ff8d5a6de61a81500ba4bb68817a1595..ac9489ec63057fc588f2fd444c4468e93b1c402a 100644 --- a/spec/classes/postfix_satellite_spec.rb +++ b/spec/classes/postfix_satellite_spec.rb @@ -1,14 +1,6 @@ require 'spec_helper' describe 'postfix::satellite' do - let (:node) { 'foo.example.com' } - let (:facts) { { - :augeasversion => '1.2.0', - :lsbdistcodename => 'wheezy', - :osfamily => 'Debian', - :rubyversion => '1.9.3', - :path => '/foo/bar', - } } let :pre_condition do " class { 'augeas': } class { 'postfix': @@ -17,9 +9,21 @@ describe 'postfix::satellite' do mynetworks => 'baz', }" end - it { is_expected.to contain_class('postfix::mta') } - it { is_expected.to contain_postfix__virtual('@foo.example.com').with( - :ensure => 'present', - :destination => 'root' - ) } + + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts.merge({ + :augeasversion => '1.2.0', + }) + end + + it { is_expected.to compile.with_all_deps } + it { is_expected.to contain_class('postfix::mta') } + it { is_expected.to contain_postfix__virtual('@foo.example.com').with( + :ensure => 'present', + :destination => 'root' + ) } + end + end end diff --git a/spec/classes/postfix_spec.rb b/spec/classes/postfix_spec.rb index e5fe635caeaf4b0a010a8ce2ebf4bad149b593cd..878ecf5181434f62471b3913805d7c0059b13c30 100644 --- a/spec/classes/postfix_spec.rb +++ b/spec/classes/postfix_spec.rb @@ -1,352 +1,283 @@ require 'spec_helper' describe 'postfix' do - context 'when using defaults' do - context 'when on Debian' do - let (:facts) { { - :lsbdistcodename => 'wheezy', - :operatingsystem => 'Debian', - :osfamily => 'Debian', - :fqdn => 'fqdn.example.com', - :path => '/foo/bar', - } } - it { is_expected.to contain_package('postfix') } - it { is_expected.to contain_package('mailx') } - - it { is_expected.to contain_file('/etc/mailname').without('seltype').with_content("fqdn.example.com\n") } - it { is_expected.to contain_file('/etc/aliases').without('seltype').with_content("# file managed by puppet\n") } - it { is_expected.to contain_exec('newaliases').with_refreshonly('true') } - it { is_expected.to contain_file('/etc/postfix/master.cf').without('seltype') } - it { is_expected.to contain_file('/etc/postfix/main.cf').without('seltype') } - - it { is_expected.to contain_postfix__config('myorigin').with_value('fqdn.example.com') } - it { is_expected.to contain_postfix__config('alias_maps').with_value('hash:/etc/aliases') } - it { is_expected.to contain_postfix__config('inet_interfaces').with_value('all') } - - it { is_expected.to contain_mailalias('root').with_recipient('nobody') } - - it { - is_expected.to contain_service('postfix').with( - :ensure => 'running', - :enable => 'true', - :hasstatus => 'true', - :restart => '/etc/init.d/postfix reload' - ) } - end - - context 'when on RedHat' do - let (:facts) { { - :lsbdistcodename => 'Maipo', - :fqdn => 'fqdn.example.com', - :operatingsystem => 'RedHat', - :operatingsystemmajrelease => '7', - :osfamily => 'RedHat', - :path => '/foo/bar', - } } - - it { is_expected.to contain_package('postfix') } - it { is_expected.to contain_package('mailx') } - - it { is_expected.to contain_file('/etc/mailname').with_seltype('postfix_etc_t').with_content("fqdn.example.com\n") } - it { is_expected.to contain_file('/etc/aliases').with_seltype('postfix_etc_t').with_content("# file managed by puppet\n") } - it { is_expected.to contain_exec('newaliases').with_refreshonly('true') } - it { is_expected.to contain_file('/etc/postfix/master.cf').with_seltype('postfix_etc_t') } - it { is_expected.to contain_file('/etc/postfix/main.cf').with_seltype('postfix_etc_t') } - - it { is_expected.to contain_postfix__config('myorigin').with_value('fqdn.example.com') } - it { is_expected.to contain_postfix__config('alias_maps').with_value('hash:/etc/aliases') } - it { is_expected.to contain_postfix__config('inet_interfaces').with_value('all') } - it { is_expected.to contain_postfix__config('sendmail_path') } - it { is_expected.to contain_postfix__config('newaliases_path') } - it { is_expected.to contain_postfix__config('mailq_path') } - - it { is_expected.to contain_mailalias('root').with_recipient('nobody') } - - it { - is_expected.to contain_service('postfix').with( - :ensure => 'running', - :enable => 'true', - :hasstatus => 'true', - :restart => '/etc/init.d/postfix reload' - ) } - end - end - - context 'when setting parameters' do - context 'when on Debian' do - context "when setting smtp_listen to 'all'" do - let (:facts) { { - :lsbdistcodename => 'wheezy', - :operatingsystem => 'Debian', - :osfamily => 'Debian', - :fqdn => 'fqdn.example.com', - :path => '/foo/bar', - } } - - let (:params) { { - :smtp_listen => 'all', - :root_mail_recipient => 'foo', - :use_amavisd => true, - :use_dovecot_lda => true, - :use_schleuder => true, - :use_sympa => true, - :mail_user => 'bar', - :myorigin => 'localhost', - :inet_interfaces => 'localhost2', - :master_smtp => "smtp inet n - - - - smtpd - -o smtpd_client_restrictions=check_client_access,hash:/etc/postfix/access,reject", - :master_smtps => 'smtps inet n - - - - smtpd', - :master_submission => 'submission inet n - - - - smtpd', - } } + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts.merge({ + :augeasversion => '1.2.0', + }) + end + context 'when using defaults' do it { is_expected.to contain_package('postfix') } it { is_expected.to contain_package('mailx') } - - it { is_expected.to contain_file('/etc/mailname').without('seltype').with_content("fqdn.example.com\n") } - it { is_expected.to contain_file('/etc/aliases').without('seltype').with_content("# file managed by puppet\n") } it { is_expected.to contain_exec('newaliases').with_refreshonly('true') } - it { - is_expected.to contain_file('/etc/postfix/master.cf').without('seltype').with_content( - /smtp inet n - - - - smtpd/ - ).with_content( - /amavis unix/ - ).with_content( - /dovecot.*\n.* user=bar:bar / - ).with_content( - /schleuder/ - ).with_content( - /sympa/ - ).with_content( - /user=bar/ - ).with_content( - /^smtp.*\n.*smtpd_client_restrictions=check_client_access,hash:/ - ).with_content( - /^smtps inet n/ - ).with_content( - /^submission inet n/ - ) - } - it { is_expected.to contain_file('/etc/postfix/main.cf').without('seltype') } - - it { is_expected.to contain_postfix__config('myorigin').with_value('localhost') } + it { is_expected.to contain_postfix__config('myorigin').with_value('foo.example.com') } it { is_expected.to contain_postfix__config('alias_maps').with_value('hash:/etc/aliases') } - it { is_expected.to contain_postfix__config('inet_interfaces').with_value('localhost2') } + it { is_expected.to contain_postfix__config('inet_interfaces').with_value('all') } + it { is_expected.to contain_mailalias('root').with_recipient('nobody') } - it { is_expected.to contain_mailalias('root').with_recipient('foo') } + case facts[:osfamily] + when 'Debian' + it { is_expected.to contain_file('/etc/mailname').without('seltype').with_content("foo.example.com\n") } + it { is_expected.to contain_file('/etc/aliases').without('seltype').with_content("# file managed by puppet\n") } + it { is_expected.to contain_file('/etc/postfix/master.cf').without('seltype') } + it { is_expected.to contain_file('/etc/postfix/main.cf').without('seltype') } - it { - is_expected.to contain_service('postfix').with( - :ensure => 'running', - :enable => 'true', - :hasstatus => 'true', - :restart => '/etc/init.d/postfix reload' - ) } - end - end - context 'when on RedHat' do - let (:facts) { { - :augeasversion => '1.2.0', - :lsbdistcodename => 'wheezy', - :operatingsystem => 'Debian', - :osfamily => 'Debian', - :rubyversion => '1.9.7', - :fqdn => 'fqdn.example.com', - :path => '/foo/bar', - } } - context 'when specifying inet_interfaces' do - let (:params) { { - :inet_interfaces => 'localhost2' - } } - it 'should create a postfix::config defined type with inet_interfaces specified properly' do - is_expected.to contain_postfix__config('inet_interfaces').with_value('localhost2') + it { + is_expected.to contain_service('postfix').with( + :ensure => 'running', + :enable => 'true', + :hasstatus => 'true', + :restart => '/etc/init.d/postfix reload' + ) } + else + it { is_expected.to contain_file('/etc/mailname').with_seltype('postfix_etc_t').with_content("foo.example.com\n") } + it { is_expected.to contain_file('/etc/aliases').with_seltype('postfix_etc_t').with_content("# file managed by puppet\n") } + it { is_expected.to contain_file('/etc/postfix/master.cf').with_seltype('postfix_etc_t') } + it { is_expected.to contain_file('/etc/postfix/main.cf').with_seltype('postfix_etc_t') } + + it { is_expected.to contain_postfix__config('sendmail_path') } + it { is_expected.to contain_postfix__config('newaliases_path') } + it { is_expected.to contain_postfix__config('mailq_path') } + + case facts[:operatingsystemmajrelease] + when '7' + it { + is_expected.to contain_service('postfix').with( + :ensure => 'running', + :enable => 'true', + :hasstatus => 'true', + :restart => '/bin/systemctl reload postfix' + ) } + else + it { + is_expected.to contain_service('postfix').with( + :ensure => 'running', + :enable => 'true', + :hasstatus => 'true', + :restart => '/etc/init.d/postfix reload' + ) } + end end end - context 'when enabling ldap' do - context 'when on Debian' do - let (:params) { { - :ldap => true, - :ldap_base => 'dc=example,dc=com', - :ldap_host => 'host.example.com', - } } - let (:facts) { { - :operatingsystem => 'Debian', - :osfamily => 'Debian', - :fqdn => 'fqdn.example.com', - :lsbdistcodename => 'wheezy', - } } + context 'when setting parameters' do + case facts[:osfamily] + when 'Debian' + context "when setting smtp_listen to 'all'" do + let (:params) { { + :smtp_listen => 'all', + :root_mail_recipient => 'foo', + :use_amavisd => true, + :use_dovecot_lda => true, + :use_schleuder => true, + :use_sympa => true, + :mail_user => 'bar', + :myorigin => 'localhost', + :inet_interfaces => 'localhost2', + :master_smtp => "smtp inet n - - - - smtpd + -o smtpd_client_restrictions=check_client_access,hash:/etc/postfix/access,reject", + :master_smtps => 'smtps inet n - - - - smtpd', + :master_submission => 'submission inet n - - - - smtpd', + } } - it { should contain_package('postfix-ldap') } + it { is_expected.to contain_package('postfix') } + it { is_expected.to contain_package('mailx') } - it { should contain_file('/etc/postfix/ldap-aliases.cf').with( - :owner => 'root', - :group => 'postfix' ).with_content(/search_base = /) - } - end + it { is_expected.to contain_file('/etc/mailname').without('seltype').with_content("foo.example.com\n") } + it { is_expected.to contain_file('/etc/aliases').without('seltype').with_content("# file managed by puppet\n") } + it { is_expected.to contain_exec('newaliases').with_refreshonly('true') } + it { + is_expected.to contain_file('/etc/postfix/master.cf').without('seltype').with_content( + /smtp inet n - - - - smtpd/ + ).with_content( + /amavis unix/ + ).with_content( + /dovecot.*\n.* user=bar:bar / + ).with_content( + /schleuder/ + ).with_content( + /sympa/ + ).with_content( + /user=bar/ + ).with_content( + /^smtp.*\n.*smtpd_client_restrictions=check_client_access,hash:/ + ).with_content( + /^smtps inet n/ + ).with_content( + /^submission inet n/ + ) + } + it { is_expected.to contain_file('/etc/postfix/main.cf').without('seltype') } - context 'when on RedHat' do - let (:params) { { - :ldap => true, - :ldap_base => 'dc=example,dc=com', - :ldap_host => 'host.example.com', - } } + it { is_expected.to contain_postfix__config('myorigin').with_value('localhost') } + it { is_expected.to contain_postfix__config('alias_maps').with_value('hash:/etc/aliases') } + it { is_expected.to contain_postfix__config('inet_interfaces').with_value('localhost2') } - let (:facts) { { - :operatingsystem => 'RedHat', - :osfamily => 'RedHat', - :operatingsystemmajrelease => '7', - :lsbdistcodename => 'Maipo', - :fqdn => 'fqdn.example.com', - } } + it { is_expected.to contain_mailalias('root').with_recipient('foo') } - it do - expect { - should_not contain_package('postfix-ldap') - } + it { + is_expected.to contain_service('postfix').with( + :ensure => 'running', + :enable => 'true', + :hasstatus => 'true', + :restart => '/etc/init.d/postfix reload' + ) } end - - it { should contain_file('/etc/postfix/ldap-aliases.cf').with( - :owner => 'root', - :group => 'postfix').with_content(/search_base = /) - } - end - end - context 'when a custom mail_user is specified' do - let (:params) { { - :mail_user => 'bar' - } } - it 'should adjust the content of /etc/postfix/master.cf specifying the user' do - is_expected.to contain_file('/etc/postfix/master.cf').without('seltype').with_content(/user=bar/) - end - end - context 'when mailman is true' do - let (:params) { { - :mailman => true - } } - it 'should do stuff' do - skip 'need to write this still' - end - end - context 'when specifying a custom mastercf_source' do - let (:params) { { - :mastercf_source => 'testy' - } } - it 'should do stuff' do - skip 'need to write this still' - end - end - context 'when specifying a custom master_smtp' do - let (:params) { { - :master_smtp => "smtp inet n - - - - smtpd + else + context 'when specifying inet_interfaces' do + let (:params) { { + :inet_interfaces => 'localhost2' + } } + it 'should create a postfix::config defined type with inet_interfaces specified properly' do + is_expected.to contain_postfix__config('inet_interfaces').with_value('localhost2') + end + end + context 'when enabling ldap' do + it 'should do stuff' do + skip 'need to write this still' + end + end + context 'when a custom mail_user is specified' do + let (:params) { { + :mail_user => 'bar' + } } + it 'should adjust the content of /etc/postfix/master.cf specifying the user' do + is_expected.to contain_file('/etc/postfix/master.cf').with_seltype('postfix_etc_t').with_content(/user=bar/) + end + end + context 'when mailman is true' do + let (:params) { { + :mailman => true + } } + it 'should do stuff' do + skip 'need to write this still' + end + end + context 'when specifying a custom mastercf_source' do + let (:params) { { + :mastercf_source => 'testy' + } } + it 'should do stuff' do + skip 'need to write this still' + end + end + context 'when specifying a custom master_smtp' do + let (:params) { { + :master_smtp => "smtp inet n - - - - smtpd -o smtpd_client_restrictions=check_client_access,hash:/etc/postfix/access,reject", - } } - it 'should update master.cf with the specified flags to smtp' do - is_expected.to contain_file('/etc/postfix/master.cf').without('seltype').with_content( - /smtp inet n - - - - smtpd/).with_content( - /^smtp.*\n.*smtpd_client_restrictions=check_client_access,hash:/ - ) - end - end - context 'when specifying a custom master_smtps' do - let (:params) { { - :master_smtps => 'smtps inet n - - - - smtpd' - } } - it 'should update master.cf with the specified flags to smtps' do - is_expected.to contain_file('/etc/postfix/master.cf').with_content(/^smtps inet n/) - end - end - context 'when mta is enabled' do - let (:params) { { :mta => true, :mydestination => '1.2.3.4', :relayhost => '2.3.4.5' } } - it 'should configure postfix as a minimal MTA, delivering mail to the mydestination param' do - is_expected.to contain_postfix__config('mydestination').with_value('1.2.3.4') - is_expected.to contain_postfix__config('mynetworks').with_value('127.0.0.0/8') - is_expected.to contain_postfix__config('relayhost').with_value('2.3.4.5') - is_expected.to contain_postfix__config('virtual_alias_maps').with_value('hash:/etc/postfix/virtual') - is_expected.to contain_postfix__config('transport_maps').with_value('hash:/etc/postfix/transport') - end - it { is_expected.to contain_class('postfix::mta') } - context 'and satellite is also enabled' do - let (:params) { { :mta => true, :satellite => true, :mydestination => '1.2.3.4', :relayhost => '2.3.4.5' } } - it 'should fail' do - expect { should compile }.to raise_error(/Please disable one/) + } } + it 'should update master.cf with the specified flags to smtp' do + is_expected.to contain_file('/etc/postfix/master.cf').with_seltype('postfix_etc_t').with_content( + /smtp inet n - - - - smtpd/).with_content( + /^smtp.*\n.*smtpd_client_restrictions=check_client_access,hash:/ + ) + end end - end - end - context 'when specifying mydesitination' do - it 'should do stuff' do - skip 'need to write this still' - end - end - context 'when specifying mynetworks' do - it 'should do stuff' do - skip 'need to write this still' - end - end - context 'when specifying myorigin' do - let (:params) { { :myorigin => 'localhost'} } - it 'should create a postfix::config defined type with myorigin specified properly' do - is_expected.to contain_postfix__config('myorigin').with_value('localhost') - end - end - context 'when specifying relayhost' do - it 'should do stuff' do - skip 'need to write this still' - end - end - context 'when specifying a root_mail_recipient' do - let (:params) { { :root_mail_recipient => 'foo'} } - it 'should contain a Mailalias resource directing roots mail to the required user' do - is_expected.to contain_mailalias('root').with_recipient('foo') - end - end - context 'when specifying satellite' do - let (:params) { { :satellite => true, :mydestination => '1.2.3.4', :relayhost => '2.3.4.5' } } - let :pre_condition do - "class { 'augeas': }" - end - it 'should configure all local email to be forwarded to $root_mail_recipient delivered through $relayhost' do - is_expected.to contain_postfix__config('mydestination').with_value('1.2.3.4') - is_expected.to contain_postfix__config('mynetworks').with_value('127.0.0.0/8') - is_expected.to contain_postfix__config('relayhost').with_value('2.3.4.5') - is_expected.to contain_postfix__config('virtual_alias_maps').with_value('hash:/etc/postfix/virtual') - is_expected.to contain_postfix__config('transport_maps').with_value('hash:/etc/postfix/transport') - end - context 'and mta is also enabled' do - let (:params) { { :mta => true, :satellite => true, :mydestination => '1.2.3.4', :relayhost => '2.3.4.5' } } - it 'should fail' do - expect { should compile }.to raise_error(/Please disable one/) + context 'when specifying a custom master_smtps' do + let (:params) { { + :master_smtps => 'smtps inet n - - - - smtpd' + } } + it 'should update master.cf with the specified flags to smtps' do + is_expected.to contain_file('/etc/postfix/master.cf').with_content(/^smtps inet n/) + end + end + context 'when mta is enabled' do + let (:params) { { :mta => true, :mydestination => '1.2.3.4', :relayhost => '2.3.4.5' } } + it 'should configure postfix as a minimal MTA, delivering mail to the mydestination param' do + is_expected.to contain_postfix__config('mydestination').with_value('1.2.3.4') + is_expected.to contain_postfix__config('mynetworks').with_value('127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128') + is_expected.to contain_postfix__config('relayhost').with_value('2.3.4.5') + is_expected.to contain_postfix__config('virtual_alias_maps').with_value('hash:/etc/postfix/virtual') + is_expected.to contain_postfix__config('transport_maps').with_value('hash:/etc/postfix/transport') + end + it { is_expected.to contain_class('postfix::mta') } + context 'and satellite is also enabled' do + let (:params) { { :mta => true, :satellite => true, :mydestination => '1.2.3.4', :relayhost => '2.3.4.5' } } + it 'should fail' do + expect { should compile }.to raise_error(/Please disable one/) + end + end + end + context 'when specifying mydesitination' do + it 'should do stuff' do + skip 'need to write this still' + end + end + context 'when specifying mynetworks' do + it 'should do stuff' do + skip 'need to write this still' + end + end + context 'when specifying myorigin' do + let (:params) { { :myorigin => 'localhost'} } + it 'should create a postfix::config defined type with myorigin specified properly' do + is_expected.to contain_postfix__config('myorigin').with_value('localhost') + end + end + context 'when specifying relayhost' do + it 'should do stuff' do + skip 'need to write this still' + end + end + context 'when specifying a root_mail_recipient' do + let (:params) { { :root_mail_recipient => 'foo'} } + it 'should contain a Mailalias resource directing roots mail to the required user' do + is_expected.to contain_mailalias('root').with_recipient('foo') + end + end + context 'when specifying satellite' do + let (:params) { { :satellite => true, :mydestination => '1.2.3.4', :relayhost => '2.3.4.5' } } + let :pre_condition do + "class { 'augeas': }" + end + it 'should configure all local email to be forwarded to $root_mail_recipient delivered through $relayhost' do + is_expected.to contain_postfix__config('mydestination').with_value('1.2.3.4') + is_expected.to contain_postfix__config('mynetworks').with_value('127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128') + is_expected.to contain_postfix__config('relayhost').with_value('2.3.4.5') + is_expected.to contain_postfix__config('virtual_alias_maps').with_value('hash:/etc/postfix/virtual') + is_expected.to contain_postfix__config('transport_maps').with_value('hash:/etc/postfix/transport') + end + context 'and mta is also enabled' do + let (:params) { { :mta => true, :satellite => true, :mydestination => '1.2.3.4', :relayhost => '2.3.4.5' } } + it 'should fail' do + expect { should compile }.to raise_error(/Please disable one/) + end + end + end + context 'when specifying smtp_listen' do + let (:params) { { :smtp_listen => 'all' } } + it 'should do stuff' do + skip 'need to write this still' + end + end + context 'when use_amavisd is true' do + let (:params) { { :use_amavisd => true } } + it 'should update master.cf with the specified flags to amavis' do + is_expected.to contain_file('/etc/postfix/master.cf').with_content(/amavis unix/) + end + end + context 'when use_dovecot_lda is true' do + let (:params) { { :use_dovecot_lda => true } } + it 'should update master.cf with the specified flags to dovecot' do + is_expected.to contain_file('/etc/postfix/master.cf').with_content(/dovecot.*\n.* user=vmail:vmail /) + end + end + context 'when use_schleuder is true' do + let (:params) { { :use_schleuder => true } } + it 'should update master.cf with the specified flags to schleuder' do + is_expected.to contain_file('/etc/postfix/master.cf').with_content(/schleuder/) + end + end + context 'when use_sympa is true' do + let (:params) { { :use_sympa => true } } + it 'should update master.cf to include sympa' do + is_expected.to contain_file('/etc/postfix/master.cf').with_content(/sympa/) + end end - end - end - context 'when specifying smtp_listen' do - let (:params) { { :smtp_listen => 'all' } } - it 'should do stuff' do - skip 'need to write this still' - end - end - context 'when use_amavisd is true' do - let (:params) { { :use_amavisd => true } } - it 'should update master.cf with the specified flags to amavis' do - is_expected.to contain_file('/etc/postfix/master.cf').with_content(/amavis unix/) - end - end - context 'when use_dovecot_lda is true' do - let (:params) { { :use_dovecot_lda => true } } - it 'should update master.cf with the specified flags to dovecot' do - is_expected.to contain_file('/etc/postfix/master.cf').with_content(/dovecot.*\n.* user=vmail:vmail /) - end - end - context 'when use_schleuder is true' do - let (:params) { { :use_schleuder => true } } - it 'should update master.cf with the specified flags to schleuder' do - is_expected.to contain_file('/etc/postfix/master.cf').with_content(/schleuder/) - end - end - context 'when use_sympa is true' do - let (:params) { { :use_sympa => true } } - it 'should update master.cf to include sympa' do - is_expected.to contain_file('/etc/postfix/master.cf').with_content(/sympa/) end end end diff --git a/spec/defines/postfix_config_spec.rb b/spec/defines/postfix_config_spec.rb index 75c8edd519fac61718236cefcd50230847dac693..2fe17840027d45c46d47ab253e6f7ae9f35c3598 100644 --- a/spec/defines/postfix_config_spec.rb +++ b/spec/defines/postfix_config_spec.rb @@ -2,93 +2,98 @@ require 'spec_helper' describe 'postfix::config' do let (:title) { 'foo' } - let (:facts) { { - :lsbdistcodename => 'wheezy', - :osfamily => 'Debian', - } } + let :pre_condition do "class { 'postfix': }" end - context 'when not passing value' do - it 'should fail' do - expect { - is_expected.to contain_augeas("set postfix 'foo'") - }.to raise_error(Puppet::Error, /value can not be empty/) - end - end + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts + end - context 'when passing wrong type for value' do - let (:params) { { - :value => ['bar'], - } } - it 'should fail' do - expect { - is_expected.to contain_augeas("set postfix 'foo'") - }.to raise_error(Puppet::Error, /\["bar"\] is not a string/) - end - end + context 'when not passing value' do + it 'should fail' do + expect { + is_expected.to contain_augeas("set postfix 'foo'") + }.to raise_error(Puppet::Error, /value can not be empty/) + end + end - context 'when passing wrong type for ensure' do - let (:params) { { - :value => 'bar', - :ensure => ['present'], - } } - it 'should fail' do - expect { - is_expected.to contain_augeas("set postfix 'foo'") - }.to raise_error(Puppet::Error, /\["present"\] is not a string/) - end - end + context 'when passing wrong type for value' do + let (:params) { { + :value => ['bar'], + } } + it 'should fail' do + expect { + is_expected.to contain_augeas("set postfix 'foo'") + }.to raise_error(Puppet::Error, /\["bar"\] is not a string/) + end + end - context 'when passing wrong value for ensure' do - let (:params) { { - :value => 'bar', - :ensure => 'running', - } } - it 'should fail' do - expect { - is_expected.to contain_augeas("set postfix 'foo'") - }.to raise_error(Puppet::Error, /must be either 'present', 'absent' or 'blank'/) - end - end + context 'when passing wrong type for ensure' do + let (:params) { { + :value => 'bar', + :ensure => ['present'], + } } + it 'should fail' do + expect { + is_expected.to contain_augeas("set postfix 'foo'") + }.to raise_error(Puppet::Error, /\["present"\] is not a string/) + end + end - context 'when ensuring presence' do - let (:params) { { - :value => 'bar', - :ensure => 'present', - } } + context 'when passing wrong value for ensure' do + let (:params) { { + :value => 'bar', + :ensure => 'running', + } } + it 'should fail' do + expect { + is_expected.to contain_augeas("set postfix 'foo'") + }.to raise_error(Puppet::Error, /must be either 'present', 'absent' or 'blank'/) + end + end - it { is_expected.to contain_augeas("manage postfix 'foo'").with( - :incl => '/etc/postfix/main.cf', - :lens => 'Postfix_Main.lns', - :changes => "set foo 'bar'" - ) } - end + context 'when ensuring presence' do + let (:params) { { + :value => 'bar', + :ensure => 'present', + } } - context 'when ensuring absence' do - let (:params) { { - :value => 'bar', - :ensure => 'absent', - } } + it { is_expected.to contain_augeas("manage postfix 'foo'").with( + :incl => '/etc/postfix/main.cf', + :lens => 'Postfix_Main.lns', + :changes => "set foo 'bar'" + ) } + end - it { is_expected.to contain_augeas("manage postfix 'foo'").with( - :incl => '/etc/postfix/main.cf', - :lens => 'Postfix_Main.lns', - :changes => "rm foo" - ) } - end + context 'when ensuring absence' do + let (:params) { { + :value => 'bar', + :ensure => 'absent', + } } + + it { is_expected.to contain_augeas("manage postfix 'foo'").with( + :incl => '/etc/postfix/main.cf', + :lens => 'Postfix_Main.lns', + :changes => "rm foo" + ) } + end - context 'when ensuring blank' do - let (:params) { { - :value => 'bar', - :ensure => 'blank', - } } + context 'when ensuring blank' do + let (:params) { { + :value => 'bar', + :ensure => 'blank', + } } - it { is_expected.to contain_augeas("manage postfix 'foo'").with( - :incl => '/etc/postfix/main.cf', - :lens => 'Postfix_Main.lns', - :changes => "clear foo" - ) } + it { is_expected.to contain_augeas("manage postfix 'foo'").with( + :incl => '/etc/postfix/main.cf', + :lens => 'Postfix_Main.lns', + :changes => "clear foo" + ) } + end + end end end diff --git a/spec/defines/postfix_hash_spec.rb b/spec/defines/postfix_hash_spec.rb index 6a3220e84b003dc178ba4579dd45b5520c71e409..ef80b0f5f04b873ec3ff99814c621ac7f69c496b 100644 --- a/spec/defines/postfix_hash_spec.rb +++ b/spec/defines/postfix_hash_spec.rb @@ -2,102 +2,107 @@ require 'spec_helper' describe 'postfix::hash' do let (:title) { '/tmp/foo' } - let (:facts) { { - :lsbdistcodename => 'wheezy', - :osfamily => 'Debian', - } } + let :pre_condition do "class { '::postfix': }" end - context 'when passing wrong type for ensure' do - let (:params) { { - :ensure => ['present'], - } } - it 'should fail' do - expect { - is_expected.to contain_file('/tmp/foo') - }.to raise_error(Puppet::Error, /\["present"\] is not a string/) - end - end + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts + end - context 'when passing wrong value for ensure' do - let (:params) { { - :ensure => 'running', - } } - it 'should fail' do - expect { - is_expected.to contain_file('/tmp/foo') - }.to raise_error(Puppet::Error, /must be either 'present' or 'absent'/) - end - end + context 'when passing wrong type for ensure' do + let (:params) { { + :ensure => ['present'], + } } + it 'should fail' do + expect { + is_expected.to contain_file('/tmp/foo') + }.to raise_error(Puppet::Error, /\["present"\] is not a string/) + end + end - context 'when passing wrong value for title' do - let (:title) { 'foo' } - it 'should fail' do - expect { - is_expected.to contain_file('/tmp/foo') - }.to raise_error(Puppet::Error, /"foo" is not an absolute path/) - end - end + context 'when passing wrong value for ensure' do + let (:params) { { + :ensure => 'running', + } } + it 'should fail' do + expect { + is_expected.to contain_file('/tmp/foo') + }.to raise_error(Puppet::Error, /must be either 'present' or 'absent'/) + end + end - context 'when passing both source and content' do - let (:params) { { - :source => '/tmp/bar', - :content => 'bar', - } } + context 'when passing wrong value for title' do + let (:title) { 'foo' } + it 'should fail' do + expect { + is_expected.to contain_file('/tmp/foo') + }.to raise_error(Puppet::Error, /"foo" is not an absolute path/) + end + end - it 'should fail' do - expect { - is_expected.to contain_file('/tmp/foo') - }.to raise_error(Puppet::Error, /You must provide either 'source' or 'content'/) - end - end + context 'when passing both source and content' do + let (:params) { { + :source => '/tmp/bar', + :content => 'bar', + } } - context 'when passing source' do - let (:params) { { - :source => '/tmp/bar', - } } + it 'should fail' do + expect { + is_expected.to contain_file('/tmp/foo') + }.to raise_error(Puppet::Error, /You must provide either 'source' or 'content'/) + end + end - it { is_expected.to contain_file('/tmp/foo').with( - :ensure => 'present', - :source => '/tmp/bar' - ).without(:content) - } - it { is_expected.to contain_file('/tmp/foo.db').with_ensure('present') } - it { is_expected.to contain_exec('generate /tmp/foo.db') } - end + context 'when passing source' do + let (:params) { { + :source => '/tmp/bar', + } } - context 'when passing content' do - let (:params) { { - :content => 'bar', - } } + it { is_expected.to contain_file('/tmp/foo').with( + :ensure => 'present', + :source => '/tmp/bar' + ).without(:content) + } + it { is_expected.to contain_file('/tmp/foo.db').with_ensure('present') } + it { is_expected.to contain_exec('generate /tmp/foo.db') } + end - it { is_expected.to contain_file('/tmp/foo').with( - :ensure => 'present', - :content => 'bar' - ).without(:source) - } - it { is_expected.to contain_file('/tmp/foo.db').with_ensure('present') } - it { is_expected.to contain_exec('generate /tmp/foo.db') } - end + context 'when passing content' do + let (:params) { { + :content => 'bar', + } } - context 'when not passing source or content' do - it { is_expected.to contain_file('/tmp/foo').with( - :ensure => 'present' - ).without(:source).without(:content) - } - it { is_expected.to contain_file('/tmp/foo.db').with_ensure('present') } - it { is_expected.to contain_exec('generate /tmp/foo.db') } - end + it { is_expected.to contain_file('/tmp/foo').with( + :ensure => 'present', + :content => 'bar' + ).without(:source) + } + it { is_expected.to contain_file('/tmp/foo.db').with_ensure('present') } + it { is_expected.to contain_exec('generate /tmp/foo.db') } + end + + context 'when not passing source or content' do + it { is_expected.to contain_file('/tmp/foo').with( + :ensure => 'present' + ).without(:source).without(:content) + } + it { is_expected.to contain_file('/tmp/foo.db').with_ensure('present') } + it { is_expected.to contain_exec('generate /tmp/foo.db') } + end - context 'when ensuring absence' do - let (:params) { { - :ensure => 'absent', - } } + context 'when ensuring absence' do + let (:params) { { + :ensure => 'absent', + } } - it { is_expected.to contain_file('/tmp/foo').with_ensure('absent') } - it { is_expected.to contain_file('/tmp/foo.db').with_ensure('absent') } - it { is_expected.to contain_exec('generate /tmp/foo.db') } + it { is_expected.to contain_file('/tmp/foo').with_ensure('absent') } + it { is_expected.to contain_file('/tmp/foo.db').with_ensure('absent') } + it { is_expected.to contain_exec('generate /tmp/foo.db') } + end + end end end diff --git a/spec/defines/postfix_transport_spec.rb b/spec/defines/postfix_transport_spec.rb index ad497170eaff6abe6341d1870b560bab9440b6d9..05904998293bff290aeb0774bd91786286d36265 100644 --- a/spec/defines/postfix_transport_spec.rb +++ b/spec/defines/postfix_transport_spec.rb @@ -2,139 +2,144 @@ require 'spec_helper' describe 'postfix::transport' do let (:title) { 'foo' } - let (:facts) { { - :augeasversion => '1.2.0', - :osfamily => 'Debian', - :rubyversion => '1.9.3', - :path => '/foo/bar', - } } - let :pre_condition do - "class { 'augeas': }" - end - - context 'when sending wrong type for destination' do - let (:params) { { - :destination => ['bar'], - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix transport - foo') - }.to raise_error(Puppet::Error, /\["bar"\] is not a string/) - end - end - - context 'when sending wrong type for nexthop' do - let (:params) { { - :destination => 'bar', - :nexthop => ['baz'], - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix transport - foo') - }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) - end - end - - context 'when sending wrong type for file' do - let (:params) { { - :destination => 'bar', - :file => ['baz'], - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix transport - foo') - }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) - end - end - context 'when sending wrong value for file' do - let (:params) { { - :destination => 'bar', - :file => 'baz', - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix transport - foo') - }.to raise_error(Puppet::Error, /"baz" is not an absolute path/) - end - end - - context 'when sending wrong type for ensure' do - let (:params) { { - :destination => 'bar', - :ensure => ['baz'], - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix transport - foo') - }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) - end + let :pre_condition do + "class { '::augeas': }" end - context 'when sending wrong value for ensure' do - let (:params) { { - :destination => 'bar', - :ensure => 'running', - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix transport - foo') - }.to raise_error(Puppet::Error, /\$ensure must be either/) + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts.merge({ + :augeasversion => '1.2.0', + }) + end + + context 'when sending wrong type for destination' do + let (:params) { { + :destination => ['bar'], + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix transport - foo') + }.to raise_error(Puppet::Error, /\["bar"\] is not a string/) + end + end + + context 'when sending wrong type for nexthop' do + let (:params) { { + :destination => 'bar', + :nexthop => ['baz'], + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix transport - foo') + }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) + end + end + + context 'when sending wrong type for file' do + let (:params) { { + :destination => 'bar', + :file => ['baz'], + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix transport - foo') + }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) + end + end + + context 'when sending wrong value for file' do + let (:params) { { + :destination => 'bar', + :file => 'baz', + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix transport - foo') + }.to raise_error(Puppet::Error, /"baz" is not an absolute path/) + end + end + + context 'when sending wrong type for ensure' do + let (:params) { { + :destination => 'bar', + :ensure => ['baz'], + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix transport - foo') + }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) + end + end + + context 'when sending wrong value for ensure' do + let (:params) { { + :destination => 'bar', + :ensure => 'running', + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix transport - foo') + }.to raise_error(Puppet::Error, /\$ensure must be either/) + end + end + + context 'when using default values' do + it { is_expected.to contain_class('postfix::augeas') } + it { is_expected.to contain_augeas('Postfix transport - foo').with( + :incl => '/etc/postfix/transport', + :lens => 'Postfix_Transport.lns', + :changes => [ + "set pattern[. = 'foo'] 'foo'", + "clear pattern[. = 'foo']/transport", + "clear pattern[. = 'foo']/nexthop", + ]) + } + end + + context 'when overriding default values' do + let (:params) { { + :destination => 'bar', + :nexthop => 'baz', + :file => '/tmp/transport', + :ensure => 'present', + } } + + it { is_expected.to contain_class('postfix::augeas') } + it { is_expected.to contain_augeas('Postfix transport - foo').with( + :incl => '/tmp/transport', + :lens => 'Postfix_Transport.lns', + :changes => [ + "set pattern[. = 'foo'] 'foo'", + "set pattern[. = 'foo']/transport 'bar'", + "set pattern[. = 'foo']/nexthop 'baz'", + ]) + } + end + + context 'when ensuring absence' do + let (:params) { { + :destination => 'bar', + :ensure => 'absent', + } } + + it { is_expected.to contain_class('postfix::augeas') } + it { is_expected.to contain_augeas('Postfix transport - foo').with( + :incl => '/etc/postfix/transport', + :lens => 'Postfix_Transport.lns', + :changes => [ + "rm pattern[. = 'foo']", + ]) + } + end end end - - context 'when using default values' do - it { is_expected.to contain_class('postfix::augeas') } - it { is_expected.to contain_augeas('Postfix transport - foo').with( - :incl => '/etc/postfix/transport', - :lens => 'Postfix_Transport.lns', - :changes => [ - "set pattern[. = 'foo'] 'foo'", - "clear pattern[. = 'foo']/transport", - "clear pattern[. = 'foo']/nexthop", - ]) - } - end - - context 'when overriding default values' do - let (:params) { { - :destination => 'bar', - :nexthop => 'baz', - :file => '/tmp/transport', - :ensure => 'present', - } } - - it { is_expected.to contain_class('postfix::augeas') } - it { is_expected.to contain_augeas('Postfix transport - foo').with( - :incl => '/tmp/transport', - :lens => 'Postfix_Transport.lns', - :changes => [ - "set pattern[. = 'foo'] 'foo'", - "set pattern[. = 'foo']/transport 'bar'", - "set pattern[. = 'foo']/nexthop 'baz'", - ]) - } - end - - context 'when ensuring absence' do - let (:params) { { - :destination => 'bar', - :ensure => 'absent', - } } - - it { is_expected.to contain_class('postfix::augeas') } - it { is_expected.to contain_augeas('Postfix transport - foo').with( - :incl => '/etc/postfix/transport', - :lens => 'Postfix_Transport.lns', - :changes => [ - "rm pattern[. = 'foo']", - ]) - } - end end diff --git a/spec/defines/postfix_virtual_spec.rb b/spec/defines/postfix_virtual_spec.rb index 36a056b2c42a5205ad7bcc3f6ff7abd872172a38..38927652ac040e8307b8aad64ce6e667ab05569d 100644 --- a/spec/defines/postfix_virtual_spec.rb +++ b/spec/defines/postfix_virtual_spec.rb @@ -2,135 +2,140 @@ require 'spec_helper' describe 'postfix::virtual' do let (:title) { 'foo' } - let (:facts) { { - :augeasversion => '1.2.0', - :osfamily => 'Debian', - :rubyversion => '1.9.3', - :path => '/foo/bar', - } } - let :pre_condition do - "class { 'augeas': }" - end - - context 'when not sending destination' do - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix virtual - foo') - }.to raise_error(Puppet::Error, /Must pass destination/) - end - end - - context 'when sending wrong type for destination' do - let (:params) { { - :destination => ['bar'], - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix virtual - foo') - }.to raise_error(Puppet::Error, /\["bar"\] is not a string/) - end - end - - context 'when sending wrong type for file' do - let (:params) { { - :destination => 'bar', - :file => ['baz'], - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix virtual - foo') - }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) - end - end - - context 'when sending wrong value for file' do - let (:params) { { - :destination => 'bar', - :file => 'baz', - } } - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix virtual - foo') - }.to raise_error(Puppet::Error, /"baz" is not an absolute path/) - end - end - - context 'when sending wrong type for ensure' do - let (:params) { { - :destination => 'bar', - :ensure => ['baz'], - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix virtual - foo') - }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) - end + let :pre_condition do + "class { '::augeas': }" end - context 'when sending wrong value for ensure' do - let (:params) { { - :destination => 'bar', - :ensure => 'running', - } } - - it 'should fail' do - expect { - is_expected.to contain_augeas('Postfix virtual - foo') - }.to raise_error(Puppet::Error, /\$ensure must be either/) + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts.merge({ + :augeasversion => '1.2.0', + }) + end + + context 'when not sending destination' do + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix virtual - foo') + }.to raise_error(Puppet::Error, /Must pass destination/) + end + end + + context 'when sending wrong type for destination' do + let (:params) { { + :destination => ['bar'], + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix virtual - foo') + }.to raise_error(Puppet::Error, /\["bar"\] is not a string/) + end + end + + context 'when sending wrong type for file' do + let (:params) { { + :destination => 'bar', + :file => ['baz'], + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix virtual - foo') + }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) + end + end + + context 'when sending wrong value for file' do + let (:params) { { + :destination => 'bar', + :file => 'baz', + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix virtual - foo') + }.to raise_error(Puppet::Error, /"baz" is not an absolute path/) + end + end + + context 'when sending wrong type for ensure' do + let (:params) { { + :destination => 'bar', + :ensure => ['baz'], + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix virtual - foo') + }.to raise_error(Puppet::Error, /\["baz"\] is not a string/) + end + end + + context 'when sending wrong value for ensure' do + let (:params) { { + :destination => 'bar', + :ensure => 'running', + } } + + it 'should fail' do + expect { + is_expected.to contain_augeas('Postfix virtual - foo') + }.to raise_error(Puppet::Error, /\$ensure must be either/) + end + end + + context 'when using default values' do + let (:params) { { + :destination => 'bar', + } } + + it { is_expected.to contain_class('postfix::augeas') } + it { is_expected.to contain_augeas('Postfix virtual - foo').with( + :incl => '/etc/postfix/virtual', + :lens => 'Postfix_Virtual.lns', + :changes => [ + "set pattern[. = 'foo'] 'foo'", + "set pattern[. = 'foo']/destination 'bar'", + ]) + } + end + + context 'when overriding default values' do + let (:params) { { + :destination => 'bar', + :file => '/tmp/virtual', + :ensure => 'present', + } } + + it { is_expected.to contain_class('postfix::augeas') } + it { is_expected.to contain_augeas('Postfix virtual - foo').with( + :incl => '/tmp/virtual', + :lens => 'Postfix_Virtual.lns', + :changes => [ + "set pattern[. = 'foo'] 'foo'", + "set pattern[. = 'foo']/destination 'bar'", + ]) + } + end + + context 'when ensuring absence' do + let (:params) { { + :destination => 'bar', + :ensure => 'absent', + } } + + it { is_expected.to contain_class('postfix::augeas') } + it { is_expected.to contain_augeas('Postfix virtual - foo').with( + :incl => '/etc/postfix/virtual', + :lens => 'Postfix_Virtual.lns', + :changes => [ + "rm pattern[. = 'foo']", + ]) + } + end end end - - context 'when using default values' do - let (:params) { { - :destination => 'bar', - } } - - it { is_expected.to contain_class('postfix::augeas') } - it { is_expected.to contain_augeas('Postfix virtual - foo').with( - :incl => '/etc/postfix/virtual', - :lens => 'Postfix_Virtual.lns', - :changes => [ - "set pattern[. = 'foo'] 'foo'", - "set pattern[. = 'foo']/destination 'bar'", - ]) - } - end - - context 'when overriding default values' do - let (:params) { { - :destination => 'bar', - :file => '/tmp/virtual', - :ensure => 'present', - } } - - it { is_expected.to contain_class('postfix::augeas') } - it { is_expected.to contain_augeas('Postfix virtual - foo').with( - :incl => '/tmp/virtual', - :lens => 'Postfix_Virtual.lns', - :changes => [ - "set pattern[. = 'foo'] 'foo'", - "set pattern[. = 'foo']/destination 'bar'", - ]) - } - end - - context 'when ensuring absence' do - let (:params) { { - :destination => 'bar', - :ensure => 'absent', - } } - - it { is_expected.to contain_class('postfix::augeas') } - it { is_expected.to contain_augeas('Postfix virtual - foo').with( - :incl => '/etc/postfix/virtual', - :lens => 'Postfix_Virtual.lns', - :changes => [ - "rm pattern[. = 'foo']", - ]) - } - end end