right_agent 0.5.1 → 0.5.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/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
|