rightscale-nanite-dev 0.4.1.17 → 0.4.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +5 -5
- data/lib/nanite.rb +1 -1
- data/lib/nanite/actor.rb +8 -2
- data/lib/nanite/agent.rb +8 -5
- data/lib/nanite/cluster.rb +32 -14
- data/lib/nanite/mapper.rb +1 -1
- data/lib/nanite/mapper_proxy.rb +12 -0
- data/lib/nanite/packets.rb +19 -8
- data/lib/nanite/security/secure_serializer.rb +13 -18
- data/lib/nanite/serializer.rb +1 -1
- metadata +7 -7
data/Rakefile
CHANGED
@@ -11,10 +11,10 @@ require 'rake/clean'
|
|
11
11
|
require 'lib/nanite'
|
12
12
|
|
13
13
|
GEM = "rightscale-nanite-dev"
|
14
|
-
AUTHOR = "
|
15
|
-
EMAIL = "
|
16
|
-
HOMEPAGE = "http://github.com/
|
17
|
-
SUMMARY = "
|
14
|
+
AUTHOR = "RightScale, Inc."
|
15
|
+
EMAIL = "support@rightscale.com"
|
16
|
+
HOMEPAGE = "http://github.com/rightscale/nanite"
|
17
|
+
SUMMARY = "Self-assembling fabric of ruby daemons; fork of ezmobius/nanite."
|
18
18
|
|
19
19
|
Dir.glob('tasks/*.rake').each { |r| Rake.application.add_import r }
|
20
20
|
|
@@ -73,4 +73,4 @@ task :docs => :rdoc do
|
|
73
73
|
else
|
74
74
|
sh 'firefox rdoc/index.html'
|
75
75
|
end
|
76
|
-
end
|
76
|
+
end
|
data/lib/nanite.rb
CHANGED
@@ -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.22' unless defined?(Nanite::VERSION)
|
43
43
|
|
44
44
|
class MapperNotRunning < StandardError; end
|
45
45
|
|
data/lib/nanite/actor.rb
CHANGED
@@ -57,15 +57,21 @@ module Nanite
|
|
57
57
|
end # ClassMethods
|
58
58
|
|
59
59
|
module InstanceMethods
|
60
|
-
#
|
60
|
+
# Send nanite request to another agent (through the mapper)
|
61
61
|
def request(*args, &blk)
|
62
62
|
MapperProxy.instance.request(*args, &blk)
|
63
63
|
end
|
64
64
|
|
65
|
+
# Send nanite push to another agent (through the mapper)
|
65
66
|
def push(*args)
|
66
67
|
MapperProxy.instance.push(*args)
|
67
68
|
end
|
69
|
+
|
70
|
+
# Send nanite tag query to mapper
|
71
|
+
def query_tags(*args, &blk)
|
72
|
+
MapperProxy.instance.query_tags(*args, &blk)
|
73
|
+
end
|
68
74
|
end # InstanceMethods
|
69
75
|
|
70
76
|
end # Actor
|
71
|
-
end # Nanite
|
77
|
+
end # Nanite
|
data/lib/nanite/agent.rb
CHANGED
@@ -99,7 +99,7 @@ module Nanite
|
|
99
99
|
Log.init(@identity, @options[:log_path])
|
100
100
|
Log.level = @options[:log_level] if @options[:log_level]
|
101
101
|
@serializer = Serializer.new(@options[:format])
|
102
|
-
@status_proc
|
102
|
+
@status_proc ||= lambda { parse_uptime(`uptime 2> /dev/null`) rescue 'no status' }
|
103
103
|
pid_file = PidFile.new(@identity, @options)
|
104
104
|
pid_file.check
|
105
105
|
if @options[:daemonize]
|
@@ -163,15 +163,18 @@ module Nanite
|
|
163
163
|
if @options[:daemonize]
|
164
164
|
@options[:log_path] = (@options[:log_dir] || @options[:root] || Dir.pwd)
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
|
+
@callbacks = opts[:callbacks]
|
168
|
+
@status_proc = opts[:status_proc]
|
169
|
+
|
170
|
+
# note the return statement in case of identity being known; ensure all
|
171
|
+
# needed configurations occur before the the following line.
|
167
172
|
return @identity = "nanite-#{@options[:identity]}" if @options[:identity]
|
168
173
|
token = Identity.generate
|
169
174
|
@identity = "nanite-#{token}"
|
170
175
|
File.open(File.expand_path(File.join(@options[:root], 'config.yml')), 'w') do |fd|
|
171
176
|
fd.write(YAML.dump(custom_config.merge(:identity => token)))
|
172
177
|
end
|
173
|
-
|
174
|
-
@callbacks = options[:callbacks]
|
175
178
|
end
|
176
179
|
|
177
180
|
def load_actors
|
@@ -230,7 +233,7 @@ module Nanite
|
|
230
233
|
receive(serializer.load(msg))
|
231
234
|
rescue Exception => e
|
232
235
|
Nanite::Log.error("RECV #{e.message}")
|
233
|
-
callbacks[:exception].call(e, msg, self) rescue nil if callbacks[:exception]
|
236
|
+
callbacks[:exception].call(e, msg, self) rescue nil if callbacks && callbacks[:exception]
|
234
237
|
end
|
235
238
|
end
|
236
239
|
end
|
data/lib/nanite/cluster.rb
CHANGED
@@ -33,7 +33,7 @@ module Nanite
|
|
33
33
|
Nanite::Log.info("RECV #{reg.to_s}")
|
34
34
|
nanites[reg.identity] = { :services => reg.services, :status => reg.status, :tags => reg.tags, :timestamp => Time.now.utc.to_i }
|
35
35
|
reaper.register(reg.identity, agent_timeout + 1) { nanite_timed_out(reg.identity) }
|
36
|
-
callbacks[:register].call(reg.identity, mapper) if callbacks[:register]
|
36
|
+
callbacks[:register].call(reg.identity, mapper) if callbacks && callbacks[:register]
|
37
37
|
else
|
38
38
|
Nanite::Log.warn("RECV NOT AUTHORIZED #{reg.to_s}")
|
39
39
|
end
|
@@ -41,7 +41,7 @@ module Nanite
|
|
41
41
|
Nanite::Log.info("RECV #{reg.to_s}")
|
42
42
|
reaper.unregister(reg.identity)
|
43
43
|
nanites.delete(reg.identity)
|
44
|
-
callbacks[:unregister].call(reg.identity, mapper) if callbacks[:unregister]
|
44
|
+
callbacks[:unregister].call(reg.identity, mapper) if callbacks && callbacks[:unregister]
|
45
45
|
when TagUpdate
|
46
46
|
Nanite::Log.info("RECV #{reg.to_s}")
|
47
47
|
nanites.update_tags(reg.identity, reg.new_tags, reg.obsolete_tags)
|
@@ -55,7 +55,7 @@ module Nanite
|
|
55
55
|
if nanite && timed_out?(nanite)
|
56
56
|
Nanite::Log.info("Nanite #{token} timed out")
|
57
57
|
nanite = nanites.delete(token)
|
58
|
-
callbacks[:timeout].call(token, mapper) if callbacks[:timeout]
|
58
|
+
callbacks[:timeout].call(token, mapper) if callbacks && callbacks[:timeout]
|
59
59
|
true
|
60
60
|
end
|
61
61
|
end
|
@@ -104,7 +104,9 @@ module Nanite
|
|
104
104
|
Nanite::Log.debug("RECV #{request.to_s}")
|
105
105
|
case request
|
106
106
|
when Push
|
107
|
-
mapper.send_push(request)
|
107
|
+
if mapper.send_push(request) == false
|
108
|
+
Nanite::Log.info("RECV - No target found for #{request.to_s}")
|
109
|
+
end
|
108
110
|
when Request
|
109
111
|
intm_handler = lambda do |result, job|
|
110
112
|
result = IntermediateMessage.new(request.token, job.request.from, mapper.identity, nil, result)
|
@@ -118,10 +120,21 @@ module Nanite
|
|
118
120
|
end
|
119
121
|
|
120
122
|
if ok == false
|
123
|
+
Nanite::Log.info("RECV - No target found for #{request.to_s}")
|
121
124
|
forward_response(result, request.persistent)
|
122
125
|
end
|
123
126
|
when TagQuery
|
124
|
-
results =
|
127
|
+
results = {}
|
128
|
+
results = nanites.nanites_for(request) if request.tags && !request.tags.empty?
|
129
|
+
if request.agent_ids && !request.agent_ids.empty?
|
130
|
+
request.agent_ids.each do |nanite_id|
|
131
|
+
if !results.include?(nanite_id)
|
132
|
+
if nanite = nanites[nanite_id]
|
133
|
+
results[nanite_id] = nanite
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
125
138
|
result = Result.new(request.token, request.from, results, mapper.identity)
|
126
139
|
forward_response(result, request.persistent)
|
127
140
|
end
|
@@ -174,12 +187,17 @@ module Nanite
|
|
174
187
|
|
175
188
|
# returns all nanites that provide the given service
|
176
189
|
def nanites_providing(request, include_timed_out)
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
190
|
+
# FIXME: Not filtering out results for now to alleviate issue with
|
191
|
+
# overloaded agents not pinging in a timely fashion
|
192
|
+
# Put that code back once agents behave properly
|
193
|
+
nanites.nanites_for(request)
|
194
|
+
|
195
|
+
# nanites.nanites_for(request).delete_if do |nanite, info|
|
196
|
+
# if res = !include_timed_out && timed_out?(info)
|
197
|
+
# Nanite::Log.debug("Ignoring timed out nanite #{nanite} in target selection - last seen at #{info[:timestamp]}")
|
198
|
+
# end
|
199
|
+
# res
|
200
|
+
# end
|
183
201
|
end
|
184
202
|
|
185
203
|
def setup_queues
|
@@ -196,7 +214,7 @@ module Nanite
|
|
196
214
|
handle_ping(ping)
|
197
215
|
rescue Exception => e
|
198
216
|
Nanite::Log.error("RECV [ping] #{e.message}")
|
199
|
-
callbacks[:exception].call(e, ping, mapper) rescue nil if callbacks[:exception]
|
217
|
+
callbacks[:exception].call(e, ping, mapper) rescue nil if callbacks && callbacks[:exception]
|
200
218
|
end
|
201
219
|
end
|
202
220
|
hb_fanout = amq.fanout('heartbeat', :durable => true)
|
@@ -213,7 +231,7 @@ module Nanite
|
|
213
231
|
register(serializer.load(msg))
|
214
232
|
rescue Exception => e
|
215
233
|
Nanite::Log.error("RECV [register] #{e.message}")
|
216
|
-
callbacks[:exception].call(e, msg, mapper) rescue nil if callbacks[:exception]
|
234
|
+
callbacks[:exception].call(e, msg, mapper) rescue nil if callbacks && callbacks[:exception]
|
217
235
|
end
|
218
236
|
end
|
219
237
|
reg_fanout = amq.fanout('registration', :durable => true)
|
@@ -230,7 +248,7 @@ module Nanite
|
|
230
248
|
handle_request(serializer.load(msg))
|
231
249
|
rescue Exception => e
|
232
250
|
Nanite::Log.error("RECV [request] #{e.message}")
|
233
|
-
callbacks[:exception].call(e, msg, mapper) rescue nil if callbacks[:exception]
|
251
|
+
callbacks[:exception].call(e, msg, mapper) rescue nil if callbacks && callbacks[:exception]
|
234
252
|
end
|
235
253
|
end
|
236
254
|
req_fanout = amq.fanout('request', :durable => true)
|
data/lib/nanite/mapper.rb
CHANGED
@@ -299,7 +299,7 @@ module Nanite
|
|
299
299
|
job_warden.process(msg)
|
300
300
|
rescue Exception => e
|
301
301
|
Nanite::Log.error("RECV [result] #{e.message}")
|
302
|
-
callbacks[:exception].call(e, msg, mapper) rescue nil if callbacks[:exception]
|
302
|
+
callbacks[:exception].call(e, msg, mapper) rescue nil if callbacks && callbacks[:exception]
|
303
303
|
end
|
304
304
|
end
|
305
305
|
end
|
data/lib/nanite/mapper_proxy.rb
CHANGED
@@ -41,6 +41,7 @@ module Nanite
|
|
41
41
|
amqp.fanout('request', :no_declare => options[:secure]).publish(serializer.dump(request))
|
42
42
|
end
|
43
43
|
|
44
|
+
# Send push to given agent through the mapper
|
44
45
|
def push(type, payload = '', opts = {})
|
45
46
|
raise "Mapper proxy not initialized" unless identity && options
|
46
47
|
push = Push.new(type, payload, opts)
|
@@ -51,6 +52,17 @@ module Nanite
|
|
51
52
|
amqp.fanout('request', :no_declare => options[:secure]).publish(serializer.dump(push))
|
52
53
|
end
|
53
54
|
|
55
|
+
# Send tag query to mapper
|
56
|
+
def query_tags(opts, &blk)
|
57
|
+
raise "Mapper proxy not initialized" unless identity && options
|
58
|
+
tag_query = TagQuery.new(identity, opts)
|
59
|
+
tag_query.token = Identity.generate
|
60
|
+
tag_query.persistent = opts.key?(:persistent) ? opts[:persistent] : options[:persistent]
|
61
|
+
pending_requests[tag_query.token] = { :result_handler => blk }
|
62
|
+
Nanite::Log.info("SEND #{tag_query.to_s}")
|
63
|
+
amqp.fanout('request', :no_declare => options[:secure]).publish(serializer.dump(tag_query))
|
64
|
+
end
|
65
|
+
|
54
66
|
# Update tags registered by mapper for agent
|
55
67
|
def update_tags(new_tags, obsolete_tags)
|
56
68
|
raise "Mapper proxy not initialized" unless identity && options
|
data/lib/nanite/packets.rb
CHANGED
@@ -219,24 +219,35 @@ module Nanite
|
|
219
219
|
#
|
220
220
|
# Options:
|
221
221
|
# from is sender identity
|
222
|
-
#
|
222
|
+
# opts Hash of options, two options are supported, at least one must be set:
|
223
|
+
# :tags is an array of tags defining a query that returned agents tags must match
|
224
|
+
# :agent_ids is an array of agents whose tags should be returned
|
223
225
|
class TagQuery < Packet
|
224
226
|
|
225
|
-
attr_accessor :from, :tags
|
227
|
+
attr_accessor :from, :token, :agent_ids, :tags, :persistent
|
226
228
|
|
227
|
-
def initialize(from,
|
228
|
-
@from
|
229
|
-
@
|
230
|
-
@
|
229
|
+
def initialize(from, opts, size=nil)
|
230
|
+
@from = from
|
231
|
+
@token = opts[:token]
|
232
|
+
@agent_ids = opts[:agent_ids]
|
233
|
+
@tags = opts[:tags]
|
234
|
+
@persistent = opts[:persistent]
|
235
|
+
@size = size
|
231
236
|
end
|
232
237
|
|
233
238
|
def self.json_create(o)
|
234
239
|
i = o['data']
|
235
|
-
new(i['from'], i['
|
240
|
+
new(i['from'], { :token => i['token'], :agent_ids => i['agent_ids'],
|
241
|
+
:tags => i['tags'], :persistent => i['persistent'] },
|
242
|
+
o['size'])
|
236
243
|
end
|
237
244
|
|
238
245
|
def to_s(filter=nil)
|
239
|
-
"#{super} <#{token}>
|
246
|
+
log_msg = "#{super} <#{token}>"
|
247
|
+
log_msg += " from #{id_to_s(from)}" if filter.nil? || filter.include?(:from)
|
248
|
+
log_msg += " agent_ids #{agent_ids.inspect}"
|
249
|
+
log_msg += " tags: #{tags.inspect}"
|
250
|
+
log_msg
|
240
251
|
end
|
241
252
|
end
|
242
253
|
|
@@ -45,25 +45,20 @@ module Nanite
|
|
45
45
|
|
46
46
|
# Unserialize data using certificate store
|
47
47
|
def self.load(json)
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
jsn = EncryptedDocument.from_data(jsn).decrypted_data(@key, @cert)
|
61
|
-
end
|
62
|
-
JSON.load(jsn) if jsn
|
63
|
-
rescue Exception => e
|
64
|
-
Nanite::Log.error("Loading of secure packet failed: #{e.message}\n#{e.backtrace.join("\n")}")
|
65
|
-
raise
|
48
|
+
raise "Missing certificate store" unless @store
|
49
|
+
raise "Missing certificate" unless @cert || !@encrypt
|
50
|
+
raise "Missing certificate key" unless @key || !@encrypt
|
51
|
+
data = JSON.load(json)
|
52
|
+
sig = Signature.from_data(data['signature'])
|
53
|
+
certs = @store.get_signer(data['id'])
|
54
|
+
raise "Could not find a cert for signer #{data['id']}" unless certs
|
55
|
+
certs = [ certs ] unless certs.respond_to?(:any?)
|
56
|
+
raise "Failed to check signature for signer #{data['id']}" unless certs.any? { |c| sig.match?(c) }
|
57
|
+
jsn = data['data']
|
58
|
+
if jsn && @encrypt && data['encrypted']
|
59
|
+
jsn = EncryptedDocument.from_data(jsn).decrypted_data(@key, @cert)
|
66
60
|
end
|
61
|
+
JSON.load(jsn) if jsn
|
67
62
|
end
|
68
63
|
|
69
64
|
end
|
data/lib/nanite/serializer.rb
CHANGED
@@ -6,7 +6,7 @@ module Nanite
|
|
6
6
|
def initialize(action, packet, serializers, msg = nil)
|
7
7
|
@action, @packet = action, packet
|
8
8
|
msg = ":\n#{msg}" if msg && !msg.empty?
|
9
|
-
super("Could not #{action}
|
9
|
+
super("Could not #{action} packet using #{serializers.inspect}: #{msg}")
|
10
10
|
end
|
11
11
|
end # SerializationError
|
12
12
|
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rightscale-nanite-dev
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.1.
|
4
|
+
version: 0.4.1.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- RightScale, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-12 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -22,8 +22,8 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 0.6.0
|
24
24
|
version:
|
25
|
-
description:
|
26
|
-
email:
|
25
|
+
description: Self-assembling fabric of ruby daemons; fork of ezmobius/nanite.
|
26
|
+
email: support@rightscale.com
|
27
27
|
executables:
|
28
28
|
- nanite-agent
|
29
29
|
- nanite-mapper
|
@@ -79,7 +79,7 @@ files:
|
|
79
79
|
- bin/nanite-agent
|
80
80
|
- bin/nanite-mapper
|
81
81
|
has_rdoc: true
|
82
|
-
homepage: http://github.com/
|
82
|
+
homepage: http://github.com/rightscale/nanite
|
83
83
|
licenses: []
|
84
84
|
|
85
85
|
post_install_message:
|
@@ -105,6 +105,6 @@ rubyforge_project:
|
|
105
105
|
rubygems_version: 1.3.5
|
106
106
|
signing_key:
|
107
107
|
specification_version: 3
|
108
|
-
summary:
|
108
|
+
summary: Self-assembling fabric of ruby daemons; fork of ezmobius/nanite.
|
109
109
|
test_files: []
|
110
110
|
|