pylon 0.2.7 → 0.2.8

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,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: