Merge remote-tracking branch 'upstream/1.5.x'
authorMorgan Haskel <morgan@puppetlabs.com>
Fri, 25 Jul 2014 15:53:53 +0000 (11:53 -0400)
committerMorgan Haskel <morgan@puppetlabs.com>
Fri, 25 Jul 2014 15:53:53 +0000 (11:53 -0400)
31 files changed:
.gitignore
.sync.yml [new file with mode: 0644]
.travis.yml
CONTRIBUTING.md [new file with mode: 0644]
Gemfile
README.md
lib/facter/apt_package_updates.rb [new file with mode: 0644]
lib/facter/apt_security_updates.rb [new file with mode: 0644]
lib/facter/apt_updates.rb [new file with mode: 0644]
lib/puppet/provider/apt_key/apt_key.rb
lib/puppet/type/apt_key.rb
manifests/init.pp
manifests/key.pp
manifests/params.pp
manifests/pin.pp
manifests/source.pp
spec/acceptance/apt_key_provider_spec.rb
spec/acceptance/apt_spec.rb
spec/acceptance/nodesets/centos-59-x64.yml [new file with mode: 0644]
spec/acceptance/nodesets/centos-64-x64-pe.yml [new file with mode: 0644]
spec/acceptance/nodesets/centos-65-x64.yml [new file with mode: 0644]
spec/acceptance/nodesets/ubuntu-server-10044-x64.yml
spec/acceptance/nodesets/ubuntu-server-12042-x64.yml
spec/classes/unattended_upgrades_spec.rb
spec/defines/key_spec.rb
spec/defines/source_spec.rb
spec/spec.opts [new file with mode: 0644]
spec/unit/facter/apt_package_updates_spec.rb [new file with mode: 0644]
spec/unit/facter/apt_security_updates_spec.rb [new file with mode: 0644]
spec/unit/facter/apt_updates_spec.rb [new file with mode: 0644]
templates/source.list.erb

index b77434bea0792513cdff50c8759df47957f77965..b5b7a00d67a1c996abfcbb460a9d59f23d1a1f0e 100644 (file)
@@ -1,4 +1,7 @@
-*.swp
 pkg/
 Gemfile.lock
-spec/fixtures/manifests
+vendor/
+spec/fixtures/
+.vagrant/
+.bundle/
+coverage/
diff --git a/.sync.yml b/.sync.yml
new file mode 100644 (file)
index 0000000..ed97d53
--- /dev/null
+++ b/.sync.yml
@@ -0,0 +1 @@
+---
index b9abaccc41b0b7d5d9c806d3c4cd3d82658a9cb8..a40ae502e961b7c077a828bf8601c13b8d2fe5fc 100644 (file)
@@ -1,19 +1,17 @@
 ---
-branches:
-  only:
-    - master
 language: ruby
 bundler_args: --without development
-script: bundle exec rake spec SPEC_OPTS='--format documentation'
-rvm:
-  - 1.8.7
-  - 1.9.3
-  - 2.0.0
-env:
-  matrix:
-    - PUPPET_GEM_VERSION="~> 3.4.0"
-    - PUPPET_GEM_VERSION="~> 3.5.0"
+script: "bundle exec rake validate && bundle exec rake lint && bundle exec rake spec SPEC_OPTS='--format documentation'"
 matrix:
   fast_finish: true
+  include:
+  - rvm: 1.8.7
+    env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.6.0"
+  - rvm: 1.8.7
+    env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.7.0"
+  - rvm: 1.9.3
+    env: PUPPET_GEM_VERSION="~> 3.0"
+  - rvm: 2.0.0
+    env: PUPPET_GEM_VERSION="~> 3.0"
 notifications:
   email: false
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..e128847
--- /dev/null
@@ -0,0 +1,234 @@
+Checklist (and a short version for the impatient)
+=================================================
+
+  * Commits:
+
+    - Make commits of logical units.
+
+    - Check for unnecessary whitespace with "git diff --check" before
+      committing.
+
+    - Commit using Unix line endings (check the settings around "crlf" in
+      git-config(1)).
+
+    - Do not check in commented out code or unneeded files.
+
+    - The first line of the commit message should be a short
+      description (50 characters is the soft limit, excluding ticket
+      number(s)), and should skip the full stop.
+
+    - Associate the issue in the message. The first line should include
+      the issue number in the form "(#XXXX) Rest of message".
+
+    - The body should provide a meaningful commit message, which:
+
+      - uses the imperative, present tense: "change", not "changed" or
+        "changes".
+
+      - includes motivation for the change, and contrasts its
+        implementation with the previous behavior.
+
+    - Make sure that you have tests for the bug you are fixing, or
+      feature you are adding.
+
+    - Make sure the test suites passes after your commit:
+      `bundle exec rspec spec/acceptance` More information on [testing](#Testing) below
+
+    - When introducing a new feature, make sure it is properly
+      documented in the README.md
+
+  * Submission:
+
+    * Pre-requisites:
+
+      - Sign the [Contributor License Agreement](https://cla.puppetlabs.com/)
+
+      - Make sure you have a [GitHub account](https://github.com/join)
+
+      - [Create a ticket](http://projects.puppetlabs.com/projects/modules/issues/new), or [watch the ticket](http://projects.puppetlabs.com/projects/modules/issues) you are patching for.
+
+    * Preferred method:
+
+      - Fork the repository on GitHub.
+
+      - Push your changes to a topic branch in your fork of the
+        repository. (the format ticket/1234-short_description_of_change is
+        usually preferred for this project).
+
+      - Submit a pull request to the repository in the puppetlabs
+        organization.
+
+The long version
+================
+
+  1.  Make separate commits for logically separate changes.
+
+      Please break your commits down into logically consistent units
+      which include new or changed tests relevant to the rest of the
+      change.  The goal of doing this is to make the diff easier to
+      read for whoever is reviewing your code.  In general, the easier
+      your diff is to read, the more likely someone will be happy to
+      review it and get it into the code base.
+
+      If you are going to refactor a piece of code, please do so as a
+      separate commit from your feature or bug fix changes.
+
+      We also really appreciate changes that include tests to make
+      sure the bug is not re-introduced, and that the feature is not
+      accidentally broken.
+
+      Describe the technical detail of the change(s).  If your
+      description starts to get too long, that is a good sign that you
+      probably need to split up your commit into more finely grained
+      pieces.
+
+      Commits which plainly describe the things which help
+      reviewers check the patch and future developers understand the
+      code are much more likely to be merged in with a minimum of
+      bike-shedding or requested changes.  Ideally, the commit message
+      would include information, and be in a form suitable for
+      inclusion in the release notes for the version of Puppet that
+      includes them.
+
+      Please also check that you are not introducing any trailing
+      whitespace or other "whitespace errors".  You can do this by
+      running "git diff --check" on your changes before you commit.
+
+  2.  Sign the Contributor License Agreement
+
+      Before we can accept your changes, we do need a signed Puppet
+      Labs Contributor License Agreement (CLA).
+
+      You can access the CLA via the [Contributor License Agreement link](https://cla.puppetlabs.com/)
+
+      If you have any questions about the CLA, please feel free to
+      contact Puppet Labs via email at cla-submissions@puppetlabs.com.
+
+  3.  Sending your patches
+
+      To submit your changes via a GitHub pull request, we _highly_
+      recommend that you have them on a topic branch, instead of
+      directly on "master".
+      It makes things much easier to keep track of, especially if
+      you decide to work on another thing before your first change
+      is merged in.
+
+      GitHub has some pretty good
+      [general documentation](http://help.github.com/) on using
+      their site.  They also have documentation on
+      [creating pull requests](http://help.github.com/send-pull-requests/).
+
+      In general, after pushing your topic branch up to your
+      repository on GitHub, you can switch to the branch in the
+      GitHub UI and click "Pull Request" towards the top of the page
+      in order to open a pull request.
+
+
+  4.  Update the related GitHub issue.
+
+      If there is a GitHub issue associated with the change you
+      submitted, then you should update the ticket to include the
+      location of your branch, along with any other commentary you
+      may wish to make.
+
+Testing
+=======
+
+Getting Started
+---------------
+
+Our puppet modules provide [`Gemfile`](./Gemfile)s which can tell a ruby
+package manager such as [bundler](http://bundler.io/) what Ruby packages,
+or Gems, are required to build, develop, and test this software.
+
+Please make sure you have [bundler installed](http://bundler.io/#getting-started)
+on your system, then use it to install all dependencies needed for this project,
+by running
+
+```shell
+% bundle install
+Fetching gem metadata from https://rubygems.org/........
+Fetching gem metadata from https://rubygems.org/..
+Using rake (10.1.0)
+Using builder (3.2.2)
+-- 8><-- many more --><8 --
+Using rspec-system-puppet (2.2.0)
+Using serverspec (0.6.3)
+Using rspec-system-serverspec (1.0.0)
+Using bundler (1.3.5)
+Your bundle is complete!
+Use `bundle show [gemname]` to see where a bundled gem is installed.
+```
+
+NOTE some systems may require you to run this command with sudo.
+
+If you already have those gems installed, make sure they are up-to-date:
+
+```shell
+% bundle update
+```
+
+With all dependencies in place and up-to-date we can now run the tests:
+
+```shell
+% rake spec
+```
+
+This will execute all the [rspec tests](http://rspec-puppet.com/) tests
+under [spec/defines](./spec/defines), [spec/classes](./spec/classes),
+and so on. rspec tests may have the same kind of dependencies as the
+module they are testing. While the module defines in its [Modulefile](./Modulefile),
+rspec tests define them in [.fixtures.yml](./fixtures.yml).
+
+Some puppet modules also come with [beaker](https://github.com/puppetlabs/beaker)
+tests. These tests spin up a virtual machine under
+[VirtualBox](https://www.virtualbox.org/)) with, controlling it with
+[Vagrant](http://www.vagrantup.com/) to actually simulate scripted test
+scenarios. In order to run these, you will need both of those tools
+installed on your system.
+
+You can run them by issuing the following command
+
+```shell
+% rake spec_clean
+% rspec spec/acceptance
+```
+
+This will now download a pre-fabricated image configured in the [default node-set](./spec/acceptance/nodesets/default.yml),
+install puppet, copy this module and install its dependencies per [spec/spec_helper_acceptance.rb](./spec/spec_helper_acceptance.rb)
+and then run all the tests under [spec/acceptance](./spec/acceptance).
+
+Writing Tests
+-------------
+
+XXX getting started writing tests.
+
+If you have commit access to the repository
+===========================================
+
+Even if you have commit access to the repository, you will still need to
+go through the process above, and have someone else review and merge
+in your changes.  The rule is that all changes must be reviewed by a
+developer on the project (that did not write the code) to ensure that
+all changes go through a code review process.
+
+Having someone other than the author of the topic branch recorded as
+performing the merge is the record that they performed the code
+review.
+
+
+Additional Resources
+====================
+
+* [Getting additional help](http://projects.puppetlabs.com/projects/puppet/wiki/Getting_Help)
+
+* [Writing tests](http://projects.puppetlabs.com/projects/puppet/wiki/Development_Writing_Tests)
+
+* [Patchwork](https://patchwork.puppetlabs.com)
+
+* [Contributor License Agreement](https://projects.puppetlabs.com/contributor_licenses/sign)
+
+* [General GitHub documentation](http://help.github.com/)
+
+* [GitHub pull request documentation](http://help.github.com/send-pull-requests/)
+
diff --git a/Gemfile b/Gemfile
index 78cf9f43760eee2921c2927b6ef1a55f4ecd687c..e960f7c4b7855406a5c684d7830c74963ef3e7de 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,15 +1,21 @@
-source ENV['GEM_SOURCE'] || 'https://rubygems.org'
+source ENV['GEM_SOURCE'] || "https://rubygems.org"
 
 group :development, :test do
-  gem 'rake', '10.1.1',          :require => false
-  gem 'rspec', '~> 2.11',        :require => false
-  gem 'pry',                     :require => false
+  gem 'rake',                    :require => false
   gem 'rspec-puppet',            :require => false
-  gem 'puppet-lint',             :require => false
   gem 'puppetlabs_spec_helper',  :require => false
   gem 'serverspec',              :require => false
+  gem 'puppet-lint',             :require => false
   gem 'beaker',                  :require => false
   gem 'beaker-rspec',            :require => false
+  gem 'pry',                     :require => false
+  gem 'simplecov',               :require => false
+end
+
+if facterversion = ENV['FACTER_GEM_VERSION']
+  gem 'facter', facterversion, :require => false
+else
+  gem 'facter', :require => false
 end
 
 if puppetversion = ENV['PUPPET_GEM_VERSION']
@@ -17,3 +23,5 @@ if puppetversion = ENV['PUPPET_GEM_VERSION']
 else
   gem 'puppet', :require => false
 end
+
+# vim:ft=ruby
index 9443cd561d6160c94a4c57bb548cda1341ddd927..0749cb85af247cb6b784fb3a512fee343c9cfbd8 100644 (file)
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ To begin using the APT module with default parameters, declare the class
 
     include apt
 
-Puppet code that uses anything from the APT module requires that the core apt class be declared/\s\+$//e
+Puppet code that uses anything from the APT module requires that the core apt class be declared.
 
 Usage
 -----
@@ -54,7 +54,8 @@ The parameters for `apt` are not required in general and are predominantly for d
       purge_sources_list   => false,
       purge_sources_list_d => false,
       purge_preferences_d  => false,
-      update_timeout       => undef
+      update_timeout       => undef,
+      fancy_progress       => undef
     }
 
 Puppet will manage your system's `sources.list` file and `sources.list.d` directory but will do its best to respect existing content.
@@ -193,6 +194,7 @@ Sets the default apt release. This class is particularly useful when using repos
 Adds an apt source to `/etc/apt/sources.list.d/`.
 
     apt::source { 'debian_unstable':
+      comment           => 'This is the iWeb Debian unstable mirror',
       location          => 'http://debian.mirror.iweb.ca/debian/',
       release           => 'unstable',
       repos             => 'main contrib non-free',
@@ -212,6 +214,13 @@ If you would like to configure your system so the source is the Puppet Labs APT
       key_server => 'pgp.mit.edu',
     }
 
+### Facts
+
+There are a few facts included within the apt module describing the state of the apt system:
+
+* `apt_updates` - the number of updates available on the system
+* `apt_security_updates` - the number of updates which are security updates
+* `apt_package_updates` - the package names that are available for update. On Facter 2.0 and newer this will be a list type, in earlier versions it is a comma delimitered string.
 
 #### Hiera example
 <pre>
diff --git a/lib/facter/apt_package_updates.rb b/lib/facter/apt_package_updates.rb
new file mode 100644 (file)
index 0000000..97c75c6
--- /dev/null
@@ -0,0 +1,13 @@
+Facter.add("apt_package_updates") do
+  confine :osfamily => 'Debian'
+  setcode do
+    if File.executable?("/usr/lib/update-notifier/apt-check")
+      packages = Facter::Util::Resolution.exec('/usr/lib/update-notifier/apt-check -p 2>&1')
+      packages = packages.split("\n")
+      if Facter.version < '2.0.0'
+        packages = packages.join(',')
+      end
+      packages
+    end
+  end
+end
diff --git a/lib/facter/apt_security_updates.rb b/lib/facter/apt_security_updates.rb
new file mode 100644 (file)
index 0000000..19bae75
--- /dev/null
@@ -0,0 +1,9 @@
+Facter.add("apt_security_updates") do
+  confine :osfamily => 'Debian'
+  setcode do
+    if File.executable?("/usr/lib/update-notifier/apt-check")
+      updates = Facter::Util::Resolution.exec('/usr/lib/update-notifier/apt-check 2>&1')
+      Integer(updates.strip.split(';')[1])
+    end
+  end
+end
diff --git a/lib/facter/apt_updates.rb b/lib/facter/apt_updates.rb
new file mode 100644 (file)
index 0000000..ee17738
--- /dev/null
@@ -0,0 +1,9 @@
+Facter.add("apt_updates") do
+  confine :osfamily => 'Debian'
+  setcode do
+    if File.executable?("/usr/lib/update-notifier/apt-check")
+      updates = Facter::Util::Resolution.exec('/usr/lib/update-notifier/apt-check 2>&1')
+      Integer(updates.strip.split(';')[0])
+    end
+  end
+end
index f8d40728b04a13727d32f1ede6cd2eebe4eb52ac..e5020fe27dd0647702dba262c62b2df3eaa28033 100644 (file)
@@ -26,7 +26,12 @@ Puppet::Type.type(:apt_key).provide(:apt_key) do
   commands   :apt_key  => 'apt-key'
 
   def self.instances
-    key_array = apt_key('list').split("\n").collect do |line|
+    if RUBY_VERSION > '1.8.7'
+      key_output = apt_key('list').encode('UTF-8', 'binary', :invalid => :replace, :undef => :replace, :replace => '')
+    else
+      key_output = apt_key('list')
+    end
+    key_array = key_output.split("\n").collect do |line|
       line_hash = key_line_hash(line)
       next unless line_hash
       expired = false
index fa7b0c676c77e2c4c1d48eeaa37a1cd677a27076..e2cb8d9cf92695dded9d331b627dc7759abc9092 100644 (file)
@@ -60,10 +60,10 @@ Puppet::Type.newtype(:apt_key) do
   end
 
   newparam(:server) do
-    desc 'The key server to fetch the key from based on the ID.'
+    desc 'The key server to fetch the key from based on the ID. It can either be a domain name or url.'
     defaultto :'keyserver.ubuntu.com'
-    # Need to validate this, preferably through stdlib is_fqdn
-    # but still working on getting to that.
+    
+    newvalues(/\A((hkp|http|https):\/\/)?([a-z\d])([a-z\d-]{0,61}\.)+[a-z\d]+(:\d{2,4})?$/)
   end
 
   newparam(:keyserver_options) do
index 5f5d0ac49f839f5c76b9444dbd9cd44b159c80db..597774c8338775a56e1e64c1d3a03ffe8ceb59ce 100644 (file)
@@ -36,7 +36,8 @@ class apt(
   $purge_preferences_d  = false,
   $update_timeout       = undef,
   $update_tries         = undef,
-  $sources              = undef
+  $sources              = undef,
+  $fancy_progress       = undef
 ) {
 
   if $::osfamily != 'Debian' {
@@ -102,6 +103,24 @@ class apt(
     recurse => $purge_preferences_d,
   }
 
+  case $fancy_progress {
+    true: {
+      file { '99progressbar':
+        ensure  => present,
+        content => 'Dpkg::Progress-Fancy "1";',
+        path    => "${apt_conf_d}/99progressbar",
+      }
+    }
+    false: {
+      file { '99progressbar':
+        ensure  => absent,
+        path    => "${apt_conf_d}/99progressbar",
+      }
+    }
+    undef: {} # do nothing
+    default: { fail('Valid values for fancy_progress are true or false') }
+  }
+
   case $disable_keys {
     true: {
       file { '99unauth':
index 9ccbfcb6bbf6990a426f8664904a134f407fcc4f..8d3bcf045c58f59df310046853e646b0c538191a 100644 (file)
@@ -39,7 +39,8 @@
 # [*key_server*]
 #   _default_: +undef+
 #
-#   The keyserver from where to fetch our GPG key. It defaults to
+#   The keyserver from where to fetch our GPG key. It can either be a domain
+#   name or url. It defaults to
 #   undef which results in apt_key's default keyserver being used,
 #   currently +keyserver.ubuntu.com+.
 #
@@ -68,9 +69,7 @@ define apt::key (
   }
 
   if $key_server {
-    if !is_domain_name($key_server) {
-      fail('$key_server must be a valid domain name')
-    }
+    validate_re($key_server,['\A((hkp|http|https):\/\/)?([a-z\d])([a-z\d-]{0,61}\.)+[a-z\d]+(:\d{2,4})?$'])
   }
 
   if $key_options {
index 4e974ba48b894efea81590aa94b1b2432f1600c9..f635b5801cd98889582d19c088f6923a2708ace0 100644 (file)
@@ -12,7 +12,8 @@ class apt::params {
           $backports_location = 'http://backports.debian.org/debian-backports'
           $legacy_origin       = true
           $origins             = ['${distro_id} oldstable',
-                                  '${distro_id} ${distro_codename}-security']
+                                  '${distro_id} ${distro_codename}-security',
+                                  '${distro_id} ${distro_codename}-lts']
         }
         'wheezy': {
           $backports_location = 'http://ftp.debian.org/debian/'
index 2563fc468176d8c62844654a435c5f0eb7ec7de1..2ce81fd6bb292fce2eae61e60bf82b2e01bfa048 100644 (file)
@@ -64,10 +64,6 @@ define apt::pin(
 
   }
 
-  $path = $order ? {
-    ''      => "${preferences_d}/${name}.pref",
-    default => "${preferences_d}/${order}-${name}.pref",
-  }
 
   # According to man 5 apt_preferences:
   # The files have either no or "pref" as filename extension
@@ -78,6 +74,10 @@ define apt::pin(
   # be silently ignored.
   $file_name = regsubst($title, '[^0-9a-z\-_\.]', '_', 'IG')
 
+  $path = $order ? {
+    ''      => "${preferences_d}/${file_name}.pref",
+    default => "${preferences_d}/${order}-${file_name}.pref",
+  }
   file { "${file_name}.pref":
     ensure  => $ensure,
     path    => $path,
index 196fc925866435dec0a3b038c8b65054542ea84e..dd00adc6a4e62a6943cc5f0368596bd4d7c7ff4d 100644 (file)
@@ -2,6 +2,7 @@
 # add an apt source
 
 define apt::source(
+  $comment           = $name,
   $ensure            = present,
   $location          = '',
   $release           = 'UNDEF',
index 0a314959577c953ed7b99a8a3519de4c2986ce57..d9c2c0d7518c8534b8c89e12933926277124e2cf 100644 (file)
@@ -192,6 +192,22 @@ ugVIB2pi+8u84f+an4Hml4xlyijgYu05pqNvnLRyJDLd61hviLC8GYU=
       end
     end
 
+    context 'hkp://pgp.mit.edu:80' do
+      it 'works' do
+        pp = <<-EOS
+        apt_key { 'puppetlabs':
+          id     => '#{PUPPETLABS_GPG_KEY_ID}',
+          ensure => 'present',
+          server => 'hkp://pgp.mit.edu:80',
+        }
+        EOS
+
+        apply_manifest(pp, :catch_failures => true)
+        expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
+        shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
+      end
+    end
+
     context 'nonexistant.key.server' do
       it 'fails' do
         pp = <<-EOS
@@ -207,6 +223,22 @@ ugVIB2pi+8u84f+an4Hml4xlyijgYu05pqNvnLRyJDLd61hviLC8GYU=
         end
       end
     end
+
+    context 'key server start with dot' do
+      it 'fails' do
+        pp = <<-EOS
+        apt_key { 'puppetlabs':
+          id     => '#{PUPPETLABS_GPG_KEY_ID}',
+          ensure => 'present',
+          server => '.pgp.key.server',
+        }
+        EOS
+
+        apply_manifest(pp, :expect_failures => true) do |r|
+          expect(r.stderr).to match(/Invalid value \".pgp.key.server\"/)
+        end
+      end
+    end
   end
 
   describe 'source =>' do
index 13f1d50536c036100fef5d28f75295ff16b3da28..60def0e1544cd6ff86bc982bd36f6e25dc8d5b3d 100644 (file)
@@ -271,6 +271,34 @@ describe 'apt class', :unless => UNSUPPORTED_PLATFORMS.include?(fact('osfamily')
     end
   end
 
+  context 'fancy_progress => true' do
+    it 'should work with no errors' do
+      pp = <<-EOS
+      class { 'apt': fancy_progress => true }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true)
+    end
+
+    describe file('/etc/apt/apt.conf.d/99progressbar') do
+      it { should be_file }
+      it { should contain 'Dpkg::Progress-Fancy "1";' }
+    end
+  end
+  context 'fancy_progress => false' do
+    it 'should work with no errors' do
+      pp = <<-EOS
+      class { 'apt': fancy_progress => false }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true)
+    end
+
+    describe file('/etc/apt/apt.conf.d/99progressbar') do
+      it { should_not be_file }
+    end
+  end
+
   context 'reset' do
     it 'fixes the sources.list' do
       shell('cp /tmp/sources.list /etc/apt')
diff --git a/spec/acceptance/nodesets/centos-59-x64.yml b/spec/acceptance/nodesets/centos-59-x64.yml
new file mode 100644 (file)
index 0000000..2ad90b8
--- /dev/null
@@ -0,0 +1,10 @@
+HOSTS:
+  centos-59-x64:
+    roles:
+      - master
+    platform: el-5-x86_64
+    box : centos-59-x64-vbox4210-nocm
+    box_url : http://puppet-vagrant-boxes.puppetlabs.com/centos-59-x64-vbox4210-nocm.box
+    hypervisor : vagrant
+CONFIG:
+  type: git
diff --git a/spec/acceptance/nodesets/centos-64-x64-pe.yml b/spec/acceptance/nodesets/centos-64-x64-pe.yml
new file mode 100644 (file)
index 0000000..7d9242f
--- /dev/null
@@ -0,0 +1,12 @@
+HOSTS:
+  centos-64-x64:
+    roles:
+      - master
+      - database
+      - dashboard
+    platform: el-6-x86_64
+    box : centos-64-x64-vbox4210-nocm
+    box_url : http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210-nocm.box
+    hypervisor : vagrant
+CONFIG:
+  type: pe
diff --git a/spec/acceptance/nodesets/centos-65-x64.yml b/spec/acceptance/nodesets/centos-65-x64.yml
new file mode 100644 (file)
index 0000000..4e2cb80
--- /dev/null
@@ -0,0 +1,10 @@
+HOSTS:
+  centos-65-x64:
+    roles:
+      - master
+    platform: el-6-x86_64
+    box : centos-65-x64-vbox436-nocm
+    box_url : http://puppet-vagrant-boxes.puppetlabs.com/centos-65-x64-virtualbox-nocm.box
+    hypervisor : vagrant
+CONFIG:
+  type: foss
index c1b8bdf8fa9263aff50eb3a575a3dcf381844aa9..5ca1514e4073ed42d4d6be289b76f774dfb50f46 100644 (file)
@@ -7,5 +7,4 @@ HOSTS:
     box_url : http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-server-10044-x64-vbox4210-nocm.box
     hypervisor : vagrant
 CONFIG:
-  log_level: debug
-  type: git
+  type: foss
index a5f38f784c8a9634c5adddb8a6138b34a9c2a73f..d065b304f831a196852757c59b1bb14665990199 100644 (file)
@@ -2,7 +2,7 @@ HOSTS:
   ubuntu-server-12042-x64:
     roles:
       - master
-    platform: ubuntu-server-12.04-amd64
+    platform: ubuntu-12.04-amd64
     box : ubuntu-server-12042-x64-vbox4210-nocm
     box_url : http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-server-12042-x64-vbox4210-nocm.box
     hypervisor : vagrant
index a2fb48b12600e5bc0e3fbc6a43a5e22fa1c8c8d1..8494f0410d9b6f7631721673e7314e69857aea72 100644 (file)
@@ -60,6 +60,8 @@ describe 'apt::unattended_upgrades', :type => :class do
         it {
           should contain_file(file_unattended).with_content(
             /^Unattended-Upgrade::Allowed-Origins/
+          ).with_content(
+            /"\${distro_id} \${distro_codename}-lts";/
           ).with_content(
             /"\${distro_id} \${distro_codename}-security";/
           ).with_content(
index a85d1710b4e565b7f5bfdf33c19a7ab51791a460..005c95e4698ab6c426186e4d23b39e8fc4a92cc3 100644 (file)
@@ -142,31 +142,159 @@ describe 'apt::key', :type => :define do
     end
 
     describe 'key_server =>' do
-      let :params do {
-        :key_server => 'pgp.mit.edu',
-      } end
+       context 'domain name' do
+        let :params do {
+          :key_server => 'pgp.mit.edu',
+       } end
 
-      it 'contains the apt::key' do
-        should contain_apt__key(title).with({
-          :key         => title,
-          :ensure      => 'present',
-          :key_server  => 'pgp.mit.edu',
-        })
+       it 'contains the apt::key' do
+          should contain_apt__key(title).with({
+            :key         => title,
+            :ensure      => 'present',
+            :key_server  => 'pgp.mit.edu',
+          })
+       end
+       it 'contains the apt_key' do
+          should contain_apt_key(title).with({
+            :id                => title,
+            :ensure            => 'present',
+            :source            => nil,
+            :server            => params[:key_server],
+            :content           => nil,
+            :keyserver_options => nil,
+          })
+       end
+       it 'contains the apt_key present anchor' do
+          should contain_anchor("apt_key #{title} present")
+       end
+                       end
+
+      context "domain with dash" do
+        let(:params) do{
+          :key_server => 'p-gp.m-it.edu',
+        } end
+        it "should contain apt::key" do
+          should contain_apt__key(title).with({
+            :key        => title,
+            :ensure     => 'present',
+            :key_server => 'p-gp.m-it.edu',
+          })
+        end
       end
-      it 'contains the apt_key' do
-        should contain_apt_key(title).with({
-          :id                => title,
-          :ensure            => 'present',
-          :source            => nil,
-          :server            => params[:key_server],
-          :content           => nil,
-          :keyserver_options => nil,
-        })
+
+      context "domain begin with dash" do
+        let(:params) do{
+          :key_server => '-pgp.mit.edu',
+        } end
+        it 'fails' do
+          expect { subject } .to raise_error(/does not match/)
+        end
       end
-      it 'contains the apt_key present anchor' do
-        should contain_anchor("apt_key #{title} present")
+
+      context "domain begin with dot" do
+        let(:params) do{
+          :key_server => '.pgp.mit.edu',
+        } end
+        it 'fails' do
+          expect { subject } .to raise_error(/does not match/)
+        end
       end
-    end
+
+      context "domain end with dot" do
+        let(:params) do{
+          :key_server => "pgp.mit.edu.",
+        } end
+        it 'fails' do
+          expect { subject } .to raise_error(/does not match/)
+        end
+      end
+
+      context "url" do
+        let (:params) do{
+          :key_server => 'hkp://pgp.mit.edu',
+        } end
+        it "should contain apt::key" do
+         should contain_apt__key(title).with({
+           :key         => title,
+           :ensure      => 'present',
+           :key_server  => 'hkp://pgp.mit.edu',
+         })
+        end
+      end
+      context "url with port number" do
+        let (:params) do{
+          :key_server => 'hkp://pgp.mit.edu:80',
+        } end
+        it "should contain apt::key" do
+         should contain_apt__key(title).with({
+            :key        => title,
+            :ensure     => 'present',
+            :key_server => 'hkp://pgp.mit.edu:80',
+         })
+        end
+      end
+
+      context "incorrect port number url" do
+        let (:params) do{
+          :key_server => 'hkp://pgp.mit.edu:8008080'
+        } end
+        it 'fails' do
+          expect { subject }.to raise_error(/does not match/)
+        end
+      end
+      context "incorrect protocol for  url" do
+        let (:params) do{
+          :key_server => 'abc://pgp.mit.edu:80'
+        } end
+        it 'fails' do
+          expect { subject }.to raise_error(/does not match/)
+        end
+      end
+      context "missing port number url" do
+        let (:params) do{
+          :key_server => 'hkp://pgp.mit.edu:'
+        } end
+        it 'fails' do
+          expect { subject }.to raise_error(/does not match/)
+        end
+      end
+      context "url ending with a dot" do
+        let (:params) do{
+          :key_server => 'hkp://pgp.mit.edu.'
+        } end
+        it 'fails' do
+          expect { subject }.to raise_error(/does not match/)
+        end
+      end
+      context "url begin with a dash" do
+        let(:params) do{
+          :key_server => "hkp://-pgp.mit.edu",
+        } end
+        it 'fails' do
+          expect { subject }.to raise_error(/does not match/)
+        end
+      end
+      context "url with dash" do
+        let(:params) do{
+          :key_server => 'hkp://p-gp.m-it.edu',
+        } end
+        it "should contain apt::key" do
+          should contain_apt__key(title).with({
+            :key        => title,
+            :ensure     => 'present',
+            :key_server => 'hkp://p-gp.m-it.edu',
+          })
+        end
+      end
+      context "exceed characher url" do
+        let (:params) do{
+          :key_server => 'hkp://pgpiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.mit.edu'
+        } end
+        it 'fails' do
+          expect { subject }.to raise_error(/does not match/)
+        end
+      end
+               end
 
     describe 'key_options =>' do
       let :params do {
@@ -229,7 +357,7 @@ describe 'apt::key', :type => :define do
         :key_server => 'two bottles of rum',
       } end
       it 'fails' do
-        expect { subject }.to raise_error(/must be a valid domain name/)
+        expect { subject }.to raise_error(/does not match/)
       end
     end
 
index 34b394282fd4df1d8c6011fcf479a4370e629570..7c7ae399e84768fe3d51daca47c67a49c35b8855 100644 (file)
@@ -74,7 +74,12 @@ describe 'apt::source', :type => :define do
       end
 
       let :content do
-        content = "# #{title}"
+        content = "#file generated by puppet\n"
+       if param_hash[:comment]
+         content << "# #{comment}"
+       else
+         content << "# #{title}"
+       end
         if param_hash[:architecture]
           arch = "[arch=#{param_hash[:architecture]}] "
         end
diff --git a/spec/spec.opts b/spec/spec.opts
new file mode 100644 (file)
index 0000000..91cd642
--- /dev/null
@@ -0,0 +1,6 @@
+--format
+s
+--colour
+--loadby
+mtime
+--backtrace
diff --git a/spec/unit/facter/apt_package_updates_spec.rb b/spec/unit/facter/apt_package_updates_spec.rb
new file mode 100644 (file)
index 0000000..dfa0927
--- /dev/null
@@ -0,0 +1,29 @@
+require 'spec_helper'
+
+describe 'apt_package_updates fact' do
+  subject { Facter.fact(:apt_package_updates).value }
+  after(:each) { Facter.clear }
+
+  describe 'on Debian based distro missing update-notifier-common' do
+    before { 
+    Facter.fact(:osfamily).stubs(:value).returns 'Debian'
+    File.stubs(:executable?).returns false
+  }
+  it { should == nil }
+  end
+
+  describe 'on Debian based distro' do
+    before { 
+    Facter.fact(:osfamily).stubs(:value).returns 'Debian'
+    File.stubs(:executable?).returns true
+    Facter::Util::Resolution.stubs(:exec).returns "puppet-common\nlinux-generic\nlinux-image-generic"
+  }
+  it {
+    if Facter.version < '2.0.0'
+      should == 'puppet-common,linux-generic,linux-image-generic'
+    else
+      should == ['puppet-common', 'linux-generic', 'linux-image-generic']
+    end
+  }
+  end
+end
diff --git a/spec/unit/facter/apt_security_updates_spec.rb b/spec/unit/facter/apt_security_updates_spec.rb
new file mode 100644 (file)
index 0000000..999603b
--- /dev/null
@@ -0,0 +1,24 @@
+require 'spec_helper'
+
+describe 'apt_security_updates fact' do
+  subject { Facter.fact(:apt_security_updates).value }
+  after(:each) { Facter.clear }
+
+  describe 'on Debian based distro missing update-notifier-common' do
+    before { 
+    Facter.fact(:osfamily).stubs(:value).returns 'Debian'
+    File.stubs(:executable?).returns false
+  }
+  it { should == nil }
+  end
+
+  describe 'on Debian based distro' do
+    before { 
+    Facter.fact(:osfamily).stubs(:value).returns 'Debian'
+    File.stubs(:executable?).returns true
+    Facter::Util::Resolution.stubs(:exec).returns '14;7'
+  }
+  it { should == 7 }
+  end
+
+end
diff --git a/spec/unit/facter/apt_updates_spec.rb b/spec/unit/facter/apt_updates_spec.rb
new file mode 100644 (file)
index 0000000..2f343bd
--- /dev/null
@@ -0,0 +1,24 @@
+require 'spec_helper'
+
+describe 'apt_updates fact' do
+  subject { Facter.fact(:apt_updates).value }
+  after(:each) { Facter.clear }
+
+  describe 'on Debian based distro missing update-notifier-common' do
+    before { 
+    Facter.fact(:osfamily).stubs(:value).returns 'Debian'
+    File.stubs(:executable?).returns false
+  }
+  it { should == nil }
+  end
+
+  describe 'on Debian based distro' do
+    before { 
+    Facter.fact(:osfamily).stubs(:value).returns 'Debian'
+    File.stubs(:executable?).returns true
+    Facter::Util::Resolution.stubs(:exec).returns '14;7'
+  }
+  it { should == 14 }
+  end
+
+end
index 9946966ee5322dab85336320c1adfba88999381e..a57244fce81e61be50470cdbdd7c39c741468312 100644 (file)
@@ -1,4 +1,5 @@
-# <%= @name %>
+#file generated by puppet
+# <%= @comment %>
 deb <% if @architecture %>[arch=<%= @architecture %>] <% end %><%= @location %> <%= @release_real %> <%= @repos %>
 <%- if @include_src then -%>
 deb-src <% if @architecture %>[arch=<%= @architecture %>] <% end %><%= @location %> <%= @release_real %> <%= @repos %>