From 451b21537565b335a45bca0d90ff03567a10e9c2 Mon Sep 17 00:00:00 2001 From: Nick Groenen Date: Mon, 11 Mar 2013 14:20:25 +0100 Subject: Resolve a cyclic dependency There was a dependency between python::virtualenv and python::requirements. Basically, the virtualenv wanted to initialize requirements, but requirements depended on the virtualenv being created already, resulting in: err: Could not apply complete catalog: Found 1 dependency cycle: (Exec[python_requirements_check_/usr/share/err/repo/requirements.txt] => Python::Requirements[/usr/share/err/repo/requirements.txt] => Exec[python_virtualenv_/usr/share/err/python3] => Python::Requirements[/usr/share/err/repo/requirements.txt] => Exec[python_requirements_check_/usr/share/err/repo/requirements.txt]) --- manifests/config.pp | 1 - manifests/virtualenv.pp | 9 +++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/manifests/config.pp b/manifests/config.pp index 43da22e..49e5230 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -5,7 +5,6 @@ class python::config { Class['python::install'] -> Python::Virtualenv <| |> Python::Virtualenv <| |> -> Python::Pip <| |> - Python::Virtualenv <| |> -> Python::Requirements <| |> if $python::gunicorn { Class['python::install'] -> Python::Gunicorn <| |> diff --git a/manifests/virtualenv.pp b/manifests/virtualenv.pp index e816468..e6c3900 100644 --- a/manifests/virtualenv.pp +++ b/manifests/virtualenv.pp @@ -76,12 +76,17 @@ define python::virtualenv ( } if $requirements { - Exec["python_virtualenv_${venv_dir}"] - -> Python::Requirements[$requirements] + exec { "python_requirements_initial_install_${requirements}": + command => "${venv_dir}/bin/pip install ${proxy_flag} --requirement ${requirements}", + refreshonly => true, + timeout => 1800, + subscribe => Exec["python_virtualenv_${venv_dir}"], + } python::requirements { $requirements: virtualenv => $venv_dir, proxy => $proxy, + require => Exec["python_virtualenv_${venv_dir}"], } } -- cgit v1.2.3 From 88c178043145581d38c8040baec67051ee5c937a Mon Sep 17 00:00:00 2001 From: Nick Groenen Date: Mon, 11 Mar 2013 15:14:08 +0100 Subject: Allow virtualenv definitions to share the same requirements file --- manifests/requirements.pp | 28 +++++++++++++++++----------- manifests/virtualenv.pp | 11 ++++++----- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/manifests/requirements.pp b/manifests/requirements.pp index 4dd1f1f..22988e5 100644 --- a/manifests/requirements.pp +++ b/manifests/requirements.pp @@ -4,6 +4,9 @@ # # === Parameters # +# [*requirements*] +# Path to the requirements file. Defaults to the resource name +# # [*virtualenv*] # virtualenv to run pip in. Default: system-wide # @@ -23,12 +26,11 @@ # Ashley Penney # define python::requirements ( - $virtualenv = 'system', - $proxy = false + $requirements = $name, + $virtualenv = 'system', + $proxy = false ) { - $requirements = $name - $pip_env = $virtualenv ? { 'system' => '`which pip`', default => "${virtualenv}/bin/pip", @@ -41,13 +43,17 @@ define python::requirements ( $req_crc = "${requirements}.sha1" - file { $requirements: - ensure => present, - mode => '0644', - owner => 'root', - group => 'root', - replace => false, - content => '# Puppet will install and/or update pip packages listed here', + # This will ensure multiple python::virtualenv definitions can share the + # the same requirements file. + if !defined(File[$requirements]) { + file { $requirements: + ensure => present, + mode => '0644', + owner => 'root', + group => 'root', + replace => false, + content => '# Puppet will install and/or update pip packages listed here', + } } # SHA1 checksum to detect changes diff --git a/manifests/virtualenv.pp b/manifests/virtualenv.pp index e6c3900..b56da85 100644 --- a/manifests/virtualenv.pp +++ b/manifests/virtualenv.pp @@ -76,17 +76,18 @@ define python::virtualenv ( } if $requirements { - exec { "python_requirements_initial_install_${requirements}": + exec { "python_requirements_initial_install_${requirements}_${venv_dir}": command => "${venv_dir}/bin/pip install ${proxy_flag} --requirement ${requirements}", refreshonly => true, timeout => 1800, subscribe => Exec["python_virtualenv_${venv_dir}"], } - python::requirements { $requirements: - virtualenv => $venv_dir, - proxy => $proxy, - require => Exec["python_virtualenv_${venv_dir}"], + python::requirements { "${requirements}_${venv_dir}": + requirements => $requirements, + virtualenv => $venv_dir, + proxy => $proxy, + require => Exec["python_virtualenv_${venv_dir}"], } } -- cgit v1.2.3