@@ -39,52 +39,40 @@ def whyrun_supported?
39
39
install_version = candidate_version
40
40
end
41
41
42
- # Set the timeout (units in seconds)
43
- timeout = 900
44
- if @new_resource . timeout
45
- timeout = @new_resource . timeout
46
- end
47
-
48
42
if install_version
49
43
description = "install package #{ @new_resource } version #{ install_version } "
50
44
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
53
50
end
54
51
end
55
52
end
56
53
57
54
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
-
64
55
if @current_resource . version != candidate_version
65
56
orig_version = @current_resource . version || "uninstalled"
66
57
description = "upgrade #{ @current_resource } version from #{ @current_resource . version } to #{ candidate_version } "
67
58
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
70
64
end
71
65
end
72
66
end
73
67
74
68
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
-
81
69
if removing_package?
82
70
description = "remove package #{ @new_resource } "
83
71
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 )
86
75
end
87
- else
88
76
end
89
77
end
90
78
@@ -100,10 +88,6 @@ def removing_package?
100
88
end
101
89
end
102
90
103
- def expand_options ( options )
104
- options ? " #{ options } " : ""
105
- end
106
-
107
91
# these methods are the required overrides of
108
92
# a provider that extends from Chef::Provider::Package
109
93
# so refactoring into core Chef should be easy
@@ -124,7 +108,7 @@ def current_installed_version
124
108
@current_installed_version ||= begin
125
109
delimeter = /==/
126
110
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 } =='"
128
112
# incase you upgrade pip with pip!
129
113
if @new_resource . package_name . eql? ( 'pip' )
130
114
delimeter = /\s /
@@ -146,23 +130,29 @@ def candidate_version
146
130
end
147
131
end
148
132
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 )
152
140
end
153
141
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' )
157
145
end
158
146
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 )
161
151
end
162
152
163
153
# TODO remove when provider is moved into Chef core
164
154
# this allows PythonPip to work with Chef::Resource::Package
165
- def pip_cmd ( nr )
155
+ def which_pip ( nr )
166
156
if ( nr . respond_to? ( "virtualenv" ) && nr . virtualenv )
167
157
::File . join ( nr . virtualenv , '/bin/pip' )
168
158
elsif "#{ node [ 'python' ] [ 'install_method' ] } " . eql? ( "source" )
0 commit comments