ridley 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +4 -0
- data/Guardfile +1 -1
- data/README.md +2 -12
- data/bootstrappers/omnibus.erb +3 -0
- data/lib/ridley/bootstrapper/context.rb +2 -2
- data/lib/ridley/bootstrapper.rb +42 -48
- data/lib/ridley/connection.rb +55 -19
- data/lib/ridley/logging.rb +1 -0
- data/lib/ridley/resource.rb +14 -1
- data/lib/ridley/resources/node.rb +84 -13
- data/lib/ridley/resources/sandbox.rb +38 -6
- data/lib/ridley/ssh/response.rb +16 -1
- data/lib/ridley/ssh/response_set.rb +72 -25
- data/lib/ridley/ssh/worker.rb +25 -10
- data/lib/ridley/ssh.rb +12 -30
- data/lib/ridley/version.rb +1 -1
- data/lib/ridley.rb +8 -16
- data/ridley.gemspec +1 -0
- data/spec/support/actor_mocking.rb +9 -0
- data/spec/support/shared_examples/ridley_resource.rb +36 -3
- data/spec/unit/ridley/connection_spec.rb +4 -0
- data/spec/unit/ridley/resources/node_spec.rb +57 -0
- data/spec/unit/ridley/ssh/response_set_spec.rb +112 -0
- data/spec/unit/ridley/ssh/worker_spec.rb +13 -0
- data/spec/unit/ridley/ssh_spec.rb +23 -6
- metadata +11 -4
@@ -2,50 +2,97 @@ module Ridley
|
|
2
2
|
class SSH
|
3
3
|
# @author Jamie Winsor <jamie@vialstudios.com>
|
4
4
|
class ResponseSet
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
class << self
|
6
|
+
# Merges the responses of the other ResponseSet with the target ResponseSet
|
7
|
+
# and returns the mutated target
|
8
|
+
#
|
9
|
+
# @param [SSH::ResponseSet] target
|
10
|
+
# @param [SSH::ResponseSet] other
|
11
|
+
#
|
12
|
+
# @return [SSH::ResponseSet]
|
13
|
+
def merge!(target, other)
|
14
|
+
if other.is_a?(self)
|
15
|
+
target.add_response(other.responses)
|
16
|
+
end
|
9
17
|
|
10
|
-
|
11
|
-
|
12
|
-
@errors = Array.new
|
18
|
+
target
|
19
|
+
end
|
13
20
|
end
|
14
21
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
22
|
+
extend Forwardable
|
23
|
+
include Enumerable
|
24
|
+
|
25
|
+
attr_reader :failures
|
26
|
+
attr_reader :successes
|
27
|
+
|
28
|
+
def_delegator :responses, :each
|
29
|
+
|
30
|
+
def initialize(responses = Array.new)
|
31
|
+
@failures = Array.new
|
32
|
+
@successes = Array.new
|
33
|
+
|
34
|
+
add_response Array(responses)
|
20
35
|
end
|
21
36
|
|
22
|
-
#
|
37
|
+
# @param [SSH::Response, Array<SSH::Response>] response
|
23
38
|
#
|
24
|
-
# @
|
25
|
-
def
|
26
|
-
|
39
|
+
# @return [Array<SSH::Response>]
|
40
|
+
def add_response(response)
|
41
|
+
if response.is_a?(Array)
|
42
|
+
until response.empty?
|
43
|
+
add_response(response.pop)
|
44
|
+
end
|
45
|
+
return responses
|
46
|
+
end
|
47
|
+
|
48
|
+
response.error? ? add_failure(response) : add_success(response)
|
49
|
+
responses
|
50
|
+
end
|
51
|
+
alias_method :<<, :add_response
|
52
|
+
|
53
|
+
def responses
|
54
|
+
successes + failures
|
27
55
|
end
|
28
56
|
|
29
57
|
# Return true if the response set contains any errors
|
30
58
|
#
|
31
59
|
# @return [Boolean]
|
32
60
|
def has_errors?
|
33
|
-
self.
|
61
|
+
self.failures.any?
|
34
62
|
end
|
35
63
|
|
36
|
-
#
|
64
|
+
# Merges the responses of another ResponseSet with self and returns
|
65
|
+
# a new instance of ResponseSet
|
66
|
+
#
|
67
|
+
# @param [Ridley::SSH::ResponseSet] other
|
37
68
|
#
|
38
|
-
# @return [SSH::
|
39
|
-
def
|
40
|
-
(self.
|
69
|
+
# @return [Ridley::SSH::ResponseSet]
|
70
|
+
def merge(other)
|
71
|
+
target = self.class.new(self.responses) # Why the fuck can't I use #dup here?
|
72
|
+
self.class.merge!(target, other)
|
41
73
|
end
|
42
74
|
|
43
|
-
#
|
75
|
+
# Merges the respones of another ResponseSet with self and returns
|
76
|
+
# mutated self
|
44
77
|
#
|
45
|
-
# @
|
46
|
-
|
47
|
-
|
78
|
+
# @param [Ridley::SSH::ResponseSet] other
|
79
|
+
#
|
80
|
+
# @return [self]
|
81
|
+
def merge!(other)
|
82
|
+
self.class.merge!(self, other)
|
48
83
|
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
# @param [SSH::Response] response
|
88
|
+
def add_failure(response)
|
89
|
+
self.failures << response
|
90
|
+
end
|
91
|
+
|
92
|
+
# @param [SSH::Response] response
|
93
|
+
def add_success(response)
|
94
|
+
self.successes << response
|
95
|
+
end
|
49
96
|
end
|
50
97
|
end
|
51
98
|
end
|
data/lib/ridley/ssh/worker.rb
CHANGED
@@ -5,11 +5,18 @@ module Ridley
|
|
5
5
|
class Worker
|
6
6
|
include Celluloid
|
7
7
|
include Celluloid::Logger
|
8
|
+
|
9
|
+
attr_reader :sudo
|
10
|
+
attr_reader :user
|
11
|
+
attr_reader :options
|
8
12
|
|
9
13
|
# @param [Hash] options
|
10
14
|
def initialize(options = {})
|
11
|
-
@options = options
|
12
|
-
@
|
15
|
+
@options = options.dup
|
16
|
+
@sudo = @options[:sudo]
|
17
|
+
@user = @options[:user]
|
18
|
+
|
19
|
+
@options[:paranoid] = false
|
13
20
|
end
|
14
21
|
|
15
22
|
# @param [String] host
|
@@ -17,11 +24,15 @@ module Ridley
|
|
17
24
|
#
|
18
25
|
# @return [Array]
|
19
26
|
def run(host, command)
|
20
|
-
response = Response.new(
|
27
|
+
response = Response.new(host)
|
21
28
|
debug "Running SSH command: '#{command}' on: '#{host}' as: '#{user}'"
|
22
29
|
|
23
|
-
Net::SSH.start(host, user, options) do |ssh|
|
30
|
+
Net::SSH.start(host, user, options.slice(*Net::SSH::VALID_OPTIONS)) do |ssh|
|
24
31
|
ssh.open_channel do |channel|
|
32
|
+
if self.sudo
|
33
|
+
channel.request_pty
|
34
|
+
end
|
35
|
+
|
25
36
|
channel.exec(command) do |ch, success|
|
26
37
|
unless success
|
27
38
|
raise "FAILURE: could not execute command"
|
@@ -29,10 +40,12 @@ module Ridley
|
|
29
40
|
|
30
41
|
channel.on_data do |ch, data|
|
31
42
|
response.stdout += data
|
43
|
+
info "NODE[#{host}] #{data}" if data.present? and data != "\r\n"
|
32
44
|
end
|
33
45
|
|
34
46
|
channel.on_extended_data do |ch, type, data|
|
35
47
|
response.stderr += data
|
48
|
+
info "NODE[#{host}] #{data}" if data.present? and data != "\r\n"
|
36
49
|
end
|
37
50
|
|
38
51
|
channel.on_request("exit-status") do |ch, data|
|
@@ -50,22 +63,24 @@ module Ridley
|
|
50
63
|
|
51
64
|
case response.exit_code
|
52
65
|
when 0
|
53
|
-
debug "Successfully ran SSH command
|
66
|
+
debug "Successfully ran SSH command on: '#{host}' as: '#{user}'"
|
54
67
|
[ :ok, response ]
|
55
68
|
else
|
56
|
-
|
69
|
+
error "Successfully ran SSH command on: '#{host}' as: '#{user}', but it failed"
|
70
|
+
error response.stdout
|
57
71
|
[ :error, response ]
|
58
72
|
end
|
59
73
|
rescue => e
|
60
|
-
|
61
|
-
|
74
|
+
error "Failed to run SSH command on: '#{host}' as: '#{user}'"
|
75
|
+
error "#{e.class}: #{e.message}"
|
76
|
+
response.exit_code = -1
|
77
|
+
response.stderr = e.message
|
78
|
+
[ :error, response ]
|
62
79
|
end
|
63
80
|
|
64
81
|
private
|
65
82
|
|
66
83
|
attr_reader :runner
|
67
|
-
attr_reader :user
|
68
|
-
attr_reader :options
|
69
84
|
end
|
70
85
|
end
|
71
86
|
end
|
data/lib/ridley/ssh.rb
CHANGED
@@ -29,46 +29,28 @@ module Ridley
|
|
29
29
|
# @param [Hash] options
|
30
30
|
# @see Net::SSH
|
31
31
|
def initialize(nodes, options = {})
|
32
|
-
@nodes = nodes
|
32
|
+
@nodes = Array(nodes)
|
33
33
|
@options = options
|
34
|
-
|
35
|
-
self.options[:timeout] ||= 1.5
|
36
|
-
end
|
37
|
-
|
38
|
-
# @return [Array<SSH::Worker>]
|
39
|
-
def workers
|
40
|
-
@workers ||= Array(nodes).collect do |node|
|
41
|
-
Worker.new_link(current_actor, node.public_hostname, options)
|
42
|
-
end
|
43
34
|
end
|
44
35
|
|
45
36
|
# @param [String] command
|
46
37
|
#
|
47
38
|
# @return [Array]
|
48
39
|
def run(command)
|
49
|
-
workers
|
40
|
+
workers = Array.new
|
41
|
+
futures = self.nodes.collect do |node|
|
42
|
+
workers << worker = Worker.new_link(self.options.freeze)
|
43
|
+
worker.future.run(node.public_hostname, command)
|
44
|
+
end
|
50
45
|
|
51
|
-
ResponseSet.new.tap do |
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
case status
|
57
|
-
when :ok
|
58
|
-
responses.add_ok(response)
|
59
|
-
when :error
|
60
|
-
responses.add_error(response)
|
61
|
-
else
|
62
|
-
error "SSH Failure: #{command}. terminating..."
|
63
|
-
terminate
|
64
|
-
end
|
65
|
-
}
|
46
|
+
ResponseSet.new.tap do |response_set|
|
47
|
+
futures.each do |future|
|
48
|
+
status, response = future.value
|
49
|
+
response_set.add_response(response)
|
66
50
|
end
|
67
51
|
end
|
68
|
-
|
69
|
-
|
70
|
-
def finalize
|
71
|
-
workers.collect(&:terminate)
|
52
|
+
ensure
|
53
|
+
workers.map(&:terminate)
|
72
54
|
end
|
73
55
|
end
|
74
56
|
end
|
data/lib/ridley/version.rb
CHANGED
data/lib/ridley.rb
CHANGED
@@ -8,6 +8,7 @@ require 'active_model'
|
|
8
8
|
require 'active_support/inflector'
|
9
9
|
require 'forwardable'
|
10
10
|
require 'thread'
|
11
|
+
require 'pathname'
|
11
12
|
|
12
13
|
if jruby?
|
13
14
|
require 'json/pure'
|
@@ -41,7 +42,13 @@ module Ridley
|
|
41
42
|
autoload :SSH, 'ridley/ssh'
|
42
43
|
|
43
44
|
class << self
|
44
|
-
|
45
|
+
extend Forwardable
|
46
|
+
|
47
|
+
def_delegator "Ridley::Logging", :logger
|
48
|
+
alias_method :log, :logger
|
49
|
+
|
50
|
+
def_delegator "Ridley::Logging", :logger=
|
51
|
+
def_delegator "Ridley::Logging", :set_logger
|
45
52
|
|
46
53
|
def connection(*args)
|
47
54
|
Connection.new(*args)
|
@@ -51,19 +58,6 @@ module Ridley
|
|
51
58
|
Connection.sync(*args, &block)
|
52
59
|
end
|
53
60
|
|
54
|
-
# @return [Logger]
|
55
|
-
def logger
|
56
|
-
Ridley::Logging.logger
|
57
|
-
end
|
58
|
-
alias_method :log, :logger
|
59
|
-
|
60
|
-
# @param [Logger, nil] obj
|
61
|
-
#
|
62
|
-
# @return [Logger]
|
63
|
-
def set_logger(obj)
|
64
|
-
Ridley::Logging.set_logger(obj)
|
65
|
-
end
|
66
|
-
|
67
61
|
# @return [Pathname]
|
68
62
|
def root
|
69
63
|
@root ||= Pathname.new(File.expand_path('../', File.dirname(__FILE__)))
|
@@ -71,6 +65,4 @@ module Ridley
|
|
71
65
|
end
|
72
66
|
end
|
73
67
|
|
74
|
-
Celluloid.logger = Ridley.logger
|
75
|
-
|
76
68
|
require 'ridley/middleware'
|
data/ridley.gemspec
CHANGED
@@ -7,6 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.description = %q{A reliable Chef API client with a clean syntax}
|
8
8
|
s.summary = s.description
|
9
9
|
s.homepage = "https://github.com/reset/ridley"
|
10
|
+
s.license = "Apache 2.0"
|
10
11
|
|
11
12
|
s.files = `git ls-files`.split($\)
|
12
13
|
s.executables = Array.new
|
@@ -146,12 +146,12 @@ shared_examples_for "a Ridley Resource" do |resource_klass|
|
|
146
146
|
end
|
147
147
|
|
148
148
|
context "when there is an HTTPConflict" do
|
149
|
-
it "sends
|
149
|
+
it "sends the update message to self" do
|
150
150
|
updated = double('updated')
|
151
151
|
updated.stub(:[]).and_return(Hash.new)
|
152
152
|
updated.stub(:attributes).and_return(Hash.new)
|
153
153
|
subject.class.should_receive(:create).and_raise(Ridley::Errors::HTTPConflict.new(updated))
|
154
|
-
subject.
|
154
|
+
subject.should_receive(:update).and_return(updated)
|
155
155
|
|
156
156
|
subject.save
|
157
157
|
end
|
@@ -161,7 +161,7 @@ shared_examples_for "a Ridley Resource" do |resource_klass|
|
|
161
161
|
context "when the object is invalid" do
|
162
162
|
before(:each) { subject.stub(:valid?).and_return(false) }
|
163
163
|
|
164
|
-
it "raises an
|
164
|
+
it "raises an InvalidResource error" do
|
165
165
|
lambda {
|
166
166
|
subject.save
|
167
167
|
}.should raise_error(Ridley::Errors::InvalidResource)
|
@@ -169,6 +169,39 @@ shared_examples_for "a Ridley Resource" do |resource_klass|
|
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
172
|
+
describe "#update" do
|
173
|
+
context "when the object is valid" do
|
174
|
+
let(:updated) do
|
175
|
+
updated = double('updated')
|
176
|
+
updated.stub(:[]).and_return(Hash.new)
|
177
|
+
updated.stub(:attributes).and_return(Hash.new)
|
178
|
+
updated
|
179
|
+
end
|
180
|
+
|
181
|
+
before(:each) { subject.stub(:valid?).and_return(true) }
|
182
|
+
|
183
|
+
it "sends an update message to the implementing class" do
|
184
|
+
subject.class.should_receive(:update).with(anything, subject).and_return(updated)
|
185
|
+
subject.update
|
186
|
+
end
|
187
|
+
|
188
|
+
it "returns true" do
|
189
|
+
subject.class.should_receive(:update).with(anything, subject).and_return(updated)
|
190
|
+
subject.update.should eql(true)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
context "when the object is invalid" do
|
195
|
+
before(:each) { subject.stub(:valid?).and_return(false) }
|
196
|
+
|
197
|
+
it "raises an InvalidResource error" do
|
198
|
+
lambda {
|
199
|
+
subject.update
|
200
|
+
}.should raise_error(Ridley::Errors::InvalidResource)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
172
205
|
describe "#chef_id" do
|
173
206
|
it "returns the value of the chef_id attribute" do
|
174
207
|
subject.class.attribute(:name)
|
@@ -35,6 +35,17 @@ describe Ridley::Node do
|
|
35
35
|
subject.bootstrap(connection, "33.33.33.10", "33.33.33.11", boot_options)
|
36
36
|
end
|
37
37
|
end
|
38
|
+
|
39
|
+
describe "::merge_data" do
|
40
|
+
it "finds the target node and sends it the merge_data message" do
|
41
|
+
data = double('data')
|
42
|
+
node = double('node')
|
43
|
+
node.should_receive(:merge_data).with(data)
|
44
|
+
subject.should_receive(:find!).and_return(node)
|
45
|
+
|
46
|
+
subject.merge_data(connection, node, data)
|
47
|
+
end
|
48
|
+
end
|
38
49
|
end
|
39
50
|
|
40
51
|
subject { Ridley::Node.new(connection) }
|
@@ -285,4 +296,50 @@ describe Ridley::Node do
|
|
285
296
|
describe "#chef_client" do
|
286
297
|
pending
|
287
298
|
end
|
299
|
+
|
300
|
+
describe "#put_secret" do
|
301
|
+
pending
|
302
|
+
end
|
303
|
+
|
304
|
+
describe "#merge_data" do
|
305
|
+
before(:each) do
|
306
|
+
subject.name = "reset.riotgames.com"
|
307
|
+
subject.should_receive(:update)
|
308
|
+
end
|
309
|
+
|
310
|
+
it "appends items to the run_list" do
|
311
|
+
subject.merge_data(run_list: ["cook::one", "cook::two"])
|
312
|
+
|
313
|
+
subject.run_list.should =~ ["cook::one", "cook::two"]
|
314
|
+
end
|
315
|
+
|
316
|
+
it "ensures the run_list is unique if identical items are given" do
|
317
|
+
subject.run_list = [ "cook::one" ]
|
318
|
+
subject.merge_data(run_list: ["cook::one", "cook::two"])
|
319
|
+
|
320
|
+
subject.run_list.should =~ ["cook::one", "cook::two"]
|
321
|
+
end
|
322
|
+
|
323
|
+
it "deep merges attributes into the normal attributes" do
|
324
|
+
subject.normal = {
|
325
|
+
one: {
|
326
|
+
two: {
|
327
|
+
four: :deep
|
328
|
+
}
|
329
|
+
}
|
330
|
+
}
|
331
|
+
subject.merge_data(attributes: {
|
332
|
+
one: {
|
333
|
+
two: {
|
334
|
+
three: :deep
|
335
|
+
}
|
336
|
+
}
|
337
|
+
})
|
338
|
+
|
339
|
+
subject.normal[:one][:two].should have_key(:four)
|
340
|
+
subject.normal[:one][:two][:four].should eql(:deep)
|
341
|
+
subject.normal[:one][:two].should have_key(:three)
|
342
|
+
subject.normal[:one][:two][:three].should eql(:deep)
|
343
|
+
end
|
344
|
+
end
|
288
345
|
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ridley::SSH::ResponseSet do
|
4
|
+
describe "ClassMethods" do
|
5
|
+
subject { described_class }
|
6
|
+
|
7
|
+
describe "::merge!" do
|
8
|
+
let(:target) { Ridley::SSH::ResponseSet.new }
|
9
|
+
let(:other) { Ridley::SSH::ResponseSet.new }
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
other.add_response(Ridley::SSH::Response.new('host.local'))
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns the mutated target" do
|
16
|
+
result = subject.merge!(target, other)
|
17
|
+
|
18
|
+
result.should eql(target)
|
19
|
+
result.should have(1).item
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
subject { described_class.new }
|
25
|
+
|
26
|
+
describe "#add_response" do
|
27
|
+
it "accepts an array of responses" do
|
28
|
+
responses = [
|
29
|
+
Ridley::SSH::Response.new("one.riotgames.com"),
|
30
|
+
Ridley::SSH::Response.new("two.riotgames.com")
|
31
|
+
]
|
32
|
+
subject.add_response(responses)
|
33
|
+
|
34
|
+
subject.responses.should have(2).items
|
35
|
+
end
|
36
|
+
|
37
|
+
it "accepts a single response" do
|
38
|
+
response = Ridley::SSH::Response.new("one.riotgames.com")
|
39
|
+
subject.add_response(response)
|
40
|
+
|
41
|
+
subject.responses.should have(1).item
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#responses" do
|
46
|
+
it "returns an array of Ridley::SSH::Response objects including both failures and successes" do
|
47
|
+
responses = [
|
48
|
+
double('success', error?: false),
|
49
|
+
double('failure', error?: true)
|
50
|
+
]
|
51
|
+
subject.add_response(responses)
|
52
|
+
|
53
|
+
subject.responses.should have(2).items
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#successes" do
|
58
|
+
it "returns an array of Ridley::SSH::Response objects only including the successes" do
|
59
|
+
responses = [
|
60
|
+
double('success', error?: false),
|
61
|
+
double('failure', error?: true)
|
62
|
+
]
|
63
|
+
subject.add_response(responses)
|
64
|
+
|
65
|
+
subject.successes.should have(1).item
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#failures" do
|
70
|
+
it "returns an array of Ridley::SSH::Response objects only including the failures" do
|
71
|
+
responses = [
|
72
|
+
double('success', error?: false),
|
73
|
+
double('failure', error?: true)
|
74
|
+
]
|
75
|
+
subject.add_response(responses)
|
76
|
+
|
77
|
+
subject.failures.should have(1).item
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#merge" do
|
82
|
+
let(:target) { Ridley::SSH::ResponseSet.new }
|
83
|
+
let(:other) { Ridley::SSH::ResponseSet.new }
|
84
|
+
|
85
|
+
before(:each) do
|
86
|
+
other.add_response(Ridley::SSH::Response.new('host.local'))
|
87
|
+
end
|
88
|
+
|
89
|
+
it "returns a new Ridley::SSH::ResponseSet object" do
|
90
|
+
result = target.merge(other)
|
91
|
+
|
92
|
+
result.should have(1).item
|
93
|
+
target.should have(0).items
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#merge!" do
|
98
|
+
let(:target) { Ridley::SSH::ResponseSet.new }
|
99
|
+
let(:other) { Ridley::SSH::ResponseSet.new }
|
100
|
+
|
101
|
+
before(:each) do
|
102
|
+
other.add_response(Ridley::SSH::Response.new('host.local'))
|
103
|
+
end
|
104
|
+
|
105
|
+
it "returns the mutated target" do
|
106
|
+
result = target.merge!(other)
|
107
|
+
|
108
|
+
result.should have(1).item
|
109
|
+
target.should have(1).item
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ridley::SSH::Worker do
|
4
|
+
describe "ClassMethods" do
|
5
|
+
subject { described_class }
|
6
|
+
|
7
|
+
describe "::new" do
|
8
|
+
it { subject.new(sudo: true).sudo.should be_true }
|
9
|
+
it { subject.new(sudo: false).sudo.should be_false }
|
10
|
+
it { subject.new().sudo.should be_false }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -15,17 +15,34 @@ describe Ridley::SSH do
|
|
15
15
|
subject { Ridley::SSH }
|
16
16
|
|
17
17
|
describe "::start" do
|
18
|
-
|
18
|
+
let(:options) do
|
19
|
+
{
|
20
|
+
user: "vagrant",
|
21
|
+
password: "vagrant"
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
it "evaluates within the context of a new SSH and returns the last item in the block" do
|
26
|
+
result = subject.start([node_one, node_two], options) do |ssh|
|
27
|
+
ssh.run("ls")
|
28
|
+
end
|
29
|
+
|
30
|
+
result.should be_a(Ridley::SSH::ResponseSet)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "raises a LocalJumpError if a block is not provided" do
|
34
|
+
expect {
|
35
|
+
subject.start([node_one, node_two], options)
|
36
|
+
}.to raise_error(LocalJumpError)
|
37
|
+
end
|
19
38
|
end
|
20
39
|
end
|
21
40
|
|
22
41
|
subject { Ridley::SSH.new([node_one, node_two], user: "vagrant", password: "vagrant") }
|
23
42
|
|
24
|
-
describe "#workers" do
|
25
|
-
pending
|
26
|
-
end
|
27
|
-
|
28
43
|
describe "#run" do
|
29
|
-
|
44
|
+
it "returns an SSH::ResponseSet" do
|
45
|
+
subject.run("ls").should be_a(Ridley::SSH::ResponseSet)
|
46
|
+
end
|
30
47
|
end
|
31
48
|
end
|