Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7a7beb7

Browse files
dexterousjtimberman
authored and
jtimberman
committed
[COOK-1715] Upgrade pip resource with user & group
- pass user & group to shellout - refactor provider to remove lots of duplication - also set HOME to specified user's home to prevent permission errors when pip attemts to write ~/.pip/pip.log
1 parent c6c891b commit 7a7beb7

File tree

2 files changed

+33
-41
lines changed

2 files changed

+33
-41
lines changed

providers/pip.rb

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -39,52 +39,40 @@ def whyrun_supported?
3939
install_version = candidate_version
4040
end
4141

42-
# Set the timeout (units in seconds)
43-
timeout = 900
44-
if @new_resource.timeout
45-
timeout = @new_resource.timeout
46-
end
47-
4842
if install_version
4943
description = "install package #{@new_resource} version #{install_version}"
5044
converge_by(description) do
51-
Chef::Log.info("Installing #{@new_resource} version #{install_version}")
52-
status = install_package(@new_resource.package_name, install_version, timeout)
45+
Chef::Log.info("Installing #{@new_resource} version #{install_version}")
46+
status = install_package(install_version)
47+
if status
48+
@new_resource.updated_by_last_action(true)
49+
end
5350
end
5451
end
5552
end
5653

5754
action :upgrade do
58-
# Set the timeout (units in seconds)
59-
timeout = 900
60-
if @new_resource.timeout
61-
timeout = @new_resource.timeout
62-
end
63-
6455
if @current_resource.version != candidate_version
6556
orig_version = @current_resource.version || "uninstalled"
6657
description = "upgrade #{@current_resource} version from #{@current_resource.version} to #{candidate_version}"
6758
converge_by(description) do
68-
Chef::Log.info("Upgrading #{@new_resource} version from #{orig_version} to #{candidate_version}")
69-
status = upgrade_package(@new_resource.package_name, candidate_version, timeout)
59+
Chef::Log.info("Upgrading #{@new_resource} version from #{orig_version} to #{candidate_version}")
60+
status = upgrade_package(candidate_version)
61+
if status
62+
@new_resource.updated_by_last_action(true)
63+
end
7064
end
7165
end
7266
end
7367

7468
action :remove do
75-
# Set the timeout (units in seconds)
76-
timeout = 900
77-
if @new_resource.timeout
78-
timeout = @new_resource.timeout
79-
end
80-
8169
if removing_package?
8270
description = "remove package #{@new_resource}"
8371
converge_by(description) do
84-
Chef::Log.info("Removing #{@new_resource}")
85-
remove_package(@current_resource.package_name, @new_resource.version, timeout)
72+
Chef::Log.info("Removing #{@new_resource}")
73+
remove_package(@new_resource.version)
74+
@new_resource.updated_by_last_action(true)
8675
end
87-
else
8876
end
8977
end
9078

@@ -100,10 +88,6 @@ def removing_package?
10088
end
10189
end
10290

103-
def expand_options(options)
104-
options ? " #{options}" : ""
105-
end
106-
10791
# these methods are the required overrides of
10892
# a provider that extends from Chef::Provider::Package
10993
# so refactoring into core Chef should be easy
@@ -124,7 +108,7 @@ def current_installed_version
124108
@current_installed_version ||= begin
125109
delimeter = /==/
126110

127-
version_check_cmd = "#{pip_cmd(@new_resource)} freeze | grep -i '^#{@new_resource.package_name}=='"
111+
version_check_cmd = "#{which_pip(@new_resource)} freeze | grep -i '^#{@new_resource.package_name}=='"
128112
# incase you upgrade pip with pip!
129113
if @new_resource.package_name.eql?('pip')
130114
delimeter = /\s/
@@ -146,23 +130,29 @@ def candidate_version
146130
end
147131
end
148132

149-
def install_package(name, version, timeout)
150-
v = "==#{version}" unless version.eql?('latest')
151-
shell_out!("#{pip_cmd(@new_resource)} install#{expand_options(@new_resource.options)} #{name}#{v}", :timeout => timeout)
133+
def install_package(version)
134+
pip_cmd('install', version == 'latest' ? '' : "==#{version}")
135+
end
136+
137+
def upgrade_package(version)
138+
@new_resource.options "#{@new_resource.options} --upgrade"
139+
install_package(version)
152140
end
153141

154-
def upgrade_package(name, version, timeout)
155-
v = "==#{version}" unless version.eql?('latest')
156-
shell_out!("#{pip_cmd(@new_resource)} install --upgrade#{expand_options(@new_resource.options)} #{@new_resource.name}#{v}", :timeout => timeout)
142+
def remove_package(version)
143+
@new_resource.options "#{@new_resource.options} --yes"
144+
pip_cmd('uninstall')
157145
end
158146

159-
def remove_package(name, version, timeout)
160-
shell_out!("#{pip_cmd(@new_resource)} uninstall -y#{expand_options(@new_resource.options)} #{@new_resource.name}", :timeout => timeout)
147+
def pip_cmd(subcommand, version='')
148+
options = { :timeout => @new_resource.timeout, :user => @new_resource.user, :group => @new_resource.group }
149+
options[:environment] = { 'HOME' => ::File.expand_path("~#{@new_resource.user}") } if @new_resource.user
150+
shell_out!("#{which_pip(@new_resource)} #{subcommand} #{@new_resource.options} #{@new_resource.name}#{version}", options)
161151
end
162152

163153
# TODO remove when provider is moved into Chef core
164154
# this allows PythonPip to work with Chef::Resource::Package
165-
def pip_cmd(nr)
155+
def which_pip(nr)
166156
if (nr.respond_to?("virtualenv") && nr.virtualenv)
167157
::File.join(nr.virtualenv,'/bin/pip')
168158
elsif "#{node['python']['install_method']}".eql?("source")

resources/pip.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
attribute :package_name, :kind_of => String, :name_attribute => true
2424
attribute :version, :default => nil
25-
attribute :timeout, :default => nil
25+
attribute :timeout, :default => 900
2626
attribute :virtualenv, :kind_of => String
27-
attribute :options, :kind_of => String
27+
attribute :user, :regex => Chef::Config[:user_valid_regex]
28+
attribute :group, :regex => Chef::Config[:group_valid_regex]
29+
attribute :options, :kind_of => String, :default => ''

0 commit comments

Comments
 (0)