5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,8 @@ spec/fixtures/
.bundle/
.vagrant/
coverage/

# Beaker
.vagrant/
log/
junit/
6 changes: 2 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
language: ruby
bundler_args: --without development
bundler_args: --without system_tests
script: "bundle exec rake validate && bundle exec rake lint && bundle exec rake spec SPEC_OPTS='--format documentation'"
matrix:
fast_finish: true
Expand All @@ -12,6 +12,4 @@ matrix:
- rvm: 1.9.3
env: PUPPET_GEM_VERSION="~> 3.0"
- rvm: 2.0.0
env: PUPPET_GEM_VERSION="~> 3.0"
notifications:
email: false
env: PUPPET_GEM_VERSION="~> 3.0"
9 changes: 6 additions & 3 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@ group :development, :test do
gem 'rake', :require => false
gem 'rspec-puppet', :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
Expand All @@ -24,4 +21,10 @@ else
gem 'puppet', :require => false
end

group :system_tests do
gem 'serverspec', :require => false
gem 'beaker', :require => false
gem 'beaker-rspec', :require => false
end

# vim:ft=ruby
2 changes: 1 addition & 1 deletion Modulefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name 'stankevich-python'
version '1.8.3'
version '1.9.0'
source 'git://github.com/stankevich/puppet-python.git'
author 'stankevich'
license 'Apache License, Version 2.0'
Expand Down
50 changes: 50 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,37 @@ Creates Python virtualenv.
}
```

### python::pyvenv

Creates Python3 virtualenv.

**ensure** - present/absent. Default: present

**version** - Python version to use. Default: system default

**systempkgs** - Copy system site-packages into virtualenv. Default: don't

**venv_dir** - The location of the virtualenv if resource path not specified. Must be absolute path. Default: resource name

**owner** - Specify the owner of this virtualenv

**group** - Specify the group for this virtualenv

**path** - Specify the path that contains the pyvenv executable. Default: /bin/, /usr/bin, /usr/sbin

**environment** - Specify any environment variables to use when creating pyvenv

```puppet
python::pyvenv { '/var/www/project1' :
ensure => present,
version => 'system',
systempkgs => true,
venv_dir => '/home/appuser/virtualenvs',
owner => 'appuser',
group => 'apps',
}
```

### python::gunicorn

Manages Gunicorn virtual hosts.
Expand Down Expand Up @@ -226,6 +257,25 @@ python::dotfile { '/var/lib/jenkins/.pip/pip.conf':
}
```

### hiera configuration

This module supports configuration through hiera. The following example
creates two python3 virtualenvs. The configuration also pip installs a
package into each environment.

```yaml
python::python_pyvenvs:
"/opt/env1":
version: "system"
"/opt/env2":
version: "system"
python::python_pips:
"nose":
virtualenv: "/opt/env1"
"coverage":
virtualenv: "/opt/env2"
```
## Authors
[Sergey Stankevich](https://github.com/stankevich)
Expand Down
29 changes: 29 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,10 +1,39 @@
require 'puppetlabs_spec_helper/rake_tasks'
require 'puppet-lint/tasks/puppet-lint'
require 'puppet-syntax/tasks/puppet-syntax'

# These two gems aren't always present, for instance
# on Travis with --without development
begin
require 'puppet_blacksmith/rake_tasks'
rescue LoadError
end

PuppetLint.configuration.fail_on_warnings
PuppetLint.configuration.send('relative')
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"]

exclude_paths = [
"pkg/**/*",
"vendor/**/*",
"spec/**/*",
]
PuppetLint.configuration.ignore_paths = exclude_paths
PuppetSyntax.exclude_paths = exclude_paths

desc "Run acceptance tests"
RSpec::Core::RakeTask.new(:acceptance) do |t|
t.pattern = 'spec/acceptance'
end

desc "Run syntax, lint, and spec tests."
task :test => [
:syntax,
:lint,
:spec,
]
21 changes: 7 additions & 14 deletions lib/facter/pip_version.rb
Original file line number Diff line number Diff line change
@@ -1,40 +1,33 @@
# Make pip version available as a fact
# Works with pip loaded and without, pip installed using pip and package installed
require 'puppet'
require 'rubygems'

facter_puppet_version = Facter.value(:puppetversion)
facter_is_pe = Facter.value(:is_pe)

if facter_is_pe
facter_puppet_version = facter_puppet_version.to_s.split(' ')[0]
facter_puppet_version = facter_puppet_version.to_s.split(' ')[0]
end

if Gem::Version.new(facter_puppet_version) >= Gem::Version.new('3.6')
if (Puppet::Util::Package.versioncmp(facter_puppet_version, '3.6') >= 0)
pkg = Puppet::Type.type(:package).new(:name => 'python-pip', :allow_virtual => 'false')
else
pkg = Puppet::Type.type(:package).new(:name => 'python-pip')
end

Facter.add("pip_version") do
has_weight 100
setcode do
begin
/^pip (\d+\.\d+\.?\d*).*$/.match(Facter::Util::Resolution.exec('pip --version 2>/dev/null'))[1]
rescue
false
if Facter::Util::Resolution.which('pip')
Facter::Util::Resolution.exec('pip --version 2>/dev/null').match(/^pip (\d+\.\d+\.?\d*).*$/)[1]
end
end
end

Facter.add("pip_version") do
has_weight 50
setcode do
begin
unless [:absent,'purged'].include?(pkg.retrieve[pkg.property(:ensure)])
/^.*(\d+\.\d+\.\d+).*$/.match(pkg.retrieve[pkg.property(:ensure)])[1]
end
rescue
false
unless [:absent,:purged].include?(pkg.retrieve[pkg.property(:ensure)])
pkg.retrieve[pkg.property(:ensure)]
end
end
end
33 changes: 11 additions & 22 deletions lib/facter/python_version.rb
Original file line number Diff line number Diff line change
@@ -1,52 +1,41 @@
# Make python versions available as facts
# In lists default python and system python versions
require 'puppet'
require 'rubygems'

facter_puppet_version = Facter.value(:puppetversion)
facter_is_pe = Facter.value(:is_pe)

if facter_is_pe
facter_puppet_version = facter_puppet_version.to_s.split(' ')[0]
facter_puppet_version = facter_puppet_version.to_s.split(' ')[0]
end

if Gem::Version.new(facter_puppet_version) >= Gem::Version.new('3.6')
pkg = Puppet::Type.type(:package).new(:name => 'python', :allow_virtual => 'false')
if (Puppet::Util::Package.versioncmp(facter_puppet_version, '3.6') >= 0)
pkg = Puppet::Type.type(:package).new(:name => 'python-pip', :allow_virtual => 'false')
else
pkg = Puppet::Type.type(:package).new(:name => 'python')
pkg = Puppet::Type.type(:package).new(:name => 'python-pip')
end

Facter.add("system_python_version") do
setcode do
begin
unless [:absent,'purged'].include?(pkg.retrieve[pkg.property(:ensure)])
/^(\d+\.\d+\.\d+).*$/.match(pkg.retrieve[pkg.property(:ensure)])[1]
end
rescue
false
unless [:absent,:purged].include?(pkg.retrieve[pkg.property(:ensure)])
pkg.retrieve[pkg.property(:ensure)]
end
end
end

Facter.add("python_version") do
has_weight 100
setcode do
begin
/^.*(\d+\.\d+\.\d+)$/.match(Facter::Util::Resolution.exec('python -V 2>&1'))[1]
rescue
false
if Facter::Util::Resolution.which('python')
Facter::Util::Resolution.exec('python -V 2>&1').match(/^.*(\d+\.\d+\.\d+)$/)[1]
end
end
end

Facter.add("python_version") do
has_weight 50
setcode do
begin
unless [:absent,'purged'].include?(pkg.retrieve[pkg.property(:ensure)])
/^.*(\d+\.\d+\.\d+).*$/.match(pkg.retrieve[pkg.property(:ensure)])[1]
end
rescue
false
unless [:absent,:purged].include?(pkg.retrieve[pkg.property(:ensure)])
pkg.retrieve[pkg.property(:ensure)]
end
end
end
25 changes: 9 additions & 16 deletions lib/facter/virtualenv_version.rb
Original file line number Diff line number Diff line change
@@ -1,40 +1,33 @@
# Make virtualenv version available as a fact
# Works with virualenv loaded and without, pip installed and package installed
require 'puppet'
require 'rubygems'

facter_puppet_version = Facter.value(:puppetversion)
facter_is_pe = Facter.value(:is_pe)

if facter_is_pe
facter_puppet_version = facter_puppet_version.to_s.split(' ')[0]
facter_puppet_version = facter_puppet_version.to_s.split(' ')[0]
end

if Gem::Version.new(facter_puppet_version) >= Gem::Version.new('3.6')
pkg = Puppet::Type.type(:package).new(:name => 'virtualenv', :allow_virtual => 'false')
if (Puppet::Util::Package.versioncmp(facter_puppet_version, '3.6') >= 0)
pkg = Puppet::Type.type(:package).new(:name => 'python-pip', :allow_virtual => 'false')
else
pkg = Puppet::Type.type(:package).new(:name => 'virtualenv')
pkg = Puppet::Type.type(:package).new(:name => 'python-pip')
end

Facter.add("virtualenv_version") do
has_weight 100
setcode do
begin
Facter::Util::Resolution.exec('virtualenv --version') || "absent"
rescue
false
if Facter::Util::Resolution.which('virtualenv')
Facter::Util::Resolution.exec('virtualenv --version 2>&1')
end
end
end

Facter.add("virtualenv_version") do
has_weight 50
setcode do
begin
unless [:absent,'purged'].include?(pkg.retrieve[pkg.property(:ensure)])
/^.*(\d+\.\d+\.\d+).*$/.match(pkg.retrieve[pkg.property(:ensure)])[1]
end
rescue
false
unless [:absent,:purged].include?(pkg.retrieve[pkg.property(:ensure)])
pkg.retrieve[pkg.property(:ensure)]
end
end
end
27 changes: 15 additions & 12 deletions manifests/gunicorn.pp
Original file line number Diff line number Diff line change
Expand Up @@ -66,18 +66,21 @@
# Marc Fournier
#
define python::gunicorn (
$ensure = present,
$virtualenv = false,
$mode = 'wsgi',
$dir = false,
$bind = false,
$environment = false,
$owner = 'www-data',
$group = 'www-data',
$appmodule = 'app:app',
$osenv = false,
$timeout = 30,
$template = 'python/gunicorn.erb',
$ensure = present,
$virtualenv = false,
$mode = 'wsgi',
$dir = false,
$bind = false,
$environment = false,
$owner = 'www-data',
$group = 'www-data',
$appmodule = 'app:app',
$osenv = false,
$timeout = 30,
$access_log_format = false,
$accesslog = false,
$errorlog = false,
$template = 'python/gunicorn.erb',
) {

# Parameter validation
Expand Down
8 changes: 8 additions & 0 deletions manifests/init.pp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@
$manage_gunicorn = $python::params::manage_gunicorn,
$provider = $python::params::provider,
$valid_versions = $python::params::valid_versions,
$python_pips = { },
$python_virtualenvs = { },
$python_pyvenvs = { },
) inherits python::params{

# validate inputs
Expand Down Expand Up @@ -92,4 +95,9 @@
class { 'python::config': } ->
anchor { 'python::end': }

# Allow hiera configuration of python resources
create_resources('python::pip', $python_pips)
create_resources('python::pyvenv', $python_pyvenvs)
create_resources('python::virtualenv', $python_virtualenvs)

}
Loading