right_agent 0.5.1 → 0.5.10
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/right_agent.rb +3 -13
- data/lib/right_agent/actors/agent_manager.rb +78 -4
- data/lib/right_agent/agent.rb +81 -4
- data/lib/right_agent/agent_config.rb +17 -1
- data/lib/right_agent/agent_tags_manager.rb +2 -2
- data/lib/right_agent/broker_client.rb +32 -34
- data/lib/right_agent/command/agent_manager_commands.rb +16 -0
- data/lib/right_agent/command/command_constants.rb +0 -9
- data/lib/right_agent/dispatcher.rb +6 -3
- data/lib/right_agent/ha_broker_client.rb +63 -14
- data/lib/right_agent/log.rb +1 -1
- data/lib/right_agent/minimal.rb +43 -0
- data/lib/right_agent/monkey_patches/amqp_patch.rb +91 -182
- data/lib/right_agent/packets.rb +10 -5
- data/lib/right_agent/platform.rb +8 -0
- data/lib/right_agent/platform/darwin.rb +14 -0
- data/lib/right_agent/platform/linux.rb +23 -0
- data/lib/right_agent/platform/windows.rb +31 -0
- data/lib/right_agent/scripts/agent_controller.rb +16 -8
- data/lib/right_agent/scripts/agent_deployer.rb +6 -0
- data/lib/right_agent/scripts/log_level_manager.rb +4 -5
- data/lib/right_agent/scripts/stats_manager.rb +9 -1
- data/lib/right_agent/sender.rb +623 -371
- data/lib/right_agent/stats_helper.rb +15 -1
- data/lib/right_agent/tracer.rb +1 -1
- data/right_agent.gemspec +14 -15
- data/spec/agent_config_spec.rb +9 -0
- data/spec/agent_spec.rb +154 -18
- data/spec/broker_client_spec.rb +171 -170
- data/spec/dispatcher_spec.rb +24 -8
- data/spec/ha_broker_client_spec.rb +55 -33
- data/spec/monkey_patches/amqp_patch_spec.rb +12 -0
- data/spec/packets_spec.rb +2 -0
- data/spec/sender_spec.rb +140 -69
- data/spec/stats_helper_spec.rb +5 -0
- metadata +54 -53
data/spec/dispatcher_spec.rb
CHANGED
@@ -96,6 +96,7 @@ describe "RightScale::Dispatcher" do
|
|
96
96
|
@agent = flexmock("Agent", :identity => "agent", :broker => @broker, :registry => @registry, :options => {}).by_default
|
97
97
|
@dispatcher = RightScale::Dispatcher.new(@agent)
|
98
98
|
@dispatcher.em = EMMock
|
99
|
+
@response_queue = RightScale::Dispatcher::RESPONSE_QUEUE
|
99
100
|
end
|
100
101
|
|
101
102
|
describe "Dispatched cache" do
|
@@ -199,6 +200,17 @@ describe "RightScale::Dispatcher" do
|
|
199
200
|
res.results.should == ['hello', 'you']
|
200
201
|
end
|
201
202
|
|
203
|
+
it "should publish result of request to response queue" do
|
204
|
+
req = RightScale::Request.new('/foo', 'you', :token => 'token')
|
205
|
+
req.reply_to = "rs-mapper-1-1"
|
206
|
+
@broker.should_receive(:publish).with(hsh(:name => @response_queue),
|
207
|
+
on {|arg| arg.class == RightScale::Result &&
|
208
|
+
arg.to == "rs-mapper-1-1" &&
|
209
|
+
arg.results == ['hello', 'you']},
|
210
|
+
hsh(:persistent => true, :mandatory => true)).once
|
211
|
+
res = @dispatcher.dispatch(req)
|
212
|
+
end
|
213
|
+
|
202
214
|
it "should handle custom prefixes" do
|
203
215
|
@registry.register(Foo.new, 'umbongo')
|
204
216
|
req = RightScale::Request.new('/umbongo/bar', 'you')
|
@@ -257,13 +269,15 @@ describe "RightScale::Dispatcher" do
|
|
257
269
|
it "should send non-delivery result if Request is rejected because its time-to-live has expired" do
|
258
270
|
flexmock(Time).should_receive(:now).and_return(Time.at(1000000)).by_default
|
259
271
|
flexmock(RightScale::Log).should_receive(:info).once.with(on {|arg| arg =~ /REJECT EXPIRED/})
|
260
|
-
@broker.should_receive(:publish).with(
|
261
|
-
|
262
|
-
|
272
|
+
@broker.should_receive(:publish).with(hsh(:name => @response_queue),
|
273
|
+
on {|arg| arg.class == RightScale::Result &&
|
274
|
+
arg.to == @response_queue &&
|
275
|
+
arg.results.non_delivery? &&
|
276
|
+
arg.results.content == RightScale::OperationResult::TTL_EXPIRATION},
|
263
277
|
hsh(:persistent => true, :mandatory => true)).once
|
264
278
|
@dispatcher = RightScale::Dispatcher.new(@agent)
|
265
279
|
@dispatcher.em = EMMock
|
266
|
-
req = RightScale::Request.new('/foo/bar', 'you', :expires_at => @now.to_i + 8)
|
280
|
+
req = RightScale::Request.new('/foo/bar', 'you', {:reply_to => @response_queue, :expires_at => @now.to_i + 8})
|
267
281
|
flexmock(Time).should_receive(:now).and_return(@now += 10)
|
268
282
|
@dispatcher.dispatch(req).should be_nil
|
269
283
|
end
|
@@ -271,13 +285,15 @@ describe "RightScale::Dispatcher" do
|
|
271
285
|
it "should send error result instead of non-delivery if agent does not know about non-delivery" do
|
272
286
|
flexmock(Time).should_receive(:now).and_return(Time.at(1000000)).by_default
|
273
287
|
flexmock(RightScale::Log).should_receive(:info).once.with(on {|arg| arg =~ /REJECT EXPIRED/})
|
274
|
-
@broker.should_receive(:publish).with(
|
275
|
-
|
276
|
-
|
288
|
+
@broker.should_receive(:publish).with(hsh(:name => @response_queue),
|
289
|
+
on {|arg| arg.class == RightScale::Result &&
|
290
|
+
arg.to == "rs-mapper-1-1" &&
|
291
|
+
arg.results.error? &&
|
292
|
+
arg.results.content =~ /Could not deliver/},
|
277
293
|
hsh(:persistent => true, :mandatory => true)).once
|
278
294
|
@dispatcher = RightScale::Dispatcher.new(@agent)
|
279
295
|
@dispatcher.em = EMMock
|
280
|
-
req = RightScale::Request.new('/foo/bar', 'you', {:expires_at => @now.to_i + 8}, [12, 13])
|
296
|
+
req = RightScale::Request.new('/foo/bar', 'you', {:reply_to => "rs-mapper-1-1", :expires_at => @now.to_i + 8}, [12, 13])
|
281
297
|
flexmock(Time).should_receive(:now).and_return(@now += 10)
|
282
298
|
@dispatcher.dispatch(req).should be_nil
|
283
299
|
end
|
@@ -27,9 +27,10 @@ describe RightScale::HABrokerClient do
|
|
27
27
|
include FlexMock::ArgumentTypes
|
28
28
|
|
29
29
|
before(:each) do
|
30
|
-
flexmock(RightScale::Log)
|
31
|
-
|
32
|
-
|
30
|
+
@log = flexmock(RightScale::Log)
|
31
|
+
@log.should_receive(:error).by_default.and_return { |m| raise RightScale::Log.format(*m) }
|
32
|
+
@log.should_receive(:warning).by_default.and_return { |m| raise RightScale::Log.format(*m) }
|
33
|
+
@log.should_receive(:info).by_default
|
33
34
|
end
|
34
35
|
|
35
36
|
describe "Context" do
|
@@ -595,7 +596,7 @@ describe RightScale::HABrokerClient do
|
|
595
596
|
end
|
596
597
|
|
597
598
|
it "should not do anything except log a message if asked to reconnect an already connected broker client" do
|
598
|
-
|
599
|
+
@log.should_receive(:info).with(/Ignored request to reconnect/).once
|
599
600
|
ha = RightScale::HABrokerClient.new(@serializer, :host => "a, b")
|
600
601
|
ha.brokers.size.should == 2
|
601
602
|
@broker_a.should_receive(:status).and_return(:connected).once
|
@@ -610,7 +611,7 @@ describe RightScale::HABrokerClient do
|
|
610
611
|
end
|
611
612
|
|
612
613
|
it "should reconnect already connected broker client if force specified" do
|
613
|
-
|
614
|
+
@log.should_receive(:info).with(/Ignored request to reconnect/).never
|
614
615
|
ha = RightScale::HABrokerClient.new(@serializer, :host => "a, b")
|
615
616
|
ha.brokers.size.should == 2
|
616
617
|
@broker_a.should_receive(:close).and_return(true).once
|
@@ -623,6 +624,21 @@ describe RightScale::HABrokerClient do
|
|
623
624
|
ha.brokers[1].alias == "b1"
|
624
625
|
end
|
625
626
|
|
627
|
+
it "should be able to change host and port of an existing broker client" do
|
628
|
+
ha = RightScale::HABrokerClient.new(@serializer, :host => "a, b")
|
629
|
+
ha.brokers.size.should == 2
|
630
|
+
@broker_a.should_receive(:close).and_return(true).once
|
631
|
+
flexmock(RightScale::BrokerClient).should_receive(:new).with(@identity_c, @address_c.merge(:index => 0),
|
632
|
+
@serializer, @exceptions, Hash, nil, nil).and_return(@broker_c).once
|
633
|
+
res = ha.connect("c", 5672, 0)
|
634
|
+
res.should be_true
|
635
|
+
ha.brokers.size.should == 2
|
636
|
+
ha.brokers[0].alias == "b0"
|
637
|
+
ha.brokers[0].identity == @address_c
|
638
|
+
ha.brokers[1].alias == "b1"
|
639
|
+
ha.brokers[1].identity == @address_b
|
640
|
+
end
|
641
|
+
|
626
642
|
it "should slot broker client into specified priority position when at end of list" do
|
627
643
|
ha = RightScale::HABrokerClient.new(@serializer, :host => "a, b")
|
628
644
|
ha.brokers.size.should == 2
|
@@ -646,7 +662,7 @@ describe RightScale::HABrokerClient do
|
|
646
662
|
end
|
647
663
|
|
648
664
|
it "should slot broker client into nex priority position if specified priority would leave a gap" do
|
649
|
-
|
665
|
+
@log.should_receive(:info).with(/Reduced priority setting for broker/).once
|
650
666
|
ha = RightScale::HABrokerClient.new(@serializer, :host => "a")
|
651
667
|
ha.brokers.size.should == 1
|
652
668
|
res = ha.connect("c", 5672, 2, 2)
|
@@ -668,11 +684,6 @@ describe RightScale::HABrokerClient do
|
|
668
684
|
ha.brokers[1].alias == "b1"
|
669
685
|
end
|
670
686
|
|
671
|
-
it "should raise an exception if try to change host and port of an existing broker client" do
|
672
|
-
ha = RightScale::HABrokerClient.new(@serializer, :host => "a, b")
|
673
|
-
lambda { ha.connect("c", 5672, 0) }.should raise_error(Exception, /Not allowed to change host or port/)
|
674
|
-
end
|
675
|
-
|
676
687
|
end # connecting
|
677
688
|
|
678
689
|
context "updating connection" do
|
@@ -925,7 +936,7 @@ describe RightScale::HABrokerClient do
|
|
925
936
|
end
|
926
937
|
|
927
938
|
it "should log an error if a selected broker is unknown but still publish with any remaining brokers" do
|
928
|
-
|
939
|
+
@log.should_receive(:error).with(/Invalid broker identity "rs-broker-fifth-5672"/).once
|
929
940
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
930
941
|
ha.publish({:type => :direct, :name => "exchange"}, @packet,
|
931
942
|
:brokers =>["rs-broker-fifth-5672", @identity1]).should == [@identity1]
|
@@ -1025,8 +1036,8 @@ describe RightScale::HABrokerClient do
|
|
1025
1036
|
end
|
1026
1037
|
|
1027
1038
|
it "should republish using a broker not yet tried if possible and log that re-routing" do
|
1028
|
-
|
1029
|
-
|
1039
|
+
@log.should_receive(:info).with(/RE-ROUTE/).once
|
1040
|
+
@log.should_receive(:info).with(/RETURN reason/).once
|
1030
1041
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1031
1042
|
@context.record_failure(@identity3)
|
1032
1043
|
@broker4.should_receive(:publish).and_return(true).once
|
@@ -1034,8 +1045,8 @@ describe RightScale::HABrokerClient do
|
|
1034
1045
|
end
|
1035
1046
|
|
1036
1047
|
it "should republish to same broker without mandatory if message is persistent and no other brokers available" do
|
1037
|
-
|
1038
|
-
|
1048
|
+
@log.should_receive(:info).with(/RE-ROUTE/).once
|
1049
|
+
@log.should_receive(:info).with(/RETURN reason/).once
|
1039
1050
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1040
1051
|
@context.record_failure(@identity3)
|
1041
1052
|
@context.record_failure(@identity4)
|
@@ -1045,8 +1056,8 @@ describe RightScale::HABrokerClient do
|
|
1045
1056
|
end
|
1046
1057
|
|
1047
1058
|
it "should republish to same broker without mandatory if message is one-way and no other brokers available" do
|
1048
|
-
|
1049
|
-
|
1059
|
+
@log.should_receive(:info).with(/RE-ROUTE/).once
|
1060
|
+
@log.should_receive(:info).with(/RETURN reason/).once
|
1050
1061
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1051
1062
|
@context.record_failure(@identity3)
|
1052
1063
|
@context.record_failure(@identity4)
|
@@ -1056,8 +1067,8 @@ describe RightScale::HABrokerClient do
|
|
1056
1067
|
end
|
1057
1068
|
|
1058
1069
|
it "should update status to :stopping if message returned because access refused" do
|
1059
|
-
|
1060
|
-
|
1070
|
+
@log.should_receive(:info).with(/RE-ROUTE/).once
|
1071
|
+
@log.should_receive(:info).with(/RETURN reason/).once
|
1061
1072
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1062
1073
|
@context.record_failure(@identity3)
|
1063
1074
|
@broker4.should_receive(:publish).and_return(true).once
|
@@ -1066,8 +1077,8 @@ describe RightScale::HABrokerClient do
|
|
1066
1077
|
end
|
1067
1078
|
|
1068
1079
|
it "should log info and make non-delivery call even if persistent when returned because of no queue" do
|
1069
|
-
|
1070
|
-
|
1080
|
+
@log.should_receive(:info).with(/NO ROUTE/).once
|
1081
|
+
@log.should_receive(:info).with(/RETURN reason/).once
|
1071
1082
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1072
1083
|
called = 0
|
1073
1084
|
ha.non_delivery { |reason, type, token, from, to| called += 1 }
|
@@ -1081,8 +1092,8 @@ describe RightScale::HABrokerClient do
|
|
1081
1092
|
end
|
1082
1093
|
|
1083
1094
|
it "should log info and make non-delivery call if no route can be found" do
|
1084
|
-
|
1085
|
-
|
1095
|
+
@log.should_receive(:info).with(/NO ROUTE/).once
|
1096
|
+
@log.should_receive(:info).with(/RETURN reason/).once
|
1086
1097
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1087
1098
|
called = 0
|
1088
1099
|
ha.non_delivery { |reason, type, token, from, to| called += 1 }
|
@@ -1095,7 +1106,7 @@ describe RightScale::HABrokerClient do
|
|
1095
1106
|
end
|
1096
1107
|
|
1097
1108
|
it "should log info if no message context available for re-routing it" do
|
1098
|
-
|
1109
|
+
@log.should_receive(:info).with(/Dropping/).once
|
1099
1110
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1100
1111
|
ha.__send__(:handle_return, @identity4, "any reason", @message, "to", nil)
|
1101
1112
|
end
|
@@ -1126,12 +1137,22 @@ describe RightScale::HABrokerClient do
|
|
1126
1137
|
ha.delete("queue").should == [@identity4, @identity2]
|
1127
1138
|
end
|
1128
1139
|
|
1140
|
+
it "should delete queue from cache on all usable broker clients and return their identities" do
|
1141
|
+
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1142
|
+
@broker1.should_receive(:usable?).and_return(false)
|
1143
|
+
@broker1.should_receive(:delete_amqp_resources).never
|
1144
|
+
@broker2.should_receive(:delete_amqp_resources).and_return(true).once
|
1145
|
+
@broker3.should_receive(:delete_amqp_resources).and_return(true).once
|
1146
|
+
@broker4.should_receive(:delete_amqp_resources).and_return(true).once
|
1147
|
+
ha.delete_amqp_resources("queue").should == [@identity3, @identity4, @identity2]
|
1148
|
+
end
|
1149
|
+
|
1129
1150
|
end # deleting
|
1130
1151
|
|
1131
1152
|
context "removing" do
|
1132
1153
|
|
1133
1154
|
it "should remove broker client after disconnecting and pass identity to block" do
|
1134
|
-
|
1155
|
+
@log.should_receive(:info).with(/Removing/).once
|
1135
1156
|
@broker2.should_receive(:close).with(true, true, false).once
|
1136
1157
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1137
1158
|
identity = nil
|
@@ -1146,7 +1167,7 @@ describe RightScale::HABrokerClient do
|
|
1146
1167
|
end
|
1147
1168
|
|
1148
1169
|
it "should remove broker when no block supplied but still return a result" do
|
1149
|
-
|
1170
|
+
@log.should_receive(:info).with(/Removing/).once
|
1150
1171
|
@broker2.should_receive(:close).once
|
1151
1172
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1152
1173
|
result = ha.remove("second", 5672)
|
@@ -1159,7 +1180,7 @@ describe RightScale::HABrokerClient do
|
|
1159
1180
|
end
|
1160
1181
|
|
1161
1182
|
it "should remove last broker if requested" do
|
1162
|
-
|
1183
|
+
@log.should_receive(:info).with(/Removing/).times(4)
|
1163
1184
|
@broker1.should_receive(:close).once
|
1164
1185
|
@broker2.should_receive(:close).once
|
1165
1186
|
@broker3.should_receive(:close).once
|
@@ -1184,7 +1205,7 @@ describe RightScale::HABrokerClient do
|
|
1184
1205
|
end
|
1185
1206
|
|
1186
1207
|
it "should return nil and not execute block if broker is unknown" do
|
1187
|
-
|
1208
|
+
@log.should_receive(:info).with(/Ignored request to remove/).once
|
1188
1209
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1189
1210
|
ha.remove("fifth", 5672).should be_nil
|
1190
1211
|
ha.brokers.size.should == 4
|
@@ -1331,23 +1352,24 @@ describe RightScale::HABrokerClient do
|
|
1331
1352
|
@broker4.should_receive(:stats).and_return("stats4")
|
1332
1353
|
ha.stats.should == {"brokers" => ["stats3", "stats4", "stats1", "stats2"],
|
1333
1354
|
"exceptions" => nil,
|
1355
|
+
"heartbeat" => nil,
|
1334
1356
|
"returns" => nil}
|
1335
1357
|
end
|
1336
1358
|
|
1337
1359
|
it "should log broker client status update if there is a change" do
|
1338
|
-
|
1360
|
+
@log.should_receive(:info).with(/Broker b0 is now connected/).once
|
1339
1361
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1340
1362
|
ha.__send__(:update_status, @broker3, false)
|
1341
1363
|
end
|
1342
1364
|
|
1343
1365
|
it "should not log broker client status update if there is no change" do
|
1344
|
-
|
1366
|
+
@log.should_receive(:info).with(/Broker b0 is now connected/).never
|
1345
1367
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1346
1368
|
ha.__send__(:update_status, @broker3, true)
|
1347
1369
|
end
|
1348
1370
|
|
1349
1371
|
it "should log broker client status update when become disconnected" do
|
1350
|
-
|
1372
|
+
@log.should_receive(:info).with(/Broker b0 is now disconnected/).once
|
1351
1373
|
ha = RightScale::HABrokerClient.new(@serializer, :islands => @islands, :home_island => @home)
|
1352
1374
|
@broker3.should_receive(:status).and_return(:disconnected)
|
1353
1375
|
@broker3.should_receive(:connected?).and_return(false)
|
@@ -1630,7 +1652,7 @@ describe RightScale::HABrokerClient do
|
|
1630
1652
|
end
|
1631
1653
|
|
1632
1654
|
it "should close all broker connections even if encounter an exception" do
|
1633
|
-
|
1655
|
+
@log.should_receive(:error).with(/Failed to close/, Exception, :trace).once
|
1634
1656
|
@broker1.should_receive(:close).and_return(true).and_yield.once
|
1635
1657
|
@broker2.should_receive(:close).and_raise(Exception).once
|
1636
1658
|
@broker3.should_receive(:close).and_return(true).and_yield.once
|
@@ -95,6 +95,18 @@ describe AMQP::Client do
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
+
context 'and an EM reconnect failure' do
|
99
|
+
it 'should log an error and schedule another reconnect' do
|
100
|
+
@sut.settings[:reconnect_delay] = true
|
101
|
+
|
102
|
+
flexmock(RightScale::Log).should_receive(:error).with(/Exception caught during AMQP reconnect/, Exception, :trace).once
|
103
|
+
flexmock(EM).should_receive(:reconnect).and_raise(Exception)
|
104
|
+
flexmock(EM).should_receive(:add_timer).with(5, Proc).once
|
105
|
+
|
106
|
+
@sut.reconnect()
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
98
110
|
end
|
99
111
|
|
100
112
|
end
|
data/spec/packets_spec.rb
CHANGED
@@ -263,6 +263,7 @@ describe "Packet: Push" do
|
|
263
263
|
packet.from.should == packet2.from
|
264
264
|
packet.token.should == packet2.token
|
265
265
|
packet.tries.should == packet2.tries
|
266
|
+
packet.confirm.should == packet2.confirm
|
266
267
|
packet.expires_at.should == packet2.expires_at
|
267
268
|
packet.recv_version.should == packet2.recv_version
|
268
269
|
packet.send_version.should == packet2.send_version
|
@@ -276,6 +277,7 @@ describe "Packet: Push" do
|
|
276
277
|
packet.from.should == packet2.from
|
277
278
|
packet.token.should == packet2.token
|
278
279
|
packet.tries.should == packet2.tries
|
280
|
+
packet.confirm.should == packet2.confirm
|
279
281
|
packet.expires_at.should == packet2.expires_at
|
280
282
|
packet.recv_version.should == packet2.recv_version
|
281
283
|
packet.send_version.should == packet2.send_version
|
data/spec/sender_spec.rb
CHANGED
@@ -59,6 +59,8 @@ describe RightScale::Sender do
|
|
59
59
|
describe "when monitoring broker connectivity" do
|
60
60
|
before(:each) do
|
61
61
|
flexmock(EM).should_receive(:next_tick).and_yield.by_default
|
62
|
+
@now = Time.at(1000000)
|
63
|
+
flexmock(Time).should_receive(:now).and_return(@now).by_default
|
62
64
|
@broker = flexmock("Broker", :subscribe => true, :publish => ["broker"], :connected? => true,
|
63
65
|
:identity_parts => ["host", 123, 0, 0, nil]).by_default
|
64
66
|
@agent = flexmock("Agent", :identity => "agent", :broker => @broker, :options => {:ping_interval => 0}).by_default
|
@@ -79,7 +81,8 @@ describe RightScale::Sender do
|
|
79
81
|
@agent.should_receive(:options).and_return(:ping_interval => 1000)
|
80
82
|
flexmock(EM::Timer).should_receive(:new).with(1000, Proc).and_return(@timer).once
|
81
83
|
instance = RightScale::Sender.new(@agent)
|
82
|
-
flexmock(
|
84
|
+
flexmock(Time).should_receive(:now).and_return(@now + 61)
|
85
|
+
flexmock(instance.connectivity_checker).should_receive(:restart_inactivity_timer).once
|
83
86
|
instance.message_received
|
84
87
|
instance.message_received
|
85
88
|
end
|
@@ -89,11 +92,47 @@ describe RightScale::Sender do
|
|
89
92
|
flexmock(EM::Timer).should_receive(:new).and_return(@timer).once.by_default
|
90
93
|
RightScale::Sender.new(@agent)
|
91
94
|
instance = RightScale::Sender.instance
|
95
|
+
flexmock(Time).should_receive(:now).and_return(@now + 61)
|
92
96
|
flexmock(EM::Timer).should_receive(:new).and_return(@timer).and_yield.once
|
93
|
-
flexmock(instance).should_receive(:
|
97
|
+
flexmock(instance.connectivity_checker).should_receive(:check).once
|
94
98
|
instance.message_received
|
95
99
|
end
|
96
100
|
|
101
|
+
it "should check connectivity by sending mapper ping" do
|
102
|
+
@agent.should_receive(:options).and_return(:ping_interval => 1000)
|
103
|
+
flexmock(EM::Timer).should_receive(:new).and_return(@timer).twice
|
104
|
+
RightScale::Sender.new(@agent)
|
105
|
+
instance = RightScale::Sender.instance
|
106
|
+
broker_id = "rs-broker-1-1"
|
107
|
+
flexmock(instance).should_receive(:publish).with(on do |request|
|
108
|
+
request.type.should == "/mapper/ping";
|
109
|
+
request.from.should == "agent"
|
110
|
+
end, [broker_id]).and_return([broker_id]).once
|
111
|
+
instance.connectivity_checker.check(broker_id)
|
112
|
+
instance.pending_requests.size.should == 1
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should not check connectivity if terminating" do
|
116
|
+
@agent.should_receive(:options).and_return(:ping_interval => 1000)
|
117
|
+
flexmock(EM::Timer).should_receive(:new).and_return(@timer).once
|
118
|
+
RightScale::Sender.new(@agent)
|
119
|
+
instance = RightScale::Sender.instance
|
120
|
+
flexmock(instance).should_receive(:publish).never
|
121
|
+
instance.terminate
|
122
|
+
instance.connectivity_checker.check
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should not check connectivity if not connected to broker" do
|
126
|
+
@agent.should_receive(:options).and_return(:ping_interval => 1000)
|
127
|
+
flexmock(EM::Timer).should_receive(:new).and_return(@timer).once
|
128
|
+
RightScale::Sender.new(@agent)
|
129
|
+
broker_id = "rs-broker-1-1"
|
130
|
+
@broker.should_receive(:connected?).with(broker_id).and_return(false)
|
131
|
+
instance = RightScale::Sender.instance
|
132
|
+
flexmock(instance).should_receive(:publish).never
|
133
|
+
instance.connectivity_checker.check(broker_id)
|
134
|
+
end
|
135
|
+
|
97
136
|
it "should ignore messages received if ping disabled" do
|
98
137
|
@agent.should_receive(:options).and_return(:ping_interval => 0)
|
99
138
|
flexmock(EM::Timer).should_receive(:new).never
|
@@ -107,8 +146,9 @@ describe RightScale::Sender do
|
|
107
146
|
flexmock(EM::Timer).should_receive(:new).and_return(@timer).once.by_default
|
108
147
|
RightScale::Sender.new(@agent)
|
109
148
|
instance = RightScale::Sender.instance
|
149
|
+
flexmock(Time).should_receive(:now).and_return(@now + 61)
|
110
150
|
flexmock(EM::Timer).should_receive(:new).and_return(@timer).and_yield.once
|
111
|
-
flexmock(instance).should_receive(:
|
151
|
+
flexmock(instance.connectivity_checker).should_receive(:check).and_raise(Exception)
|
112
152
|
instance.message_received
|
113
153
|
end
|
114
154
|
|
@@ -118,18 +158,18 @@ describe RightScale::Sender do
|
|
118
158
|
broker_id = "rs-broker-localhost-5672"
|
119
159
|
@broker.should_receive(:identity_parts).with(broker_id).and_return(["localhost", 5672, 0, 0, nil]).once
|
120
160
|
@agent.should_receive(:connect).with("localhost", 5672, 0, 0, true).once
|
121
|
-
old_ping_timeout = RightScale::Sender::PING_TIMEOUT
|
161
|
+
old_ping_timeout = RightScale::Sender::ConnectivityChecker::PING_TIMEOUT
|
122
162
|
begin
|
123
|
-
RightScale::Sender.const_set(:PING_TIMEOUT, 0.5)
|
163
|
+
RightScale::Sender::ConnectivityChecker.const_set(:PING_TIMEOUT, 0.5)
|
124
164
|
EM.run do
|
125
165
|
EM.add_timer(1) { EM.stop }
|
126
166
|
RightScale::Sender.new(@agent)
|
127
167
|
instance = RightScale::Sender.instance
|
128
168
|
flexmock(instance).should_receive(:publish).with(RightScale::Request, nil).and_return([broker_id])
|
129
|
-
instance.
|
169
|
+
instance.connectivity_checker.check
|
130
170
|
end
|
131
171
|
ensure
|
132
|
-
RightScale::Sender.const_set(:PING_TIMEOUT, old_ping_timeout)
|
172
|
+
RightScale::Sender::ConnectivityChecker.const_set(:PING_TIMEOUT, old_ping_timeout)
|
133
173
|
end
|
134
174
|
end
|
135
175
|
end
|
@@ -138,6 +178,7 @@ describe RightScale::Sender do
|
|
138
178
|
before(:each) do
|
139
179
|
@timer = flexmock("timer")
|
140
180
|
flexmock(EM::Timer).should_receive(:new).and_return(@timer)
|
181
|
+
flexmock(Time).should_receive(:now).and_return(Time.at(1000000)).by_default
|
141
182
|
@broker = flexmock("Broker", :subscribe => true, :publish => true).by_default
|
142
183
|
@agent = flexmock("Agent", :identity => "agent", :broker => @broker).by_default
|
143
184
|
@agent.should_receive(:options).and_return({}).by_default
|
@@ -205,6 +246,7 @@ describe RightScale::Sender do
|
|
205
246
|
push.persistent.should be_false
|
206
247
|
push.from.should == 'agent'
|
207
248
|
push.target.should be_nil
|
249
|
+
push.confirm.should be_nil
|
208
250
|
push.expires_at.should == 0
|
209
251
|
end, hsh(:persistent => false, :mandatory => true)).once
|
210
252
|
@instance.send_push('/welcome/aboard', 'iZac')
|
@@ -217,27 +259,40 @@ describe RightScale::Sender do
|
|
217
259
|
@instance.initialize_offline_queue
|
218
260
|
@broker.should_receive(:publish).never
|
219
261
|
@instance.enable_offline_mode
|
220
|
-
@instance.
|
262
|
+
@instance.offline_handler.mode.should == :offline
|
221
263
|
@instance.send_push('/welcome/aboard', 'iZac')
|
222
|
-
@instance.
|
264
|
+
@instance.offline_handler.queue.size.should == 1
|
223
265
|
end
|
224
266
|
|
225
267
|
it "should store the response handler if given" do
|
226
268
|
response_handler = lambda {}
|
227
269
|
flexmock(RightScale::AgentIdentity).should_receive(:generate).and_return('abc').once
|
270
|
+
@broker.should_receive(:publish).with(hsh(:name => "request"), on do |push|
|
271
|
+
push.confirm.should == true
|
272
|
+
end, hsh(:persistent => false, :mandatory => true)).once
|
228
273
|
@instance.send_push('/welcome/aboard', 'iZac', &response_handler)
|
229
|
-
@instance.pending_requests['abc']
|
274
|
+
@instance.pending_requests['abc'].response_handler.should == response_handler
|
230
275
|
end
|
231
276
|
|
232
277
|
it "should store the request receive time if there is a response handler" do
|
233
278
|
response_handler = lambda {}
|
234
279
|
flexmock(RightScale::AgentIdentity).should_receive(:generate).and_return('abc').once
|
235
|
-
|
236
|
-
@instance.request_age.should be_nil
|
280
|
+
@instance.pending_requests.kind(RightScale::Sender::PendingRequests::PUSH_KINDS).youngest_age.should be_nil
|
237
281
|
@instance.send_push('/welcome/aboard', 'iZac', &response_handler)
|
238
|
-
@instance.pending_requests['abc']
|
282
|
+
@instance.pending_requests['abc'].receive_time.should == Time.at(1000000)
|
239
283
|
flexmock(Time).should_receive(:now).and_return(Time.at(1000100))
|
240
|
-
@instance.
|
284
|
+
@instance.pending_requests.kind(RightScale::Sender::PendingRequests::PUSH_KINDS).youngest_age.should == 100
|
285
|
+
end
|
286
|
+
|
287
|
+
it "should eventually remove push from pending requests if no response received" do
|
288
|
+
response_handler = lambda {}
|
289
|
+
flexmock(RightScale::AgentIdentity).should_receive(:generate).and_return('abc', 'xyz').twice
|
290
|
+
@instance.send_push('/welcome/aboard', 'iZac', &response_handler)
|
291
|
+
@instance.pending_requests['abc'].should_not be_nil
|
292
|
+
flexmock(Time).should_receive(:now).and_return(Time.at(1000121))
|
293
|
+
@instance.send_push('/welcome/aboard', 'iZac', &response_handler)
|
294
|
+
@instance.pending_requests['xyz'].should_not be_nil
|
295
|
+
@instance.pending_requests['abc'].should be_nil
|
241
296
|
end
|
242
297
|
end
|
243
298
|
|
@@ -266,6 +321,7 @@ describe RightScale::Sender do
|
|
266
321
|
push.persistent.should be_true
|
267
322
|
push.from.should == 'agent'
|
268
323
|
push.target.should be_nil
|
324
|
+
push.confirm.should be_nil
|
269
325
|
push.expires_at.should == 0
|
270
326
|
end, hsh(:persistent => true, :mandatory => true)).once
|
271
327
|
@instance.send_persistent_push('/welcome/aboard', 'iZac')
|
@@ -282,19 +338,22 @@ describe RightScale::Sender do
|
|
282
338
|
it "should store the response handler if given" do
|
283
339
|
response_handler = lambda {}
|
284
340
|
flexmock(RightScale::AgentIdentity).should_receive(:generate).and_return('abc').once
|
341
|
+
@broker.should_receive(:publish).with(hsh(:name => "request"), on do |push|
|
342
|
+
push.confirm.should == true
|
343
|
+
end, hsh(:persistent => true, :mandatory => true)).once
|
285
344
|
@instance.send_persistent_push('/welcome/aboard', 'iZac', &response_handler)
|
286
|
-
@instance.pending_requests['abc']
|
345
|
+
@instance.pending_requests['abc'].response_handler.should == response_handler
|
287
346
|
end
|
288
347
|
|
289
348
|
it "should store the request receive time if there is a response handler" do
|
290
349
|
response_handler = lambda {}
|
291
350
|
flexmock(RightScale::AgentIdentity).should_receive(:generate).and_return('abc').once
|
292
351
|
flexmock(Time).should_receive(:now).and_return(Time.at(1000000)).by_default
|
293
|
-
@instance.
|
352
|
+
@instance.pending_requests.kind(RightScale::Sender::PendingRequests::PUSH_KINDS).youngest_age.should be_nil
|
294
353
|
@instance.send_persistent_push('/welcome/aboard', 'iZac', &response_handler)
|
295
|
-
@instance.pending_requests['abc']
|
354
|
+
@instance.pending_requests['abc'].receive_time.should == Time.at(1000000)
|
296
355
|
flexmock(Time).should_receive(:now).and_return(Time.at(1000100))
|
297
|
-
@instance.
|
356
|
+
@instance.pending_requests.kind(RightScale::Sender::PendingRequests::PUSH_KINDS).youngest_age.should == 100
|
298
357
|
end
|
299
358
|
end
|
300
359
|
|
@@ -396,17 +455,17 @@ describe RightScale::Sender do
|
|
396
455
|
response_handler = lambda {}
|
397
456
|
flexmock(RightScale::AgentIdentity).should_receive(:generate).and_return('abc').once
|
398
457
|
@instance.send_retryable_request('/welcome/aboard', 'iZac', &response_handler)
|
399
|
-
@instance.pending_requests['abc']
|
458
|
+
@instance.pending_requests['abc'].response_handler.should == response_handler
|
400
459
|
end
|
401
460
|
|
402
461
|
it "should store the request receive time" do
|
403
462
|
flexmock(RightScale::AgentIdentity).should_receive(:generate).and_return('abc').once
|
404
463
|
flexmock(Time).should_receive(:now).and_return(Time.at(1000000)).by_default
|
405
|
-
@instance.
|
464
|
+
@instance.pending_requests.kind(RightScale::Sender::PendingRequests::REQUEST_KINDS).youngest_age.should be_nil
|
406
465
|
@instance.send_retryable_request('/welcome/aboard', 'iZac')
|
407
|
-
@instance.pending_requests['abc']
|
466
|
+
@instance.pending_requests['abc'].receive_time.should == Time.at(1000000)
|
408
467
|
flexmock(Time).should_receive(:now).and_return(Time.at(1000100))
|
409
|
-
@instance.
|
468
|
+
@instance.pending_requests.kind(RightScale::Sender::PendingRequests::REQUEST_KINDS).youngest_age.should == 100
|
410
469
|
end
|
411
470
|
|
412
471
|
it 'should queue the request if in offline mode and :offline_queueing enabled' do
|
@@ -416,9 +475,9 @@ describe RightScale::Sender do
|
|
416
475
|
@instance.initialize_offline_queue
|
417
476
|
@broker.should_receive(:publish).never
|
418
477
|
@instance.enable_offline_mode
|
419
|
-
@instance.
|
478
|
+
@instance.offline_handler.mode.should == :offline
|
420
479
|
@instance.send_retryable_request('/welcome/aboard', 'iZac')
|
421
|
-
@instance.
|
480
|
+
@instance.offline_handler.queue.size.should == 1
|
422
481
|
end
|
423
482
|
|
424
483
|
it "should dump the pending requests" do
|
@@ -489,7 +548,7 @@ describe RightScale::Sender do
|
|
489
548
|
@agent.should_receive(:options).and_return({:retry_timeout => 0.3, :retry_interval => 0.1})
|
490
549
|
RightScale::Sender.new(@agent)
|
491
550
|
@instance = RightScale::Sender.instance
|
492
|
-
flexmock(@instance).should_receive(:
|
551
|
+
flexmock(@instance.connectivity_checker).should_receive(:check).once
|
493
552
|
@broker.should_receive(:publish).and_return(@broker_ids).twice
|
494
553
|
@instance.send_retryable_request('/welcome/aboard', 'iZac') do |response|
|
495
554
|
result = RightScale::OperationResult.from_results(response)
|
@@ -514,7 +573,7 @@ describe RightScale::Sender do
|
|
514
573
|
@agent.should_receive(:options).and_return({:retry_timeout => 0.6, :retry_interval => 0.1})
|
515
574
|
RightScale::Sender.new(@agent)
|
516
575
|
@instance = RightScale::Sender.instance
|
517
|
-
flexmock(@instance).should_receive(:
|
576
|
+
flexmock(@instance.connectivity_checker).should_receive(:check).once
|
518
577
|
@broker.should_receive(:publish).and_return(@broker_ids).times(3)
|
519
578
|
@instance.send_retryable_request('/welcome/aboard', 'iZac') do |response|
|
520
579
|
result = RightScale::OperationResult.from_results(response)
|
@@ -537,7 +596,7 @@ describe RightScale::Sender do
|
|
537
596
|
@agent.should_receive(:options).and_return({:retry_timeout => 0.5, :retry_interval => 0.1})
|
538
597
|
RightScale::Sender.new(@agent)
|
539
598
|
@instance = RightScale::Sender.instance
|
540
|
-
flexmock(@instance).should_receive(:
|
599
|
+
flexmock(@instance.connectivity_checker).should_receive(:check).once
|
541
600
|
@broker.should_receive(:publish).with(hsh(:name => "request"), on do |request|
|
542
601
|
request.expires_at.should == (expires_at ||= request.expires_at)
|
543
602
|
end, hsh(:persistent => false, :mandatory => true)).and_return(@broker_ids).twice
|
@@ -554,16 +613,16 @@ describe RightScale::Sender do
|
|
554
613
|
|
555
614
|
it "should not check connection if check already in progress" do
|
556
615
|
flexmock(EM::Timer).should_receive(:new).and_return(@timer).never
|
557
|
-
@instance.
|
616
|
+
@instance.connectivity_checker.ping_timer = true
|
558
617
|
flexmock(@instance).should_receive(:publish).never
|
559
|
-
@instance.
|
618
|
+
@instance.connectivity_checker.check(@broker_ids)
|
560
619
|
end
|
561
620
|
|
562
621
|
it "should publish ping to mapper" do
|
563
622
|
flexmock(EM::Timer).should_receive(:new).and_return(@timer).once
|
564
623
|
flexmock(@instance).should_receive(:publish).with(on { |request| request.type.should == "/mapper/ping" },
|
565
624
|
@broker_ids).and_return(@broker_ids).once
|
566
|
-
@instance.
|
625
|
+
@instance.connectivity_checker.check(@broker_id)
|
567
626
|
@instance.pending_requests.size.should == 1
|
568
627
|
end
|
569
628
|
|
@@ -572,19 +631,19 @@ describe RightScale::Sender do
|
|
572
631
|
@timer.should_receive(:cancel).once
|
573
632
|
flexmock(EM::Timer).should_receive(:new).and_return(@timer).once
|
574
633
|
flexmock(@instance).should_receive(:publish).and_return(@broker_ids).once
|
575
|
-
@instance.
|
576
|
-
@instance.
|
634
|
+
@instance.connectivity_checker.check(@broker_id)
|
635
|
+
@instance.connectivity_checker.ping_timer.should == @timer
|
577
636
|
@instance.pending_requests.size.should == 1
|
578
|
-
@instance.pending_requests['abc']
|
579
|
-
@instance.
|
637
|
+
@instance.pending_requests['abc'].response_handler.call(nil)
|
638
|
+
@instance.connectivity_checker.ping_timer.should == nil
|
580
639
|
end
|
581
640
|
|
582
641
|
it "should try to reconnect if ping times out" do
|
583
642
|
@log.should_receive(:warning).once
|
584
643
|
flexmock(EM::Timer).should_receive(:new).and_yield.once
|
585
644
|
flexmock(@agent).should_receive(:connect).once
|
586
|
-
@instance.
|
587
|
-
@instance.
|
645
|
+
@instance.connectivity_checker.check(@broker_id)
|
646
|
+
@instance.connectivity_checker.ping_timer.should == nil
|
588
647
|
end
|
589
648
|
|
590
649
|
it "should log error if attempt to reconnect fails" do
|
@@ -592,7 +651,7 @@ describe RightScale::Sender do
|
|
592
651
|
@log.should_receive(:error).with(/Failed to reconnect/, Exception, :trace).once
|
593
652
|
flexmock(@agent).should_receive(:connect).and_raise(Exception)
|
594
653
|
flexmock(EM::Timer).should_receive(:new).and_yield.once
|
595
|
-
@instance.
|
654
|
+
@instance.connectivity_checker.check(@broker_id)
|
596
655
|
end
|
597
656
|
end
|
598
657
|
end
|
@@ -668,10 +727,17 @@ describe RightScale::Sender do
|
|
668
727
|
flexmock(RightScale::AgentIdentity, :generate => 'token1')
|
669
728
|
end
|
670
729
|
|
671
|
-
it "should deliver the response" do
|
730
|
+
it "should deliver the response for a Request" do
|
672
731
|
@instance.send_retryable_request('/welcome/aboard', 'iZac') {|_|}
|
673
732
|
response = RightScale::Result.new('token1', 'to', RightScale::OperationResult.success, 'target1')
|
674
|
-
flexmock(@instance).should_receive(:deliver).with(response,
|
733
|
+
flexmock(@instance).should_receive(:deliver).with(response, RightScale::Sender::PendingRequest).once
|
734
|
+
@instance.handle_response(response)
|
735
|
+
end
|
736
|
+
|
737
|
+
it "should deliver the response for a Push" do
|
738
|
+
@instance.send_push('/welcome/aboard', 'iZac') {|_|}
|
739
|
+
response = RightScale::Result.new('token1', 'to', RightScale::OperationResult.success, 'target1')
|
740
|
+
flexmock(@instance).should_receive(:deliver).with(response, RightScale::Sender::PendingRequest).once
|
675
741
|
@instance.handle_response(response)
|
676
742
|
end
|
677
743
|
|
@@ -691,7 +757,7 @@ describe RightScale::Sender do
|
|
691
757
|
non_delivery = RightScale::OperationResult.non_delivery(RightScale::OperationResult::NO_ROUTE_TO_TARGET)
|
692
758
|
response = RightScale::Result.new('token1', 'to', non_delivery, 'target1')
|
693
759
|
@instance.handle_response(response)
|
694
|
-
@instance.instance_variable_get(:@
|
760
|
+
@instance.instance_variable_get(:@non_delivery_stats).total.should == 1
|
695
761
|
end
|
696
762
|
|
697
763
|
it "should log non-delivery if there is no response handler" do
|
@@ -724,7 +790,7 @@ describe RightScale::Sender do
|
|
724
790
|
flexmock(RightScale::AgentIdentity, :generate => 'token1')
|
725
791
|
end
|
726
792
|
|
727
|
-
it "should delete all associated pending requests" do
|
793
|
+
it "should delete all associated pending Request requests" do
|
728
794
|
@instance.send_retryable_request('/welcome/aboard', 'iZac') {|_|}
|
729
795
|
@instance.pending_requests['token1'].should_not be_nil
|
730
796
|
response = RightScale::Result.new('token1', 'to', RightScale::OperationResult.success, 'target1')
|
@@ -732,11 +798,19 @@ describe RightScale::Sender do
|
|
732
798
|
@instance.pending_requests['token1'].should be_nil
|
733
799
|
end
|
734
800
|
|
801
|
+
it "should not delete any pending Push requests" do
|
802
|
+
@instance.send_push('/welcome/aboard', 'iZac') {|_|}
|
803
|
+
@instance.pending_requests['token1'].should_not be_nil
|
804
|
+
response = RightScale::Result.new('token1', 'to', RightScale::OperationResult.success, 'target1')
|
805
|
+
@instance.handle_response(response)
|
806
|
+
@instance.pending_requests['token1'].should_not be_nil
|
807
|
+
end
|
808
|
+
|
735
809
|
it "should delete any associated retry requests" do
|
736
810
|
@instance.send_retryable_request('/welcome/aboard', 'iZac') {|_|}
|
737
811
|
@instance.pending_requests['token1'].should_not be_nil
|
738
812
|
@instance.pending_requests['token2'] = @instance.pending_requests['token1'].dup
|
739
|
-
@instance.pending_requests['token2']
|
813
|
+
@instance.pending_requests['token2'].retry_parent = 'token1'
|
740
814
|
response = RightScale::Result.new('token2', 'to', RightScale::OperationResult.success, 'target1')
|
741
815
|
@instance.handle_response(response)
|
742
816
|
@instance.pending_requests['token1'].should be_nil
|
@@ -799,52 +873,52 @@ describe RightScale::Sender do
|
|
799
873
|
end
|
800
874
|
|
801
875
|
it 'should vote for restart after the maximum number of queued requests is reached' do
|
802
|
-
@instance.instance_variable_get(:@restart_vote_count).should == 0
|
876
|
+
@instance.offline_handler.instance_variable_get(:@restart_vote_count).should == 0
|
803
877
|
EM.run do
|
804
878
|
@instance.enable_offline_mode
|
805
|
-
@instance.
|
879
|
+
@instance.offline_handler.queue = ('*' * (RightScale::Sender::OfflineHandler::MAX_QUEUED_REQUESTS - 1)).split(//)
|
806
880
|
@instance.send_push('/dummy', 'payload')
|
807
881
|
EM.next_tick { EM.stop }
|
808
882
|
end
|
809
|
-
@instance.
|
810
|
-
@instance.instance_variable_get(:@restart_vote_count).should == 1
|
883
|
+
@instance.offline_handler.queue.size.should == RightScale::Sender::OfflineHandler::MAX_QUEUED_REQUESTS
|
884
|
+
@instance.offline_handler.instance_variable_get(:@restart_vote_count).should == 1
|
811
885
|
end
|
812
886
|
|
813
887
|
it 'should vote for restart after the threshold delay is reached' do
|
814
|
-
old_vote_delay = RightScale::Sender::RESTART_VOTE_DELAY
|
888
|
+
old_vote_delay = RightScale::Sender::OfflineHandler::RESTART_VOTE_DELAY
|
815
889
|
begin
|
816
|
-
RightScale::Sender.const_set(:RESTART_VOTE_DELAY, 0.1)
|
817
|
-
@instance.instance_variable_get(:@restart_vote_count).should == 0
|
890
|
+
RightScale::Sender::OfflineHandler.const_set(:RESTART_VOTE_DELAY, 0.1)
|
891
|
+
@instance.offline_handler.instance_variable_get(:@restart_vote_count).should == 0
|
818
892
|
EM.run do
|
819
893
|
@instance.enable_offline_mode
|
820
894
|
@instance.send_push('/dummy', 'payload')
|
821
895
|
EM.add_timer(0.5) { EM.stop }
|
822
896
|
end
|
823
|
-
@instance.instance_variable_get(:@restart_vote_count).should == 1
|
897
|
+
@instance.offline_handler.instance_variable_get(:@restart_vote_count).should == 1
|
824
898
|
ensure
|
825
|
-
RightScale::Sender.const_set(:RESTART_VOTE_DELAY, old_vote_delay)
|
899
|
+
RightScale::Sender::OfflineHandler.const_set(:RESTART_VOTE_DELAY, old_vote_delay)
|
826
900
|
end
|
827
901
|
end
|
828
902
|
|
829
903
|
it 'should not flush queued requests until back online' do
|
830
|
-
old_flush_delay = RightScale::Sender::MAX_QUEUE_FLUSH_DELAY
|
904
|
+
old_flush_delay = RightScale::Sender::OfflineHandler::MAX_QUEUE_FLUSH_DELAY
|
831
905
|
begin
|
832
|
-
RightScale::Sender.const_set(:MAX_QUEUE_FLUSH_DELAY, 0.1)
|
906
|
+
RightScale::Sender::OfflineHandler.const_set(:MAX_QUEUE_FLUSH_DELAY, 0.1)
|
833
907
|
EM.run do
|
834
908
|
@instance.enable_offline_mode
|
835
909
|
@instance.send_push('/dummy', 'payload')
|
836
910
|
EM.add_timer(0.5) { EM.stop }
|
837
911
|
end
|
838
912
|
ensure
|
839
|
-
RightScale::Sender.const_set(:MAX_QUEUE_FLUSH_DELAY, old_flush_delay)
|
913
|
+
RightScale::Sender::OfflineHandler.const_set(:MAX_QUEUE_FLUSH_DELAY, old_flush_delay)
|
840
914
|
end
|
841
915
|
end
|
842
916
|
|
843
917
|
it 'should flush queued requests once back online' do
|
844
|
-
old_flush_delay = RightScale::Sender::MAX_QUEUE_FLUSH_DELAY
|
918
|
+
old_flush_delay = RightScale::Sender::OfflineHandler::MAX_QUEUE_FLUSH_DELAY
|
845
919
|
@broker.should_receive(:publish).once.and_return { EM.stop }
|
846
920
|
begin
|
847
|
-
RightScale::Sender.const_set(:MAX_QUEUE_FLUSH_DELAY, 0.1)
|
921
|
+
RightScale::Sender::OfflineHandler.const_set(:MAX_QUEUE_FLUSH_DELAY, 0.1)
|
848
922
|
EM.run do
|
849
923
|
@instance.enable_offline_mode
|
850
924
|
@instance.send_push('/dummy', 'payload')
|
@@ -852,34 +926,31 @@ describe RightScale::Sender do
|
|
852
926
|
EM.add_timer(1) { EM.stop }
|
853
927
|
end
|
854
928
|
ensure
|
855
|
-
RightScale::Sender.const_set(:MAX_QUEUE_FLUSH_DELAY, old_flush_delay)
|
929
|
+
RightScale::Sender::OfflineHandler.const_set(:MAX_QUEUE_FLUSH_DELAY, old_flush_delay)
|
856
930
|
end
|
857
931
|
end
|
858
932
|
|
859
933
|
it 'should stop flushing when going back to offline mode' do
|
860
|
-
old_flush_delay = RightScale::Sender::MAX_QUEUE_FLUSH_DELAY
|
934
|
+
old_flush_delay = RightScale::Sender::OfflineHandler::MAX_QUEUE_FLUSH_DELAY
|
861
935
|
begin
|
862
|
-
RightScale::Sender.const_set(:MAX_QUEUE_FLUSH_DELAY, 0.1)
|
936
|
+
RightScale::Sender::OfflineHandler.const_set(:MAX_QUEUE_FLUSH_DELAY, 0.1)
|
863
937
|
EM.run do
|
864
938
|
@instance.enable_offline_mode
|
865
939
|
@instance.send_push('/dummy', 'payload')
|
866
940
|
@instance.disable_offline_mode
|
867
|
-
@instance.
|
868
|
-
@instance.
|
869
|
-
@instance.instance_variable_get(:@queueing_mode).should == :offline
|
941
|
+
@instance.offline_handler.state.should == :flushing
|
942
|
+
@instance.offline_handler.mode.should == :offline
|
870
943
|
@instance.enable_offline_mode
|
871
|
-
@instance.
|
872
|
-
@instance.
|
873
|
-
@instance.instance_variable_get(:@queueing_mode).should == :offline
|
944
|
+
@instance.offline_handler.state.should == :running
|
945
|
+
@instance.offline_handler.mode.should == :offline
|
874
946
|
EM.add_timer(1) do
|
875
|
-
@instance.
|
876
|
-
@instance.
|
877
|
-
@instance.instance_variable_get(:@queueing_mode).should == :offline
|
947
|
+
@instance.offline_handler.state.should == :running
|
948
|
+
@instance.offline_handler.mode.should == :offline
|
878
949
|
EM.stop
|
879
950
|
end
|
880
951
|
end
|
881
952
|
ensure
|
882
|
-
RightScale::Sender.const_set(:MAX_QUEUE_FLUSH_DELAY, old_flush_delay)
|
953
|
+
RightScale::Sender::OfflineHandler.const_set(:MAX_QUEUE_FLUSH_DELAY, old_flush_delay)
|
883
954
|
end
|
884
955
|
end
|
885
956
|
end
|