diff --git a/manifests/source.pp b/manifests/source.pp index 163a411..24d0ae4 100644 --- a/manifests/source.pp +++ b/manifests/source.pp @@ -8,7 +8,7 @@ define apt::source( $repos = 'main', $include = {}, $key = undef, - $pin = false, + $pin = undef, $architecture = undef, $allow_unsigned = false, ) { @@ -44,17 +44,22 @@ define apt::source( content => template('apt/_header.erb', 'apt/source.list.erb'), } - if ($pin != false) { - # Get the host portion out of the url so we can pin to origin - $url_split = split($location, '/') - $host = $url_split[2] - - apt::pin { $name: - ensure => $ensure, - priority => $pin, - before => $_before, - origin => $host, + if $pin { + if is_hash($pin) { + $_pin = merge($pin, { 'ensure' => $ensure, 'before' => $_before }) + } elsif (is_numeric($pin) or is_string($pin)) { + $url_split = split($location, '/') + $host = $url_split[2] + $_pin = { + 'ensure' => $ensure, + 'priority' => $pin, + 'before' => $_before, + 'origin' => $host, + } + } else { + fail('Received invalid value for pin parameter') } + create_resources('apt::pin', { $name => $_pin }) } # We do not want to remove keys when the source is absent. diff --git a/spec/defines/source_spec.rb b/spec/defines/source_spec.rb index 7fd86b5..3900158 100644 --- a/spec/defines/source_spec.rb +++ b/spec/defines/source_spec.rb @@ -51,6 +51,31 @@ describe 'apt::source' do :osfamily => 'Debian' } end + + context 'with complex pin' do + let :params do + { + :location => 'hello.there', + :pin => { 'release' => 'wishwash', + 'explanation' => 'wishwash', + 'priority' => 1001, }, + } + end + + it { is_expected.to contain_apt__setting('list-my_source').with({ + :ensure => 'present', + }).with_content(/hello.there wheezy main\n/) + } + + it { is_expected.to contain_apt__pin('my_source').that_comes_before('Apt::Setting[list-my_source]').with({ + :ensure => 'present', + :priority => 1001, + :explanation => 'wishwash', + :release => 'wishwash', + }) + } + end + context 'with simple key' do let :params do { @@ -235,5 +260,28 @@ describe 'apt::source' do }.to raise_error(Puppet::Error, /lsbdistcodename fact not available: release parameter required/) end end + + context 'invalid pin' do + let :facts do + { + :lsbdistid => 'Debian', + :lsbdistcodename => 'wheezy', + :osfamily => 'Debian' + } + end + let :params do + { + :location => 'hello.there', + :pin => true, + } + end + + it do + expect { + is_expected.to compile + }.to raise_error(Puppet::Error, /invalid value for pin/) + end + end + end end