Skip to content

Commit bfde725

Browse files
author
Seth Cleveland
committed
Support creating python3 virtualenvs with pyvenv
1 parent ff83450 commit bfde725

File tree

4 files changed

+166
-0
lines changed

4 files changed

+166
-0
lines changed

README.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,37 @@ Creates Python virtualenv.
157157
}
158158
```
159159

160+
### python::pyvenv
161+
162+
Creates Python3 virtualenv.
163+
164+
**ensure** - present/absent. Default: present
165+
166+
**version** - Python version to use. Default: system default
167+
168+
**systempkgs** - Copy system site-packages into virtualenv. Default: don't
169+
170+
**venv_dir** - The location of the virtualenv if resource path not specified. Must be absolute path. Default: resource name
171+
172+
**owner** - Specify the owner of this virtualenv
173+
174+
**group** - Specify the group for this virtualenv
175+
176+
**path** - Specify the path that contains the pyvenv executable. Default: /bin/, /usr/bin, /usr/sbin
177+
178+
**environment** - Specify any environment variables to use when creating pyvenv
179+
180+
```puppet
181+
python::pyvenv { '/var/www/project1' :
182+
ensure => present,
183+
version => 'system',
184+
systempkgs => true,
185+
venv_dir => '/home/appuser/virtualenvs',
186+
owner => 'appuser',
187+
group => 'apps',
188+
}
189+
```
190+
160191
### python::gunicorn
161192

162193
Manages Gunicorn virtual hosts.

manifests/pyvenv.pp

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# == Define: python::pyvenv
2+
#
3+
# Create a Python3 virtualenv using pyvenv.
4+
#
5+
# === Parameters
6+
#
7+
# [*ensure*]
8+
# present|absent. Default: present
9+
#
10+
# [*version*]
11+
# Python version to use. Default: system default
12+
#
13+
# [*systempkgs*]
14+
# Copy system site-packages into virtualenv. Default: don't
15+
#
16+
# [*venv_dir*]
17+
# Directory to install virtualenv to. Default: $name
18+
#
19+
# [*owner*]
20+
# The owner of the virtualenv being manipulated. Default: root
21+
#
22+
# [*group*]
23+
# The group relating to the virtualenv being manipulated. Default: root
24+
#
25+
# [*mode*]
26+
# Optionally specify directory mode. Default: 0755
27+
#
28+
# [*path*]
29+
# Specifies the PATH variable. Default: [ '/bin', '/usr/bin', '/usr/sbin' ]
30+
31+
# [*environment*]
32+
# Optionally specify environment variables for pyvenv
33+
#
34+
# === Examples
35+
#
36+
# python::venv { '/var/www/project1':
37+
# ensure => present,
38+
# version => 'system',
39+
# systempkgs => true,
40+
# }
41+
#
42+
# === Authors
43+
#
44+
# Sergey Stankevich
45+
# Ashley Penney
46+
# Marc Fournier
47+
# Fotis Gimian
48+
# Seth Cleveland
49+
#
50+
define python::pyvenv (
51+
$ensure = present,
52+
$version = 'system',
53+
$systempkgs = false,
54+
$venv_dir = $name,
55+
$owner = 'root',
56+
$group = 'root',
57+
$mode = '0755',
58+
$path = [ '/bin', '/usr/bin', '/usr/sbin' ],
59+
$environment = [],
60+
) {
61+
62+
if $ensure == 'present' {
63+
64+
$virtualenv_cmd = $version ? {
65+
'system' => 'pyvenv',
66+
default => "pyvenv-${version}",
67+
}
68+
69+
if ( $systempkgs == true ) {
70+
$system_pkgs_flag = '--system-site-packages'
71+
} else {
72+
$system_pkgs_flag = ''
73+
}
74+
75+
file { $venv_dir:
76+
ensure => directory,
77+
owner => $owner,
78+
group => $group,
79+
mode => $mode
80+
}
81+
82+
exec { "python_virtualenv_${venv_dir}":
83+
command => "${virtualenv_cmd} ${system_pkgs_flag} ${venv_dir}",
84+
user => $owner,
85+
creates => "${venv_dir}/bin/activate",
86+
path => $path,
87+
cwd => '/tmp',
88+
environment => $environment,
89+
unless => "grep '^[\\t ]*VIRTUAL_ENV=[\\\\'\\\"]*${venv_dir}[\\\"\\\\'][\\t ]*$' ${venv_dir}/bin/activate", #Unless activate exists and VIRTUAL_ENV is correct we re-create the virtualenv
90+
require => File[$venv_dir],
91+
}
92+
} elsif $ensure == 'absent' {
93+
file { $venv_dir:
94+
ensure => absent,
95+
force => true,
96+
recurse => true,
97+
purge => true,
98+
}
99+
} else {
100+
fail( "Illegal ensure value: $ensure. Expected (present or absent)")
101+
}
102+
}

spec/defines/pyvenv_spec.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
require 'spec_helper'
2+
3+
describe 'python::pyvenv', :type => :define do
4+
let (:title) { '/opt/env' }
5+
6+
it {
7+
should contain_file( '/opt/env')
8+
should contain_exec( "python_virtualenv_/opt/env").with_command("pyvenv /opt/env")
9+
}
10+
11+
describe 'when ensure' do
12+
context "is absent" do
13+
let (:params) {{
14+
:ensure => 'absent'
15+
}}
16+
it {
17+
should contain_file( '/opt/env').with_ensure('absent').with_purge( true)
18+
}
19+
end
20+
end
21+
end

tests/pyvenv.pp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class { 'python':
2+
pip=>false,
3+
version=>'3',
4+
}
5+
6+
python::pyvenv { "/opt/uwsgi":
7+
}
8+
9+
python::pip { "uwsgi":
10+
virtualenv => "/opt/uwsgi",
11+
ensure => "latest"
12+
}

0 commit comments

Comments
 (0)