weave 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a59144545dbba7f902dae6c32554a3f2743861e1
4
+ data.tar.gz: 495f658b7d46a8dd442e299f1b2e6b5f18974238
5
+ SHA512:
6
+ metadata.gz: ca9f0be174aa7bae005d03c9937944539e1826c680dda6cf6c8fdc5fcf3d36abefb4649ee3344d65d6b5a585f093fee8dee017c3112a3f704d4e87e9feb7db6e
7
+ data.tar.gz: 226c169a961c1cb2f40238c10be1ce68ce881d3bc1d67e447e9c32785b3f46317e0721d34dfc33bd17e0871904defee92fb1c170bb2a8bfb56151a377fbae4c6
data/README.md CHANGED
@@ -22,19 +22,3 @@ examples (in `examples/`) to get started.
22
22
  * Commands:
23
23
 
24
24
  - `run`
25
-
26
- ## Other ideas
27
-
28
- * Commands:
29
-
30
- - `sudo`
31
- - `rsync`
32
- - `put`?
33
- - `get`?
34
-
35
- * Handle password prompts (maybe just sudo prompt)
36
- * Handle ctrl-c correctly?
37
-
38
- ## To do:
39
-
40
- * Full readme with detailed usage
@@ -58,8 +58,10 @@ module Weave
58
58
 
59
59
  # A pool of SSH connections. Operations over the pool may be performed in serial or in parallel.
60
60
  class ConnectionPool
61
- # @param [Array] host_list the array of hosts, of the form user@host
62
- def initialize(host_list)
61
+ # @param [Array] host_list the array of hosts, of the form user@host. You may leave off this argument, and
62
+ # use #execute_with (instead of #execute) to specify the whole list of hosts each time.
63
+ def initialize(host_list = [])
64
+ @hosts = host_list
63
65
  @connections = host_list.reduce({}) { |pool, host| pool.merge(host => LazyConnection.new(host)) }
64
66
  end
65
67
 
@@ -73,18 +75,25 @@ module Weave
73
75
  # @option options [Fixnum] :batch_by if set, group the connections into batches of no more than this value
74
76
  # and fully process each batch before starting the next one.
75
77
  def execute(options = {}, &block)
78
+ execute_with(@hosts, options, &block)
79
+ end
80
+
81
+ # This is the same as #execute, except that host_list overrides the list of connections with which this
82
+ # ConnectionPool was initialized. Any hosts in here that weren't already in the pool will be added.
83
+ def execute_with(host_list, options = {}, &block)
84
+ host_list.each { |host| @connections[host] ||= LazyConnection.new(host) }
76
85
  args = options[:args] || []
77
86
  options[:num_threads] ||= DEFAULT_THREAD_POOL_SIZE
78
87
  if options[:serial]
79
- @connections.each_key { |host| @connections[host].self_eval args, &block }
88
+ host_list.each { |host| @connections[host].self_eval args, &block }
80
89
  elsif options[:batch_by]
81
- @connections.each_key.each_slice(options[:batch_by]) do |batch|
90
+ host_list.each_slice(options[:batch_by]) do |batch|
82
91
  Weave.with_thread_pool(batch, options[:num_threads]) do |host, mutex|
83
92
  @connections[host].self_eval args, mutex, &block
84
93
  end
85
94
  end
86
95
  else
87
- Weave.with_thread_pool(@connections.keys, options[:num_threads]) do |host, mutex|
96
+ Weave.with_thread_pool(host_list, options[:num_threads]) do |host, mutex|
88
97
  @connections[host].self_eval args, mutex, &block
89
98
  end
90
99
  end
@@ -1,3 +1,3 @@
1
1
  module Weave
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -10,17 +10,17 @@ class SanityTest < Scope::TestCase
10
10
 
11
11
  setup_once do
12
12
  # Make sure the machines are up.
13
- vagrant_status = `bundle exec vagrant status`
13
+ vagrant_status = `/usr/bin/vagrant status`
14
14
  unless $?.to_i.zero? && TEST_HOSTS.each { |host| vagrant_status =~ /#{host}\w+running/ }
15
15
  abort "You need to set up the test vagrant virtual machines to run the sanity test." \
16
- "Run 'bundle exec vagrant up'."
16
+ "Run 'vagrant up'."
17
17
  end
18
18
  # Make sure the user's ssh config has weave entries.
19
19
  TEST_HOSTS.each do |host|
20
20
  config = Net::SSH::Config.load("~/.ssh/config", host)
21
21
  unless config["hostname"] == "127.0.0.1"
22
22
  abort "You need to add weave{1,2} to your ~/.ssh/config." \
23
- "You can use the output of 'bundle exec vagrant ssh-config weave1'"
23
+ "You can use the output of 'vagrant ssh-config weave1'"
24
24
  end
25
25
  end
26
26
  end
@@ -33,7 +33,7 @@ class SanityTest < Scope::TestCase
33
33
  end
34
34
  TEST_HOSTS.each do |host|
35
35
  assert_empty output[host][:stderr]
36
- assert_equal ["hello\n"], output[host][:stdout]
36
+ assert_equal "hello\n", output[host][:stdout]
37
37
  end
38
38
  end
39
39
 
@@ -51,24 +51,24 @@ class SanityTest < Scope::TestCase
51
51
 
52
52
  context "in serial" do
53
53
  should "run some commands in the expected order" do
54
- output = []
54
+ output = ""
55
55
  Weave.connect(ROOT_AT_TEST_HOSTS, :serial => true) do
56
56
  command = (host == "weave1") ? "sleep 0.2; echo 'delayed'" : "echo 'on time'"
57
57
  output += run(command, :output => :capture)[:stdout]
58
58
  end
59
- assert_equal ["delayed\n", "on time\n"], output
59
+ assert_equal "delayed\non time\n", output
60
60
  end
61
61
  end
62
62
 
63
63
  context "in parallel" do
64
64
  should "run some commands in the expected order" do
65
- output = []
65
+ output = ""
66
66
  Weave.connect(ROOT_AT_TEST_HOSTS) do
67
67
  command = (host == "weave1") ? "sleep 0.2; echo 'delayed'" : "echo 'on time'"
68
68
  result = run(command, :output => :capture)
69
69
  output += result[:stdout]
70
70
  end
71
- assert_equal ["on time\n", "delayed\n"], output
71
+ assert_equal "on time\ndelayed\n", output
72
72
  end
73
73
  end
74
74
 
@@ -80,9 +80,19 @@ class SanityTest < Scope::TestCase
80
80
  end
81
81
  TEST_HOSTS.each do |host|
82
82
  assert_empty output[host][:stderr]
83
- assert_equal ["hello\n"], output[host][:stdout]
83
+ assert_equal "hello\n", output[host][:stdout]
84
84
  end
85
85
  end
86
86
  end
87
+
88
+ context "with a different host list" do
89
+ should "run only on the listed hosts" do
90
+ output = ""
91
+ Weave::ConnectionPool.new.execute_with(SINGLE_TEST_HOST) do
92
+ output += run("echo 'hello'", :output => :capture)[:stdout]
93
+ end
94
+ assert_equal "hello\n", output
95
+ end
96
+ end
87
97
  end
88
98
  end
@@ -18,7 +18,6 @@ Gem::Specification.new do |gem|
18
18
  gem.add_dependency "net-ssh", ">= 2.2.0"
19
19
 
20
20
  # For running integration tests.
21
- gem.add_development_dependency "vagrant", "~> 1.0.5"
22
21
  gem.add_development_dependency "scope"
23
22
  gem.add_development_dependency "rake"
24
23
  # For generating the docs
metadata CHANGED
@@ -1,82 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weave
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Caleb Spare
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-10 00:00:00.000000000Z
11
+ date: 2013-05-31 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: net-ssh
16
- requirement: &70237392577060 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 2.2.0
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70237392577060
25
- - !ruby/object:Gem::Dependency
26
- name: vagrant
27
- requirement: &70237392576560 !ruby/object:Gem::Requirement
28
- none: false
22
+ version_requirements: !ruby/object:Gem::Requirement
29
23
  requirements:
30
- - - ~>
24
+ - - '>='
31
25
  - !ruby/object:Gem::Version
32
- version: 1.0.5
33
- type: :development
34
- prerelease: false
35
- version_requirements: *70237392576560
26
+ version: 2.2.0
36
27
  - !ruby/object:Gem::Dependency
37
28
  name: scope
38
- requirement: &70237392576180 !ruby/object:Gem::Requirement
39
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
40
30
  requirements:
41
- - - ! '>='
31
+ - - '>='
42
32
  - !ruby/object:Gem::Version
43
33
  version: '0'
44
34
  type: :development
45
35
  prerelease: false
46
- version_requirements: *70237392576180
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: rake
49
- requirement: &70237392575720 !ruby/object:Gem::Requirement
50
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
51
44
  requirements:
52
- - - ! '>='
45
+ - - '>='
53
46
  - !ruby/object:Gem::Version
54
47
  version: '0'
55
48
  type: :development
56
49
  prerelease: false
57
- version_requirements: *70237392575720
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
58
55
  - !ruby/object:Gem::Dependency
59
56
  name: yard
60
- requirement: &70237392575300 !ruby/object:Gem::Requirement
61
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
62
58
  requirements:
63
- - - ! '>='
59
+ - - '>='
64
60
  - !ruby/object:Gem::Version
65
61
  version: '0'
66
62
  type: :development
67
63
  prerelease: false
68
- version_requirements: *70237392575300
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: redcarpet
71
- requirement: &70237392574880 !ruby/object:Gem::Requirement
72
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
73
72
  requirements:
74
- - - ! '>='
73
+ - - '>='
75
74
  - !ruby/object:Gem::Version
76
75
  version: '0'
77
76
  type: :development
78
77
  prerelease: false
79
- version_requirements: *70237392574880
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
80
83
  description: Simple parallel ssh.
81
84
  email:
82
85
  - cespare@gmail.com
@@ -100,27 +103,26 @@ files:
100
103
  - weave.gemspec
101
104
  homepage: https://github.com/cespare/weave
102
105
  licenses: []
106
+ metadata: {}
103
107
  post_install_message:
104
108
  rdoc_options: []
105
109
  require_paths:
106
110
  - lib
107
111
  required_ruby_version: !ruby/object:Gem::Requirement
108
- none: false
109
112
  requirements:
110
- - - ! '>='
113
+ - - '>='
111
114
  - !ruby/object:Gem::Version
112
115
  version: '0'
113
116
  required_rubygems_version: !ruby/object:Gem::Requirement
114
- none: false
115
117
  requirements:
116
- - - ! '>='
118
+ - - '>='
117
119
  - !ruby/object:Gem::Version
118
120
  version: '0'
119
121
  requirements: []
120
122
  rubyforge_project:
121
- rubygems_version: 1.8.10
123
+ rubygems_version: 2.0.0
122
124
  signing_key:
123
- specification_version: 3
125
+ specification_version: 4
124
126
  summary: Simple parallel ssh.
125
127
  test_files:
126
128
  - test/integrations/sanity_test.rb