sprinkle 0.5.1.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +15 -0
- data/lib/sprinkle/actors/actor.rb +15 -0
- data/lib/sprinkle/actors/capistrano.rb +24 -7
- data/lib/sprinkle/actors/local.rb +9 -4
- data/lib/sprinkle/actors/ssh.rb +17 -14
- data/lib/sprinkle/actors/vlad.rb +11 -2
- data/lib/sprinkle/deployment.rb +2 -2
- data/lib/sprinkle/installers/installer.rb +2 -2
- data/lib/sprinkle/installers/runner.rb +1 -1
- data/lib/sprinkle/installers/yum.rb +6 -0
- data/lib/sprinkle/package.rb +38 -50
- data/lib/sprinkle/version.rb +1 -1
- data/spec/sprinkle/actors/capistrano_spec.rb +35 -24
- data/spec/sprinkle/actors/local_spec.rb +9 -4
- data/spec/sprinkle/installers/apt_spec.rb +2 -1
- data/spec/sprinkle/installers/brew_spec.rb +0 -2
- data/spec/sprinkle/installers/installer_spec.rb +8 -1
- data/spec/sprinkle/installers/rpm_spec.rb +0 -3
- data/spec/sprinkle/installers/yum_spec.rb +2 -1
- data/sprinkle.gemspec +1 -0
- metadata +3 -2
data/CHANGELOG.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
* Sprinkle `sudo_cmd` and Capistrino should work together instead of getting in each others way
|
2
|
+
|
3
|
+
When using the capistrano actor `sudo_cmd` will now use the capistrano
|
4
|
+
generated sudo command and therefore automatically deal with password
|
5
|
+
prompts, etc. This should fix hangs when installers try to call `sudo` on
|
6
|
+
the other side of a pipe operation and capistrano can not recognize the
|
7
|
+
password prompt.
|
8
|
+
|
9
|
+
* Sprinkle executable should return an error code if there was a failure
|
10
|
+
|
11
|
+
*Michael Nigh*
|
12
|
+
|
13
|
+
* verify of local actor was never returning false so installers would never be executed
|
14
|
+
|
15
|
+
*Edgars Beigarts*
|
@@ -15,6 +15,8 @@ module Sprinkle
|
|
15
15
|
# * install (installer, roles, options)
|
16
16
|
# * verify (verifier, roles, options)
|
17
17
|
# * servers_for_role? (roles)
|
18
|
+
# * sudo?
|
19
|
+
# * sudo_command
|
18
20
|
#
|
19
21
|
# Hopefully these methods are kind of fairly obvious. They should return true
|
20
22
|
# to indicate success and false to indicate failure.
|
@@ -35,6 +37,19 @@ module Sprinkle
|
|
35
37
|
raise "you must define install"
|
36
38
|
end
|
37
39
|
|
40
|
+
# an actor must define this and let the installers know if it plans
|
41
|
+
# to try and add sudo to all of their commands or not since some
|
42
|
+
# installers might need to handle sudo their own special way
|
43
|
+
def sudo?
|
44
|
+
raise "you must define sudo?"
|
45
|
+
end
|
46
|
+
|
47
|
+
# if an installer needs to call sudo this is the command the actor
|
48
|
+
# would prefer the installers to use
|
49
|
+
def sudo_command
|
50
|
+
raise "you must define sudo_command"
|
51
|
+
end
|
52
|
+
|
38
53
|
def verify(*args)
|
39
54
|
raise "you must define verify"
|
40
55
|
end
|
@@ -38,6 +38,14 @@ module Sprinkle
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
def sudo?
|
42
|
+
@config.fetch(:run_method, :sudo) == :sudo
|
43
|
+
end
|
44
|
+
|
45
|
+
def sudo_command
|
46
|
+
@config.sudo
|
47
|
+
end
|
48
|
+
|
41
49
|
# Determines if there are any servers for the given roles
|
42
50
|
def servers_for_role?(roles)
|
43
51
|
roles=Array(roles)
|
@@ -79,13 +87,15 @@ module Sprinkle
|
|
79
87
|
end
|
80
88
|
|
81
89
|
def verify(verifier, roles, opts = {}) #:nodoc:
|
82
|
-
process(verifier.package.name, verifier.commands, roles
|
83
|
-
|
90
|
+
process(verifier.package.name, verifier.commands, roles)
|
91
|
+
rescue ::Capistrano::CommandError
|
92
|
+
return false
|
84
93
|
end
|
85
94
|
|
86
95
|
def process(name, commands, roles, opts = {}) #:nodoc:
|
87
96
|
inst=@installer
|
88
97
|
@log_recorder = log_recorder = Sprinkle::Utility::LogRecorder.new
|
98
|
+
commands = commands.map {|x| rewrite_command(x)}
|
89
99
|
define_task(name, roles) do
|
90
100
|
via = fetch(:run_method, :sudo)
|
91
101
|
commands.each do |command|
|
@@ -110,6 +120,17 @@ module Sprinkle
|
|
110
120
|
|
111
121
|
private
|
112
122
|
|
123
|
+
# rip out any double sudos from the beginning of the command
|
124
|
+
def rewrite_command(cmd)
|
125
|
+
return cmd if cmd.is_a?(Symbol)
|
126
|
+
via = @config.fetch(:run_method, :sudo)
|
127
|
+
if via == :sudo and cmd =~ /^#{sudo_command}/
|
128
|
+
cmd.gsub(/^#{sudo_command}\s?/,"")
|
129
|
+
else
|
130
|
+
cmd
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
113
134
|
def raise_error(e)
|
114
135
|
details={:command => @log_recorder.command, :code => "??",
|
115
136
|
:message => e.message,
|
@@ -120,11 +141,7 @@ module Sprinkle
|
|
120
141
|
|
121
142
|
def run_task(task, opts={})
|
122
143
|
run(task)
|
123
|
-
|
124
|
-
rescue ::Capistrano::CommandError => e
|
125
|
-
return false if opts[:suppress_and_return_failures]
|
126
|
-
# Reraise error if we're not suppressing it
|
127
|
-
raise
|
144
|
+
true
|
128
145
|
end
|
129
146
|
|
130
147
|
# REVISIT: can we set the description somehow?
|
@@ -24,6 +24,9 @@ module Sprinkle
|
|
24
24
|
true
|
25
25
|
end
|
26
26
|
|
27
|
+
def sudo?; false; end
|
28
|
+
def sudo_command; nil; end
|
29
|
+
|
27
30
|
def install(installer, roles, opts = {}) #:nodoc:
|
28
31
|
# all local installer cares about is the commands
|
29
32
|
@installer = installer
|
@@ -35,7 +38,10 @@ module Sprinkle
|
|
35
38
|
end
|
36
39
|
|
37
40
|
def verify(verifier, roles, opts = {}) #:nodoc:
|
38
|
-
process(verifier.package.name, verifier.commands, roles
|
41
|
+
process(verifier.package.name, verifier.commands, roles)
|
42
|
+
true
|
43
|
+
rescue LocalCommandError
|
44
|
+
false
|
39
45
|
end
|
40
46
|
|
41
47
|
protected
|
@@ -44,15 +50,14 @@ module Sprinkle
|
|
44
50
|
@log_recorder = Sprinkle::Utility::LogRecorder.new
|
45
51
|
commands.each do |command|
|
46
52
|
if command == :RECONNECT
|
47
|
-
|
53
|
+
res = 0
|
48
54
|
elsif command == :TRANSFER
|
49
55
|
res = transfer(@installer.sourcepath, @installer.destination, roles,
|
50
56
|
:recursive => @installer.options[:recursive])
|
51
|
-
raise LocalCommandError if res != 0
|
52
57
|
else
|
53
58
|
res = run_command command
|
54
|
-
raise LocalCommandError if res != 0 and not opts[:suppress_and_return_failures]
|
55
59
|
end
|
60
|
+
raise LocalCommandError if res != 0
|
56
61
|
end
|
57
62
|
return true
|
58
63
|
end
|
data/lib/sprinkle/actors/ssh.rb
CHANGED
@@ -88,9 +88,17 @@ module Sprinkle
|
|
88
88
|
end
|
89
89
|
|
90
90
|
# Set this to true to prepend 'sudo' to every command.
|
91
|
-
def use_sudo(value)
|
91
|
+
def use_sudo(value=true)
|
92
92
|
@options[:use_sudo] = value
|
93
93
|
end
|
94
|
+
|
95
|
+
def sudo?
|
96
|
+
@options[:use_sudo]
|
97
|
+
end
|
98
|
+
|
99
|
+
def sudo_command
|
100
|
+
"sudo"
|
101
|
+
end
|
94
102
|
|
95
103
|
def setup_gateway #:nodoc:
|
96
104
|
@gateway ||= Net::SSH::Gateway.new(@options[:gateway], @options[:user]) if @options[:gateway]
|
@@ -104,8 +112,9 @@ module Sprinkle
|
|
104
112
|
@verifier = verifier
|
105
113
|
# issue all the verification steps in a single SSH command
|
106
114
|
commands=[verifier.commands.join(" && ")]
|
107
|
-
process(verifier.package.name, commands, roles
|
108
|
-
|
115
|
+
process(verifier.package.name, commands, roles)
|
116
|
+
rescue SSHCommandFailure => e
|
117
|
+
false
|
109
118
|
ensure
|
110
119
|
@verifier = nil
|
111
120
|
end
|
@@ -126,9 +135,7 @@ module Sprinkle
|
|
126
135
|
end
|
127
136
|
|
128
137
|
def process(name, commands, roles, opts = {}) #:nodoc:
|
129
|
-
opts.reverse_merge!(:suppress_and_return_failures => false)
|
130
138
|
setup_gateway
|
131
|
-
@suppress = opts[:suppress_and_return_failures]
|
132
139
|
r=execute_on_role(commands, roles)
|
133
140
|
logger.debug green "process returning #{r}"
|
134
141
|
return r
|
@@ -143,10 +150,10 @@ module Sprinkle
|
|
143
150
|
end
|
144
151
|
|
145
152
|
def prepare_commands(commands)
|
146
|
-
return commands unless
|
153
|
+
return commands unless sudo?
|
147
154
|
commands.map do |command|
|
148
155
|
next command if command.is_a?(Symbol)
|
149
|
-
command.match(
|
156
|
+
command.match(/^#{sudo_command}/) ? command : "#{sudo_command} #{command}"
|
150
157
|
end
|
151
158
|
end
|
152
159
|
|
@@ -166,13 +173,9 @@ module Sprinkle
|
|
166
173
|
@log_recorder.reset cmd
|
167
174
|
res = ssh(session, cmd)
|
168
175
|
if res != 0
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
fail=SSHCommandFailure.new
|
173
|
-
fail.details = @log_recorder.hash.merge(:hosts => host)
|
174
|
-
raise fail, "#{cmd} failed with error code #{res[:code]}"
|
175
|
-
end
|
176
|
+
fail=SSHCommandFailure.new
|
177
|
+
fail.details = @log_recorder.hash.merge(:hosts => host)
|
178
|
+
raise fail, "#{cmd} failed with error code #{res[:code]}"
|
176
179
|
end
|
177
180
|
end
|
178
181
|
true
|
data/lib/sprinkle/actors/vlad.rb
CHANGED
@@ -27,6 +27,15 @@ module Sprinkle
|
|
27
27
|
raise "The vlad actor needs a maintainer. "+
|
28
28
|
"Please file an issue on github.com/sprinkle-tool/sprinkle if you can help."
|
29
29
|
end
|
30
|
+
|
31
|
+
def sudo?
|
32
|
+
# TODO
|
33
|
+
raise
|
34
|
+
end
|
35
|
+
|
36
|
+
def sudo_command
|
37
|
+
"sudo"
|
38
|
+
end
|
30
39
|
|
31
40
|
# Defines a script file which will be included by vlad. Use these
|
32
41
|
# script files to set vlad specific configurations. Multiple scripts
|
@@ -66,7 +75,7 @@ module Sprinkle
|
|
66
75
|
protected
|
67
76
|
|
68
77
|
def process(name, commands, roles, opts ={}) #:nodoc:
|
69
|
-
commands = commands.map{|x| "
|
78
|
+
commands = commands.map{|x| "#{sudo_command} #{x}"} if sudo?
|
70
79
|
commands = commands.join(' && ')
|
71
80
|
puts "executing #{commands}"
|
72
81
|
task = remote_task(task_sym(name), :roles => roles) { run commands }
|
@@ -75,7 +84,7 @@ module Sprinkle
|
|
75
84
|
|
76
85
|
def process_with_transfer(name, commands, roles, opts ={}) #:nodoc:
|
77
86
|
raise "cant do non recursive file transfers, sorry" if opts[:recursive] == false
|
78
|
-
commands = commands.map{|x| x == :TRANSFER
|
87
|
+
commands = commands.map{|x| x == :TRANSFER ? x : "sudo #{x}" } if sudo?
|
79
88
|
i = commands.index(:TRANSFER)
|
80
89
|
before = commands.first(i).join(" && ")
|
81
90
|
after = commands.last(commands.size-i+1).join(" && ")
|
data/lib/sprinkle/deployment.rb
CHANGED
@@ -80,10 +80,10 @@ module Sprinkle
|
|
80
80
|
end
|
81
81
|
rescue Sprinkle::Errors::RemoteCommandFailure => e
|
82
82
|
e.print_summary
|
83
|
-
exit
|
83
|
+
exit 1
|
84
84
|
rescue Sprinkle::Errors::TransferFailure => e
|
85
85
|
e.print_summary
|
86
|
-
exit
|
86
|
+
exit 2
|
87
87
|
ensure
|
88
88
|
# do any cleanup our actor may need to close network sockets, etc
|
89
89
|
@style.teardown if @style.respond_to?(:teardown)
|
@@ -80,11 +80,11 @@ module Sprinkle
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def sudo_cmd
|
83
|
-
"sudo " if sudo?
|
83
|
+
return "#{@delivery.try(:sudo_command) || "sudo"} " if sudo?
|
84
84
|
end
|
85
85
|
|
86
86
|
def sudo?
|
87
|
-
options[:sudo] or package.sudo?
|
87
|
+
options[:sudo] or package.sudo? or @delivery.try(:sudo?)
|
88
88
|
end
|
89
89
|
|
90
90
|
def escape_shell_arg(str)
|
@@ -16,6 +16,12 @@ module Sprinkle
|
|
16
16
|
# package :magic_beans do
|
17
17
|
# yum "magic_beans", "magic_sauce"
|
18
18
|
# end
|
19
|
+
#
|
20
|
+
# To install a specific version just add that version after the name
|
21
|
+
#
|
22
|
+
# package :magic_beans do
|
23
|
+
# yum "magic_beans-3.0"
|
24
|
+
# end
|
19
25
|
class Yum < PackageInstaller
|
20
26
|
|
21
27
|
auto_api
|
data/lib/sprinkle/package.rb
CHANGED
@@ -222,78 +222,66 @@ module Sprinkle
|
|
222
222
|
v.process(roles)
|
223
223
|
end
|
224
224
|
end
|
225
|
-
|
226
|
-
def dependencies
|
227
|
-
@dependencies.map {|a,b| a }
|
228
|
-
end
|
229
|
-
|
225
|
+
|
230
226
|
def requires(*packages)
|
231
|
-
|
232
|
-
packages.each do |pack|
|
233
|
-
@dependencies << [pack, opts]
|
234
|
-
end
|
227
|
+
add_dependencies packages, :dependencies
|
235
228
|
end
|
236
229
|
|
237
230
|
def recommends(*packages)
|
238
|
-
|
239
|
-
packages.each do |pack|
|
240
|
-
@recommends << [pack, opts]
|
241
|
-
end
|
242
|
-
@recommends.map {|a,b| a }
|
231
|
+
add_dependencies packages, :recommends
|
243
232
|
end
|
244
233
|
|
245
234
|
def optional(*packages)
|
246
|
-
|
247
|
-
packages.each do |pack|
|
248
|
-
@optional << [pack, opts]
|
249
|
-
end
|
250
|
-
@optional.map {|a,b| a }
|
235
|
+
add_dependencies packages, :optional
|
251
236
|
end
|
252
|
-
|
237
|
+
|
238
|
+
def dependencies
|
239
|
+
@dependencies.map {|a,b| a }
|
240
|
+
end
|
241
|
+
|
253
242
|
def tree(depth = 1, &block)
|
254
243
|
packages = []
|
255
|
-
|
256
|
-
@
|
257
|
-
package = PACKAGES[dep]
|
258
|
-
next unless package # skip missing recommended packages as they're allowed to not exist
|
259
|
-
package=package.instance(config)
|
260
|
-
block.call(self, package, depth) if block
|
261
|
-
packages << package.tree(depth + 1, &block)
|
262
|
-
end
|
263
|
-
|
264
|
-
@dependencies.each do |dep, config|
|
265
|
-
package = PACKAGES[dep]
|
266
|
-
package = select_package(dep, package) if package.is_a? Array
|
267
|
-
|
268
|
-
raise "Package definition not found for key: #{dep}" unless package
|
269
|
-
package = package.instance(config)
|
270
|
-
block.call(self, package, depth) if block
|
271
|
-
packages << package.tree(depth + 1, &block)
|
272
|
-
end
|
273
|
-
|
244
|
+
packages << tree_for_packages(@recommends, :depth => depth, &block)
|
245
|
+
packages << tree_for_packages(@dependencies, :depth => depth, :required => true, &block)
|
274
246
|
packages << self
|
275
|
-
|
276
|
-
@optional.each do |dep, config|
|
277
|
-
package = PACKAGES[dep]
|
278
|
-
next unless package # skip missing optional packages as they're allow to not exist
|
279
|
-
package = package.instance(config)
|
280
|
-
block.call(self, package, depth) if block
|
281
|
-
packages << package.tree(depth + 1, &block)
|
282
|
-
end
|
283
|
-
|
247
|
+
packages << tree_for_packages(@optional, :depth => depth, &block)
|
284
248
|
packages
|
285
249
|
end
|
286
250
|
|
287
251
|
def to_s; @name; end
|
288
252
|
|
289
|
-
|
253
|
+
protected
|
290
254
|
|
291
255
|
def install(i)
|
292
256
|
@installers << i
|
293
257
|
i
|
294
258
|
end
|
295
259
|
|
296
|
-
|
260
|
+
private
|
261
|
+
|
262
|
+
def add_dependencies(packages, kind)
|
263
|
+
opts = packages.extract_options!
|
264
|
+
depends = instance_variable_get("@#{kind}")
|
265
|
+
packages.each do |pack|
|
266
|
+
depends << [pack, opts]
|
267
|
+
end
|
268
|
+
depends.map {|a,b| a }
|
269
|
+
end
|
270
|
+
|
271
|
+
def tree_for_packages(packages, opts={}, &block)
|
272
|
+
depth = opts[:depth]
|
273
|
+
tree = []
|
274
|
+
packages.each do |dep, config|
|
275
|
+
package = PACKAGES[dep]
|
276
|
+
raise "Package definition not found for key: #{dep}" if not package and opts[:required]
|
277
|
+
next unless package # skip missing recommended packages as they're allowed to not exist
|
278
|
+
package = select_package(dep, package) if package.is_a? Array
|
279
|
+
package = package.instance(config)
|
280
|
+
block.call(self, package, depth) if block
|
281
|
+
tree << package.tree(depth + 1, &block)
|
282
|
+
end
|
283
|
+
tree
|
284
|
+
end
|
297
285
|
|
298
286
|
def cloud_info(message)
|
299
287
|
logger.info(message) if Sprinkle::OPTIONS[:cloud] or logger.debug?
|
data/lib/sprinkle/version.rb
CHANGED
@@ -89,6 +89,30 @@ describe Sprinkle::Actors::Capistrano do
|
|
89
89
|
end
|
90
90
|
|
91
91
|
end
|
92
|
+
|
93
|
+
describe 'verifications' do
|
94
|
+
|
95
|
+
before do
|
96
|
+
@commands = %w( op1 op2 )
|
97
|
+
@roles = %w( app )
|
98
|
+
@package = stub(:name => "name")
|
99
|
+
@cap = create_cap
|
100
|
+
@verifier = stub(:package => @package, :commands => ["op1", "op2"])
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should return true if successful" do
|
104
|
+
@cap.stub!(:run).and_return
|
105
|
+
res = @cap.verify(@verifier, @roles)
|
106
|
+
res.should == true
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should return false if there was an error" do
|
110
|
+
@cap.stub!(:run).and_raise(::Capistrano::CommandError)
|
111
|
+
res = @cap.verify(@verifier, @roles)
|
112
|
+
res.should == false
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
92
116
|
|
93
117
|
describe 'processing commands' do
|
94
118
|
|
@@ -102,6 +126,14 @@ describe Sprinkle::Actors::Capistrano do
|
|
102
126
|
|
103
127
|
@testing_errors = false
|
104
128
|
end
|
129
|
+
|
130
|
+
it "should strip excessive occurrences of sudo" do
|
131
|
+
# pretend the package or installer has also added sudo
|
132
|
+
@commands =["sudo op1"]
|
133
|
+
@cap.stub(:sudo_command).and_return("sudo")
|
134
|
+
@cap.unstub!(:run)
|
135
|
+
@cap.config.should_receive(:invoke_command).with('op1', :via => :sudo).ordered.and_return
|
136
|
+
end
|
105
137
|
|
106
138
|
it 'should dynamically create a capistrano task containing the commands' do
|
107
139
|
@cap.config.should_receive(:task).and_return
|
@@ -118,17 +150,6 @@ describe Sprinkle::Actors::Capistrano do
|
|
118
150
|
lambda { @cap.process @name, @commands, @roles }.should raise_error(::Capistrano::CommandError)
|
119
151
|
end
|
120
152
|
|
121
|
-
it 'should not raise errors and instead return false when suppressing parameter is set' do
|
122
|
-
@testing_errors = true
|
123
|
-
|
124
|
-
@cap.should_receive(:run).and_raise(::Capistrano::CommandError)
|
125
|
-
|
126
|
-
value = nil
|
127
|
-
lambda { value = @cap.process(@name, @commands, @roles, true) }.should_not raise_error(::Capistrano::CommandError)
|
128
|
-
|
129
|
-
value.should_not be
|
130
|
-
end
|
131
|
-
|
132
153
|
after do
|
133
154
|
@cap.process @name, @commands, @roles unless @testing_errors
|
134
155
|
end
|
@@ -141,6 +162,7 @@ describe Sprinkle::Actors::Capistrano do
|
|
141
162
|
@source = 'source'
|
142
163
|
@dest = 'dest'
|
143
164
|
@roles = %w( app )
|
165
|
+
@commands = [:TRANSFER]
|
144
166
|
@name = 'name'
|
145
167
|
|
146
168
|
@cap = create_cap do; recipes 'deploy'; end
|
@@ -167,17 +189,6 @@ describe Sprinkle::Actors::Capistrano do
|
|
167
189
|
lambda { @cap.process @name, @commands, @roles }.should raise_error(::Capistrano::CommandError)
|
168
190
|
end
|
169
191
|
|
170
|
-
it 'should not raise errors and instead return false when suppressing parameter is set' do
|
171
|
-
@testing_errors = true
|
172
|
-
|
173
|
-
@cap.should_receive(:run).and_raise(::Capistrano::CommandError)
|
174
|
-
|
175
|
-
value = nil
|
176
|
-
lambda { value = @cap.process(@name, @commands, @roles, true) }.should_not raise_error(::Capistrano::CommandError)
|
177
|
-
|
178
|
-
value.should_not be
|
179
|
-
end
|
180
|
-
|
181
192
|
after do
|
182
193
|
@cap.process @package.name, @installer.install_sequence, @roles
|
183
194
|
end
|
@@ -191,12 +202,12 @@ describe Sprinkle::Actors::Capistrano do
|
|
191
202
|
@name = 'name'
|
192
203
|
|
193
204
|
@cap = create_cap do; recipes 'deploy'; end
|
194
|
-
@cap.config.stub!(:fetch).and_return(:sudo)
|
195
205
|
@cap.config.stub!(:invoke_command).and_return
|
196
206
|
end
|
197
207
|
|
198
208
|
it 'should use sudo to invoke commands when so configured' do
|
199
|
-
@cap.config.should_receive(:
|
209
|
+
@cap.config.should_receive(:invoke_command).with('op1', :via => :sudo).ordered.and_return
|
210
|
+
@cap.config.should_receive(:invoke_command).with('op2', :via => :sudo).ordered.and_return
|
200
211
|
end
|
201
212
|
|
202
213
|
it 'should run the supplied commands' do
|
@@ -33,13 +33,18 @@ describe Sprinkle::Actors::Local do
|
|
33
33
|
@verifier.commands += ["test","test"]
|
34
34
|
@roles = %w( app )
|
35
35
|
@name = 'name'
|
36
|
-
|
37
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should return false when verification fails' do
|
39
|
+
@local.stub!(:run_command).and_return(1)
|
40
|
+
res = @local.verify @verifier, @roles
|
41
|
+
res.should == false
|
38
42
|
end
|
39
43
|
|
40
44
|
it 'should run the commands on the local system' do
|
41
|
-
@local.
|
42
|
-
@local.verify @verifier, @roles
|
45
|
+
@local.stub!(:run_command).and_return(0)
|
46
|
+
res = @local.verify @verifier, @roles
|
47
|
+
res.should == true
|
43
48
|
end
|
44
49
|
|
45
50
|
end
|
@@ -73,7 +73,8 @@ describe Sprinkle::Installers::Apt do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'should install a specific version if defined' do
|
76
|
-
|
76
|
+
@installer = create_apt 'ruby=2'
|
77
|
+
@installer.send(:install_sequence).should == [ %(env DEBCONF_TERSE='yes' DEBIAN_PRIORITY='critical' DEBIAN_FRONTEND=noninteractive apt-get --force-yes -qyu install ruby=2)]
|
77
78
|
end
|
78
79
|
|
79
80
|
end
|
@@ -7,7 +7,8 @@ describe Sprinkle::Installers::Installer do
|
|
7
7
|
@package = mock(Sprinkle::Package, :name => 'package')
|
8
8
|
@empty = Proc.new { }
|
9
9
|
@sequence = ['op1', 'op2']
|
10
|
-
@delivery = mock(Sprinkle::Deployment, :process => true, :install => true
|
10
|
+
@delivery = mock(Sprinkle::Deployment, :process => true, :install => true,
|
11
|
+
:sudo_command => "sudo")
|
11
12
|
@installer = create_installer
|
12
13
|
@installer.delivery = @delivery
|
13
14
|
@roles = []
|
@@ -102,6 +103,12 @@ describe Sprinkle::Installers::Installer do
|
|
102
103
|
@installer.delivery = @delivery
|
103
104
|
end
|
104
105
|
|
106
|
+
it "should use sudo command from actor" do
|
107
|
+
@installer.delivery = mock(Sprinkle::Deployment, :process => true, :install => true,
|
108
|
+
:sudo_command => "sudo -p blah")
|
109
|
+
@installer.sudo_cmd.should =~ /sudo -p blah /
|
110
|
+
end
|
111
|
+
|
105
112
|
it "should know it uses sudo" do
|
106
113
|
@installer.sudo?.should == true
|
107
114
|
end
|
@@ -47,9 +47,6 @@ describe Sprinkle::Installers::Rpm do
|
|
47
47
|
@installer.send(:install_sequence).should == [ 'op1', 'rpm -Uvh ruby', 'op2' ]
|
48
48
|
end
|
49
49
|
|
50
|
-
it 'should specify a non interactive mode to the apt installer' do
|
51
|
-
pending
|
52
|
-
end
|
53
50
|
it 'should install a specific version if defined' do
|
54
51
|
pending
|
55
52
|
end
|
data/sprinkle.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sprinkle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-05-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -134,6 +134,7 @@ extra_rdoc_files:
|
|
134
134
|
files:
|
135
135
|
- .gitignore
|
136
136
|
- .travis.yml
|
137
|
+
- CHANGELOG.md
|
137
138
|
- CREDITS
|
138
139
|
- Gemfile
|
139
140
|
- Gemfile.lock
|