From a25a6179754e58b81b019d2dd288e050f07ebce5 Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Mon, 10 Nov 2014 14:31:55 -0800 Subject: [PATCH 01/14] upgrade pip before upgrading setuptools to fix virtualenv install on failure --- attributes/default.rb | 1 + recipes/pip.rb | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/attributes/default.rb b/attributes/default.rb index e78d47b..cf61ff4 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -43,3 +43,4 @@ default['python']['virtualenv_location'] = "#{node['python']['prefix_dir']}/bin/virtualenv" default['python']['setuptools_version'] = nil # defaults to latest default['python']['virtualenv_version'] = nil +default['python']['pip_version'] = nil diff --git a/recipes/pip.rb b/recipes/pip.rb index 17110fa..23afdc8 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -47,6 +47,11 @@ not_if { ::File.exists?(pip_binary) } end +python_pip 'pip' do + action :upgrade + version node['python']['pip_version'] +end + python_pip 'setuptools' do action :upgrade version node['python']['setuptools_version'] From e5977bef1ecf23f98fcf25cf33741d04f5b22217 Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Thu, 13 Nov 2014 13:30:46 -0800 Subject: [PATCH 02/14] parse PiPy for candidate version using yolk --- attributes/default.rb | 2 ++ providers/pip.rb | 36 ++++++++++++++++++++++++++++++++---- recipes/pip.rb | 9 +++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/attributes/default.rb b/attributes/default.rb index e78d47b..d7bb7a7 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -43,3 +43,5 @@ default['python']['virtualenv_location'] = "#{node['python']['prefix_dir']}/bin/virtualenv" default['python']['setuptools_version'] = nil # defaults to latest default['python']['virtualenv_version'] = nil +default['python']['yolk_version'] = nil +default['python']['yolk_location'] = "#{node['python']['prefix_dir']}/bin/yolk" diff --git a/providers/pip.rb b/providers/pip.rb index bdd8142..e7cd62a 100644 --- a/providers/pip.rb +++ b/providers/pip.rb @@ -20,6 +20,7 @@ require 'chef/mixin/shell_out' require 'chef/mixin/language' +require 'version' include Chef::Mixin::ShellOut def whyrun_supported? @@ -117,11 +118,28 @@ def current_installed_version end def candidate_version + yolk_path = which_yolk(new_resource) @candidate_version ||= begin - # `pip search` doesn't return versions yet - # `pip list` may be coming soon: - # https://bitbucket.org/ianb/pip/issue/197/option-to-show-what-version-would-be - new_resource.version||'latest' + # if yolk is installed, check if a newer version is available in PyPi + # then check if newer version is greater then the version specified by new_resource + # return as appropriate + if ::File.exists?(yolk_path) then + out = shell_out("#{yolk_path} -U #{new_resource.package_name}").stdout + if out.match(/not installed/) then + new_resource.version||'latest' + elsif out.match(/#{new_resource.package_name} [\d\.]+ \([\d\.]+\)/) then + available_version = Version.new(out.split(' ').last.tr('()','')) + if available_version > ( Version.new(new_resource.version) || Version.new('0.0') ) + new_resource.version + else + available_version + end + else + current_installed_version + end + else + new_resource.version||'latest' + end end end @@ -166,3 +184,13 @@ def which_pip(nr) 'pip' end end + +def which_yolk(nr) + if (nr.respond_to?("virtualenv") && nr.virtualenv) + ::File.join(nr.virtualenv,'/bin/yolk') + elsif ::File.exists?(node['python']['yolk_location']) + node['python']['yolk_location'] + else + 'yolk' + end +end diff --git a/recipes/pip.rb b/recipes/pip.rb index 17110fa..2da35aa 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -33,6 +33,10 @@ pip_binary = "/usr/local/bin/pip" end +chef_gem 'version' do + action :nothing +end.run_action(:install) + cookbook_file "#{Chef::Config[:file_cache_path]}/get-pip.py" do source 'get-pip.py' mode "0644" @@ -47,6 +51,11 @@ not_if { ::File.exists?(pip_binary) } end +python_pip 'yolk' do + action :upgrade + version node['python']['yolk_version'] +end + python_pip 'setuptools' do action :upgrade version node['python']['setuptools_version'] From f1ce6e7ca11b56ccd9e05ffbfa8fcea129bb7f8b Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Thu, 13 Nov 2014 14:54:59 -0800 Subject: [PATCH 03/14] update to using versionub gem for more precise versioning --- providers/pip.rb | 10 ++++++---- recipes/pip.rb | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/providers/pip.rb b/providers/pip.rb index e7cd62a..fdf30b8 100644 --- a/providers/pip.rb +++ b/providers/pip.rb @@ -20,7 +20,7 @@ require 'chef/mixin/shell_out' require 'chef/mixin/language' -require 'version' +require 'versionub' include Chef::Mixin::ShellOut def whyrun_supported? @@ -128,11 +128,13 @@ def candidate_version if out.match(/not installed/) then new_resource.version||'latest' elsif out.match(/#{new_resource.package_name} [\d\.]+ \([\d\.]+\)/) then - available_version = Version.new(out.split(' ').last.tr('()','')) - if available_version > ( Version.new(new_resource.version) || Version.new('0.0') ) + available_version = Versionub.parse(out.split(' ').last.tr('()','')) + if ! new_resource.version + available_version.to_s + elsif available_version > Versionub.parse(new_resource.version) new_resource.version else - available_version + available_version.to_s end else current_installed_version diff --git a/recipes/pip.rb b/recipes/pip.rb index 3c26009..849d00c 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -33,7 +33,7 @@ pip_binary = "/usr/local/bin/pip" end -chef_gem 'version' do +chef_gem 'versionub' do action :nothing end.run_action(:install) From 4b3ce7f45f01c7777fff1390f42c0de781beb94b Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Thu, 13 Nov 2014 14:57:14 -0800 Subject: [PATCH 04/14] backport patch from master --- providers/pip.rb | 10 ++++++---- recipes/pip.rb | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/providers/pip.rb b/providers/pip.rb index e7cd62a..fdf30b8 100644 --- a/providers/pip.rb +++ b/providers/pip.rb @@ -20,7 +20,7 @@ require 'chef/mixin/shell_out' require 'chef/mixin/language' -require 'version' +require 'versionub' include Chef::Mixin::ShellOut def whyrun_supported? @@ -128,11 +128,13 @@ def candidate_version if out.match(/not installed/) then new_resource.version||'latest' elsif out.match(/#{new_resource.package_name} [\d\.]+ \([\d\.]+\)/) then - available_version = Version.new(out.split(' ').last.tr('()','')) - if available_version > ( Version.new(new_resource.version) || Version.new('0.0') ) + available_version = Versionub.parse(out.split(' ').last.tr('()','')) + if ! new_resource.version + available_version.to_s + elsif available_version > Versionub.parse(new_resource.version) new_resource.version else - available_version + available_version.to_s end else current_installed_version diff --git a/recipes/pip.rb b/recipes/pip.rb index 2da35aa..43d913e 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -33,7 +33,7 @@ pip_binary = "/usr/local/bin/pip" end -chef_gem 'version' do +chef_gem 'versionub' do action :nothing end.run_action(:install) From 3eec94cf9fa58e840f8bb34f87fe89cad1142a1d Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Mon, 17 Nov 2014 16:02:38 -0800 Subject: [PATCH 05/14] use chef-sugar instead of versionub gem --- Berksfile | 2 ++ metadata.rb | 1 + providers/pip.rb | 10 +++++----- recipes/pip.rb | 4 ---- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Berksfile b/Berksfile index f795efe..f2488bb 100644 --- a/Berksfile +++ b/Berksfile @@ -2,6 +2,8 @@ site :opscode metadata +cookbook "chef-sugar" + group :integration do cookbook "minitest-handler" cookbook "apt" diff --git a/metadata.rb b/metadata.rb index 4a86423..41a2a0c 100644 --- a/metadata.rb +++ b/metadata.rb @@ -7,6 +7,7 @@ depends "build-essential" depends "yum-epel" +depends "chef-sugar" recipe "python", "Installs python, pip, and virtualenv" recipe "python::package", "Installs python using packages." diff --git a/providers/pip.rb b/providers/pip.rb index fdf30b8..11ed84c 100644 --- a/providers/pip.rb +++ b/providers/pip.rb @@ -20,7 +20,7 @@ require 'chef/mixin/shell_out' require 'chef/mixin/language' -require 'versionub' +require 'chef/sugar/core_extensions' include Chef::Mixin::ShellOut def whyrun_supported? @@ -128,13 +128,13 @@ def candidate_version if out.match(/not installed/) then new_resource.version||'latest' elsif out.match(/#{new_resource.package_name} [\d\.]+ \([\d\.]+\)/) then - available_version = Versionub.parse(out.split(' ').last.tr('()','')) + available_version = out.split(' ').last.tr('()','') if ! new_resource.version - available_version.to_s - elsif available_version > Versionub.parse(new_resource.version) + available_version + elsif available_version.satisfies?(">= #{new_resource.version}") new_resource.version else - available_version.to_s + available_version end else current_installed_version diff --git a/recipes/pip.rb b/recipes/pip.rb index 43d913e..0a0cf01 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -33,10 +33,6 @@ pip_binary = "/usr/local/bin/pip" end -chef_gem 'versionub' do - action :nothing -end.run_action(:install) - cookbook_file "#{Chef::Config[:file_cache_path]}/get-pip.py" do source 'get-pip.py' mode "0644" From 53ff1ceaf478849c95a5bf57e4d282ace3b40d18 Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Mon, 17 Nov 2014 16:14:46 -0800 Subject: [PATCH 06/14] finish merge --- providers/pip.rb | 7 ------- 1 file changed, 7 deletions(-) diff --git a/providers/pip.rb b/providers/pip.rb index c26334f..8023587 100644 --- a/providers/pip.rb +++ b/providers/pip.rb @@ -128,17 +128,10 @@ def candidate_version if out.match(/not installed/) then new_resource.version||'latest' elsif out.match(/#{new_resource.package_name} [\d\.]+ \([\d\.]+\)/) then -<<<<<<< HEAD - available_version = Versionub.parse(out.split(' ').last.tr('()','')) - if ! new_resource.version - available_version.to_s - elsif available_version > Versionub.parse(new_resource.version) -======= available_version = out.split(' ').last.tr('()','') if ! new_resource.version available_version elsif available_version.satisfies?(">= #{new_resource.version}") ->>>>>>> check_upgrade new_resource.version else available_version.to_s From 591fad344443ca6eea26ad18467b5086caa84d8a Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Mon, 17 Nov 2014 16:38:49 -0800 Subject: [PATCH 07/14] adjust per https://sethvargo.com/chef-sugar-presentation/ --- providers/pip.rb | 1 - recipes/pip.rb | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/providers/pip.rb b/providers/pip.rb index 8023587..1e09aef 100644 --- a/providers/pip.rb +++ b/providers/pip.rb @@ -20,7 +20,6 @@ require 'chef/mixin/shell_out' require 'chef/mixin/language' -require 'chef/sugar/core_extensions' include Chef::Mixin::ShellOut def whyrun_supported? diff --git a/recipes/pip.rb b/recipes/pip.rb index 7c77a9f..a53f6aa 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -23,6 +23,9 @@ # redhat/package: /usr/bin/pip (sha a8a3a3) # omnibus/source: /opt/local/bin/pip (sha 29ce9874) +include_recipe 'chef_sugar::default' +require 'chef/sugar/core_extensions' + if node['python']['install_method'] == 'source' pip_binary = "#{node['python']['prefix_dir']}/bin/pip" elsif platform_family?("rhel", "fedora") From 25633c3a97f1156197c9ed24b9ecaeea390f43f8 Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Mon, 17 Nov 2014 16:46:01 -0800 Subject: [PATCH 08/14] fix --- recipes/pip.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/pip.rb b/recipes/pip.rb index a53f6aa..d8edc6f 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -23,7 +23,7 @@ # redhat/package: /usr/bin/pip (sha a8a3a3) # omnibus/source: /opt/local/bin/pip (sha 29ce9874) -include_recipe 'chef_sugar::default' +include_recipe 'chef-sugar::default' require 'chef/sugar/core_extensions' if node['python']['install_method'] == 'source' From 7f7e592b9f39861072c3a416c5e5a815c2c671fc Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Fri, 9 Jan 2015 11:27:19 -0800 Subject: [PATCH 09/14] use newest get-pip.py --- recipes/pip.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/recipes/pip.rb b/recipes/pip.rb index d8edc6f..dd9b30d 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -36,9 +36,10 @@ pip_binary = "/usr/local/bin/pip" end -cookbook_file "#{Chef::Config[:file_cache_path]}/get-pip.py" do - source 'get-pip.py' +remote_file "#{Chef::Config[:file_cache_path]}/get-pip.py" do + source 'https://bootstrap.pypa.io/get-pip.py' mode "0644" + action :create_if_missing not_if { ::File.exists?(pip_binary) } end From ecfbc63972119e416527af033f3e6ae0fbce00f1 Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Fri, 9 Jan 2015 11:38:16 -0800 Subject: [PATCH 10/14] testing --- attributes/default.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/attributes/default.rb b/attributes/default.rb index 8e8d117..ff17b2a 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -44,5 +44,5 @@ default['python']['setuptools_version'] = nil # defaults to latest default['python']['virtualenv_version'] = nil default['python']['pip_version'] = nil -default['python']['yolk_version'] = nil +default['python']['yolk_version'] = "0.4.2" default['python']['yolk_location'] = "#{node['python']['prefix_dir']}/bin/yolk" From 25b06231b291cfaf1db295895930285d94e9e51e Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Fri, 9 Jan 2015 11:49:00 -0800 Subject: [PATCH 11/14] testing --- attributes/default.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/attributes/default.rb b/attributes/default.rb index ff17b2a..a7feb6e 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -44,5 +44,5 @@ default['python']['setuptools_version'] = nil # defaults to latest default['python']['virtualenv_version'] = nil default['python']['pip_version'] = nil -default['python']['yolk_version'] = "0.4.2" +default['python']['yolk_version'] = "0.4.1" default['python']['yolk_location'] = "#{node['python']['prefix_dir']}/bin/yolk" From 4e593c52eba2bc48900660dc32aa2d0b29ec2457 Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Fri, 9 Jan 2015 12:01:42 -0800 Subject: [PATCH 12/14] testing --- attributes/default.rb | 2 +- recipes/pip.rb | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/attributes/default.rb b/attributes/default.rb index a7feb6e..8e8d117 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -44,5 +44,5 @@ default['python']['setuptools_version'] = nil # defaults to latest default['python']['virtualenv_version'] = nil default['python']['pip_version'] = nil -default['python']['yolk_version'] = "0.4.1" +default['python']['yolk_version'] = nil default['python']['yolk_location'] = "#{node['python']['prefix_dir']}/bin/yolk" diff --git a/recipes/pip.rb b/recipes/pip.rb index dd9b30d..957bf72 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -51,17 +51,32 @@ not_if { ::File.exists?(pip_binary) } end -python_pip 'pip' do - action :upgrade - version node['python']['pip_version'] +remote_file "#{Chef::Config[:file_cache_path]}/ez_setup.py" do + source 'https://bootstrap.pypa.io/ez_setup.py' + mode "0644" + action :create_if_missing + not_if { ::File.exists?(pip_binary) } end -python_pip 'yolk' do +execute "install-setuptools" do + cwd Chef::Config[:file_cache_path] + command <<-EOF + #{node['python']['binary']} ez_setup.py + EOF + not_if { ::File.exists?(pip_binary) } +end + +python_pip 'pip' do action :upgrade - version node['python']['yolk_version'] + version node['python']['pip_version'] end python_pip 'setuptools' do action :upgrade version node['python']['setuptools_version'] end + +python_pip 'yolk' do + action :upgrade + version node['python']['yolk_version'] +end \ No newline at end of file From cf4b1d83915576f922523793299018d6fb8abbc5 Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Fri, 9 Jan 2015 12:29:40 -0800 Subject: [PATCH 13/14] always install as eggs --- providers/pip.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/pip.rb b/providers/pip.rb index 1e09aef..10e9929 100644 --- a/providers/pip.rb +++ b/providers/pip.rb @@ -152,11 +152,12 @@ def install_package(version) else version = "==#{version}" end + new_resource.options "#{new_resource.options} --egg" pip_cmd('install', version) end def upgrade_package(version) - new_resource.options "#{new_resource.options} --upgrade" + new_resource.options "#{new_resource.options} --upgrade --egg" install_package(version) end From 4b5c2bba0ea8bc19a2728a6017b644ba73c6a72b Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Fri, 9 Jan 2015 12:48:56 -0800 Subject: [PATCH 14/14] run pip install and setup tools whenever the installer is created --- recipes/pip.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/recipes/pip.rb b/recipes/pip.rb index 957bf72..e536188 100644 --- a/recipes/pip.rb +++ b/recipes/pip.rb @@ -40,7 +40,7 @@ source 'https://bootstrap.pypa.io/get-pip.py' mode "0644" action :create_if_missing - not_if { ::File.exists?(pip_binary) } + notifies :run, 'execute[install-pip]', :immediately end execute "install-pip" do @@ -48,14 +48,14 @@ command <<-EOF #{node['python']['binary']} get-pip.py EOF - not_if { ::File.exists?(pip_binary) } + action :nothing end remote_file "#{Chef::Config[:file_cache_path]}/ez_setup.py" do source 'https://bootstrap.pypa.io/ez_setup.py' mode "0644" action :create_if_missing - not_if { ::File.exists?(pip_binary) } + notifies :run, 'execute[install-setuptools]', :immediately end execute "install-setuptools" do @@ -63,7 +63,7 @@ command <<-EOF #{node['python']['binary']} ez_setup.py EOF - not_if { ::File.exists?(pip_binary) } + action :nothing end python_pip 'pip' do