ridley 1.0.0.rc3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,7 @@
1
1
  require 'active_support/inflector'
2
2
  require 'addressable/uri'
3
3
  require 'celluloid'
4
+ require 'celluloid/io'
4
5
  require 'chozo'
5
6
  require 'faraday'
6
7
  require 'forwardable'
@@ -6,6 +6,7 @@ require 'zlib'
6
6
  module Ridley
7
7
  class Connection < Faraday::Connection
8
8
  include Celluloid
9
+ task_class TaskThread
9
10
 
10
11
  VALID_OPTIONS = [
11
12
  :retries,
@@ -100,7 +101,7 @@ module Ridley
100
101
  # Override Faraday::Connection#run_request to catch exceptions from {Ridley::Middleware} that
101
102
  # we expect. Caught exceptions are re-raised with Celluloid#abort so we don't crash the connection.
102
103
  def run_request(*args)
103
- defer { super }
104
+ super
104
105
  rescue Errors::HTTPError => ex
105
106
  abort ex
106
107
  rescue Faraday::Error::ConnectionFailed => ex
@@ -140,22 +141,20 @@ module Ridley
140
141
  local = Tempfile.new('ridley-stream')
141
142
  local.binmode
142
143
 
143
- defer {
144
- retryable(tries: retries, on: OpenURI::HTTPError, sleep: retry_interval) do
145
- open(target, 'rb', headers) do |remote|
146
- body = remote.read
147
- case remote.content_encoding
148
- when ['gzip']
149
- body = Zlib::GzipReader.new(StringIO.new(body), encoding: 'ASCII-8BIT').read
150
- when ['deflate']
151
- body = Zlib::Inflate.inflate(body)
152
- end
153
- local.write(body)
144
+ retryable(tries: retries, on: OpenURI::HTTPError, sleep: retry_interval) do
145
+ open(target, 'rb', headers) do |remote|
146
+ body = remote.read
147
+ case remote.content_encoding
148
+ when ['gzip']
149
+ body = Zlib::GzipReader.new(StringIO.new(body), encoding: 'ASCII-8BIT').read
150
+ when ['deflate']
151
+ body = Zlib::Inflate.inflate(body)
154
152
  end
153
+ local.write(body)
155
154
  end
155
+ end
156
156
 
157
- local.flush
158
- }
157
+ local.flush
159
158
 
160
159
  FileUtils.mv(local.path, destination)
161
160
  rescue OpenURI::HTTPError => ex
@@ -1,6 +1,3 @@
1
- require 'socket'
2
- require 'timeout'
3
-
4
1
  module Ridley
5
2
  class ConnectorSupervisor < ::Celluloid::SupervisionGroup
6
3
  # @param [Celluloid::Registry] registry
@@ -12,25 +9,6 @@ module Ridley
12
9
  end
13
10
 
14
11
  class HostCommander
15
- class << self
16
- # Checks to see if the given port is open for TCP connections
17
- # on the given host.
18
- #
19
- # @param [String] host
20
- # the host to attempt to connect to
21
- # @param [Fixnum] port
22
- # the port to attempt to connect on
23
- # @param [Float] timeout
24
- # the number of seconds to wait (default: {PORT_CHECK_TIMEOUT})
25
- #
26
- # @return [Boolean]
27
- def connector_port_open?(host, port, timeout = nil)
28
- Timeout.timeout(timeout || PORT_CHECK_TIMEOUT) { TCPSocket.new(host, port).close; true }
29
- rescue Timeout::Error, SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::EADDRNOTAVAIL => ex
30
- false
31
- end
32
- end
33
-
34
12
  include Celluloid
35
13
  include Ridley::Logging
36
14
 
@@ -183,7 +161,7 @@ module Ridley
183
161
  def execute(method, host, *args)
184
162
  options = args.last.is_a?(Hash) ? args.pop : Hash.new
185
163
 
186
- connector_for(host, options).send(method, host, *args, options)
164
+ defer { connector_for(host, options).send(method, host, *args, options) }
187
165
  rescue Errors::HostConnectionError => ex
188
166
  abort(ex)
189
167
  end
@@ -206,10 +184,10 @@ module Ridley
206
184
  options[:ssh][:port] ||= HostConnector::SSH::DEFAULT_PORT
207
185
  options[:winrm][:port] ||= HostConnector::WinRM::DEFAULT_PORT
208
186
 
209
- if self.class.connector_port_open?(host, options[:winrm][:port])
187
+ if connector_port_open?(host, options[:winrm][:port])
210
188
  options.delete(:ssh)
211
189
  winrm
212
- elsif self.class.connector_port_open?(host, options[:ssh][:port], options[:ssh][:timeout])
190
+ elsif connector_port_open?(host, options[:ssh][:port], options[:ssh][:timeout])
213
191
  options.delete(:winrm)
214
192
  ssh
215
193
  else
@@ -217,6 +195,23 @@ module Ridley
217
195
  end
218
196
  end
219
197
 
198
+ # Checks to see if the given port is open for TCP connections
199
+ # on the given host.
200
+ #
201
+ # @param [String] host
202
+ # the host to attempt to connect to
203
+ # @param [Fixnum] port
204
+ # the port to attempt to connect on
205
+ # @param [Float] wait_time ({PORT_CHECK_TIMEOUT})
206
+ # the number of seconds to wait
207
+ #
208
+ # @return [Boolean]
209
+ def connector_port_open?(host, port, wait_time = nil)
210
+ timeout(wait_time || PORT_CHECK_TIMEOUT) { Celluloid::IO::TCPSocket.new(host, port).close; true }
211
+ rescue Timeout::Error, SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::EADDRNOTAVAIL => ex
212
+ false
213
+ end
214
+
220
215
  def finalize_callback
221
216
  @connector_supervisor.terminate if @connector_supervisor && @connector_supervisor.alive?
222
217
  end
@@ -109,7 +109,7 @@ module Ridley
109
109
  raise Errors::HTTPUnknownMethod, "unknown http method: #{method}"
110
110
  end
111
111
 
112
- defer { connection.send(method, *args) }
112
+ connection.send(method, *args)
113
113
  rescue Errors::HTTPError, Errors::ClientError => ex
114
114
  abort(ex)
115
115
  end
@@ -133,9 +133,10 @@ module Ridley
133
133
  # @param [String] command
134
134
  #
135
135
  # @return [Array<Symbol, HostConnector::Response>]
136
- def execute_command(host, command)
136
+ def run(host, command)
137
137
  host_commander.run(host, command, ssh: ssh, winrm: winrm)
138
138
  end
139
+ alias_method :execute_command, :run
139
140
 
140
141
  # Merges the given data with the the data of the target node on the remote
141
142
  #
@@ -1,3 +1,3 @@
1
1
  module Ridley
2
- VERSION = "1.0.0.rc3"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.add_runtime_dependency 'addressable'
21
21
  s.add_runtime_dependency 'chozo', '>= 0.6.0'
22
22
  s.add_runtime_dependency 'celluloid', '~> 0.14.0'
23
+ s.add_runtime_dependency 'celluloid-io', '~> 0.14.0'
23
24
  s.add_runtime_dependency 'erubis'
24
25
  s.add_runtime_dependency 'faraday', '>= 0.8.4'
25
26
  s.add_runtime_dependency 'hashie', '>= 2.0.2'
@@ -1,41 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Ridley::HostCommander do
4
- describe "ClassMethods" do
5
- subject { described_class }
6
-
7
- describe "::connector_port_open?" do
8
- let(:host) { "127.0.0.1" }
9
- let(:port) { 22 }
10
- let(:socket) { double(close: nil) }
11
-
12
- before { TCPSocket.stub(:new).and_return(socket) }
13
-
14
- subject(:result) { described_class.connector_port_open?(host, port) }
15
-
16
- context "when a port is open" do
17
- it { should be_true }
18
-
19
- it "closes the opened socket" do
20
- socket.should_receive(:close)
21
- result
22
- end
23
- end
24
-
25
- context "when a port is closed" do
26
- before { TCPSocket.stub(:new).and_raise(Errno::ECONNREFUSED) }
27
-
28
- it { should be_false }
29
- end
30
-
31
- context "when host is unreachable" do
32
- before { TCPSocket.stub(:new).and_raise(SocketError) }
33
-
34
- it { should be_false }
35
- end
36
- end
37
- end
38
-
39
4
  subject { described_class.new }
40
5
 
41
6
  describe "#run" do
@@ -47,8 +12,8 @@ describe Ridley::HostCommander do
47
12
 
48
13
  context "when communicating to a unix node" do
49
14
  before do
50
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
51
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
15
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
16
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
52
17
  end
53
18
 
54
19
  it "sends a #run message to the ssh host connector" do
@@ -60,8 +25,8 @@ describe Ridley::HostCommander do
60
25
 
61
26
  context "when communicating to a windows node" do
62
27
  before do
63
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
64
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
28
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
29
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
65
30
  end
66
31
 
67
32
  it "sends a #run message to the ssh host connector" do
@@ -80,8 +45,8 @@ describe Ridley::HostCommander do
80
45
 
81
46
  context "when communicating to a unix node" do
82
47
  before do
83
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
84
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
48
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
49
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
85
50
  end
86
51
 
87
52
  it "sends a #bootstrap message to the ssh host connector" do
@@ -93,8 +58,8 @@ describe Ridley::HostCommander do
93
58
 
94
59
  context "when communicating to a windows node" do
95
60
  before do
96
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
97
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
61
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
62
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
98
63
  end
99
64
 
100
65
  it "sends a #bootstrap message to the ssh host connector" do
@@ -113,8 +78,8 @@ describe Ridley::HostCommander do
113
78
 
114
79
  context "when communicating to a unix node" do
115
80
  before do
116
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
117
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
81
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
82
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
118
83
  end
119
84
 
120
85
  it "sends a #chef_client message to the ssh host connector" do
@@ -126,8 +91,8 @@ describe Ridley::HostCommander do
126
91
 
127
92
  context "when communicating to a windows node" do
128
93
  before do
129
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
130
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
94
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
95
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
131
96
  end
132
97
 
133
98
  it "sends a #chef_client message to the ssh host connector" do
@@ -147,8 +112,8 @@ describe Ridley::HostCommander do
147
112
 
148
113
  context "when communicating to a unix node" do
149
114
  before do
150
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
151
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
115
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
116
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
152
117
  end
153
118
 
154
119
  it "sends a #put_secret message to the ssh host connector" do
@@ -160,8 +125,8 @@ describe Ridley::HostCommander do
160
125
 
161
126
  context "when communicating to a windows node" do
162
127
  before do
163
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
164
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
128
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
129
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
165
130
  end
166
131
 
167
132
  it "sends a #put_secret message to the ssh host connector" do
@@ -181,8 +146,8 @@ describe Ridley::HostCommander do
181
146
 
182
147
  context "when communicating to a unix node" do
183
148
  before do
184
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
185
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
149
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(false)
150
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(true)
186
151
  end
187
152
 
188
153
  it "sends a #ruby_script message to the ssh host connector" do
@@ -194,8 +159,8 @@ describe Ridley::HostCommander do
194
159
 
195
160
  context "when communicating to a windows node" do
196
161
  before do
197
- described_class.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
198
- described_class.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
162
+ subject.stub(:connector_port_open?).with(host, options[:winrm][:port]).and_return(true)
163
+ subject.stub(:connector_port_open?).with(host, options[:ssh][:port], anything).and_return(false)
199
164
  end
200
165
 
201
166
  it "sends a #ruby_script message to the ssh host connector" do
@@ -58,12 +58,12 @@ describe Ridley::NodeResource do
58
58
  end
59
59
  end
60
60
 
61
- describe "#execute_command" do
61
+ describe "#run" do
62
62
  let(:command) { "echo 'hello world'" }
63
63
 
64
64
  it "sends the message #run to the instance's host_commander" do
65
65
  host_commander.should_receive(:run).with(host, command, ssh: instance.ssh, winrm: instance.winrm)
66
- instance.execute_command(host, command)
66
+ instance.run(host, command)
67
67
  end
68
68
  end
69
69
 
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ridley
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc3
5
- prerelease: 6
4
+ version: 1.0.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jamie Winsor
@@ -60,6 +60,22 @@ dependencies:
60
60
  - - ~>
61
61
  - !ruby/object:Gem::Version
62
62
  version: 0.14.0
63
+ - !ruby/object:Gem::Dependency
64
+ name: celluloid-io
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: 0.14.0
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 0.14.0
63
79
  - !ruby/object:Gem::Dependency
64
80
  name: erubis
65
81
  requirement: !ruby/object:Gem::Requirement
@@ -369,9 +385,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
369
385
  required_rubygems_version: !ruby/object:Gem::Requirement
370
386
  none: false
371
387
  requirements:
372
- - - ! '>'
388
+ - - ! '>='
373
389
  - !ruby/object:Gem::Version
374
- version: 1.3.1
390
+ version: '0'
391
+ segments:
392
+ - 0
393
+ hash: 422593322150565092
375
394
  requirements: []
376
395
  rubyforge_project:
377
396
  rubygems_version: 1.8.23