gofer 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.md +5 -0
- data/README.md +13 -6
- data/lib/gofer/cluster.rb +38 -41
- data/lib/gofer/version.rb +1 -1
- data/spec/gofer/integration_spec.rb +3 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NjZkNzBmMjZlMWI5ODk4MDE0ZDNmNTFlYzAxNjU4NTFlNzgyMDQ4NQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZjMwYjNmMTAwMWQ2NDJlOWUzZTE1MTdmODBkNjg2ZWVlMTQ2OTZiOA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
N2MwNTRkYzQzZDM4MGIyN2Q0ZTJmNmY3MDY2NWFhZTgwNTg2ZmFhOWU1OGRk
|
10
|
+
NWE3ZGRjZWJkMjM2OGFkOTA0Mjk4NTIyMDA4YTcwYjlhYWM0NmE1OWU2Mzdm
|
11
|
+
YzNlZjU1MzYxY2ExYWJkOGY5NTVjYmUxZGMzOGVlNzIzMzMwNzQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZTYyNDAxYTU2MTdjNTQ1YWRjMjNmODFkYWI4MTA4YTVkYmQxZDlmMWIxMTE0
|
14
|
+
NTU2NmQ1MTJiOThkMTBkMjNhNGZhYzBjNTIwY2U2M2UzMGI0ZmU1MjVjYTAw
|
15
|
+
MDA1NmUxYWZlNzcxY2U5M2M2MTZmMzFmNGQzNjM1Zjc4OWI1YWE=
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Revision History
|
2
2
|
|
3
|
+
### v0.4.0
|
4
|
+
|
5
|
+
* Rework `Gofer::Cluster` to be a direct proxy, rather than requiring a block
|
6
|
+
* Add all `Gofer::Host` methods to the `Gofer::Cluster` proxy (@rich0h)
|
7
|
+
|
3
8
|
### v0.3.1
|
4
9
|
|
5
10
|
* Prefix stderr/stdout per host with `:output_prefix`
|
data/README.md
CHANGED
@@ -90,13 +90,20 @@ cluster = Gopher::Cluster.new
|
|
90
90
|
cluster << Gofer::Host.new('my.host.com', 'ubuntu', :keys => ['key.pem'], :output_prefix => " my")
|
91
91
|
cluster << Gofer::Host.new('other.host.com', 'ubuntu', :keys => ['key.pem'], :output_prefix => "other")
|
92
92
|
|
93
|
-
|
94
|
-
|
95
|
-
end
|
93
|
+
# Run on all the hosts at once
|
94
|
+
cluster.run "hostname"
|
96
95
|
|
97
|
-
|
98
|
-
|
99
|
-
|
96
|
+
# Run on only one host at a time
|
97
|
+
cluster.max_concurrency = 1
|
98
|
+
cluster.run("sudo /etc/init.d/apache2 restart")
|
99
|
+
|
100
|
+
# Run a command on only one host
|
101
|
+
host = cluster.shuffle.first
|
102
|
+
host.run("rake migrations")
|
103
|
+
|
104
|
+
# Inspect the results from each host
|
105
|
+
results = cluster.run "echo hostname"
|
106
|
+
puts results.values.join(", ") # will print "my.host.com, other.host.com"
|
100
107
|
```
|
101
108
|
|
102
109
|
## Testing
|
data/lib/gofer/cluster.rb
CHANGED
@@ -2,72 +2,69 @@ require 'thread'
|
|
2
2
|
|
3
3
|
module Gofer
|
4
4
|
class Cluster
|
5
|
+
|
5
6
|
attr_reader :hosts
|
6
7
|
attr_accessor :max_concurrency
|
7
|
-
|
8
|
+
|
9
|
+
def initialize(parties=[], opts={})
|
8
10
|
@hosts = []
|
9
|
-
@max_concurrency =
|
11
|
+
@max_concurrency = opts.delete(:max_concurrency)
|
10
12
|
|
11
|
-
parties.each
|
12
|
-
|
13
|
-
|
13
|
+
parties.each { |i| self << i }
|
14
|
+
end
|
15
|
+
|
16
|
+
def concurrency
|
17
|
+
max_concurrency.nil? ? hosts.length : [max_concurrency, hosts.length].min
|
14
18
|
end
|
15
19
|
|
16
20
|
def <<(other)
|
17
21
|
case other
|
18
22
|
when Cluster
|
19
|
-
other.hosts.each
|
20
|
-
@hosts << host
|
21
|
-
end
|
23
|
+
other.hosts.each { |host| self << host }
|
22
24
|
when Host
|
23
25
|
@hosts << other
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
%w{run exist? read directory? ls upload read write}.each do |host_method|
|
30
|
+
define_method host_method do |*args|
|
31
|
+
threaded(host_method, *args)
|
32
|
+
end
|
30
33
|
end
|
31
34
|
|
32
|
-
|
33
|
-
def initialize(hosts, concurrency)
|
34
|
-
@concurrency = concurrency
|
35
|
-
@hosts = hosts
|
36
|
-
end
|
35
|
+
private
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
37
|
+
# Spawn +concurrency+ worker threads, each of which pops work off the
|
38
|
+
# +_in+ queue, and writes values to the +_out+ queue for syncronisation.
|
39
|
+
def threaded(meth, *args)
|
40
|
+
_in = run_queue
|
41
|
+
length = run_queue.length
|
42
|
+
_out = Queue.new
|
43
|
+
results = {}
|
44
|
+
(0...concurrency).map do
|
45
|
+
Thread.new do
|
46
|
+
loop do
|
47
|
+
host = _in.pop(false) rescue Thread.exit
|
49
48
|
|
50
|
-
|
51
|
-
|
52
|
-
end
|
49
|
+
results[host] = host.send(meth, *args)
|
50
|
+
_out << true
|
53
51
|
end
|
54
52
|
end
|
53
|
+
end
|
55
54
|
|
56
|
-
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
return results
|
55
|
+
length.times do
|
56
|
+
_out.pop
|
61
57
|
end
|
62
58
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
59
|
+
results
|
60
|
+
end
|
61
|
+
|
62
|
+
def run_queue
|
63
|
+
Queue.new.tap do |q|
|
64
|
+
@hosts.each do |h|
|
65
|
+
q << h
|
68
66
|
end
|
69
67
|
end
|
70
68
|
end
|
71
|
-
|
72
69
|
end
|
73
70
|
end
|
data/lib/gofer/version.rb
CHANGED
@@ -251,9 +251,7 @@ describe Gofer do
|
|
251
251
|
end
|
252
252
|
|
253
253
|
it "should run commands in parallel" do
|
254
|
-
results = @cluster.run
|
255
|
-
c.run "ruby -e 'puts Time.now.to_f; sleep 0.1; puts Time.now.to_f'"
|
256
|
-
end
|
254
|
+
results = @cluster.run("ruby -e 'puts Time.now.to_f; sleep 0.1; puts Time.now.to_f'")
|
257
255
|
|
258
256
|
res1 = results[@host1].stdout.lines.to_a
|
259
257
|
res2 = results[@host2].stdout.lines.to_a
|
@@ -262,9 +260,8 @@ describe Gofer do
|
|
262
260
|
end
|
263
261
|
|
264
262
|
it "should respect max_concurrency" do
|
265
|
-
|
266
|
-
|
267
|
-
end
|
263
|
+
@cluster.max_concurrency = 1
|
264
|
+
results = @cluster.run("ruby -e 'puts Time.now.to_f; sleep 0.1; puts Time.now.to_f'")
|
268
265
|
|
269
266
|
res1 = results[@host1].stdout.lines.to_a
|
270
267
|
res2 = results[@host2].stdout.lines.to_a
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gofer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Pearson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|