pylon 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,38 @@
1
+ #
2
+ # Author:: AJ Christensen (<aj@junglist.gen.nz>)
3
+ # Copyright:: Copyright (c) 2011 AJ Christensen
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or#implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ require 'timeout'
19
+
20
+ class Pylon
21
+ class Exceptions
22
+
23
+ class Node
24
+ class PingTimeout < RuntimeError; end
25
+ class BadTimestamp < RuntimeError; end
26
+ end
27
+
28
+ class FailureDetector
29
+ class PingTimeout < RuntimeError; end
30
+ end
31
+
32
+ class Command
33
+ class NotFound < ArgumentError; end
34
+ class InvalidOptions < ArgumentError; end
35
+ end
36
+
37
+ end # Exceptions
38
+ end # Pylon
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: AJ Christensen (<aj@junglist.gen.nz>)
3
+ # Copyright:: Copyright (c) 2011 AJ Christensen
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or#implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ require "timeout"
19
+ require_relative "node"
20
+
21
+ class Pylon
22
+ class FailureDetector
23
+
24
+ def initialize(name, node)
25
+ end
26
+
27
+ end # FailureDetector
28
+ end # Pylon
@@ -0,0 +1,70 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Walters (<cw@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008, 2009 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+ # Taken from Opscode's Chef @
21
+ # chef/lib/chef/mixin/convert_to_class_name.rb
22
+ # Used for Knifes' subcommand loader.
23
+ # Repurposed for pylons command handler.
24
+
25
+ class Pylon
26
+ module Mixin
27
+ module ConvertToClassName
28
+
29
+ extend self
30
+
31
+ def convert_to_class_name(str)
32
+ rname = nil
33
+ regexp = %r{^(.+?)(_(.+))?$}
34
+
35
+ mn = str.match(regexp)
36
+ if mn
37
+ rname = mn[1].capitalize
38
+
39
+ while mn && mn[3]
40
+ mn = mn[3].match(regexp)
41
+ rname << mn[1].capitalize if mn
42
+ end
43
+ end
44
+
45
+ rname
46
+ end
47
+
48
+ def convert_to_snake_case(str, namespace=nil)
49
+ str = str.dup
50
+ str.sub!(/^#{namespace}(\:\:)?/, '') if namespace
51
+ str.gsub!(/[A-Z]/) {|s| "_" + s}
52
+ str.downcase!
53
+ str.sub!(/^\_/, "")
54
+ str
55
+ end
56
+
57
+ def snake_case_basename(str)
58
+ with_namespace = convert_to_snake_case(str)
59
+ with_namespace.split("::").last.sub(/^_/, '')
60
+ end
61
+
62
+ def filename_to_qualified_string(base, filename)
63
+ file_base = File.basename(filename, ".rb")
64
+ base.to_s + (file_base == 'default' ? '' : "_#{file_base}")
65
+ end
66
+
67
+ end
68
+
69
+ end #ConvertToClassName
70
+ end #Pylon
@@ -18,11 +18,13 @@ require "uuidtools"
18
18
  require "ffi-rzmq"
19
19
  require "thread"
20
20
  require "json"
21
+ require_relative "exceptions"
22
+ require_relative "command"
21
23
 
22
24
  class Pylon
23
25
  class Node
24
26
 
25
- attr_accessor :uuid, :weight, :timestamp, :context
27
+ attr_accessor :uuid, :weight, :timestamp, :context, :master
26
28
  attr_reader :unicast_endpoint, :multicast_endpoint
27
29
 
28
30
  def initialize(json=nil)
@@ -41,7 +43,7 @@ class Pylon
41
43
  if arg != nil
42
44
  @multicast_endpoint = arg
43
45
  else
44
- @multicast_endpoint ||= "epgm://#{Pylon::Config[:interface]};#{Pylon::Config[:multicast_address]}:#{Pylon::Config[:multicast_port]}"
46
+ @multicast_endpoint ||= "epgm://#{Pylon::Config[:multicast_interface]};#{Pylon::Config[:multicast_address]}:#{Pylon::Config[:multicast_port]}"
45
47
  end
46
48
  end
47
49
 
@@ -78,47 +80,39 @@ class Pylon
78
80
  UUIDTools::UUID.timestamp_create
79
81
  end
80
82
 
81
- # Expects a two element tuple containing a string command and a
82
- # hash of params:
83
- # ["command", :params => {}]
84
- def handle_command string
85
- command, params = JSON.parse(string)
86
- case command
87
- when "sync_time"
88
- Log.info "handle_command: sync time received, running ntpdate"
89
- ["sync_time", %x{ntpdate -u pool.ntp.org}]
90
- when "add"
91
- Log.info "handle_command: add message received, params: #{params.inspect}"
92
- when "new_leader"
93
- Log.info "handle_command: new_leader message received"
94
- new_leader = params
95
- new_leader.send "add", self
96
- self
97
- when "status"
98
- Log.info "handle_command: status message received, sending node back"
99
- self
100
- when "ping"
101
- timestamp = Time.now.to_i
102
- Log.info "handle_command: ping requested, sending pong with timestamp: #{timestamp}"
103
- ["pong", timestamp]
104
- when "exit"
105
- error = "handle_command: exit command received"
106
- error << " with message: #{params["message"]}" if params.has_key? "message"
107
- Pylon::Application.fatal! error, 1
83
+ def ping
84
+ Timeout::timeout(Pylon::Config[:ping_timeout]) do
85
+ pong, timestamp = self.send "ping", :attempt => attempt
86
+ end
87
+ rescue Timeout::Error => e
88
+ Log.warn "ping: timeout exceeded #{Pylon::Config[:fd_timeout]}"
89
+ raise Pylon::Exceptions::Node::PingTimeout, e
90
+ else
91
+ time_difference = timestamp - Time.now.to_i
92
+ if time_difference >= 600
93
+ Log.warn "ping: received bad timestamp: #{timestamp}, time difference: #{time_difference}"
94
+ raise Pylon::Exceptions::Node::BadTimestamp, timestamp
108
95
  else
109
- Pylon::Application.fatal! "handle_command: unrecognized command '#{command.inspect}' (params: #{params.inspect}), exiting!", -99
96
+ Log.debug "ping: received pong with good timestamp: #{timestamp}"
110
97
  end
111
98
  end
112
99
 
113
- def send(command = "status", params = {})
100
+
101
+ def send(command = "status", options = {})
114
102
  Thread.new do
115
103
  req_socket = context.socket ZMQ::REQ
116
104
  req_socket.setsockopt ZMQ::LINGER, 0
117
105
  req_socket.connect unicast_endpoint
118
106
  if req_socket.send_string "command", ZMQ::SNDMORE
119
- if req_socket.send_string([command, params].to_json)
120
- response = JSON.parse(req_socket.recv_string)
121
- end
107
+ req_socket.send_string command, ZMQ::SNDMORE
108
+ req_socket.send_string options.to_json
109
+
110
+ #
111
+ # Since the response *may* contain arbitrary Node json, we
112
+ # can't parse here.
113
+ #
114
+ response = req_socket.recv_string
115
+ Log.debug "send response: #{response.inspect}"
122
116
  end
123
117
  req_socket.close
124
118
  response
@@ -132,13 +126,15 @@ class Pylon
132
126
  rep_socket.bind unicast_endpoint
133
127
  loop do
134
128
  if rep_socket.recv_string == "command"
135
- rep_socket.send_string handle_command(rep_socket.recv_string).to_json if rep_socket.more_parts?
129
+ command = rep_socket.recv_string if rep_socket.more_parts?
130
+ args = JSON.parse(rep_socket.recv_string) if rep_socket.more_parts?
131
+ Log.debug "unicast_announcer: handling command #{command} with args #{args}"
132
+ rep_socket.send_string Pylon::Command.run(command, args)
136
133
  end
137
- sleep_after_announce = Pylon::Config[:sleep_after_announce]
138
- Thread.pass
139
- sleep sleep_after_announce
134
+ # Sleep shouldn't be needed here, rep_socket.recv_string
135
+ # should block.. right?
136
+ # sleep Pylon::Config[:sleep_after_announce]
140
137
  end
141
-
142
138
  end
143
139
  end
144
140
 
@@ -151,12 +147,8 @@ class Pylon
151
147
  pub_socket.setsockopt ZMQ::MCAST_LOOP, Pylon::Config[:multicast_loopback]
152
148
  pub_socket.connect multicast_endpoint
153
149
  loop do
154
- sleep_after_announce = Pylon::Config[:sleep_after_announce]
155
- Log.debug "#{self}: announcing then sleeping #{sleep_after_announce} secs"
156
- pub_socket.send_string uuid.to_s, ZMQ::SNDMORE
157
- pub_socket.send_string self.to_json
158
- Thread.pass
159
- sleep sleep_after_announce
150
+ pub_socket.send_string Pylon::Command.run("status", :node => self.to_json)
151
+ sleep Pylon::Config[:sleep_after_announce]
160
152
  end
161
153
  end
162
154
  end
@@ -180,13 +172,11 @@ class Pylon
180
172
  end
181
173
 
182
174
  def self.json_create(json)
183
- Log.debug "json_create: trying to create pylon::node object from json: #{json}"
184
175
  node = new(json)
185
176
  node.uuid(json["uuid"])
186
177
  node.weight json["weight"]
187
178
  node.unicast_endpoint json["unicast_endpoint"]
188
179
  node.timestamp json["timestamp"]
189
- Log.debug "#{node}: created from json succesfully"
190
180
  node
191
181
  end
192
182
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pylon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.2.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,7 +14,7 @@ default_executable: pylon
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
17
- requirement: &2158677700 !ruby/object:Gem::Requirement
17
+ requirement: &2164901700 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.0.0
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2158677700
25
+ version_requirements: *2164901700
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: jeweler
28
- requirement: &2158677220 !ruby/object:Gem::Requirement
28
+ requirement: &2164901020 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 1.6.4
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *2158677220
36
+ version_requirements: *2164901020
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rcov
39
- requirement: &2158676740 !ruby/object:Gem::Requirement
39
+ requirement: &2164900280 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2158676740
47
+ version_requirements: *2164900280
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: vagrant
50
- requirement: &2158676100 !ruby/object:Gem::Requirement
50
+ requirement: &2164899580 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2158676100
58
+ version_requirements: *2164899580
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: virtualbox
61
- requirement: &2158675240 !ruby/object:Gem::Requirement
61
+ requirement: &2164898840 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2158675240
69
+ version_requirements: *2164898840
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: minitest
72
- requirement: &2158674520 !ruby/object:Gem::Requirement
72
+ requirement: &2164898200 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ~>
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 2.6.0
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *2158674520
80
+ version_requirements: *2164898200
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: bundler
83
- requirement: &2158674040 !ruby/object:Gem::Requirement
83
+ requirement: &2164897720 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ~>
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: 1.0.0
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *2158674040
91
+ version_requirements: *2164897720
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: jeweler
94
- requirement: &2158673420 !ruby/object:Gem::Requirement
94
+ requirement: &2164897220 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ~>
@@ -99,10 +99,10 @@ dependencies:
99
99
  version: 1.6.4
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *2158673420
102
+ version_requirements: *2164897220
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: rcov
105
- requirement: &2158672780 !ruby/object:Gem::Requirement
105
+ requirement: &2164896720 !ruby/object:Gem::Requirement
106
106
  none: false
107
107
  requirements:
108
108
  - - ! '>='
@@ -110,10 +110,10 @@ dependencies:
110
110
  version: '0'
111
111
  type: :development
112
112
  prerelease: false
113
- version_requirements: *2158672780
113
+ version_requirements: *2164896720
114
114
  - !ruby/object:Gem::Dependency
115
115
  name: vagrant
116
- requirement: &2158672300 !ruby/object:Gem::Requirement
116
+ requirement: &2164896240 !ruby/object:Gem::Requirement
117
117
  none: false
118
118
  requirements:
119
119
  - - ! '>='
@@ -121,10 +121,10 @@ dependencies:
121
121
  version: '0'
122
122
  type: :development
123
123
  prerelease: false
124
- version_requirements: *2158672300
124
+ version_requirements: *2164896240
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: virtualbox
127
- requirement: &2158671820 !ruby/object:Gem::Requirement
127
+ requirement: &2164895740 !ruby/object:Gem::Requirement
128
128
  none: false
129
129
  requirements:
130
130
  - - ! '>='
@@ -132,10 +132,10 @@ dependencies:
132
132
  version: '0'
133
133
  type: :development
134
134
  prerelease: false
135
- version_requirements: *2158671820
135
+ version_requirements: *2164895740
136
136
  - !ruby/object:Gem::Dependency
137
137
  name: minitest
138
- requirement: &2158671280 !ruby/object:Gem::Requirement
138
+ requirement: &2164894980 !ruby/object:Gem::Requirement
139
139
  none: false
140
140
  requirements:
141
141
  - - ~>
@@ -143,10 +143,10 @@ dependencies:
143
143
  version: 2.6.0
144
144
  type: :development
145
145
  prerelease: false
146
- version_requirements: *2158671280
146
+ version_requirements: *2164894980
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: bundler
149
- requirement: &2158652820 !ruby/object:Gem::Requirement
149
+ requirement: &2164894500 !ruby/object:Gem::Requirement
150
150
  none: false
151
151
  requirements:
152
152
  - - ~>
@@ -154,10 +154,10 @@ dependencies:
154
154
  version: 1.0.0
155
155
  type: :development
156
156
  prerelease: false
157
- version_requirements: *2158652820
157
+ version_requirements: *2164894500
158
158
  - !ruby/object:Gem::Dependency
159
159
  name: jeweler
160
- requirement: &2158651960 !ruby/object:Gem::Requirement
160
+ requirement: &2164894020 !ruby/object:Gem::Requirement
161
161
  none: false
162
162
  requirements:
163
163
  - - ~>
@@ -165,10 +165,10 @@ dependencies:
165
165
  version: 1.6.4
166
166
  type: :development
167
167
  prerelease: false
168
- version_requirements: *2158651960
168
+ version_requirements: *2164894020
169
169
  - !ruby/object:Gem::Dependency
170
170
  name: rcov
171
- requirement: &2158651100 !ruby/object:Gem::Requirement
171
+ requirement: &2164893480 !ruby/object:Gem::Requirement
172
172
  none: false
173
173
  requirements:
174
174
  - - ! '>='
@@ -176,10 +176,10 @@ dependencies:
176
176
  version: '0'
177
177
  type: :development
178
178
  prerelease: false
179
- version_requirements: *2158651100
179
+ version_requirements: *2164893480
180
180
  - !ruby/object:Gem::Dependency
181
181
  name: vagrant
182
- requirement: &2158650620 !ruby/object:Gem::Requirement
182
+ requirement: &2164893000 !ruby/object:Gem::Requirement
183
183
  none: false
184
184
  requirements:
185
185
  - - ! '>='
@@ -187,10 +187,10 @@ dependencies:
187
187
  version: '0'
188
188
  type: :development
189
189
  prerelease: false
190
- version_requirements: *2158650620
190
+ version_requirements: *2164893000
191
191
  - !ruby/object:Gem::Dependency
192
192
  name: virtualbox
193
- requirement: &2158650120 !ruby/object:Gem::Requirement
193
+ requirement: &2164892520 !ruby/object:Gem::Requirement
194
194
  none: false
195
195
  requirements:
196
196
  - - ! '>='
@@ -198,10 +198,10 @@ dependencies:
198
198
  version: '0'
199
199
  type: :development
200
200
  prerelease: false
201
- version_requirements: *2158650120
201
+ version_requirements: *2164892520
202
202
  - !ruby/object:Gem::Dependency
203
203
  name: minitest
204
- requirement: &2158649420 !ruby/object:Gem::Requirement
204
+ requirement: &2164892040 !ruby/object:Gem::Requirement
205
205
  none: false
206
206
  requirements:
207
207
  - - ~>
@@ -209,10 +209,10 @@ dependencies:
209
209
  version: 2.6.0
210
210
  type: :development
211
211
  prerelease: false
212
- version_requirements: *2158649420
212
+ version_requirements: *2164892040
213
213
  - !ruby/object:Gem::Dependency
214
214
  name: bundler
215
- requirement: &2158648680 !ruby/object:Gem::Requirement
215
+ requirement: &2164891560 !ruby/object:Gem::Requirement
216
216
  none: false
217
217
  requirements:
218
218
  - - ~>
@@ -220,10 +220,10 @@ dependencies:
220
220
  version: 1.0.0
221
221
  type: :development
222
222
  prerelease: false
223
- version_requirements: *2158648680
223
+ version_requirements: *2164891560
224
224
  - !ruby/object:Gem::Dependency
225
225
  name: jeweler
226
- requirement: &2158647980 !ruby/object:Gem::Requirement
226
+ requirement: &2164891080 !ruby/object:Gem::Requirement
227
227
  none: false
228
228
  requirements:
229
229
  - - ~>
@@ -231,10 +231,10 @@ dependencies:
231
231
  version: 1.6.4
232
232
  type: :development
233
233
  prerelease: false
234
- version_requirements: *2158647980
234
+ version_requirements: *2164891080
235
235
  - !ruby/object:Gem::Dependency
236
236
  name: rcov
237
- requirement: &2158647240 !ruby/object:Gem::Requirement
237
+ requirement: &2164890600 !ruby/object:Gem::Requirement
238
238
  none: false
239
239
  requirements:
240
240
  - - ! '>='
@@ -242,10 +242,10 @@ dependencies:
242
242
  version: '0'
243
243
  type: :development
244
244
  prerelease: false
245
- version_requirements: *2158647240
245
+ version_requirements: *2164890600
246
246
  - !ruby/object:Gem::Dependency
247
247
  name: vagrant
248
- requirement: &2158646540 !ruby/object:Gem::Requirement
248
+ requirement: &2164890120 !ruby/object:Gem::Requirement
249
249
  none: false
250
250
  requirements:
251
251
  - - ! '>='
@@ -253,10 +253,10 @@ dependencies:
253
253
  version: '0'
254
254
  type: :development
255
255
  prerelease: false
256
- version_requirements: *2158646540
256
+ version_requirements: *2164890120
257
257
  - !ruby/object:Gem::Dependency
258
258
  name: virtualbox
259
- requirement: &2158645860 !ruby/object:Gem::Requirement
259
+ requirement: &2164889640 !ruby/object:Gem::Requirement
260
260
  none: false
261
261
  requirements:
262
262
  - - ! '>='
@@ -264,10 +264,10 @@ dependencies:
264
264
  version: '0'
265
265
  type: :development
266
266
  prerelease: false
267
- version_requirements: *2158645860
267
+ version_requirements: *2164889640
268
268
  - !ruby/object:Gem::Dependency
269
269
  name: minitest
270
- requirement: &2158645380 !ruby/object:Gem::Requirement
270
+ requirement: &2164889160 !ruby/object:Gem::Requirement
271
271
  none: false
272
272
  requirements:
273
273
  - - ~>
@@ -275,10 +275,10 @@ dependencies:
275
275
  version: 2.6.0
276
276
  type: :development
277
277
  prerelease: false
278
- version_requirements: *2158645380
278
+ version_requirements: *2164889160
279
279
  - !ruby/object:Gem::Dependency
280
280
  name: bundler
281
- requirement: &2158644880 !ruby/object:Gem::Requirement
281
+ requirement: &2164888680 !ruby/object:Gem::Requirement
282
282
  none: false
283
283
  requirements:
284
284
  - - ~>
@@ -286,10 +286,10 @@ dependencies:
286
286
  version: 1.0.0
287
287
  type: :development
288
288
  prerelease: false
289
- version_requirements: *2158644880
289
+ version_requirements: *2164888680
290
290
  - !ruby/object:Gem::Dependency
291
291
  name: jeweler
292
- requirement: &2158644400 !ruby/object:Gem::Requirement
292
+ requirement: &2164888200 !ruby/object:Gem::Requirement
293
293
  none: false
294
294
  requirements:
295
295
  - - ~>
@@ -297,10 +297,10 @@ dependencies:
297
297
  version: 1.6.4
298
298
  type: :development
299
299
  prerelease: false
300
- version_requirements: *2158644400
300
+ version_requirements: *2164888200
301
301
  - !ruby/object:Gem::Dependency
302
302
  name: rcov
303
- requirement: &2158643920 !ruby/object:Gem::Requirement
303
+ requirement: &2164887360 !ruby/object:Gem::Requirement
304
304
  none: false
305
305
  requirements:
306
306
  - - ! '>='
@@ -308,10 +308,10 @@ dependencies:
308
308
  version: '0'
309
309
  type: :development
310
310
  prerelease: false
311
- version_requirements: *2158643920
311
+ version_requirements: *2164887360
312
312
  - !ruby/object:Gem::Dependency
313
313
  name: vagrant
314
- requirement: &2158643440 !ruby/object:Gem::Requirement
314
+ requirement: &2164862560 !ruby/object:Gem::Requirement
315
315
  none: false
316
316
  requirements:
317
317
  - - ! '>='
@@ -319,10 +319,10 @@ dependencies:
319
319
  version: '0'
320
320
  type: :development
321
321
  prerelease: false
322
- version_requirements: *2158643440
322
+ version_requirements: *2164862560
323
323
  - !ruby/object:Gem::Dependency
324
324
  name: virtualbox
325
- requirement: &2158642940 !ruby/object:Gem::Requirement
325
+ requirement: &2164861840 !ruby/object:Gem::Requirement
326
326
  none: false
327
327
  requirements:
328
328
  - - ! '>='
@@ -330,10 +330,21 @@ dependencies:
330
330
  version: '0'
331
331
  type: :development
332
332
  prerelease: false
333
- version_requirements: *2158642940
333
+ version_requirements: *2164861840
334
+ - !ruby/object:Gem::Dependency
335
+ name: ffi
336
+ requirement: &2164861360 !ruby/object:Gem::Requirement
337
+ none: false
338
+ requirements:
339
+ - - ~>
340
+ - !ruby/object:Gem::Version
341
+ version: 1.0.9
342
+ type: :runtime
343
+ prerelease: false
344
+ version_requirements: *2164861360
334
345
  - !ruby/object:Gem::Dependency
335
346
  name: ffi-rzmq
336
- requirement: &2158642460 !ruby/object:Gem::Requirement
347
+ requirement: &2164860880 !ruby/object:Gem::Requirement
337
348
  none: false
338
349
  requirements:
339
350
  - - ~>
@@ -341,10 +352,10 @@ dependencies:
341
352
  version: 0.8.2
342
353
  type: :runtime
343
354
  prerelease: false
344
- version_requirements: *2158642460
355
+ version_requirements: *2164860880
345
356
  - !ruby/object:Gem::Dependency
346
357
  name: mixlib-log
347
- requirement: &2158641980 !ruby/object:Gem::Requirement
358
+ requirement: &2164860380 !ruby/object:Gem::Requirement
348
359
  none: false
349
360
  requirements:
350
361
  - - ! '>='
@@ -352,10 +363,10 @@ dependencies:
352
363
  version: '0'
353
364
  type: :runtime
354
365
  prerelease: false
355
- version_requirements: *2158641980
366
+ version_requirements: *2164860380
356
367
  - !ruby/object:Gem::Dependency
357
368
  name: mixlib-cli
358
- requirement: &2158641500 !ruby/object:Gem::Requirement
369
+ requirement: &2164859880 !ruby/object:Gem::Requirement
359
370
  none: false
360
371
  requirements:
361
372
  - - ! '>='
@@ -363,10 +374,10 @@ dependencies:
363
374
  version: '0'
364
375
  type: :runtime
365
376
  prerelease: false
366
- version_requirements: *2158641500
377
+ version_requirements: *2164859880
367
378
  - !ruby/object:Gem::Dependency
368
379
  name: mixlib-config
369
- requirement: &2158641020 !ruby/object:Gem::Requirement
380
+ requirement: &2164859400 !ruby/object:Gem::Requirement
370
381
  none: false
371
382
  requirements:
372
383
  - - ! '>='
@@ -374,10 +385,10 @@ dependencies:
374
385
  version: '0'
375
386
  type: :runtime
376
387
  prerelease: false
377
- version_requirements: *2158641020
388
+ version_requirements: *2164859400
378
389
  - !ruby/object:Gem::Dependency
379
390
  name: uuidtools
380
- requirement: &2158640540 !ruby/object:Gem::Requirement
391
+ requirement: &2164858920 !ruby/object:Gem::Requirement
381
392
  none: false
382
393
  requirements:
383
394
  - - ~>
@@ -385,10 +396,10 @@ dependencies:
385
396
  version: 2.1.2
386
397
  type: :runtime
387
398
  prerelease: false
388
- version_requirements: *2158640540
399
+ version_requirements: *2164858920
389
400
  - !ruby/object:Gem::Dependency
390
401
  name: json
391
- requirement: &2158640060 !ruby/object:Gem::Requirement
402
+ requirement: &2164858440 !ruby/object:Gem::Requirement
392
403
  none: false
393
404
  requirements:
394
405
  - - ! '>='
@@ -396,10 +407,21 @@ dependencies:
396
407
  version: '0'
397
408
  type: :runtime
398
409
  prerelease: false
399
- version_requirements: *2158640060
410
+ version_requirements: *2164858440
411
+ - !ruby/object:Gem::Dependency
412
+ name: bundler
413
+ requirement: &2164857960 !ruby/object:Gem::Requirement
414
+ none: false
415
+ requirements:
416
+ - - ~>
417
+ - !ruby/object:Gem::Version
418
+ version: 1.0.0
419
+ type: :runtime
420
+ prerelease: false
421
+ version_requirements: *2164857960
400
422
  - !ruby/object:Gem::Dependency
401
423
  name: minitest
402
- requirement: &2158639580 !ruby/object:Gem::Requirement
424
+ requirement: &2164857480 !ruby/object:Gem::Requirement
403
425
  none: false
404
426
  requirements:
405
427
  - - ~>
@@ -407,10 +429,10 @@ dependencies:
407
429
  version: 2.6.0
408
430
  type: :development
409
431
  prerelease: false
410
- version_requirements: *2158639580
432
+ version_requirements: *2164857480
411
433
  - !ruby/object:Gem::Dependency
412
434
  name: bundler
413
- requirement: &2158639100 !ruby/object:Gem::Requirement
435
+ requirement: &2164857000 !ruby/object:Gem::Requirement
414
436
  none: false
415
437
  requirements:
416
438
  - - ~>
@@ -418,10 +440,10 @@ dependencies:
418
440
  version: 1.0.0
419
441
  type: :development
420
442
  prerelease: false
421
- version_requirements: *2158639100
443
+ version_requirements: *2164857000
422
444
  - !ruby/object:Gem::Dependency
423
445
  name: jeweler
424
- requirement: &2158638620 !ruby/object:Gem::Requirement
446
+ requirement: &2164856520 !ruby/object:Gem::Requirement
425
447
  none: false
426
448
  requirements:
427
449
  - - ~>
@@ -429,10 +451,10 @@ dependencies:
429
451
  version: 1.6.4
430
452
  type: :development
431
453
  prerelease: false
432
- version_requirements: *2158638620
454
+ version_requirements: *2164856520
433
455
  - !ruby/object:Gem::Dependency
434
456
  name: rcov
435
- requirement: &2158638140 !ruby/object:Gem::Requirement
457
+ requirement: &2164856040 !ruby/object:Gem::Requirement
436
458
  none: false
437
459
  requirements:
438
460
  - - ! '>='
@@ -440,10 +462,10 @@ dependencies:
440
462
  version: '0'
441
463
  type: :development
442
464
  prerelease: false
443
- version_requirements: *2158638140
465
+ version_requirements: *2164856040
444
466
  - !ruby/object:Gem::Dependency
445
467
  name: vagrant
446
- requirement: &2158637660 !ruby/object:Gem::Requirement
468
+ requirement: &2164855560 !ruby/object:Gem::Requirement
447
469
  none: false
448
470
  requirements:
449
471
  - - ! '>='
@@ -451,10 +473,10 @@ dependencies:
451
473
  version: '0'
452
474
  type: :development
453
475
  prerelease: false
454
- version_requirements: *2158637660
476
+ version_requirements: *2164855560
455
477
  - !ruby/object:Gem::Dependency
456
478
  name: virtualbox
457
- requirement: &2158637180 !ruby/object:Gem::Requirement
479
+ requirement: &2164854740 !ruby/object:Gem::Requirement
458
480
  none: false
459
481
  requirements:
460
482
  - - ! '>='
@@ -462,7 +484,7 @@ dependencies:
462
484
  version: '0'
463
485
  type: :development
464
486
  prerelease: false
465
- version_requirements: *2158637180
487
+ version_requirements: *2164854740
466
488
  description: leader election with zeromq for ruby using widely available leader election
467
489
  algorithms, similar to gen_leader erlang project in essence
468
490
  email: aj@junglist.gen.nz
@@ -474,10 +496,18 @@ extra_rdoc_files:
474
496
  - README.org
475
497
  files:
476
498
  - lib/pylon/application.rb
499
+ - lib/pylon/command/new_leader.rb
500
+ - lib/pylon/command/ping.rb
501
+ - lib/pylon/command/status.rb
502
+ - lib/pylon/command.rb
503
+ - lib/pylon/command_handler.rb
477
504
  - lib/pylon/config.rb
478
505
  - lib/pylon/daemon.rb
479
506
  - lib/pylon/elector.rb
507
+ - lib/pylon/exceptions.rb
508
+ - lib/pylon/failure_detector.rb
480
509
  - lib/pylon/log.rb
510
+ - lib/pylon/mixin/convert_to_class_name.rb
481
511
  - lib/pylon/node.rb
482
512
  - lib/pylon.rb
483
513
  - bin/pylon
@@ -502,7 +532,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
502
532
  version: '0'
503
533
  segments:
504
534
  - 0
505
- hash: 120515204154468058
535
+ hash: -2224656068456165140
506
536
  required_rubygems_version: !ruby/object:Gem::Requirement
507
537
  none: false
508
538
  requirements: