(#16070) Allow optional order parameter to apt::pin
authorErik Dalén <dalen@spotify.com>
Tue, 21 Aug 2012 21:14:54 +0000 (23:14 +0200)
committerErik Dalén <dalen@spotify.com>
Thu, 23 Aug 2012 09:25:17 +0000 (11:25 +0200)
As the apt pinnings are parsed in ascending alphabetical order with
first match wins within a given scope it is useful to be able to specify
a ordering parameter. Then the name parameter can be kept to something
meaningful.

manifests/pin.pp
spec/defines/pin_spec.rb

index 14df14b5b3f370c8ec7bc7978f535ceb15e28548..96a3d70643455e96b1eb007961d9b674ad99e7bb 100644 (file)
@@ -3,6 +3,7 @@
 
 define apt::pin(
   $ensure     = present,
+  $order      = '',
   $packages   = '*',
   $priority   = 0,
   $release    = '',
@@ -14,6 +15,10 @@ define apt::pin(
 
   $preferences_d = $apt::params::preferences_d
 
+  if $order != '' and !is_integer($order) {
+    fail('Only integers are allowed in the apt::pin order param')
+  }
+
   if $release != '' {
     $pin = "release a=${release}"
   } elsif $origin != '' {
@@ -24,9 +29,13 @@ define apt::pin(
     $pin = "release a=${name}"
   }
 
+  $path = $order ? {
+    ''      => "${preferences_d}/${name}.pref",
+    default => "${preferences_d}/${order}-${name}.pref",
+  }
   file { "${name}.pref":
     ensure  => $ensure,
-    path    => "${preferences_d}/${name}.pref",
+    path    => $path,
     owner   => root,
     group   => root,
     mode    => '0644',
index bfa0126030abdddde3f8802af4ed34f531b97056..cd269d3b8bb11b3deff3831df99be63b5d877da8 100644 (file)
@@ -5,6 +5,7 @@ describe 'apt::pin', :type => :define do
   let :default_params do
     {
       :ensure   => 'present',
+      :order    => '',
       :packages => '*',
       :priority => '0',
       :release  => nil
@@ -16,6 +17,11 @@ describe 'apt::pin', :type => :define do
       :packages  => 'apache',
       :priority  => '1'
     },
+    {
+      :order     => 50,
+      :packages  => 'apache',
+      :priority  => '1'
+    },
     {
       :ensure    => 'absent',
       :packages  => 'apache',
@@ -40,7 +46,7 @@ describe 'apt::pin', :type => :define do
 
       it { should contain_file("#{title}.pref").with({
           'ensure'  => param_hash[:ensure],
-          'path'    => "/etc/apt/preferences.d/#{title}.pref",
+          'path'    => "/etc/apt/preferences.d/#{param_hash[:order] == '' ? "" : "#{param_hash[:order]}-"}#{title}.pref",
           'owner'   => 'root',
           'group'   => 'root',
           'mode'    => '0644',