summaryrefslogtreecommitdiff
path: root/manifests/virtualenv.pp
blob: 53f30f8a2b1b176bd56ddcf7e21a76d4435e79ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# == Define: python::virtualenv
#
# Creates Python virtualenv.
#
# === Parameters
#
# [*ensure*]
#  present|absent. Default: present
#
# [*version*]
#  Python version to use. Default: system default
#
# [*requirements*]
#  Path to pip requirements.txt file. Default: none
#
# [*proxy*]
#  Proxy server to use for outbound connections. Default: none
#
# [*systempkgs*]
#  Copy system site-packages into virtualenv. Default: don't
#
# [*distribute*]
#  Include distribute in the virtualenv. Default: true
#
# === Examples
#
# python::virtualenv { '/var/www/project1':
#   ensure       => present,
#   version      => 'system',
#   requirements => '/var/www/project1/requirements.txt',
#   proxy        => 'http://proxy.domain.com:3128',
#   systempkgs   => true,
#   index        => 'http://www.example.com/simple/'
# }
#
# === Authors
#
# Sergey Stankevich
# Ashley Penney
# Marc Fournier
#
define python::virtualenv (
  $ensure       = present,
  $version      = 'system',
  $requirements = false,
  $proxy        = false,
  $systempkgs   = false,
  $distribute   = true,
  $owner        = 'root',
  $group        = 'root',
  $index        = false,
) {

  $venv_dir = $name

  if $ensure == 'present' {

    $python = $version ? {
      'system' => 'python',
      default  => "python${version}",
    }

    $proxy_flag = $proxy ? {
      false    => '',
      default  => "--proxy=${proxy}",
    }

    $proxy_command = $proxy ? {
      false   => '',
      default => "&& export http_proxy=${proxy}",
    }

    $system_pkgs_flag = $systempkgs ? {
      false    => '',
      default  => '--system-site-packages',
    }

    $distribute_pkg = $distribute ? {
      true     => 'distribute',
      default  => '',
    }
    $pypi_index = $index ? {
        false   => '',
        default => "-i ${index}",
    }

    exec { "python_virtualenv_${venv_dir}":
      command => "mkdir -p ${venv_dir} ${proxy_command} && virtualenv -p `which ${python}` ${system_pkgs_flag} ${venv_dir} && ${venv_dir}/bin/pip --log-file ${venv_dir}/pip.log install ${pypi_index} ${proxy_flag} --upgrade ${distribute_pkg} pip",
      user    => $owner,
      creates => "${venv_dir}/bin/activate",
      path    => [ '/bin', '/usr/bin', '/usr/sbin' ],
    }

    if $requirements {
      exec { "python_requirements_initial_install_${requirements}_${venv_dir}":
        command     => "${venv_dir}/bin/pip --log-file ${venv_dir}/pip.log install ${pypi_index} ${proxy_flag} --requirement ${requirements}",
        refreshonly => true,
        timeout     => 1800,
        user        => $owner,
        subscribe   => Exec["python_virtualenv_${venv_dir}"],
      }

      python::requirements { "${requirements}_${venv_dir}":
        requirements => $requirements,
        virtualenv   => $venv_dir,
        proxy        => $proxy,
        owner        => $owner,
        group        => $group,
        require      => Exec["python_virtualenv_${venv_dir}"],
      }
    }

  } elsif $ensure == 'absent' {

    file { $venv_dir:
      ensure  => absent,
      force   => true,
      recurse => true,
      purge   => true,
    }

  }

}