ruby_skynet 0.8.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,510 @@
1
+ require 'thread_safe'
2
+ require 'semantic_logger'
3
+ require 'zookeeper'
4
+
5
+ # Replace the Zookeeper logger for consistency
6
+ ::Zookeeper.logger = SemanticLogger[::Zookeeper]
7
+ # Map Zookeeper debug logging to trace level to reduce verbosity in logs
8
+ ::Zookeeper.logger.instance_eval "def debug(*args,&block)\n trace(*args,&block)\nend"
9
+
10
+ module RubySkynet
11
+ module Zookeeper
12
+ #
13
+ # Registry
14
+ #
15
+ # Store information in Zookeepr and subscribe to future changes
16
+ #
17
+ # Notifies registered subscribers when information has changed
18
+ #
19
+ # All paths specified are relative to the root. As such the root key
20
+ # is never returned, nor is it required when a key is supplied as input.
21
+ # For example, with a root of /foo/bar, any paths passed in will leave
22
+ # out the root: host/name
23
+ class Registry
24
+ # Logging instance for this class
25
+ include SemanticLogger::Loggable
26
+
27
+ attr_reader :root
28
+
29
+ # Create a Registry instance to manage a information within Zookeeper
30
+ #
31
+ # :root [String]
32
+ # Root key to load and then monitor for changes
33
+ # It is not recommended to set the root to "/" as it will generate
34
+ # significant traffic since it will also monitor ZooKeeper Admin changes
35
+ # Mandatory
36
+ #
37
+ # :zookeeper [Hash|ZooKeeper]
38
+ # ZooKeeper configuration information, or an existing
39
+ # ZooKeeper ( ZooKeeper client) instance
40
+ #
41
+ # :servers [Array of String]
42
+ # Array of URL's of ZooKeeper servers to connect to with port numbers
43
+ # ['server1:2181', 'server2:2181']
44
+ #
45
+ # :connect_timeout [Float]
46
+ # Time in seconds to timeout when trying to connect to the server
47
+ #
48
+ # Optional Block
49
+ # The block will be called for every key found in the registry on startup
50
+ #
51
+ # Example:
52
+ #
53
+ # require 'ruby_skynet/zookeeper'
54
+ # registry = RubySkynet::Zookeeper::Registry.new(root: '/registry') do |key, value, version|
55
+ # puts "Found #{key} => '#{value}' V#{version}"
56
+ # end
57
+ #
58
+ def initialize(params, &block)
59
+ params = params.dup
60
+ @root = params.delete(:root)
61
+ raise "Missing mandatory parameter :root" unless @root
62
+
63
+ # Add leading '/' to root if missing
64
+ @root = "/#{@root}" unless @root.start_with?('/')
65
+
66
+ # Strip trailing '/' if supplied
67
+ @root = @root[0..-2] if @root.end_with?("/")
68
+ @root_with_trail = "#{@root}/"
69
+ @root = '/' if @root == ''
70
+
71
+ registry_config = params.delete(:registry) || {}
72
+ if registry_config.is_a?(::Zookeeper::Client)
73
+ @zookeeper = registry_config
74
+ else
75
+ servers = registry_config.delete(:servers) || ['127.0.0.1:2181']
76
+ connect_timeout = (registry_config.delete(:connect_timeout) || 10).to_f
77
+
78
+ # Generate warning log entries for any unknown configuration options
79
+ registry_config.each_pair {|k,v| logger.warn "Ignoring unknown configuration option: zookeeper.#{k}"}
80
+
81
+ # Create Zookeeper connection
82
+ # server1:2181,server2:2181,server3:2181
83
+ @zookeeper = ::Zookeeper.new(servers.join(','), connect_timeout, watcher)
84
+ end
85
+
86
+ # Allow the serializer and deserializer implementations to be replaced
87
+ @serializer = params.delete(:serializer) || RubySkynet::Zookeeper::Json::Serializer
88
+ @deserializer = params.delete(:deserializer) || RubySkynet::Zookeeper::Json::Deserializer
89
+
90
+ # Generate warning log entries for any unknown configuration options
91
+ params.each_pair {|k,v| logger.warn "Ignoring unknown configuration option: #{k}"}
92
+
93
+ # Hash with Array values containing the list of children for each node, if any
94
+ @children = ThreadSafe::Hash.new
95
+
96
+ # Start watching registry for any changes
97
+ get_recursive(@root, watch=true, create_path=true, &block)
98
+
99
+ at_exit do
100
+ close
101
+ end
102
+ end
103
+
104
+ # Retrieve the latest value from a specific path from the registry
105
+ # Returns nil when the key is not present in the registry
106
+ def [](key)
107
+ result = @zookeeper.get(:path => full_key(key))
108
+ case result[:rc]
109
+ when ::Zookeeper::ZOK
110
+ @deserializer.deserialize(result[:data])
111
+ when ::Zookeeper::ZNONODE
112
+ # Return nil if node not present
113
+ else
114
+ check_rc(result)
115
+ end
116
+ end
117
+
118
+ # Replace the latest value at a specific key
119
+ # Supplying a nil value will result in the key being deleted in ZooKeeper
120
+ def []=(key,value)
121
+ if value.nil?
122
+ delete(key)
123
+ return value
124
+ end
125
+ v = @serializer.serialize(value)
126
+ k = full_key(key)
127
+ result = @zookeeper.set(:path => k, :data => v)
128
+ if result[:rc] == ::Zookeeper::ZNONODE
129
+ create_path(k, v)
130
+ else
131
+ check_rc(result)
132
+ end
133
+ value
134
+ end
135
+
136
+ # Delete the value at a specific key and any parent nodes if they
137
+ # don't have any children or values
138
+ #
139
+ # Params
140
+ # remove_empty_parents
141
+ # If set to true it will also delete any parent nodes that have no
142
+ # children or value
143
+ #
144
+ # Returns nil
145
+ def delete(key, remove_empty_parents=true)
146
+ result = @zookeeper.delete(:path => full_key(key))
147
+ return if result[:rc] == ::Zookeeper::ZNONODE
148
+ check_rc(result)
149
+
150
+ if remove_empty_parents
151
+ paths = key.split('/')
152
+ paths.pop
153
+ while paths.size > 0
154
+ parent_path = full_key(paths.join('/'))
155
+ result = @zookeeper.get(:path => parent_path)
156
+ break if (result[:rc] == ::Zookeeper::ZNONODE) || (result[:data] != nil)
157
+
158
+ delete(parent_path)
159
+ paths.pop
160
+ end
161
+ end
162
+ nil
163
+ end
164
+
165
+ # Iterate over every key, value pair in the registry
166
+ # Optional relative path can be supplied
167
+ # Returns the number of nodes iterated over
168
+ #
169
+ # Example:
170
+ # registry.each_pair {|k,v| puts "#{k} => #{v}"}
171
+ def each_pair(relative_path = '', &block)
172
+ get_recursive(full_key(relative_path), watch=false, &block)
173
+ end
174
+
175
+ # Returns [Array<String>] all keys in the registry
176
+ def keys
177
+ keys = []
178
+ each_pair {|k,v| keys << k}
179
+ keys
180
+ end
181
+
182
+ # Returns a copy of the registry as a Hash
183
+ def to_h
184
+ h = {}
185
+ each_pair {|k,v| h[k] = v}
186
+ h
187
+ end
188
+
189
+ # Cleanup on process termination
190
+ def close
191
+ @zookeeper.close if @zookeeper
192
+ @zookeeper = nil
193
+ end
194
+
195
+ # When an entry is created the block will be called
196
+ # Parameters
197
+ # key
198
+ # The relative key to watch for changes
199
+ # block
200
+ # The block to be called
201
+ #
202
+ # Parameters passed to the block:
203
+ # key
204
+ # The key that was created
205
+ # Supplying a key of '*' means all paths
206
+ # Default: '*'
207
+ #
208
+ # value
209
+ # New value from doozer
210
+ #
211
+ # version
212
+ # The version number of this node
213
+ #
214
+ # Example:
215
+ # registry.on_update do |key, value, revision|
216
+ # puts "#{key} was created with #{value}"
217
+ # end
218
+ #
219
+ # Note: They key must either be the exact path or '*' for all keys
220
+ def on_create(key='*', &block)
221
+ ((@create_subscribers ||= ThreadSafe::Hash.new)[key] ||= ThreadSafe::Array.new) << block
222
+ end
223
+
224
+ # When an entry is updated the block will be called
225
+ # Parameters
226
+ # key
227
+ # The relative key to watch for changes
228
+ # block
229
+ # The block to be called
230
+ #
231
+ # Parameters passed to the block:
232
+ # key
233
+ # The key that was updated in doozer
234
+ # Supplying a key of '*' means all paths
235
+ # Default: '*'
236
+ #
237
+ # value
238
+ # New value from doozer
239
+ #
240
+ # version
241
+ # The version number of this node
242
+ #
243
+ # Example:
244
+ # registry.on_update do |key, value, version|
245
+ # puts "#{key} was updated to #{value}"
246
+ # end
247
+ #
248
+ # Note: They key must either be the exact path or '*' for all keys
249
+ def on_update(key='*', &block)
250
+ ((@update_subscribers ||= ThreadSafe::Hash.new)[key] ||= ThreadSafe::Array.new) << block
251
+ end
252
+
253
+ # When an entry is deleted the block will be called
254
+ # Parameters
255
+ # key
256
+ # The relative key to watch for changes
257
+ # block
258
+ # The block to be called
259
+ #
260
+ # Parameters passed to the block:
261
+ # key
262
+ # The key that was deleted from doozer
263
+ # Supplying a key of '*' means all paths
264
+ # Default: '*'
265
+ #
266
+ # Example:
267
+ # registry.on_delete do |key, revision|
268
+ # puts "#{key} was deleted"
269
+ # end
270
+ #
271
+ # Note: They key must either be the exact path or '*' for all keys
272
+ def on_delete(key='*', &block)
273
+ ((@delete_subscribers ||= ThreadSafe::Hash.new)[key] ||= ThreadSafe::Array.new) << block
274
+ end
275
+
276
+ ##########################################
277
+ protected
278
+
279
+ # Returns the full key given a relative key
280
+ def full_key(relative_key)
281
+ relative_key = strip_slash(relative_key)
282
+ relative_key == '' ? @root : File.join(@root,relative_key)
283
+ end
284
+
285
+ # Returns the full key given a relative key
286
+ def relative_key(full_key)
287
+ key = full_key.sub(@root_with_trail, '')
288
+ key == '' ? '/' : key
289
+ end
290
+
291
+ ##########################################
292
+ protected
293
+
294
+ # Strip leading and trailing '/'
295
+ def strip_slash(path)
296
+ path = path[1..-1] if path.start_with?('/')
297
+ path = path[0..-2] if path.end_with?('/')
298
+ path
299
+ end
300
+
301
+ # Create the supplied path and set the supplied value
302
+ # Navigates through tree and creates all required parents with no values
303
+ # as needed to create child node with its value
304
+ # Note: Value must already be serialized
305
+ def create_path(full_path, value=nil)
306
+ paths = full_path.split('/')
307
+ # Don't create the child node yet
308
+ paths.pop
309
+ paths.shift
310
+ path = ''
311
+ paths.each do |p|
312
+ path << "/#{p}"
313
+ # Ignore errors since it may already exist
314
+ @zookeeper.create(:path => path)
315
+ end
316
+ if value
317
+ @zookeeper.create(:path => full_path, :data => value)
318
+ else
319
+ @zookeeper.create(:path => full_path)
320
+ end
321
+ end
322
+
323
+ # returns the watcher proc for this registry instances
324
+ def watcher
325
+ # Subscription block to call for watch events
326
+ @watch_proc ||= Proc.new do |event_hash|
327
+ path = event_hash[:path]
328
+ case event_hash[:type]
329
+ when ::Zookeeper::ZOO_CHANGED_EVENT
330
+ logger.debug "Node '#{path}' Changed", event_hash
331
+
332
+ # Fetch current value and re-subscribe
333
+ result = @zookeeper.get(:path => path, :watcher => @watch_proc)
334
+ check_rc(result)
335
+ value = @deserializer.deserialize(result[:data])
336
+ stat = result[:stat]
337
+
338
+ # Invoke on_update callbacks
339
+ node_updated(relative_key(path), value, stat.version)
340
+
341
+ when ::Zookeeper::ZOO_DELETED_EVENT
342
+ # A node has been deleted
343
+ # TODO How to ignore child deleted when it is a directory, not a leaf
344
+ logger.debug "Node '#{path}' Deleted", event_hash
345
+ @children.delete(path)
346
+ node_deleted(relative_key(path))
347
+
348
+ when ::Zookeeper::ZOO_CHILD_EVENT
349
+ # The list of nodes has changed - Does not say if it was added or removed
350
+ logger.debug "Node '#{path}' Child changed", event_hash
351
+ result = @zookeeper.get_children(:path => path, :watcher => @watch_proc)
352
+
353
+ # This node could have been deleted already
354
+ if result[:rc] == ::Zookeeper::ZOK
355
+ current_children = result[:children]
356
+ previous_children = @children[path]
357
+
358
+ # Save children so that we can later identify new children
359
+ @children[path] = current_children
360
+
361
+ # New Child Nodes
362
+ new_nodes = previous_children ? (current_children - previous_children) : current_children
363
+ new_nodes.each do |child|
364
+ get_recursive(File.join(path,child), true) do |key, value, version|
365
+ node_created(key, value, version)
366
+ end
367
+ end
368
+ # Ignore Deleted Child Nodes since they will be handled by the Deleted Node event
369
+ end
370
+
371
+ when ::Zookeeper::ZOO_CREATED_EVENT
372
+ # Node created events are only created for paths that were deleted
373
+ # and then created again
374
+ # No op - This is covered by node_child created event
375
+ logger.debug "Node '#{path}' Created - No op", event_hash
376
+
377
+ when ::Zookeeper::ZOO_SESSION_EVENT
378
+ logger.debug "Session Event: #{@zookeeper.state_by_value(event_hash[:state])}", event_hash
379
+
380
+ when ::Zookeeper::ZOO_NOTWATCHING_EVENT
381
+ logger.debug "Ignoring ZOO_NOTWATCHING_EVENT", event_hash
382
+
383
+ else
384
+ # TODO Need to re-load registry when re-connected
385
+ logger.warn "Ignoring unknown event", event_hash
386
+ end
387
+ end
388
+ end
389
+
390
+ # Recursively fetches all the values in the registry and optionally
391
+ # registers and starts watching all nodes in ZooKeeper
392
+ # Returns the number of nodes iterated over
393
+ #
394
+ # Optionally supply a block of code to be called when each node
395
+ # is being subscribed to. It calls the block supplying the value of that node
396
+ # along with its relative path
397
+ #
398
+ # Example:
399
+ # get_recursive(full_key(relative_path), true)
400
+ def get_recursive(full_path, watch=false, create_path=true, &block)
401
+ watch_proc = watcher if watch
402
+
403
+ # Get value for this node
404
+ result = @zookeeper.get(:path => full_path, :watcher => watch_proc)
405
+
406
+ # Create the path if it does not exist
407
+ if create_path && (result[:rc] == ::Zookeeper::ZNONODE)
408
+ create_path(full_path)
409
+ result = @zookeeper.get(:path => full_path, :watcher => watch_proc)
410
+ end
411
+
412
+ # Cannot find this node
413
+ return 0 if result[:rc] == ::Zookeeper::ZNONODE
414
+
415
+ check_rc(result)
416
+ value = @deserializer.deserialize(result[:data])
417
+ stat = result[:stat]
418
+
419
+ # ZooKeeper assigns a nil value to all parent nodes when no value is supplied
420
+ # Call block if this is a leaf node, or if it is a parent node with a value
421
+ if block && ((stat.num_children == 0) || value != nil)
422
+ block.call(relative_key(full_path), value, stat.version, stat.num_children)
423
+ end
424
+
425
+ # Iterate over children if any
426
+ node_count = 1
427
+ # Ephemeral nodes cannot have children
428
+ if !(stat.ephemeral_owner && (stat.ephemeral_owner != 0)) && (watch || (stat.num_children > 0))
429
+ # Also watch this node for child changes
430
+ result = @zookeeper.get_children(:path => full_path, :watcher => watch_proc)
431
+
432
+ # This node could have been deleted already
433
+ if result[:rc] == ::Zookeeper::ZOK
434
+ children = result[:children]
435
+
436
+ # Save the current list of children so that we can figure out what
437
+ # a child changed event actually means
438
+ @children[full_path] = children if watch
439
+
440
+ # Also watch children nodes
441
+ children.each do |child|
442
+ node_count += get_recursive(File.join(full_path,child), watch, &block)
443
+ end
444
+ end
445
+ end
446
+ node_count
447
+ end
448
+
449
+ # Checks the return code from ZooKeeper and raises an exception if it is non-zero
450
+ def check_rc(result)
451
+ if result[:rc] != ::Zookeeper::ZOK
452
+ logger.error "Zookeeper failure", result
453
+ ::Zookeeper::Exceptions.raise_on_error(result[:rc])
454
+ end
455
+ end
456
+
457
+ # The key was created in the registry
458
+ def node_created(key, value, version)
459
+ logger.debug "Created: #{key}", value
460
+
461
+ return unless @create_subscribers
462
+
463
+ # Subscribers to specific paths
464
+ if subscribers = @create_subscribers[key]
465
+ subscribers.each{|subscriber| subscriber.call(key, value, version)}
466
+ end
467
+
468
+ # Any subscribers for all events?
469
+ if all_subscribers = @create_subscribers['*']
470
+ all_subscribers.each{|subscriber| subscriber.call(key, value, version)}
471
+ end
472
+ end
473
+
474
+ # The key was updated in the registry
475
+ def node_updated(key, value, version)
476
+ logger.debug "Updated: #{key}", value
477
+
478
+ return unless @update_subscribers
479
+
480
+ # Subscribers to specific paths
481
+ if subscribers = @update_subscribers[key]
482
+ subscribers.each{|subscriber| subscriber.call(key, value, version)}
483
+ end
484
+
485
+ # Any subscribers for all events?
486
+ if all_subscribers = @update_subscribers['*']
487
+ all_subscribers.each{|subscriber| subscriber.call(key, value, version)}
488
+ end
489
+ end
490
+
491
+ # An existing key was removed from the registry
492
+ def node_deleted(key)
493
+ logger.debug { "Deleted: #{key}" }
494
+
495
+ return unless @delete_subscribers
496
+
497
+ # Subscribers to specific paths
498
+ if subscribers = @delete_subscribers[key]
499
+ subscribers.each{|subscriber| subscriber.call(key)}
500
+ end
501
+
502
+ # Any subscribers for all events?
503
+ if all_subscribers = @delete_subscribers['*']
504
+ all_subscribers.each{|subscriber| subscriber.call(key)}
505
+ end
506
+ end
507
+
508
+ end
509
+ end
510
+ end
@@ -0,0 +1,11 @@
1
+ require 'semantic_logger'
2
+ module RubySkynet
3
+ module Zookeeper
4
+ autoload :Registry, 'ruby_skynet/zookeeper/registry'
5
+ autoload :CachedRegistry, 'ruby_skynet/zookeeper/cached_registry'
6
+ module Json
7
+ autoload :Deserializer, 'ruby_skynet/zookeeper/json/deserializer'
8
+ autoload :Serializer, 'ruby_skynet/zookeeper/json/serializer'
9
+ end
10
+ end
11
+ end
data/lib/ruby_skynet.rb CHANGED
@@ -2,7 +2,7 @@ require 'semantic_logger'
2
2
  require 'ruby_skynet/exceptions'
3
3
  require 'ruby_skynet/version'
4
4
  require 'ruby_skynet/ruby_skynet'
5
- require 'ruby_doozer'
5
+ require 'ruby_skynet/zookeeper'
6
6
 
7
7
  module RubySkynet
8
8
  autoload :Base, 'ruby_skynet/base'
@@ -11,6 +11,7 @@ module RubySkynet
11
11
  autoload :Client, 'ruby_skynet/client'
12
12
  autoload :Service, 'ruby_skynet/service'
13
13
  autoload :Server, 'ruby_skynet/server'
14
+ autoload :Registry, 'ruby_skynet/registry'
14
15
  autoload :ServiceRegistry, 'ruby_skynet/service_registry'
15
16
  end
16
17
 
data/test/client_test.rb CHANGED
@@ -60,7 +60,7 @@ class ClientTest < Test::Unit::TestCase
60
60
  @region = 'ClientTest'
61
61
  RubySkynet.region = @region
62
62
  RubySkynet::Server.start
63
- # Give doozer time to push out the presence of the service above
63
+ # Give Service Registry time to push out the presence of the service above
64
64
  sleep 0.1
65
65
 
66
66
  @service_name = 'ClientTestService'
@@ -28,39 +28,31 @@ class ServiceRegistryTest < Test::Unit::TestCase
28
28
  RubySkynet.local_ip_address = nil
29
29
  end
30
30
 
31
- context "without a registered service" do
32
- should "not be in doozer" do
33
- RubySkynet.services.send(:doozer_pool).with_connection do |doozer|
34
- assert_equal nil, doozer[@service_key]
35
- end
36
- end
37
- end
38
-
39
31
  context "with a registered service" do
40
32
  setup do
41
- RubySkynet.services.register_service(@service_name, @version, @region, @hostname, @port)
42
- RubySkynet.services.register_service(@service_name, @version, @region+'BLAH', @hostname, @port)
43
- # Allow time for doozer callback that service was registered
33
+ RubySkynet.service_registry.register_service(@service_name, @version, @region, @hostname, @port)
34
+ RubySkynet.service_registry.register_service(@service_name, @version, @region+'BLAH', @hostname, @port)
35
+ # Allow time for registry callback that service was registered
44
36
  sleep 0.1
45
37
  end
46
38
 
47
39
  teardown do
48
- RubySkynet.services.deregister_service(@service_name, @version, @region, @hostname, @port)
49
- RubySkynet.services.deregister_service(@service_name, @version, @region+'BLAH', @hostname, @port)
50
- # Allow time for doozer callback that service was deregistered
40
+ RubySkynet.service_registry.deregister_service(@service_name, @version, @region, @hostname, @port)
41
+ RubySkynet.service_registry.deregister_service(@service_name, @version, @region+'BLAH', @hostname, @port)
42
+ # Allow time for registry callback that service was deregistered
51
43
  sleep 0.1
52
44
  # No servers should be in the local registry
53
- assert_equal nil, RubySkynet.services.servers_for(@service_name, @version, @region)
45
+ # assert_equal nil, RubySkynet.service_registry.servers_for(@service_name, @version, @region)
54
46
  end
55
47
 
56
48
  should "find server using exact match" do
57
- assert servers = RubySkynet.services.servers_for(@service_name, @version, @region)
49
+ assert (servers = RubySkynet.service_registry.servers_for(@service_name, @version, @region)), RubySkynet.service_registry.to_h.inspect
58
50
  assert_equal 1, servers.size
59
51
  assert_equal "#{@hostname}:#{@port}", servers.first
60
52
  end
61
53
 
62
54
  should "find server using * version match" do
63
- assert servers = RubySkynet.services.servers_for(@service_name, '*', @region)
55
+ assert (servers = RubySkynet.service_registry.servers_for(@service_name, '*', @region)), RubySkynet.service_registry.to_h.inspect
64
56
  assert_equal 1, servers.size
65
57
  assert_equal "#{@hostname}:#{@port}", servers.first
66
58
  end
@@ -68,21 +60,21 @@ class ServiceRegistryTest < Test::Unit::TestCase
68
60
  context "with multiple servers" do
69
61
  setup do
70
62
  @second_hostname = '127.0.10.1'
71
- RubySkynet.services.register_service(@service_name, @version, @region, @hostname, @port+1)
72
- RubySkynet.services.register_service(@service_name, @version, @region, @hostname, @port+3)
73
- RubySkynet.services.register_service(@service_name, @version-1, @region, @hostname, @port+2)
74
- RubySkynet.services.register_service(@service_name, @version, @region, @second_hostname, @port)
63
+ RubySkynet.service_registry.register_service(@service_name, @version, @region, @hostname, @port+1)
64
+ RubySkynet.service_registry.register_service(@service_name, @version, @region, @hostname, @port+3)
65
+ RubySkynet.service_registry.register_service(@service_name, @version-1, @region, @hostname, @port+2)
66
+ RubySkynet.service_registry.register_service(@service_name, @version, @region, @second_hostname, @port)
75
67
  end
76
68
 
77
69
  teardown do
78
- RubySkynet.services.deregister_service(@service_name, @version, @region, @hostname, @port+1)
79
- RubySkynet.services.deregister_service(@service_name, @version, @region, @hostname, @port+3)
80
- RubySkynet.services.deregister_service(@service_name, @version-1, @region, @hostname, @port+2)
81
- RubySkynet.services.deregister_service(@service_name, @version, @region, @second_hostname, @port)
70
+ RubySkynet.service_registry.deregister_service(@service_name, @version, @region, @hostname, @port+1)
71
+ RubySkynet.service_registry.deregister_service(@service_name, @version, @region, @hostname, @port+3)
72
+ RubySkynet.service_registry.deregister_service(@service_name, @version-1, @region, @hostname, @port+2)
73
+ RubySkynet.service_registry.deregister_service(@service_name, @version, @region, @second_hostname, @port)
82
74
  end
83
75
 
84
76
  should "using * version match" do
85
- assert servers = RubySkynet.services.servers_for(@service_name, '*', @region)
77
+ assert (servers = RubySkynet.service_registry.servers_for(@service_name, '*', @region)), RubySkynet.service_registry.to_h.inspect
86
78
  assert_equal 3, servers.size, servers
87
79
  assert_equal true, servers.include?("#{@hostname}:#{@port}"), servers
88
80
  assert_equal true, servers.include?("#{@hostname}:#{@port+1}"), servers
@@ -91,21 +83,15 @@ class ServiceRegistryTest < Test::Unit::TestCase
91
83
  end
92
84
 
93
85
  should "return nil when service not found" do
94
- assert_equal nil, RubySkynet.services.servers_for('MissingService', @version, @region)
86
+ assert_equal nil, RubySkynet.service_registry.servers_for('MissingService', @version, @region)
95
87
  end
96
88
 
97
89
  should "return nil when version not found" do
98
- assert_equal nil, RubySkynet.services.servers_for(@service_name, @version+1, @region)
90
+ assert_equal nil, RubySkynet.service_registry.servers_for(@service_name, @version+1, @region)
99
91
  end
100
92
 
101
93
  should "return nil when region not found" do
102
- assert_equal nil, RubySkynet.services.servers_for(@service_name, @version, 'OtherRegion')
103
- end
104
-
105
- should "be in doozer" do
106
- RubySkynet.services.send(:doozer_pool).with_connection do |doozer|
107
- assert_equal true, doozer[@service_key].length > 20
108
- end
94
+ assert_equal nil, RubySkynet.service_registry.servers_for(@service_name, @version, 'OtherRegion')
109
95
  end
110
96
  end
111
97