rabbitmq-cluster 0.0.13 → 0.0.14

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.
data/bin/rabbitmq-cluster CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'rabbitmq/cluster'
2
2
 
3
3
  server = RabbitMQ::Cluster::Server.build
4
- server.start
5
4
 
6
5
  while true do
7
6
  server.synchronize
@@ -0,0 +1,4 @@
1
+ require 'rabbitmq/cluster'
2
+
3
+ server = RabbitMQ::Cluster::Server.build
4
+ server.prestart
@@ -2,7 +2,6 @@ require "rabbitmq/cluster/version"
2
2
  require "rabbitmq/cluster/server"
3
3
 
4
4
  module RabbitMQ
5
- module Cluster
6
- # Your code goes here...
5
+ class Cluster
7
6
  end
8
7
  end
@@ -1,6 +1,6 @@
1
1
  require 'etcd'
2
2
 
3
- module RabbitMQ::Cluster
3
+ class RabbitMQ::Cluster
4
4
  class Etcd
5
5
  attr_accessor :client
6
6
  private :client
@@ -7,7 +7,7 @@ class RabbitMQManager
7
7
  end
8
8
  end
9
9
 
10
- module RabbitMQ::Cluster
10
+ class RabbitMQ::Cluster
11
11
  class Server
12
12
  attr_accessor :client, :etcd
13
13
  private :client, :etcd
@@ -24,18 +24,13 @@ module RabbitMQ::Cluster
24
24
  self.etcd = etcd
25
25
  end
26
26
 
27
- def start
28
- etcd.aquire_lock do
29
- setup_erlang_cookie
30
- start_rabbitmq_server
31
- save_erlang_cookie
32
- join_cluster
33
- end
27
+ def prestart
28
+ setup_erlang_cookie
34
29
  end
35
30
 
36
31
  def synchronize
37
- remove_stopped_nodes if stopped_nodes.any?
38
32
  join_cluster
33
+ remove_stopped_nodes if stopped_nodes.any?
39
34
  end
40
35
 
41
36
  def healthcheck
@@ -95,32 +90,11 @@ module RabbitMQ::Cluster
95
90
  etcd.nodes - [name]
96
91
  end
97
92
 
98
- def start_rabbitmq_server
99
- system("/usr/sbin/rabbitmq-server &")
100
- waits = 1
101
- until up?
102
- sleep waits
103
- waits *= 2
104
- end
105
- end
106
-
107
- def erlang_cookie
108
- IO.read('/var/lib/rabbitmq/.erlang.cookie')
109
- end
110
-
111
93
  def setup_erlang_cookie
112
- if etcd.erlang_cookie
113
- File.open('/var/lib/rabbitmq/.erlang.cookie', 'w') { |file| file.write etcd.erlang_cookie }
114
- `chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie`
115
- `chmod 400 /var/lib/rabbitmq/.erlang.cookie`
116
- end
94
+ fail "erlang cookie must be preset in etcd" unless etcd.erlang_cookie
95
+ File.open('/var/lib/rabbitmq/.erlang.cookie', 'w') { |file| file.write etcd.erlang_cookie }
96
+ `chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie`
97
+ `chmod 400 /var/lib/rabbitmq/.erlang.cookie`
117
98
  end
118
-
119
- def save_erlang_cookie
120
- unless etcd.erlang_cookie
121
- etcd.erlang_cookie = erlang_cookie
122
- end
123
- end
124
-
125
99
  end
126
100
  end
@@ -1,5 +1,5 @@
1
1
  module RabbitMQ
2
- module Cluster
3
- VERSION = "0.0.13"
2
+ class Cluster
3
+ VERSION = "0.0.14"
4
4
  end
5
5
  end
@@ -64,41 +64,92 @@ describe RabbitMQ::Cluster::Server do
64
64
  end
65
65
  end
66
66
 
67
- describe 'starting the server' do
68
- let(:client) { double(:client).as_null_object }
69
67
 
68
+ describe '#prestart' do
69
+ context 'with an erlang cookie in etcd' do
70
+ before do
71
+ allow(File).to receive(:open)
72
+ allow(subject).to receive(:"`")
73
+ allow(etcd).to receive(:erlang_cookie).and_return('NummmNugnnmNuyum')
74
+ end
75
+
76
+ it 'sets up the erlang cookie' do
77
+ expect(File).to receive(:open).with('/var/lib/rabbitmq/.erlang.cookie', 'w')
78
+ subject.prestart
79
+ end
80
+
81
+ it 'sets up the ownership and permissions of the erlang cooke' do
82
+ expect(subject).to receive(:"`")
83
+ .with("chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie")
84
+ expect(subject).to receive(:"`")
85
+ .with("chmod 400 /var/lib/rabbitmq/.erlang.cookie")
86
+ subject.prestart
87
+ end
88
+ end
89
+
90
+ context 'when there was no erlang cookie in etcd' do
91
+ before do
92
+ allow(etcd).to receive(:erlang_cookie).and_return(false)
93
+ end
94
+
95
+ it 'fails hard and fast' do
96
+ expect { subject.prestart }.to raise_error('erlang cookie must be preset in etcd')
97
+ end
98
+ end
99
+ end
100
+
101
+ describe '#synchronize' do
70
102
  before do
103
+ allow(client).to receive(:nodes)
104
+ .and_return([
105
+ {"name" => "rabbit@node1", "running" => true},
106
+ {"name" => "rabbit@node2", "running" => false}
107
+ ])
71
108
  allow(subject).to receive(:system)
72
- allow(client).to receive(:aliveness_test).and_return({ "status" => "ok" })
73
- allow(File).to receive(:open)
74
- allow(IO).to receive(:read)
75
- allow(subject).to receive(:"`")
109
+ allow(client).to receive(:aliveness_test).and_return("status" => "ok")
110
+ allow(client).to receive(:overview).and_return("node" => "rabbit@this_node")
76
111
  end
77
112
 
78
- it 'shells out to start rabbitmq-server' do
79
- expect(subject).to receive(:system).with("/usr/sbin/rabbitmq-server &")
80
- subject.start
113
+ context 'the node is not up' do
114
+ before do
115
+ allow(client).to receive(:aliveness_test).and_return("status" => "agghghghgh")
116
+ end
117
+
118
+ it 'does not register the node' do
119
+ expect(etcd).to_not receive(:register).with('rabbit@this_node')
120
+ subject.synchronize
121
+ end
81
122
  end
82
123
 
83
- context 'waiting for the server to start' do
84
- it 'waits until the server has started' do
85
- expect(subject).to receive(:up?).exactly(2).times.and_return(false, true)
86
- subject.start
124
+ context 'the node is up' do
125
+ it 'removes the stopped node from the cluster' do
126
+ expect(subject).to receive(:system)
127
+ .with('rabbitmqctl forget_cluster_node rabbit@node2')
128
+ subject.synchronize
87
129
  end
88
130
  end
89
131
 
90
132
  describe 'joining the cluster' do
133
+ let(:client) { double(:client).as_null_object }
134
+
135
+ before do
136
+ allow(subject).to receive(:system)
137
+ allow(subject).to receive(:"`")
138
+ allow(client).to receive(:aliveness_test).and_return({ "status" => "ok" })
139
+ end
140
+
141
+
91
142
  context 'with no nodes in etcd' do
92
143
  it 'does nothing' do
93
144
  expect(subject).to_not receive(:"`")
94
- subject.start
145
+ subject.synchronize
95
146
  end
96
147
  end
97
148
 
98
149
  context 'with some nodes allready in etcd' do
99
150
  before do
100
151
  allow(client).to receive(:nodes)
101
- .and_return([{}])
152
+ .and_return([{}])
102
153
  etcd.register('rabbit@node1')
103
154
  etcd.register('rabbit@node2')
104
155
  end
@@ -106,122 +157,39 @@ describe RabbitMQ::Cluster::Server do
106
157
  context 'allready in a cluster' do
107
158
  before do
108
159
  allow(client).to receive(:nodes)
109
- .and_return([{},{}])
160
+ .and_return([{},{}])
110
161
  end
111
162
 
112
163
  it 'does nothing' do
113
164
  expect(subject).to_not receive(:"`")
114
- subject.start
165
+ expect(subject).to_not receive(:system)
166
+ subject.synchronize
115
167
  end
116
168
  end
117
169
 
118
170
  it 'tries to join the cluster' do
119
171
  expect(subject).to receive(:system).with("rabbitmqctl join_cluster rabbit@node1")
120
- subject.start
172
+ subject.synchronize
121
173
  end
122
174
 
123
175
  it 'stops the management app before clustering' do
124
176
  expect(subject).to receive(:"`")
125
- .with('rabbitmqctl stop_app')
177
+ .with('rabbitmqctl stop_app')
126
178
  expect(subject).to receive(:"`")
127
- .with('rabbitmqctl start_app')
128
- subject.start
179
+ .with('rabbitmqctl start_app')
180
+ subject.synchronize
129
181
  end
130
182
 
131
183
  it 'does not try to cluster with itself' do
132
184
  allow(client).to receive(:overview).and_return('node' => 'rabbit@node1')
133
185
  expect(subject).to receive(:system).with("rabbitmqctl join_cluster rabbit@node2")
134
- subject.start
186
+ subject.synchronize
135
187
  end
136
188
 
137
189
  it 'registers itself' do
138
190
  allow(client).to receive(:overview).and_return('node' => 'rabbit@this_node')
139
- subject.start
140
- expect(etcd.nodes).to include('rabbit@this_node')
141
- end
142
- end
143
- end
144
-
145
- context 'with an erlang cookie in etcd' do
146
-
147
- before do
148
- allow(etcd).to receive(:erlang_cookie).and_return('NummmNugnnmNuyum')
149
- end
150
-
151
- it 'sets up the erlang cookie' do
152
- expect(File).to receive(:open).with('/var/lib/rabbitmq/.erlang.cookie', 'w')
153
- subject.start
154
- end
155
-
156
- it 'sets up the ownership and permissions of the erlang cooke' do
157
- expect(subject).to receive(:"`")
158
- .with("chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie")
159
- expect(subject).to receive(:"`")
160
- .with("chmod 400 /var/lib/rabbitmq/.erlang.cookie")
161
- subject.start
162
- end
163
- end
164
-
165
- context 'when there was no erlang cookie in etcd' do
166
- before do
167
- allow(IO).to receive(:read)
168
- .with('/var/lib/rabbitmq/.erlang.cookie')
169
- .and_return('ErLAnGCOookie')
170
- end
171
-
172
- it 'saves the on disk cookie to etcd' do
173
- subject.start
174
- expect(etcd.erlang_cookie).to eq 'ErLAnGCOookie'
175
- end
176
- end
177
- end
178
-
179
- describe '#synchronize' do
180
- context 'etcd has more nodes than are running' do
181
- before do
182
- allow(client).to receive(:nodes)
183
- .and_return([
184
- {"name" => "rabbit@node1", "running" => true},
185
- {"name" => "rabbit@node2", "running" => false}
186
- ])
187
- allow(subject).to receive(:system)
188
- allow(client).to receive(:aliveness_test).and_return("status" => "ok")
189
- allow(client).to receive(:overview).and_return("node" => "rabbit@this_node")
190
- end
191
-
192
- context 'the node is not up' do
193
- before do
194
- allow(client).to receive(:aliveness_test).and_return("status" => "agghghghgh")
195
- end
196
-
197
- it 'does not register the node' do
198
- expect(etcd).to_not receive(:register).with('rabbit@this_node')
199
- subject.synchronize
200
- end
201
- end
202
-
203
- it 'removes the stopped node from the cluster' do
204
- expect(subject).to receive(:system)
205
- .with('rabbitmqctl forget_cluster_node rabbit@node2')
206
- subject.synchronize
207
- end
208
-
209
-
210
- context 'etcd nodes matches running nodes in the cluster' do
211
- before do
212
- etcd.register('rabbit@node1')
213
- etcd.register('rabbit@node2')
214
- allow(client).to receive(:nodes)
215
- .and_return([
216
- {"name" => "rabbit@node1", "running" => true},
217
- {"name" => "rabbit@node2", "running" => true},
218
- {"name" => "rabbit@this_node", "running" => true}
219
- ])
220
- end
221
-
222
- it 'will not remove any nodes' do
223
- expect(subject).to_not receive(:system)
224
191
  subject.synchronize
192
+ expect(etcd.nodes).to include('rabbit@this_node')
225
193
  end
226
194
  end
227
195
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rabbitmq-cluster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -112,7 +112,8 @@ email:
112
112
  - ed.robinson@reevoo.com
113
113
  executables:
114
114
  - rabbitmq-cluster
115
- - rabbitmq-cluster-sidekick
115
+ - rabbitmq-cluster-discovery
116
+ - rabbitmq-cluster-prestart
116
117
  extensions: []
117
118
  extra_rdoc_files: []
118
119
  files:
@@ -122,7 +123,8 @@ files:
122
123
  - README.md
123
124
  - Rakefile
124
125
  - bin/rabbitmq-cluster
125
- - bin/rabbitmq-cluster-sidekick
126
+ - bin/rabbitmq-cluster-discovery
127
+ - bin/rabbitmq-cluster-prestart
126
128
  - lib/rabbitmq/cluster.rb
127
129
  - lib/rabbitmq/cluster/etcd.rb
128
130
  - lib/rabbitmq/cluster/server.rb
@@ -146,7 +148,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
148
  version: '0'
147
149
  segments:
148
150
  - 0
149
- hash: -2679174376872424793
151
+ hash: -99154985774826741
150
152
  required_rubygems_version: !ruby/object:Gem::Requirement
151
153
  none: false
152
154
  requirements:
@@ -155,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
157
  version: '0'
156
158
  segments:
157
159
  - 0
158
- hash: -2679174376872424793
160
+ hash: -99154985774826741
159
161
  requirements: []
160
162
  rubyforge_project:
161
163
  rubygems_version: 1.8.25