rightscale-nanite 0.4.1.4 → 0.4.1.10
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 +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/spec/actor_spec.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
|
3
|
-
describe Nanite::Actor do
|
4
|
-
class ::WebDocumentImporter
|
5
|
-
include Nanite::Actor
|
6
|
-
expose :import, :cancel
|
7
|
-
|
8
|
-
def import
|
9
|
-
1
|
10
|
-
end
|
11
|
-
def cancel
|
12
|
-
0
|
13
|
-
end
|
14
|
-
def continue
|
15
|
-
1
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
module ::Actors
|
20
|
-
class ComedyActor
|
21
|
-
include Nanite::Actor
|
22
|
-
expose :fun_tricks
|
23
|
-
def fun_tricks
|
24
|
-
:rabbit_in_the_hat
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class ::Actors::InvalidActor
|
30
|
-
include Nanite::Actor
|
31
|
-
expose :non_existing
|
32
|
-
end
|
33
|
-
|
34
|
-
describe ".expose" do
|
35
|
-
before :each do
|
36
|
-
@exposed = WebDocumentImporter.instance_variable_get(:@exposed).dup
|
37
|
-
end
|
38
|
-
|
39
|
-
after :each do
|
40
|
-
WebDocumentImporter.instance_variable_set(:@exposed, @exposed)
|
41
|
-
end
|
42
|
-
|
43
|
-
|
44
|
-
it "should single expose method only once" do
|
45
|
-
3.times { WebDocumentImporter.expose(:continue) }
|
46
|
-
WebDocumentImporter.provides_for("webfiles").should == ["/webfiles/import", "/webfiles/cancel", "/webfiles/continue"]
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe ".default_prefix" do
|
51
|
-
it "is calculated as default prefix as const path of class name" do
|
52
|
-
Actors::ComedyActor.default_prefix.should == "actors/comedy_actor"
|
53
|
-
WebDocumentImporter.default_prefix.should == "web_document_importer"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe ".provides_for(prefix)" do
|
58
|
-
before :each do
|
59
|
-
@provides = Actors::ComedyActor.provides_for("money")
|
60
|
-
end
|
61
|
-
|
62
|
-
it "returns an array" do
|
63
|
-
@provides.should be_kind_of(Array)
|
64
|
-
end
|
65
|
-
|
66
|
-
it "maps exposed service methods to prefix" do
|
67
|
-
@provides.should == ["/money/fun_tricks"]
|
68
|
-
wdi_provides = WebDocumentImporter.provides_for("webfiles")
|
69
|
-
wdi_provides.should include("/webfiles/import")
|
70
|
-
wdi_provides.should include("/webfiles/cancel")
|
71
|
-
end
|
72
|
-
|
73
|
-
it "should not include methods not existing in the actor class" do
|
74
|
-
Actors::InvalidActor.provides_for("money").should_not include("/money/non_existing")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
data/spec/agent_spec.rb
DELETED
@@ -1,240 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
|
3
|
-
describe "Agent:" do
|
4
|
-
|
5
|
-
describe "Default Option" do
|
6
|
-
|
7
|
-
before(:all) do
|
8
|
-
EM.stub!(:add_periodic_timer)
|
9
|
-
AMQP.stub!(:connect)
|
10
|
-
@amq = mock("AMQueue", :queue => mock("queue", :subscribe => {}), :fanout => mock("fanout", :publish => nil))
|
11
|
-
MQ.stub!(:new).and_return(@amq)
|
12
|
-
@agent = Nanite::Agent.start
|
13
|
-
end
|
14
|
-
|
15
|
-
it "for daemonize is false" do
|
16
|
-
@agent.options.should include(:daemonize)
|
17
|
-
@agent.options[:daemonize].should == false
|
18
|
-
end
|
19
|
-
|
20
|
-
it "for format is marshal" do
|
21
|
-
@agent.options.should include(:format)
|
22
|
-
@agent.options[:format].should == :marshal
|
23
|
-
end
|
24
|
-
|
25
|
-
it "for console is false" do
|
26
|
-
@agent.options.should include(:console)
|
27
|
-
@agent.options[:console].should == false
|
28
|
-
end
|
29
|
-
|
30
|
-
it "for user is nanite" do
|
31
|
-
@agent.options.should include(:user)
|
32
|
-
@agent.options[:user].should == "nanite"
|
33
|
-
end
|
34
|
-
|
35
|
-
it "for pass(word) is testing" do
|
36
|
-
@agent.options.should include(:pass)
|
37
|
-
@agent.options[:pass].should == "testing"
|
38
|
-
end
|
39
|
-
|
40
|
-
it "for secure is false" do
|
41
|
-
@agent.options.should include(:secure)
|
42
|
-
@agent.options[:secure].should == false
|
43
|
-
end
|
44
|
-
|
45
|
-
it "for host is 0.0.0.0" do
|
46
|
-
@agent.options.should include(:host)
|
47
|
-
@agent.options[:host].should == "0.0.0.0"
|
48
|
-
end
|
49
|
-
|
50
|
-
it "for log_level is info" do
|
51
|
-
@agent.options.should include(:log_level)
|
52
|
-
@agent.options[:log_level].should == :info
|
53
|
-
end
|
54
|
-
|
55
|
-
it "for vhost is /nanite" do
|
56
|
-
@agent.options.should include(:vhost)
|
57
|
-
@agent.options[:vhost].should == "/nanite"
|
58
|
-
end
|
59
|
-
|
60
|
-
it "for ping_time is 15" do
|
61
|
-
@agent.options.should include(:ping_time)
|
62
|
-
@agent.options[:ping_time].should == 15
|
63
|
-
end
|
64
|
-
|
65
|
-
it "for default_services is []" do
|
66
|
-
@agent.options.should include(:default_services)
|
67
|
-
@agent.options[:default_services].should == []
|
68
|
-
end
|
69
|
-
|
70
|
-
it "for root is #{File.expand_path(File.join(File.dirname(__FILE__), '..'))}" do
|
71
|
-
@agent.options.should include(:root)
|
72
|
-
@agent.options[:root].should == File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
73
|
-
end
|
74
|
-
|
75
|
-
it "for file_root is #{File.expand_path(File.join(File.dirname(__FILE__), '..', 'files'))}" do
|
76
|
-
@agent.options.should include(:file_root)
|
77
|
-
@agent.options[:file_root].should == File.expand_path(File.join(File.dirname(__FILE__), '..', 'files'))
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
describe "Options from config.yml" do
|
83
|
-
|
84
|
-
before(:all) do
|
85
|
-
@agent = Nanite::Agent.start
|
86
|
-
end
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
describe "Passed in Options" do
|
91
|
-
|
92
|
-
before(:each) do
|
93
|
-
EM.stub!(:add_periodic_timer)
|
94
|
-
AMQP.stub!(:connect)
|
95
|
-
@amq = mock("AMQueue", :queue => mock("queue", :subscribe => {}), :fanout => mock("fanout", :publish => nil))
|
96
|
-
MQ.stub!(:new).and_return(@amq)
|
97
|
-
end
|
98
|
-
|
99
|
-
# TODO figure out how to stub call to daemonize
|
100
|
-
# it "for daemonize should override default (false)" do
|
101
|
-
# agent = Nanite::Agent.start(:daemonize => true)
|
102
|
-
# agent.options.should include(:daemonize)
|
103
|
-
# agent.options[:daemonize].should == true
|
104
|
-
# end
|
105
|
-
|
106
|
-
it "for format should override default (marshal)" do
|
107
|
-
agent = Nanite::Agent.start(:format => :json)
|
108
|
-
agent.options.should include(:format)
|
109
|
-
agent.options[:format].should == :json
|
110
|
-
end
|
111
|
-
|
112
|
-
# TODO figure out how to avoid console output
|
113
|
-
# it "for console should override default (false)" do
|
114
|
-
# agent = Nanite::Agent.start(:console => true)
|
115
|
-
# agent.options.should include(:console)
|
116
|
-
# agent.options[:console].should == true
|
117
|
-
# end
|
118
|
-
|
119
|
-
it "for user should override default (nanite)" do
|
120
|
-
agent = Nanite::Agent.start(:user => "me")
|
121
|
-
agent.options.should include(:user)
|
122
|
-
agent.options[:user].should == "me"
|
123
|
-
end
|
124
|
-
|
125
|
-
it "for pass(word) should override default (testing)" do
|
126
|
-
agent = Nanite::Agent.start(:pass => "secret")
|
127
|
-
agent.options.should include(:pass)
|
128
|
-
agent.options[:pass].should == "secret"
|
129
|
-
end
|
130
|
-
|
131
|
-
it "for secure should override default (false)" do
|
132
|
-
agent = Nanite::Agent.start(:secure => true)
|
133
|
-
agent.options.should include(:secure)
|
134
|
-
agent.options[:secure].should == true
|
135
|
-
end
|
136
|
-
|
137
|
-
it "for host should override default (0.0.0.0)" do
|
138
|
-
agent = Nanite::Agent.start(:host => "127.0.0.1")
|
139
|
-
agent.options.should include(:host)
|
140
|
-
agent.options[:host].should == "127.0.0.1"
|
141
|
-
end
|
142
|
-
|
143
|
-
it "for log_level should override default (info)" do
|
144
|
-
agent = Nanite::Agent.start(:log_level => :debug)
|
145
|
-
agent.options.should include(:log_level)
|
146
|
-
agent.options[:log_level].should == :debug
|
147
|
-
end
|
148
|
-
|
149
|
-
it "for vhost should override default (/nanite)" do
|
150
|
-
agent = Nanite::Agent.start(:vhost => "/virtual_host")
|
151
|
-
agent.options.should include(:vhost)
|
152
|
-
agent.options[:vhost].should == "/virtual_host"
|
153
|
-
end
|
154
|
-
|
155
|
-
it "for ping_time should override default (15)" do
|
156
|
-
agent = Nanite::Agent.start(:ping_time => 5)
|
157
|
-
agent.options.should include(:ping_time)
|
158
|
-
agent.options[:ping_time].should == 5
|
159
|
-
end
|
160
|
-
|
161
|
-
it "for default_services should override default ([])" do
|
162
|
-
agent = Nanite::Agent.start(:default_services => [:test])
|
163
|
-
agent.options.should include(:default_services)
|
164
|
-
agent.options[:default_services].should == [:test]
|
165
|
-
end
|
166
|
-
|
167
|
-
it "for root should override default (#{File.expand_path(File.join(File.dirname(__FILE__), '..'))})" do
|
168
|
-
agent = Nanite::Agent.start(:root => File.expand_path(File.dirname(__FILE__)))
|
169
|
-
agent.options.should include(:root)
|
170
|
-
agent.options[:root].should == File.expand_path(File.dirname(__FILE__))
|
171
|
-
end
|
172
|
-
|
173
|
-
it "for file_root should override default (#{File.expand_path(File.join(File.dirname(__FILE__), '..', 'files'))})" do
|
174
|
-
agent = Nanite::Agent.start(:file_root => File.expand_path(File.dirname(__FILE__)))
|
175
|
-
agent.options.should include(:file_root)
|
176
|
-
agent.options[:file_root].should == File.expand_path(File.dirname(__FILE__))
|
177
|
-
end
|
178
|
-
|
179
|
-
it "for a single tag should result in the agent's tags being set" do
|
180
|
-
agent = Nanite::Agent.start(:tag => "sample_tag")
|
181
|
-
agent.tags.should include("sample_tag")
|
182
|
-
end
|
183
|
-
|
184
|
-
it "for multiple tags should result in the agent's tags being set" do
|
185
|
-
agent = Nanite::Agent.start(:tag => ["sample_tag_1", "sample_tag_2"])
|
186
|
-
agent.tags.should include("sample_tag_1")
|
187
|
-
agent.tags.should include("sample_tag_2")
|
188
|
-
end
|
189
|
-
|
190
|
-
it "for threadpool_size" do
|
191
|
-
agent = Nanite::Agent.start(:threadpool_size => 5)
|
192
|
-
agent.dispatcher.evmclass.threadpool_size.should == 5
|
193
|
-
end
|
194
|
-
|
195
|
-
end
|
196
|
-
|
197
|
-
describe "Security" do
|
198
|
-
|
199
|
-
before(:each) do
|
200
|
-
EM.stub!(:add_periodic_timer)
|
201
|
-
AMQP.stub!(:connect)
|
202
|
-
@amq = mock("AMQueue", :queue => mock("queue", :subscribe => {}, :publish => {}), :fanout => mock("fanout", :publish => nil))
|
203
|
-
MQ.stub!(:new).and_return(@amq)
|
204
|
-
serializer = Nanite::Serializer.new
|
205
|
-
@request = Nanite::Request.new('/foo/bar', '')
|
206
|
-
@push = Nanite::Push.new('/foo/bar', '')
|
207
|
-
@agent = Nanite::Agent.start
|
208
|
-
end
|
209
|
-
|
210
|
-
it 'should correctly deny requests' do
|
211
|
-
security = mock("Security")
|
212
|
-
@agent.register_security(security)
|
213
|
-
|
214
|
-
security.should_receive(:authorize).twice.and_return(false)
|
215
|
-
@agent.dispatcher.should_not_receive(:dispatch)
|
216
|
-
@agent.__send__(:receive, @request)
|
217
|
-
@agent.__send__(:receive, @push)
|
218
|
-
end
|
219
|
-
|
220
|
-
it 'should correctly authorize requests' do
|
221
|
-
security = mock("Security")
|
222
|
-
@agent.register_security(security)
|
223
|
-
|
224
|
-
security.should_receive(:authorize).twice.and_return(true)
|
225
|
-
@agent.dispatcher.stub!(:dispatch)
|
226
|
-
@agent.dispatcher.should_receive(:dispatch).twice
|
227
|
-
@agent.__send__(:receive, @request)
|
228
|
-
@agent.__send__(:receive, @push)
|
229
|
-
end
|
230
|
-
|
231
|
-
it 'should be ignored when not specified' do
|
232
|
-
@agent.dispatcher.stub!(:dispatch)
|
233
|
-
@agent.dispatcher.should_receive(:dispatch).twice
|
234
|
-
@agent.__send__(:receive, @request)
|
235
|
-
@agent.__send__(:receive, @push)
|
236
|
-
end
|
237
|
-
|
238
|
-
end
|
239
|
-
|
240
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
|
3
|
-
describe Nanite::CachedCertificateStoreProxy do
|
4
|
-
|
5
|
-
include SpecHelpers
|
6
|
-
|
7
|
-
before(:all) do
|
8
|
-
@signer, key = issue_cert
|
9
|
-
@recipient, key = issue_cert
|
10
|
-
@store = mock("Store")
|
11
|
-
@proxy = Nanite::CachedCertificateStoreProxy.new(@store)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'should not raise and return nil for non existent certificates' do
|
15
|
-
res = nil
|
16
|
-
@store.should_receive(:get_recipients).with(nil).and_return(nil)
|
17
|
-
lambda { res = @proxy.get_recipients(nil) }.should_not raise_error
|
18
|
-
res.should == nil
|
19
|
-
@store.should_receive(:get_signer).with(nil).and_return(nil)
|
20
|
-
lambda { res = @proxy.get_signer(nil) }.should_not raise_error
|
21
|
-
res.should == nil
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'should return recipient certificates' do
|
25
|
-
@store.should_receive(:get_recipients).with('anything').and_return(@recipient)
|
26
|
-
@proxy.get_recipients('anything').should == @recipient
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should return signer certificates' do
|
30
|
-
@store.should_receive(:get_signer).with('anything').and_return(@signer)
|
31
|
-
@proxy.get_signer('anything').should == @signer
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
|
3
|
-
describe Nanite::CertificateCache do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@cache = Nanite::CertificateCache.new(2)
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should allow storing and retrieving objects' do
|
10
|
-
@cache['some_id'].should be_nil
|
11
|
-
@cache['some_id'] = 'some_value'
|
12
|
-
@cache['some_id'].should == 'some_value'
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should not store more than required' do
|
16
|
-
@cache[1] = 'oldest'
|
17
|
-
@cache[2] = 'older'
|
18
|
-
@cache[1].should == 'oldest'
|
19
|
-
@cache[2].should == 'older'
|
20
|
-
|
21
|
-
@cache[3] = 'new'
|
22
|
-
@cache[3].should == 'new'
|
23
|
-
|
24
|
-
@cache[1].should be_nil
|
25
|
-
@cache[2].should == 'older'
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'should use LRU to remove entries' do
|
29
|
-
@cache[1] = 'oldest'
|
30
|
-
@cache[2] = 'older'
|
31
|
-
@cache[1].should == 'oldest'
|
32
|
-
@cache[2].should == 'older'
|
33
|
-
|
34
|
-
@cache[1] = 'new'
|
35
|
-
@cache[3] = 'newer'
|
36
|
-
@cache[1].should == 'new'
|
37
|
-
@cache[3].should == 'newer'
|
38
|
-
|
39
|
-
@cache[2].should be_nil
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'should store items returned by block' do
|
43
|
-
@cache[1].should be_nil
|
44
|
-
item = @cache.get(1) { 'item' }
|
45
|
-
item.should == 'item'
|
46
|
-
@cache[1].should == 'item'
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
data/spec/certificate_spec.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
|
3
|
-
describe Nanite::Certificate do
|
4
|
-
|
5
|
-
include SpecHelpers
|
6
|
-
|
7
|
-
before(:all) do
|
8
|
-
@certificate, key = issue_cert
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should save' do
|
12
|
-
filename = File.join(File.dirname(__FILE__), "cert.pem")
|
13
|
-
@certificate.save(filename)
|
14
|
-
File.size(filename).should be > 0
|
15
|
-
File.delete(filename)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'should load' do
|
19
|
-
filename = File.join(File.dirname(__FILE__), "cert.pem")
|
20
|
-
@certificate.save(filename)
|
21
|
-
cert = Nanite::Certificate.load(filename)
|
22
|
-
File.delete(filename)
|
23
|
-
cert.should_not be_nil
|
24
|
-
cert.data.should == @certificate.data
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|