apt::source: Allow passing in a complex key.
authorDaniele Sluijters <daenney@users.noreply.github.com>
Sat, 28 Feb 2015 17:02:23 +0000 (18:02 +0100)
committerDaniele Sluijters <daenney@users.noreply.github.com>
Sun, 1 Mar 2015 13:40:17 +0000 (14:40 +0100)
Turn `$key` into something that accepts a string or a hash of four keys
representing the different options that can be passed on to `apt::key`.

manifests/params.pp
manifests/source.pp
spec/classes/apt_spec.rb
spec/defines/source_spec.rb

index 2a29b6d1be053a8a33d5fe7f6928c90e8e3ea4b8..8799f7b98e8be829aaa1bd741b042da9a73f8a37 100644 (file)
@@ -51,6 +51,13 @@ class apt::params {
     'preferences.d'  => true,
   }
 
+  $source_key_defaults = {
+    'server'  => $default_keyserver,
+    'options' => undef,
+    'content' => undef,
+    'source'  => undef,
+  }
+
   $file_defaults = {
     'owner' => 'root',
     'group' => 'root',
index 215e4c407eaf5d26c7cec02f854e82ad808b7c65..ea24cbfe442bda3b106571e8222e8f8ba920e872 100644 (file)
@@ -9,20 +9,30 @@ define apt::source(
   $include_src       = false,
   $include_deb       = true,
   $key               = undef,
-  $key_server        = 'keyserver.ubuntu.com',
-  $key_content       = undef,
-  $key_source        = undef,
   $pin               = false,
   $architecture      = undef,
   $trusted_source    = false,
 ) {
-  validate_string($architecture, $comment, $location, $release, $repos, $key_server)
+  validate_string($architecture, $comment, $location, $release, $repos)
   validate_bool($trusted_source, $include_src, $include_deb)
 
   if ! $release {
     fail('lsbdistcodename fact not available: release parameter required')
   }
 
+  $_before = Apt::Setting["list-${title}"]
+
+  if $key {
+    if is_hash($key) {
+      unless $key['id'] {
+        fail('key hash must contain at least an id entry')
+      }
+      $_key = merge($::apt::source_key_defaults, $key)
+    } else {
+      validate_string($key)
+    }
+  }
+
   apt::setting { "list-${name}":
     ensure  => $ensure,
     content => template('apt/_header.erb', 'apt/source.list.erb'),
@@ -36,20 +46,29 @@ define apt::source(
     apt::pin { $name:
       ensure   => $ensure,
       priority => $pin,
-      before   => Apt::Setting["list-${name}"],
+      before   => $_before,
       origin   => $host,
     }
   }
 
   # We do not want to remove keys when the source is absent.
   if $key and ($ensure == 'present') {
-    apt::key { "Add key: ${key} from Apt::Source ${title}":
-      ensure  => present,
-      key     => $key,
-      server  => $key_server,
-      content => $key_content,
-      source  => $key_source,
-      before  => Apt::Setting["list-${name}"],
+    if is_hash($_key) {
+      apt::key { "Add key: ${_key['id']} from Apt::Source ${title}":
+        ensure  => present,
+        id      => $_key['id'],
+        server  => $_key['server'],
+        content => $_key['content'],
+        source  => $_key['source'],
+        options => $_key['options'],
+        before  => $_before,
+      }
+    } else {
+      apt::key { "Add key: ${key} from Apt::Source ${title}":
+        ensure => present,
+        id     => $key,
+        before => $_before,
+      }
     }
   }
 }
index 2de19650610c6db89239c0af86bd586480a48341..9e0598565fe24f0b4998cfc0c5d76906f3c3e91b 100644 (file)
@@ -140,16 +140,14 @@ describe 'apt' do
         'location'          => 'http://debian.mirror.iweb.ca/debian/',
         'release'           => 'unstable',
         'repos'             => 'main contrib non-free',
-        'key'               => '55BE302B',
-        'key_server'        => 'subkeys.pgp.net',
+        'key'               => { 'id' => '55BE302B', 'server' => 'subkeys.pgp.net' },
         'pin'               => '-10',
         'include_src'       => true,
       },
       'puppetlabs' => {
         'location'   => 'http://apt.puppetlabs.com',
         'repos'      => 'main',
-        'key'        => '4BD6EC30',
-        'key_server' => 'pgp.mit.edu',
+        'key'        => { 'id' => '4BD6EC30', 'server' => 'pgp.mit.edu' },
       }
     } } }
 
index f55921b615784a1f9b4db5860e9f22b167278ee1..06363e608cc7d409f1f7802b22bbb20ae9dc737d 100644 (file)
@@ -22,18 +22,19 @@ describe 'apt::source' do
 
     let :params do
       {
-        'include_deb' => false,
-        'include_src' => true,
+        :include_deb => false,
+        :include_src => true,
       }
     end
 
     it { is_expected.to contain_apt__setting('list-my_source').with({
-      'ensure' => 'present',
+      :ensure => 'present',
     }).with_content(/# my_source\ndeb-src  wheezy main\n/)
+
     }
   end
 
-  context 'no defaults' do
+  describe 'no defaults' do
     let :facts do
       {
         :lsbdistid       => 'Debian',
@@ -41,43 +42,112 @@ describe 'apt::source' do
         :osfamily        => 'Debian'
       }
     end
-    let :params do
-      {
-        'comment'           => 'foo',
-        'location'          => 'http://debian.mirror.iweb.ca/debian/',
-        'release'           => 'sid',
-        'repos'             => 'testing',
-        'include_src'       => false,
-        'key'               => GPG_KEY_ID,
-        'key_server'        => 'pgp.mit.edu',
-        'key_content'       => 'GPG key content',
-        'key_source'        => 'http://apt.puppetlabs.com/pubkey.gpg',
-        'pin'               => '10',
-        'architecture'      => 'x86_64',
-        'trusted_source'    => true,
+    context 'with simple key' do
+      let :params do
+        {
+          :comment           => 'foo',
+          :location          => 'http://debian.mirror.iweb.ca/debian/',
+          :release           => 'sid',
+          :repos             => 'testing',
+          :include_src       => false,
+          :key               => GPG_KEY_ID,
+          :pin               => '10',
+          :architecture      => 'x86_64',
+          :trusted_source    => true,
+        }
+      end
+
+      it { is_expected.to contain_apt__setting('list-my_source').with({
+        :ensure => 'present',
+      }).with_content(/# foo\ndeb \[arch=x86_64 trusted=yes\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ sid testing\n/).without_content(/deb-src/)
+      }
+
+      it { is_expected.to contain_apt__pin('my_source').that_comes_before('Apt::Setting[list-my_source]').with({
+        :ensure   => 'present',
+        :priority => '10',
+        :origin   => 'debian.mirror.iweb.ca',
+      })
+      }
+
+      it { is_expected.to contain_apt__key("Add key: #{GPG_KEY_ID} from Apt::Source my_source").that_comes_before('Apt::Setting[list-my_source]').with({
+        :ensure  => 'present',
+        :key     => GPG_KEY_ID,
+      })
       }
     end
 
-    it { is_expected.to contain_apt__setting('list-my_source').with({
-      'ensure' => 'present',
-    }).with_content(/# foo\ndeb \[arch=x86_64 trusted=yes\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ sid testing\n/).without_content(/deb-src/)
-    }
+    context 'with complex key' do
+      let :params do
+        {
+          :comment           => 'foo',
+          :location          => 'http://debian.mirror.iweb.ca/debian/',
+          :release           => 'sid',
+          :repos             => 'testing',
+          :include_src       => false,
+          :key               => { 'id' => GPG_KEY_ID, 'server' => 'pgp.mit.edu',
+                                  'content' => 'GPG key content',
+                                  'source'  => 'http://apt.puppetlabs.com/pubkey.gpg',},
+          :pin               => '10',
+          :architecture      => 'x86_64',
+          :trusted_source    => true,
+        }
+      end
 
-    it { is_expected.to contain_apt__pin('my_source').that_comes_before('Apt::Setting[list-my_source]').with({
-      'ensure'   => 'present',
-      'priority' => '10',
-      'origin'   => 'debian.mirror.iweb.ca',
-    })
-    }
+      it { is_expected.to contain_apt__setting('list-my_source').with({
+        :ensure => 'present',
+      }).with_content(/# foo\ndeb \[arch=x86_64 trusted=yes\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ sid testing\n/).without_content(/deb-src/)
+      }
 
-    it { is_expected.to contain_apt__key("Add key: #{GPG_KEY_ID} from Apt::Source my_source").that_comes_before('Apt::Setting[list-my_source]').with({
-      'ensure'  => 'present',
-      'key'     => GPG_KEY_ID,
-      'server'  => 'pgp.mit.edu',
-      'content' => 'GPG key content',
-      'source'  => 'http://apt.puppetlabs.com/pubkey.gpg',
-    })
-    }
+      it { is_expected.to contain_apt__pin('my_source').that_comes_before('Apt::Setting[list-my_source]').with({
+        :ensure   => 'present',
+        :priority => '10',
+        :origin   => 'debian.mirror.iweb.ca',
+      })
+      }
+
+      it { is_expected.to contain_apt__key("Add key: #{GPG_KEY_ID} from Apt::Source my_source").that_comes_before('Apt::Setting[list-my_source]').with({
+        :ensure  => 'present',
+        :key     => GPG_KEY_ID,
+        :server  => 'pgp.mit.edu',
+        :content => 'GPG key content',
+        :source  => 'http://apt.puppetlabs.com/pubkey.gpg',
+      })
+      }
+    end
+
+    context 'with simple key' do
+      let :params do
+        {
+          :comment        => 'foo',
+          :location       => 'http://debian.mirror.iweb.ca/debian/',
+          :release        => 'sid',
+          :repos          => 'testing',
+          :include_src    => false,
+          :key            => GPG_KEY_ID,
+          :pin            => '10',
+          :architecture   => 'x86_64',
+          :trusted_source => true,
+        }
+      end
+
+      it { is_expected.to contain_apt__setting('list-my_source').with({
+        :ensure => 'present',
+      }).with_content(/# foo\ndeb \[arch=x86_64 trusted=yes\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ sid testing\n/).without_content(/deb-src/)
+      }
+
+      it { is_expected.to contain_apt__pin('my_source').that_comes_before('Apt::Setting[list-my_source]').with({
+        :ensure   => 'present',
+        :priority => '10',
+        :origin   => 'debian.mirror.iweb.ca',
+      })
+      }
+
+      it { is_expected.to contain_apt__key("Add key: #{GPG_KEY_ID} from Apt::Source my_source").that_comes_before('Apt::Setting[list-my_source]').with({
+        :ensure  => 'present',
+        :id      => GPG_KEY_ID,
+      })
+      }
+    end
   end
 
   context 'trusted_source true' do
@@ -90,13 +160,13 @@ describe 'apt::source' do
     end
     let :params do
       {
-        'include_src'    => false,
-        'trusted_source' => true,
+        :include_src    => false,
+        :trusted_source => true,
       }
     end
 
     it { is_expected.to contain_apt__setting('list-my_source').with({
-      'ensure' => 'present',
+      :ensure => 'present',
     }).with_content(/# my_source\ndeb \[trusted=yes\]  wheezy main\n/)
     }
   end
@@ -111,14 +181,14 @@ describe 'apt::source' do
     end
     let :params do
       {
-        'include_deb'  => false,
-        'include_src'  => true,
-        'architecture' => 'x86_64',
+        :include_deb  => false,
+        :include_src  => true,
+        :architecture => 'x86_64',
       }
     end
 
     it { is_expected.to contain_apt__setting('list-my_source').with({
-      'ensure' => 'present',
+      :ensure => 'present',
     }).with_content(/# my_source\ndeb-src \[arch=x86_64 \]  wheezy main\n/)
     }
   end
@@ -133,12 +203,12 @@ describe 'apt::source' do
     end
     let :params do
       {
-        'ensure' => 'absent',
+        :ensure => 'absent',
       }
     end
 
     it { is_expected.to contain_apt__setting('list-my_source').with({
-      'ensure' => 'absent'
+      :ensure => 'absent'
     })
     }
   end