Commit f9a114b2 authored by Raphaël Pinson's avatar Raphaël Pinson Committed by Raphaël Pinson
Browse files

Support multiple destinations in postfix::virtual (Fix #164)

parent e8fe4c71
Loading
Loading
Loading
Loading
+14 −10
Changes for manifests/virtual.pp: 14 added lines, 10 removed lines.
Original line number Diff line number Diff line
@@ -5,9 +5,9 @@
# === Parameters
#
# [*name*]        - name of address postfix will lookup. See virtual(8).
# [*destination*] - where the emails will be delivered to. See virtual(8).
# [*destination*] - a list of destinations where the emails will be delivered to. See virtual(8).
# [*ensure*]      - present/absent, defaults to present.
# [*file*]        - A string defining the location of the pre-hash map.
# [*file*]        - a string defining the location of the pre-hash map.
#
# === Requires
#
@@ -21,8 +21,7 @@
#   node "toto.example.com" {
#
#     include postfix
#
#     postfix::hash { "/etc/postfix/virtual":
# #     postfix::hash { "/etc/postfix/virtual":
#       ensure => present,
#     }
#     postfix::config { "virtual_alias_maps":
@@ -30,24 +29,29 @@
#     }
#     postfix::virtual { "user@example.com":
#       ensure      => present,
#       destination => "root",
#       destination => ['root', 'postmaster'],
#     }
#   }
#
define postfix::virtual (
  String                    $destination,
  Variant[String, Array[String]] $destination,
  Stdlib::Absolutepath           $file='/etc/postfix/virtual',
  Enum['present', 'absent']      $ensure='present'
) {
  include ::postfix::augeas

  $dest_sets = [$destination].flatten.map |$i, $d| {
    $idx = $i+1
    "set \$entry/destination[${idx}] '${d}'"
  }

  case $ensure {
    'present': {
      $changes = [
        "set pattern[. = '${name}'] '${name}'",
        # TODO: support more than one destination
        "set pattern[. = '${name}']/destination '${destination}'",
      ]
        "defnode entry pattern[. = '${name}'] '${name}'",
        'rm $entry/destination',
        $dest_sets,
      ].flatten
    }

    'absent': {
+27 −5
Changes for spec/defines/postfix_virtual_spec.rb: 27 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ describe 'postfix::virtual' do

      context 'when sending wrong type for destination' do
        let (:params) { {
          :destination => ['bar'],
          :destination => true,
        } }

        it 'should fail' do
@@ -98,8 +98,9 @@ describe 'postfix::virtual' do
          :incl    => '/etc/postfix/virtual',
          :lens    => 'Postfix_Virtual.lns',
          :changes => [
            "set pattern[. = 'foo'] 'foo'",
            "set pattern[. = 'foo']/destination 'bar'",
            "defnode entry pattern[. = 'foo'] 'foo'",
            "rm $entry/destination",
            "set $entry/destination[1] 'bar'",
          ])
        }
      end
@@ -116,8 +117,29 @@ describe 'postfix::virtual' do
          :incl    => '/tmp/virtual',
          :lens    => 'Postfix_Virtual.lns',
          :changes => [
            "set pattern[. = 'foo'] 'foo'",
            "set pattern[. = 'foo']/destination 'bar'",
            "defnode entry pattern[. = 'foo'] 'foo'",
            "rm $entry/destination",
            "set $entry/destination[1] 'bar'",
          ])
        }
      end

      context 'when passing destination as array' do
        let (:params) { {
          :destination => ['bar', 'baz'],
          :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 => [
            "defnode entry pattern[. = 'foo'] 'foo'",
            "rm $entry/destination",
            "set $entry/destination[1] 'bar'",
            "set $entry/destination[2] 'baz'",
          ])
        }
      end