-*.swp
pkg/
Gemfile.lock
-spec/fixtures/manifests
+vendor/
+spec/fixtures/
+.vagrant/
+.bundle/
+coverage/
--- /dev/null
+---
+.travis.yml:
+ env_matrix:
+ - PUPPET_GEM_VERSION="~> 3.4.0"
+ - PUPPET_GEM_VERSION="~> 3.5.0"
- master
language: ruby
bundler_args: --without development
-script: bundle exec rake spec SPEC_OPTS='--format documentation'
+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"
+ - PUPPET_GEM_VERSION="~> 3.4.0"
+ - PUPPET_GEM_VERSION="~> 3.5.0"
matrix:
fast_finish: true
+ exclude:
+ - rvm: 1.9.3
+ env: PUPPET_GEM_VERSION="~> 2.7.0"
+ - rvm: 2.0.0
+ env: PUPPET_GEM_VERSION="~> 2.7.0"
notifications:
email: false
--- /dev/null
+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/)
+
-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 '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 puppetversion = ENV['PUPPET_GEM_VERSION']
else
gem 'puppet', :require => false
end
+
+# vim:ft=ruby
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',
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint'
+PuppetLint.configuration.fail_on_warnings
+PuppetLint.configuration.send('disable_80chars')
+PuppetLint.configuration.send('disable_class_inherits_from_params_class')
+PuppetLint.configuration.send('disable_class_parameter_defaults')
+PuppetLint.configuration.send('disable_documentation')
PuppetLint.configuration.send('disable_single_quote_string_with_variables')
+PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]
commands :apt_key => 'apt-key'
def self.instances
+ 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 = apt_key('list').split("\n").collect do |line|
line_hash = key_line_hash(line)
next unless line_hash
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
# [*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+.
#
}
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 {
# add an apt source
define apt::source(
+ $comment = $name,
$ensure = present,
$location = '',
$release = 'UNDEF',
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
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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
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
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
--- /dev/null
+HOSTS:
+ ubuntu-server-1404-x64:
+ roles:
+ - master
+ platform: ubuntu-14.04-amd64
+ box : puppetlabs/ubuntu-14.04-64-nocm
+ box_url : https://vagrantcloud.com/puppetlabs/ubuntu-14.04-64-nocm
+ hypervisor : vagrant
+CONFIG:
+ log_level : debug
+ type: git
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 {
: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
end
let :content do
- content = "#file generated by puppet\n# #{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
--- /dev/null
+--format
+s
+--colour
+--loadby
+mtime
+--backtrace
#file generated by puppet
-# <%= @name %>
+# <%= @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 %>