rightscale-nanite 0.4.1.4 → 0.4.1.10
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +3 -1
- data/lib/nanite/agent.rb +24 -8
- data/lib/nanite/amqp.rb +5 -1
- data/lib/nanite/cluster.rb +74 -54
- data/lib/nanite/daemonize.rb +4 -4
- data/lib/nanite/local_state.rb +5 -1
- data/lib/nanite/log.rb +1 -1
- data/lib/nanite/mapper.rb +17 -11
- data/lib/nanite/mapper_proxy.rb +9 -1
- data/lib/nanite/{dispatcher.rb → nanite_dispatcher.rb} +0 -0
- data/lib/nanite/packets.rb +55 -19
- data/lib/nanite/reaper.rb +15 -14
- data/lib/nanite/redis_tag_store.rb +141 -0
- data/lib/nanite/state.rb +87 -116
- data/lib/nanite/util.rb +21 -1
- data/lib/nanite.rb +2 -2
- metadata +34 -58
- data/spec/actor_registry_spec.rb +0 -60
- data/spec/actor_spec.rb +0 -77
- data/spec/agent_spec.rb +0 -240
- data/spec/cached_certificate_store_proxy_spec.rb +0 -34
- data/spec/certificate_cache_spec.rb +0 -49
- data/spec/certificate_spec.rb +0 -27
- data/spec/cluster_spec.rb +0 -485
- data/spec/dispatcher_spec.rb +0 -136
- data/spec/distinguished_name_spec.rb +0 -24
- data/spec/encrypted_document_spec.rb +0 -21
- data/spec/job_spec.rb +0 -251
- data/spec/local_state_spec.rb +0 -112
- data/spec/log_spec.rb +0 -49
- data/spec/mapper_proxy_spec.rb +0 -72
- data/spec/mapper_spec.rb +0 -70
- data/spec/nanite_spec.rb +0 -36
- data/spec/packet_spec.rb +0 -220
- data/spec/rsa_key_pair_spec.rb +0 -33
- data/spec/secure_serializer_spec.rb +0 -41
- data/spec/serializer_spec.rb +0 -107
- data/spec/signature_spec.rb +0 -30
- data/spec/spec_helper.rb +0 -30
- data/spec/static_certificate_store_spec.rb +0 -30
- data/spec/util_spec.rb +0 -63
data/lib/nanite/reaper.rb
CHANGED
@@ -1,23 +1,29 @@
|
|
1
1
|
module Nanite
|
2
2
|
class Reaper
|
3
|
-
|
3
|
+
attr_reader :timeouts
|
4
4
|
def initialize(frequency=2)
|
5
5
|
@timeouts = {}
|
6
6
|
EM.add_periodic_timer(frequency) { EM.next_tick { reap } }
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
# Add the specified token to the internal timeout hash.
|
10
|
+
# The reaper will then check this instance on every reap.
|
11
|
+
def register(token, seconds, &blk)
|
10
12
|
@timeouts[token] = {:timestamp => Time.now + seconds, :seconds => seconds, :callback => blk}
|
11
13
|
end
|
14
|
+
|
15
|
+
def unregister(token)
|
16
|
+
@timeouts.delete(token)
|
17
|
+
end
|
12
18
|
|
13
|
-
|
19
|
+
# Updates the timeout timestamp for the given token. If the token is
|
20
|
+
# unknown to this reaper instance it will be auto-registered, usually
|
21
|
+
# happening when you have several mappers and not all of them know
|
22
|
+
# this agent yet, but received a ping from it.
|
23
|
+
def update(token, seconds, &blk)
|
14
24
|
unless @timeouts[token]
|
15
|
-
|
25
|
+
register(token, seconds, &blk)
|
16
26
|
end
|
17
|
-
reset(token)
|
18
|
-
end
|
19
|
-
|
20
|
-
def reset(token)
|
21
27
|
@timeouts[token][:timestamp] = Time.now + @timeouts[token][:seconds]
|
22
28
|
end
|
23
29
|
|
@@ -26,12 +32,7 @@ module Nanite
|
|
26
32
|
def reap
|
27
33
|
time = Time.now
|
28
34
|
@timeouts.reject! do |token, data|
|
29
|
-
|
30
|
-
data[:callback].call
|
31
|
-
true
|
32
|
-
else
|
33
|
-
false
|
34
|
-
end
|
35
|
+
time > data[:timestamp] and data[:callback].call
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'redis'
|
2
|
+
|
3
|
+
module Nanite
|
4
|
+
|
5
|
+
# Implementation of a tag store on top of Redis
|
6
|
+
# For a nanite with the identity 'nanite-foobar', we store the following:
|
7
|
+
#
|
8
|
+
# s-nanite-foobar: { /foo/bar, /foo/nik } # a SET of the provided services
|
9
|
+
# tg-nanite-foobar: { foo-42, customer-12 } # a SET of the tags for this agent
|
10
|
+
#
|
11
|
+
# Also we do an inverted index for quick lookup of agents providing a certain
|
12
|
+
# service, so for each service the agent provides, we add the nanite to a SET
|
13
|
+
# of all the nanites that provide said service:
|
14
|
+
#
|
15
|
+
# foo/bar: { nanite-foobar, nanite-nickelbag, nanite-another } # redis SET
|
16
|
+
#
|
17
|
+
# We do that same thing for tags:
|
18
|
+
#
|
19
|
+
# some-tag: { nanite-foobar, nanite-nickelbag, nanite-another } # redis SET
|
20
|
+
#
|
21
|
+
# This way we can do a lookup of what nanites provide a set of services and tags based
|
22
|
+
# on redis SET intersection:
|
23
|
+
#
|
24
|
+
# nanites_for('/gems/list', 'some-tag')
|
25
|
+
# => returns an array of nanites that provide the intersection of these two service tags
|
26
|
+
|
27
|
+
class RedisTagStore
|
28
|
+
|
29
|
+
# Initialize tag store with given redis handle
|
30
|
+
def initialize(redis)
|
31
|
+
@redis = redis
|
32
|
+
end
|
33
|
+
|
34
|
+
# Store services and tags for given agent
|
35
|
+
def store(nanite, services, tags)
|
36
|
+
services = nil if services.compact.empty?
|
37
|
+
tags = nil if tags.compact.empty?
|
38
|
+
log_redis_error do
|
39
|
+
if services
|
40
|
+
obsolete_services = @redis.set_members("s-#{nanite}") - services
|
41
|
+
update_elems(nanite, services, obsolete_services, "s-#{nanite}", 'naniteservices')
|
42
|
+
end
|
43
|
+
if tags
|
44
|
+
obsolete_tags = @redis.set_members("tg-#{nanite}") - tags
|
45
|
+
update_elems(nanite, tags, obsolete_tags, "tg-#{nanite}", 'nanitestags')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Update tags for given agent
|
51
|
+
def update(nanite, new_tags, obsolete_tags)
|
52
|
+
update_elems(nanite, new_tags, obsolete_tags, "tg-#{nanite}", 'nanitestags')
|
53
|
+
end
|
54
|
+
|
55
|
+
# Delete services and tags for given agent
|
56
|
+
def delete(nanite)
|
57
|
+
delete_elems(nanite, "s-#{nanite}", 'naniteservices')
|
58
|
+
delete_elems(nanite, "tg-#{nanite}", 'nanitestags')
|
59
|
+
end
|
60
|
+
|
61
|
+
# Services implemented by given agent
|
62
|
+
def services(nanite)
|
63
|
+
@redis.set_members("s-#{nanite}")
|
64
|
+
end
|
65
|
+
|
66
|
+
# Tags exposed by given agent
|
67
|
+
def tags(nanite)
|
68
|
+
@redis.set_members("tg-#{nanite}")
|
69
|
+
end
|
70
|
+
|
71
|
+
# Retrieve all agents services
|
72
|
+
def all_services
|
73
|
+
log_redis_error do
|
74
|
+
@redis.set_members('naniteservices')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Retrieve all agents tags
|
79
|
+
def all_tags
|
80
|
+
log_redis_error do
|
81
|
+
@redis.set_members('nanitetags')
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Retrieve nanites implementing given service and exposing given tags
|
86
|
+
def nanites_for(from, service, tags)
|
87
|
+
keys = tags && tags.dup || []
|
88
|
+
keys << service
|
89
|
+
log_redis_error do
|
90
|
+
@redis.set_intersect(keys.compact)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
# Update values stored for given agent
|
97
|
+
# Also store reverse lookup information using both a unique and
|
98
|
+
# a global key (so it's possible to retrieve that agent value or
|
99
|
+
# all related values)
|
100
|
+
def update_elems(nanite, new_tags, obsolete_tags, elem_key, global_key)
|
101
|
+
new_tags = nil if new_tags.compact.empty?
|
102
|
+
obsolete_tags = nil if obsolete_tags.compact.empty?
|
103
|
+
log_redis_error do
|
104
|
+
obsolete_tags.each do |val|
|
105
|
+
@redis.set_delete(val, nanite)
|
106
|
+
@redis.set_delete(elem_key, val)
|
107
|
+
@redis.set_delete(global_key, val)
|
108
|
+
end if obsolete_tags
|
109
|
+
new_tags.each do |val|
|
110
|
+
@redis.set_add(val, nanite)
|
111
|
+
@redis.set_add(elem_key, val)
|
112
|
+
@redis.set_add(global_key, val)
|
113
|
+
end if new_tags
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Delete all values for given nanite agent
|
118
|
+
# Also delete reverse lookup information
|
119
|
+
def delete_elems(nanite, elem_key, global_key)
|
120
|
+
log_redis_error do
|
121
|
+
(@redis.set_members(elem_key)||[]).each do |val|
|
122
|
+
@redis.set_delete(val, nanite)
|
123
|
+
if @redis.set_count(val) == 0
|
124
|
+
@redis.delete(val)
|
125
|
+
@redis.set_delete(global_key, val)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
@redis.delete(elem_key)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Helper method, catch and log errors
|
133
|
+
def log_redis_error(&blk)
|
134
|
+
blk.call
|
135
|
+
rescue Exception => e
|
136
|
+
Nanite::Log.warn("redis error in method: #{caller[0]}")
|
137
|
+
raise e
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
data/lib/nanite/state.rb
CHANGED
@@ -1,164 +1,135 @@
|
|
1
1
|
require 'redis'
|
2
|
+
require 'redis_tag_store'
|
2
3
|
|
3
4
|
module Nanite
|
4
5
|
class State
|
5
6
|
include Enumerable
|
6
7
|
|
7
|
-
#
|
8
|
-
# data store
|
9
|
-
#
|
8
|
+
# This class encapsulates the state of a nanite system using redis as the
|
9
|
+
# data store and a provided tag store. For a nanite with the identity
|
10
|
+
# 'nanite-foobar' we store the following:
|
10
11
|
#
|
11
|
-
# nanite-foobar: 0.72
|
12
|
-
# s-nanite-foobar: { /foo/bar, /foo/nik } # a SET of the provided services
|
13
|
-
# tg-nanite-foobar: { foo-42, customer-12 } # a SET of the tags for this agent
|
12
|
+
# nanite-foobar: 0.72 # load average or 'status'
|
14
13
|
# t-nanite-foobar: 123456789 # unix timestamp of the last state update
|
15
14
|
#
|
16
|
-
#
|
17
|
-
# service, so for each service the agent provides, we add the nanite to a SET
|
18
|
-
# of all the nanites that provide said service:
|
15
|
+
# The tag store is used to store the associated services and tags.
|
19
16
|
#
|
20
|
-
#
|
17
|
+
# A tag store should provide the following methods:
|
18
|
+
# - initialize(redis): Initialize tag store, may use provided redis handle
|
19
|
+
# - services(nanite): Retrieve services implemented by given agent
|
20
|
+
# - tags(nanite): Retrieve tags implemented by given agent
|
21
|
+
# - all_services: Retrieve all services implemented by all agents
|
22
|
+
# - all_tags: Retrieve all tags exposed by all agents
|
23
|
+
# - store(nanite, services, tags): Store agent's services and tags
|
24
|
+
# - update(name, new_tags,obsolete_tags): Update agent's tags
|
25
|
+
# - delete(nanite): Delete all entries associated with given agent
|
26
|
+
# - nanites_for(service, tags): Retrieve agents implementing given service
|
27
|
+
# and exposing given tags
|
21
28
|
#
|
22
|
-
#
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
# on redis SET intersection:
|
27
|
-
#
|
28
|
-
# nanites_for('/gems/list', 'some-tag')
|
29
|
-
# => returns a nested array of nanites and their state that provide the intersection
|
30
|
-
# of these two service tags
|
31
|
-
|
32
|
-
def initialize(redis)
|
33
|
-
Nanite::Log.info("[setup] initializing redis state: #{redis}")
|
34
|
-
host, port = redis.split(':')
|
29
|
+
# The default implementation for the tag store reuses Redis.
|
30
|
+
|
31
|
+
def initialize(redis, tag_store=nil)
|
32
|
+
host, port, tag_store_type = redis.split(':')
|
35
33
|
host ||= '127.0.0.1'
|
36
34
|
port ||= '6379'
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
blk.call
|
42
|
-
rescue Exception => e
|
43
|
-
Nanite::Log.info("redis error in method: #{meth}")
|
44
|
-
raise e
|
35
|
+
tag_store||= 'Nanite::RedisTagStore'
|
36
|
+
@redis = Redis.new(:host => host, :port => port)
|
37
|
+
@tag_store = tag_store.to_const.new(@redis)
|
38
|
+
Nanite::Log.info("[setup] Initializing redis state using host '#{host}', port '#{port}' and tag store #{tag_store}")
|
45
39
|
end
|
46
|
-
|
40
|
+
|
41
|
+
# Retrieve given agent services, tags, status and timestamp
|
47
42
|
def [](nanite)
|
48
|
-
log_redis_error
|
49
|
-
status
|
43
|
+
log_redis_error do
|
44
|
+
status = @redis[nanite]
|
50
45
|
timestamp = @redis["t-#{nanite}"]
|
51
|
-
services
|
52
|
-
tags
|
46
|
+
services = @tag_store.services(nanite)
|
47
|
+
tags = @tag_store.tags(nanite)
|
53
48
|
return nil unless status && timestamp && services
|
54
49
|
{:services => services, :status => status, :timestamp => timestamp.to_i, :tags => tags}
|
55
50
|
end
|
56
51
|
end
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
52
|
+
|
53
|
+
# Set given attributes for given agent
|
54
|
+
# Attributes may include services, tags and status
|
55
|
+
def []=(nanite, attributes)
|
56
|
+
@tag_store.store(nanite, attributes[:services], attributes[:tags])
|
57
|
+
update_status(nanite, attributes[:status])
|
62
58
|
end
|
63
|
-
|
59
|
+
|
60
|
+
# Delete all information related to given agent
|
64
61
|
def delete(nanite)
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
@redis.delete(srv)
|
70
|
-
@redis.set_delete("naniteservices", srv)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
(@redis.set_members("tg-#{nanite}")||[]).each do |tag|
|
74
|
-
@redis.set_delete(tag, nanite)
|
75
|
-
if @redis.set_count(tag) == 0
|
76
|
-
@redis.delete(tag)
|
77
|
-
@redis.set_delete("nanitetags", tag)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
@redis.delete nanite
|
81
|
-
@redis.delete "s-#{nanite}"
|
82
|
-
@redis.delete "t-#{nanite}"
|
83
|
-
@redis.delete "tg-#{nanite}"
|
62
|
+
@tag_store.delete(nanite)
|
63
|
+
log_redis_error do
|
64
|
+
@redis.delete(nanite)
|
65
|
+
@redis.delete("t-#{nanite}")
|
84
66
|
end
|
85
67
|
end
|
86
|
-
|
68
|
+
|
69
|
+
# Return all services exposed by all agents
|
87
70
|
def all_services
|
88
|
-
|
89
|
-
@redis.set_members("naniteservices")
|
90
|
-
end
|
71
|
+
@tag_store.all_services
|
91
72
|
end
|
92
73
|
|
74
|
+
# Return all tags exposed by all agents
|
93
75
|
def all_tags
|
94
|
-
|
95
|
-
@redis.set_members("nanitetags")
|
96
|
-
end
|
76
|
+
@tag_store.all_tags
|
97
77
|
end
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
@redis.set_delete("naniteservices", s)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
old_tags = @redis.set_members("tg-#{name}")
|
108
|
-
if old_tags
|
109
|
-
(old_tags - tags).each do |t|
|
110
|
-
@redis.set_delete(t, name)
|
111
|
-
@redis.set_delete("nanitetags", t)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
@redis.delete("s-#{name}")
|
115
|
-
services.each do |srv|
|
116
|
-
@redis.set_add(srv, name)
|
117
|
-
@redis.set_add("s-#{name}", srv)
|
118
|
-
@redis.set_add("naniteservices", srv)
|
119
|
-
end
|
120
|
-
@redis.delete("tg-#{name}")
|
121
|
-
tags.each do |tag|
|
122
|
-
next if tag.nil?
|
123
|
-
@redis.set_add(tag, name)
|
124
|
-
@redis.set_add("tg-#{name}", tag)
|
125
|
-
@redis.set_add("nanitetags", tag)
|
78
|
+
|
79
|
+
# Update status and timestamp for given agent
|
80
|
+
def update_status(name, status)
|
81
|
+
log_redis_error do
|
82
|
+
@redis[name] = status
|
83
|
+
@redis["t-#{name}"] = Time.now.utc.to_i
|
126
84
|
end
|
127
|
-
@redis[name] = status
|
128
|
-
@redis["t-#{name}"] = Time.now.to_i
|
129
85
|
end
|
130
|
-
|
86
|
+
|
87
|
+
# Update tags for given agent
|
88
|
+
def update_tags(name, new_tags, obsolete_tags)
|
89
|
+
@tag_store.update(name, new_tags, obsolete_tags)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Return all registered agents
|
131
93
|
def list_nanites
|
132
|
-
log_redis_error
|
94
|
+
log_redis_error do
|
133
95
|
@redis.keys("nanite-*")
|
134
96
|
end
|
135
97
|
end
|
136
|
-
|
98
|
+
|
99
|
+
# Number of registered agents
|
137
100
|
def size
|
138
101
|
list_nanites.size
|
139
102
|
end
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
@redis.keys("*").each {|k| @redis.delete k}
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
103
|
+
|
104
|
+
# Iterate through all agents, yielding services, tags
|
105
|
+
# status and timestamp keyed by agent name
|
147
106
|
def each
|
148
107
|
list_nanites.each do |nan|
|
149
108
|
yield nan, self[nan]
|
150
109
|
end
|
151
110
|
end
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
111
|
+
|
112
|
+
# Return agents that implement given service and expose
|
113
|
+
# all given tags
|
114
|
+
def nanites_for(from, service, tags)
|
115
|
+
res = []
|
116
|
+
@tag_store.nanites_for(from, service, tags).each do |nanite_id|
|
117
|
+
if nanite = self[nanite_id]
|
118
|
+
res << [nanite_id, nanite]
|
159
119
|
end
|
160
|
-
res
|
161
120
|
end
|
121
|
+
res
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
# Helper method, catch and log errors
|
127
|
+
def log_redis_error(&blk)
|
128
|
+
blk.call
|
129
|
+
rescue Exception => e
|
130
|
+
Nanite::Log.warn("redis error in method: #{caller[0]}")
|
131
|
+
raise e
|
162
132
|
end
|
133
|
+
|
163
134
|
end
|
164
135
|
end
|
data/lib/nanite/util.rb
CHANGED
@@ -27,6 +27,26 @@ class String
|
|
27
27
|
def to_const_path
|
28
28
|
snake_case.gsub(/::/, "/")
|
29
29
|
end
|
30
|
+
|
31
|
+
# Convert constant name to constant
|
32
|
+
#
|
33
|
+
# "FooBar::Baz".to_const => FooBar::Baz
|
34
|
+
#
|
35
|
+
# @return [Constant] Constant corresponding to given name or nil if no
|
36
|
+
# constant with that name exists
|
37
|
+
#
|
38
|
+
# @api public
|
39
|
+
def to_const
|
40
|
+
names = split('::')
|
41
|
+
names.shift if names.empty? || names.first.empty?
|
42
|
+
|
43
|
+
constant = Object
|
44
|
+
names.each do |name|
|
45
|
+
# modified to return nil instead of raising an const_missing error
|
46
|
+
constant = constant && constant.const_defined?(name) ? constant.const_get(name) : nil
|
47
|
+
end
|
48
|
+
constant
|
49
|
+
end
|
30
50
|
end
|
31
51
|
|
32
52
|
class Object
|
@@ -55,4 +75,4 @@ class Object
|
|
55
75
|
end
|
56
76
|
end
|
57
77
|
end
|
58
|
-
end
|
78
|
+
end
|
data/lib/nanite.rb
CHANGED
@@ -20,7 +20,7 @@ require 'nanite/mapper'
|
|
20
20
|
require 'nanite/actor'
|
21
21
|
require 'nanite/actor_registry'
|
22
22
|
require 'nanite/streaming'
|
23
|
-
require 'nanite/
|
23
|
+
require 'nanite/nanite_dispatcher'
|
24
24
|
require 'nanite/agent'
|
25
25
|
require 'nanite/cluster'
|
26
26
|
require 'nanite/reaper'
|
@@ -39,7 +39,7 @@ require 'nanite/security/static_certificate_store'
|
|
39
39
|
require 'nanite/serializer'
|
40
40
|
|
41
41
|
module Nanite
|
42
|
-
VERSION = '0.4.1.
|
42
|
+
VERSION = '0.4.1.10' unless defined?(Nanite::VERSION)
|
43
43
|
|
44
44
|
class MapperNotRunning < StandardError; end
|
45
45
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rightscale-nanite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.1.
|
4
|
+
version: 0.4.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ezra Zygmuntowicz
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-09 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -39,74 +39,50 @@ files:
|
|
39
39
|
- README.rdoc
|
40
40
|
- Rakefile
|
41
41
|
- TODO
|
42
|
-
- lib/nanite.rb
|
43
42
|
- lib/nanite
|
44
|
-
- lib/nanite/
|
45
|
-
- lib/nanite/
|
46
|
-
- lib/nanite/
|
47
|
-
- lib/nanite/
|
43
|
+
- lib/nanite/actor.rb
|
44
|
+
- lib/nanite/actor_registry.rb
|
45
|
+
- lib/nanite/admin.rb
|
46
|
+
- lib/nanite/agent.rb
|
47
|
+
- lib/nanite/amqp.rb
|
48
|
+
- lib/nanite/cluster.rb
|
49
|
+
- lib/nanite/config.rb
|
50
|
+
- lib/nanite/console.rb
|
48
51
|
- lib/nanite/daemonize.rb
|
52
|
+
- lib/nanite/identity.rb
|
53
|
+
- lib/nanite/job.rb
|
54
|
+
- lib/nanite/local_state.rb
|
55
|
+
- lib/nanite/log
|
56
|
+
- lib/nanite/log/formatter.rb
|
57
|
+
- lib/nanite/log.rb
|
58
|
+
- lib/nanite/mapper.rb
|
49
59
|
- lib/nanite/mapper_proxy.rb
|
60
|
+
- lib/nanite/nanite_dispatcher.rb
|
61
|
+
- lib/nanite/packets.rb
|
62
|
+
- lib/nanite/pid_file.rb
|
63
|
+
- lib/nanite/reaper.rb
|
64
|
+
- lib/nanite/redis_tag_store.rb
|
50
65
|
- lib/nanite/security
|
51
|
-
- lib/nanite/security/
|
52
|
-
- lib/nanite/security/secure_serializer.rb
|
53
|
-
- lib/nanite/security/certificate_cache.rb
|
54
|
-
- lib/nanite/security/signature.rb
|
66
|
+
- lib/nanite/security/cached_certificate_store_proxy.rb
|
55
67
|
- lib/nanite/security/certificate.rb
|
68
|
+
- lib/nanite/security/certificate_cache.rb
|
69
|
+
- lib/nanite/security/distinguished_name.rb
|
56
70
|
- lib/nanite/security/encrypted_document.rb
|
57
71
|
- lib/nanite/security/rsa_key_pair.rb
|
72
|
+
- lib/nanite/security/secure_serializer.rb
|
73
|
+
- lib/nanite/security/signature.rb
|
58
74
|
- lib/nanite/security/static_certificate_store.rb
|
59
|
-
- lib/nanite/security/cached_certificate_store_proxy.rb
|
60
|
-
- lib/nanite/config.rb
|
61
|
-
- lib/nanite/util.rb
|
62
|
-
- lib/nanite/log
|
63
|
-
- lib/nanite/log/formatter.rb
|
64
|
-
- lib/nanite/state.rb
|
65
|
-
- lib/nanite/cluster.rb
|
66
|
-
- lib/nanite/dispatcher.rb
|
67
75
|
- lib/nanite/security_provider.rb
|
68
|
-
- lib/nanite/
|
69
|
-
- lib/nanite/
|
70
|
-
- lib/nanite/
|
71
|
-
- lib/nanite/
|
72
|
-
- lib/nanite
|
73
|
-
- lib/nanite/agent.rb
|
74
|
-
- lib/nanite/local_state.rb
|
75
|
-
- lib/nanite/identity.rb
|
76
|
-
- lib/nanite/actor_registry.rb
|
77
|
-
- lib/nanite/log.rb
|
78
|
-
- lib/nanite/reaper.rb
|
79
|
-
- lib/nanite/job.rb
|
80
|
-
- bin/nanite-agent
|
76
|
+
- lib/nanite/serializer.rb
|
77
|
+
- lib/nanite/state.rb
|
78
|
+
- lib/nanite/streaming.rb
|
79
|
+
- lib/nanite/util.rb
|
80
|
+
- lib/nanite.rb
|
81
81
|
- bin/nanite-admin
|
82
|
+
- bin/nanite-agent
|
82
83
|
- bin/nanite-mapper
|
83
|
-
- spec/util_spec.rb
|
84
|
-
- spec/encrypted_document_spec.rb
|
85
|
-
- spec/agent_spec.rb
|
86
|
-
- spec/certificate_cache_spec.rb
|
87
|
-
- spec/cached_certificate_store_proxy_spec.rb
|
88
|
-
- spec/dispatcher_spec.rb
|
89
|
-
- spec/log_spec.rb
|
90
|
-
- spec/rsa_key_pair_spec.rb
|
91
|
-
- spec/cluster_spec.rb
|
92
|
-
- spec/spec_helper.rb
|
93
|
-
- spec/mapper_spec.rb
|
94
|
-
- spec/actor_registry_spec.rb
|
95
|
-
- spec/actor_spec.rb
|
96
|
-
- spec/packet_spec.rb
|
97
|
-
- spec/local_state_spec.rb
|
98
|
-
- spec/static_certificate_store_spec.rb
|
99
|
-
- spec/job_spec.rb
|
100
|
-
- spec/signature_spec.rb
|
101
|
-
- spec/mapper_proxy_spec.rb
|
102
|
-
- spec/secure_serializer_spec.rb
|
103
|
-
- spec/serializer_spec.rb
|
104
|
-
- spec/certificate_spec.rb
|
105
|
-
- spec/nanite_spec.rb
|
106
|
-
- spec/distinguished_name_spec.rb
|
107
84
|
has_rdoc: true
|
108
85
|
homepage: http://github.com/ezmobius/nanite
|
109
|
-
licenses:
|
110
86
|
post_install_message:
|
111
87
|
rdoc_options: []
|
112
88
|
|
@@ -127,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
103
|
requirements: []
|
128
104
|
|
129
105
|
rubyforge_project:
|
130
|
-
rubygems_version: 1.3.
|
106
|
+
rubygems_version: 1.3.1
|
131
107
|
signing_key:
|
132
108
|
specification_version: 2
|
133
109
|
summary: self assembling fabric of ruby daemons
|
data/spec/actor_registry_spec.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
|
3
|
-
describe Nanite::ActorRegistry do
|
4
|
-
|
5
|
-
class ::WebDocumentImporter
|
6
|
-
include Nanite::Actor
|
7
|
-
expose :import, :cancel
|
8
|
-
|
9
|
-
def import
|
10
|
-
1
|
11
|
-
end
|
12
|
-
def cancel
|
13
|
-
0
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
module ::Actors
|
18
|
-
class ComedyActor
|
19
|
-
include Nanite::Actor
|
20
|
-
expose :fun_tricks
|
21
|
-
def fun_tricks
|
22
|
-
:rabbit_in_the_hat
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
before(:each) do
|
28
|
-
Nanite::Log.stub!(:info)
|
29
|
-
@registry = Nanite::ActorRegistry.new
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should know about all services" do
|
33
|
-
@registry.register(WebDocumentImporter.new, nil)
|
34
|
-
@registry.register(Actors::ComedyActor.new, nil)
|
35
|
-
@registry.services.sort.should == ["/actors/comedy_actor/fun_tricks", "/web_document_importer/cancel", "/web_document_importer/import"]
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should not register anything except Nanite::Actor" do
|
39
|
-
lambda { @registry.register(String.new, nil) }.should raise_error(ArgumentError)
|
40
|
-
end
|
41
|
-
|
42
|
-
it "should register an actor" do
|
43
|
-
importer = WebDocumentImporter.new
|
44
|
-
@registry.register(importer, nil)
|
45
|
-
@registry.actors['web_document_importer'].should == importer
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should log info message that actor was registered" do
|
49
|
-
importer = WebDocumentImporter.new
|
50
|
-
Nanite::Log.should_receive(:info).with("[actor] #{importer.class.to_s}")
|
51
|
-
@registry.register(importer, nil)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should handle actors registered with a custom prefix" do
|
55
|
-
importer = WebDocumentImporter.new
|
56
|
-
@registry.register(importer, 'monkey')
|
57
|
-
@registry.actor_for('monkey').should == importer
|
58
|
-
end
|
59
|
-
|
60
|
-
end # Nanite::ActorRegistry
|