right_agent 2.0.7-x86-mingw32
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/LICENSE +20 -0
- data/README.rdoc +82 -0
- data/Rakefile +113 -0
- data/lib/right_agent.rb +59 -0
- data/lib/right_agent/actor.rb +182 -0
- data/lib/right_agent/actor_registry.rb +76 -0
- data/lib/right_agent/actors/agent_manager.rb +232 -0
- data/lib/right_agent/agent.rb +1149 -0
- data/lib/right_agent/agent_config.rb +480 -0
- data/lib/right_agent/agent_identity.rb +210 -0
- data/lib/right_agent/agent_tag_manager.rb +237 -0
- data/lib/right_agent/audit_formatter.rb +107 -0
- data/lib/right_agent/clients.rb +31 -0
- data/lib/right_agent/clients/api_client.rb +383 -0
- data/lib/right_agent/clients/auth_client.rb +247 -0
- data/lib/right_agent/clients/balanced_http_client.rb +369 -0
- data/lib/right_agent/clients/base_retry_client.rb +495 -0
- data/lib/right_agent/clients/right_http_client.rb +279 -0
- data/lib/right_agent/clients/router_client.rb +493 -0
- data/lib/right_agent/command.rb +30 -0
- data/lib/right_agent/command/agent_manager_commands.rb +150 -0
- data/lib/right_agent/command/command_client.rb +136 -0
- data/lib/right_agent/command/command_constants.rb +33 -0
- data/lib/right_agent/command/command_io.rb +126 -0
- data/lib/right_agent/command/command_parser.rb +87 -0
- data/lib/right_agent/command/command_runner.rb +118 -0
- data/lib/right_agent/command/command_serializer.rb +63 -0
- data/lib/right_agent/connectivity_checker.rb +179 -0
- data/lib/right_agent/console.rb +65 -0
- data/lib/right_agent/core_payload_types.rb +44 -0
- data/lib/right_agent/core_payload_types/cookbook.rb +61 -0
- data/lib/right_agent/core_payload_types/cookbook_position.rb +46 -0
- data/lib/right_agent/core_payload_types/cookbook_repository.rb +116 -0
- data/lib/right_agent/core_payload_types/cookbook_sequence.rb +70 -0
- data/lib/right_agent/core_payload_types/dev_repositories.rb +100 -0
- data/lib/right_agent/core_payload_types/dev_repository.rb +76 -0
- data/lib/right_agent/core_payload_types/event_categories.rb +38 -0
- data/lib/right_agent/core_payload_types/executable_bundle.rb +130 -0
- data/lib/right_agent/core_payload_types/login_policy.rb +72 -0
- data/lib/right_agent/core_payload_types/login_user.rb +79 -0
- data/lib/right_agent/core_payload_types/planned_volume.rb +94 -0
- data/lib/right_agent/core_payload_types/recipe_instantiation.rb +73 -0
- data/lib/right_agent/core_payload_types/repositories_bundle.rb +50 -0
- data/lib/right_agent/core_payload_types/right_script_attachment.rb +95 -0
- data/lib/right_agent/core_payload_types/right_script_instantiation.rb +94 -0
- data/lib/right_agent/core_payload_types/runlist_policy.rb +44 -0
- data/lib/right_agent/core_payload_types/secure_document.rb +66 -0
- data/lib/right_agent/core_payload_types/secure_document_location.rb +63 -0
- data/lib/right_agent/core_payload_types/software_repository_instantiation.rb +61 -0
- data/lib/right_agent/daemonize.rb +35 -0
- data/lib/right_agent/dispatched_cache.rb +109 -0
- data/lib/right_agent/dispatcher.rb +272 -0
- data/lib/right_agent/enrollment_result.rb +221 -0
- data/lib/right_agent/exceptions.rb +87 -0
- data/lib/right_agent/history.rb +145 -0
- data/lib/right_agent/log.rb +460 -0
- data/lib/right_agent/minimal.rb +46 -0
- data/lib/right_agent/monkey_patches.rb +30 -0
- data/lib/right_agent/monkey_patches/ruby_patch.rb +55 -0
- data/lib/right_agent/monkey_patches/ruby_patch/array_patch.rb +29 -0
- data/lib/right_agent/monkey_patches/ruby_patch/darwin_patch.rb +24 -0
- data/lib/right_agent/monkey_patches/ruby_patch/linux_patch.rb +24 -0
- data/lib/right_agent/monkey_patches/ruby_patch/linux_patch/file_patch.rb +30 -0
- data/lib/right_agent/monkey_patches/ruby_patch/object_patch.rb +49 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch.rb +32 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/file_patch.rb +60 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/process_patch.rb +63 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/stdio_patch.rb +27 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/time_patch.rb +55 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/win32ole_patch.rb +34 -0
- data/lib/right_agent/multiplexer.rb +102 -0
- data/lib/right_agent/offline_handler.rb +270 -0
- data/lib/right_agent/operation_result.rb +300 -0
- data/lib/right_agent/packets.rb +673 -0
- data/lib/right_agent/payload_formatter.rb +104 -0
- data/lib/right_agent/pending_requests.rb +128 -0
- data/lib/right_agent/pid_file.rb +159 -0
- data/lib/right_agent/platform.rb +770 -0
- data/lib/right_agent/platform/unix/darwin/platform.rb +102 -0
- data/lib/right_agent/platform/unix/linux/platform.rb +305 -0
- data/lib/right_agent/platform/unix/platform.rb +226 -0
- data/lib/right_agent/platform/windows/mingw/platform.rb +447 -0
- data/lib/right_agent/platform/windows/mswin/platform.rb +236 -0
- data/lib/right_agent/platform/windows/platform.rb +1808 -0
- data/lib/right_agent/protocol_version_mixin.rb +69 -0
- data/lib/right_agent/retryable_request.rb +195 -0
- data/lib/right_agent/scripts/agent_controller.rb +543 -0
- data/lib/right_agent/scripts/agent_deployer.rb +400 -0
- data/lib/right_agent/scripts/common_parser.rb +160 -0
- data/lib/right_agent/scripts/log_level_manager.rb +192 -0
- data/lib/right_agent/scripts/stats_manager.rb +268 -0
- data/lib/right_agent/scripts/usage.rb +58 -0
- data/lib/right_agent/secure_identity.rb +92 -0
- data/lib/right_agent/security.rb +32 -0
- data/lib/right_agent/security/cached_certificate_store_proxy.rb +77 -0
- data/lib/right_agent/security/certificate.rb +102 -0
- data/lib/right_agent/security/certificate_cache.rb +89 -0
- data/lib/right_agent/security/distinguished_name.rb +56 -0
- data/lib/right_agent/security/encrypted_document.rb +83 -0
- data/lib/right_agent/security/rsa_key_pair.rb +76 -0
- data/lib/right_agent/security/signature.rb +86 -0
- data/lib/right_agent/security/static_certificate_store.rb +85 -0
- data/lib/right_agent/sender.rb +792 -0
- data/lib/right_agent/serialize.rb +29 -0
- data/lib/right_agent/serialize/message_pack.rb +107 -0
- data/lib/right_agent/serialize/secure_serializer.rb +151 -0
- data/lib/right_agent/serialize/secure_serializer_initializer.rb +47 -0
- data/lib/right_agent/serialize/serializable.rb +151 -0
- data/lib/right_agent/serialize/serializer.rb +159 -0
- data/lib/right_agent/subprocess.rb +38 -0
- data/lib/right_agent/tracer.rb +124 -0
- data/right_agent.gemspec +101 -0
- data/spec/actor_registry_spec.rb +80 -0
- data/spec/actor_spec.rb +162 -0
- data/spec/agent_config_spec.rb +235 -0
- data/spec/agent_identity_spec.rb +78 -0
- data/spec/agent_spec.rb +734 -0
- data/spec/agent_tag_manager_spec.rb +319 -0
- data/spec/clients/api_client_spec.rb +423 -0
- data/spec/clients/auth_client_spec.rb +272 -0
- data/spec/clients/balanced_http_client_spec.rb +576 -0
- data/spec/clients/base_retry_client_spec.rb +635 -0
- data/spec/clients/router_client_spec.rb +594 -0
- data/spec/clients/spec_helper.rb +111 -0
- data/spec/command/agent_manager_commands_spec.rb +51 -0
- data/spec/command/command_io_spec.rb +93 -0
- data/spec/command/command_parser_spec.rb +79 -0
- data/spec/command/command_runner_spec.rb +107 -0
- data/spec/command/command_serializer_spec.rb +51 -0
- data/spec/connectivity_checker_spec.rb +83 -0
- data/spec/core_payload_types/dev_repositories_spec.rb +64 -0
- data/spec/core_payload_types/dev_repository_spec.rb +33 -0
- data/spec/core_payload_types/executable_bundle_spec.rb +67 -0
- data/spec/core_payload_types/login_user_spec.rb +102 -0
- data/spec/core_payload_types/recipe_instantiation_spec.rb +81 -0
- data/spec/core_payload_types/right_script_attachment_spec.rb +65 -0
- data/spec/core_payload_types/right_script_instantiation_spec.rb +79 -0
- data/spec/core_payload_types/spec_helper.rb +23 -0
- data/spec/dispatched_cache_spec.rb +136 -0
- data/spec/dispatcher_spec.rb +324 -0
- data/spec/enrollment_result_spec.rb +53 -0
- data/spec/history_spec.rb +246 -0
- data/spec/log_spec.rb +192 -0
- data/spec/monkey_patches/eventmachine_spec.rb +62 -0
- data/spec/multiplexer_spec.rb +48 -0
- data/spec/offline_handler_spec.rb +340 -0
- data/spec/operation_result_spec.rb +208 -0
- data/spec/packets_spec.rb +461 -0
- data/spec/pending_requests_spec.rb +136 -0
- data/spec/platform/spec_helper.rb +216 -0
- data/spec/platform/unix/darwin/platform_spec.rb +181 -0
- data/spec/platform/unix/linux/platform_spec.rb +540 -0
- data/spec/platform/unix/spec_helper.rb +149 -0
- data/spec/platform/windows/mingw/platform_spec.rb +222 -0
- data/spec/platform/windows/mswin/platform_spec.rb +259 -0
- data/spec/platform/windows/spec_helper.rb +720 -0
- data/spec/retryable_request_spec.rb +306 -0
- data/spec/secure_identity_spec.rb +50 -0
- data/spec/security/cached_certificate_store_proxy_spec.rb +62 -0
- data/spec/security/certificate_cache_spec.rb +71 -0
- data/spec/security/certificate_spec.rb +49 -0
- data/spec/security/distinguished_name_spec.rb +46 -0
- data/spec/security/encrypted_document_spec.rb +55 -0
- data/spec/security/rsa_key_pair_spec.rb +55 -0
- data/spec/security/signature_spec.rb +66 -0
- data/spec/security/static_certificate_store_spec.rb +58 -0
- data/spec/sender_spec.rb +1045 -0
- data/spec/serialize/message_pack_spec.rb +131 -0
- data/spec/serialize/secure_serializer_spec.rb +132 -0
- data/spec/serialize/serializable_spec.rb +90 -0
- data/spec/serialize/serializer_spec.rb +197 -0
- data/spec/spec.opts +2 -0
- data/spec/spec.win32.opts +1 -0
- data/spec/spec_helper.rb +130 -0
- data/spec/tracer_spec.rb +114 -0
- metadata +447 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2009-2011 RightScale Inc
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
24
|
+
|
25
|
+
describe EventMachine do
|
26
|
+
|
27
|
+
it "should not repeatedly run deferred task if task raises an exception" do
|
28
|
+
error = nil
|
29
|
+
count = 0
|
30
|
+
EM.error_handler { |e| error = e; raise e if (count += 1) > 1 }
|
31
|
+
|
32
|
+
begin
|
33
|
+
EM.run do
|
34
|
+
EM.add_timer(1) { EM.next_tick { EM.stop } }
|
35
|
+
EM.next_tick { raise 'test' }
|
36
|
+
end
|
37
|
+
rescue Exception => error
|
38
|
+
error.should == nil
|
39
|
+
end
|
40
|
+
|
41
|
+
EM.error_handler(nil)
|
42
|
+
|
43
|
+
error.class.should == RuntimeError
|
44
|
+
error.message.should == 'test'
|
45
|
+
count.should == 1
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should end EM loop if deferred task raises an exception and there is no error handler" do
|
49
|
+
count = 0
|
50
|
+
begin
|
51
|
+
EM.run do
|
52
|
+
EM.add_timer(0) { raise 'test' }
|
53
|
+
end
|
54
|
+
rescue Exception => error
|
55
|
+
error.class.should == RuntimeError
|
56
|
+
error.message.should == 'test'
|
57
|
+
count += 1
|
58
|
+
end
|
59
|
+
count.should == 1
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2009-2011 RightScale Inc
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
24
|
+
|
25
|
+
describe RightScale::Multiplexer do
|
26
|
+
|
27
|
+
before(:all) do
|
28
|
+
@target1 = flexmock('Target 1')
|
29
|
+
@target2 = flexmock('Target 2')
|
30
|
+
@target3 = flexmock('Target 3')
|
31
|
+
@multiplexer = RightScale::Multiplexer.new(@target1, @target2, @target3)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should multiplex' do
|
35
|
+
@target1.should_receive(:some_method).once.with('arg', 'arg2').once
|
36
|
+
@target2.should_receive(:some_method).once.with('arg', 'arg2').once
|
37
|
+
@target3.should_receive(:some_method).once.with('arg', 'arg2').once
|
38
|
+
@multiplexer.some_method('arg', 'arg2')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should retrieve the first result' do
|
42
|
+
@target1.should_receive(:some_method).once.with('arg', 'arg2').and_return('res1').once
|
43
|
+
@target2.should_receive(:some_method).once.with('arg', 'arg2').and_return('res2').once
|
44
|
+
@target3.should_receive(:some_method).once.with('arg', 'arg2').and_return('res3').once
|
45
|
+
@multiplexer.some_method('arg', 'arg2').should == 'res1'
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,340 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2013 RightScale Inc
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
24
|
+
|
25
|
+
describe RightScale::OfflineHandler do
|
26
|
+
|
27
|
+
include FlexMock::ArgumentTypes
|
28
|
+
|
29
|
+
before(:each) do
|
30
|
+
@vote = 0
|
31
|
+
@restart_callback = lambda { @vote += 1 }
|
32
|
+
@offline_stats = RightSupport::Stats::Activity.new
|
33
|
+
@handler = RightScale::OfflineHandler.new(@restart_callback, @offline_stats)
|
34
|
+
end
|
35
|
+
|
36
|
+
context :initialize do
|
37
|
+
it "sets initial state to created and mode to initializing" do
|
38
|
+
@handler.state == :created
|
39
|
+
@handler.mode == :initializing
|
40
|
+
@handler.queue.size.should == 0
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context :init do
|
45
|
+
it "advances state from created to initializing so that new requests get prepended to queue" do
|
46
|
+
@handler.state.should == :created
|
47
|
+
@handler.init.should be_true
|
48
|
+
@handler.state.should == :initializing
|
49
|
+
end
|
50
|
+
|
51
|
+
it "does nothing if not in the created state" do
|
52
|
+
@handler.init
|
53
|
+
@handler.start
|
54
|
+
state = @handler.state
|
55
|
+
state.should_not == :created
|
56
|
+
@handler.init.should be_true
|
57
|
+
@handler.state.should == state
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context :start do
|
62
|
+
it "sets state to running if in offline mode" do
|
63
|
+
@handler.init
|
64
|
+
flexmock(@handler).should_receive(:start_timer)
|
65
|
+
@handler.enable
|
66
|
+
@handler.start.should be_true
|
67
|
+
@handler.state.should == :running
|
68
|
+
@handler.mode.should == :offline
|
69
|
+
end
|
70
|
+
|
71
|
+
it "sets state to flushing and flushes if not in offline mode" do
|
72
|
+
@handler.init
|
73
|
+
flexmock(@handler).should_receive(:flush).once
|
74
|
+
@handler.start.should be_true
|
75
|
+
@handler.state.should == :flushing
|
76
|
+
@handler.mode.should == :online
|
77
|
+
end
|
78
|
+
|
79
|
+
it "does nothing if not in initializing state" do
|
80
|
+
@handler.state.should == :created
|
81
|
+
@handler.start.should be_true
|
82
|
+
@handler.state.should == :created
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context :offline? do
|
87
|
+
it "indicates that offline when initially created" do
|
88
|
+
@handler.offline?.should be_true
|
89
|
+
end
|
90
|
+
|
91
|
+
it "indicates that not offline after initialize offline queueing" do
|
92
|
+
@handler.init
|
93
|
+
@handler.offline?.should be_false
|
94
|
+
end
|
95
|
+
|
96
|
+
it "indicates that offline when offline has been enabled" do
|
97
|
+
@handler.init
|
98
|
+
flexmock(@handler).should_receive(:start_timer)
|
99
|
+
@handler.enable
|
100
|
+
@handler.offline?.should be_true
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context :queueing? do
|
105
|
+
it "indicates that should queue when initially created" do
|
106
|
+
@handler.queueing?.should be_true
|
107
|
+
end
|
108
|
+
|
109
|
+
it "indicates that should not queue once initialize offline queueing" do
|
110
|
+
@handler.init
|
111
|
+
@handler.queueing?.should be_false
|
112
|
+
end
|
113
|
+
|
114
|
+
it "indicates that should queue when offline has been enabled" do
|
115
|
+
@handler.init
|
116
|
+
flexmock(@handler).should_receive(:start_timer)
|
117
|
+
@handler.enable
|
118
|
+
@handler.queueing?.should be_true
|
119
|
+
end
|
120
|
+
|
121
|
+
it "indicates that should not queue if offline but currently flushing" do
|
122
|
+
@handler.init
|
123
|
+
@handler.queueing?.should be_false
|
124
|
+
@handler.start
|
125
|
+
@handler.queueing?.should be_false
|
126
|
+
flexmock(@handler).should_receive(:start_timer)
|
127
|
+
@handler.enable
|
128
|
+
@handler.queueing?.should be_true
|
129
|
+
flexmock(EM).should_receive(:add_timer)
|
130
|
+
@handler.disable
|
131
|
+
@handler.state.should == :flushing
|
132
|
+
@handler.mode.should == :offline
|
133
|
+
@handler.queueing?.should be_false
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
context :enable do
|
138
|
+
it "goes into offline mode if not offline now" do
|
139
|
+
@handler.init
|
140
|
+
@handler.start
|
141
|
+
flexmock(@handler).should_receive(:start_timer)
|
142
|
+
@handler.enable.should be_true
|
143
|
+
@handler.state.should == :running
|
144
|
+
@handler.mode.should == :offline
|
145
|
+
end
|
146
|
+
|
147
|
+
it "starts restart vote timer when after going into offline mode" do
|
148
|
+
@handler.init
|
149
|
+
@handler.start
|
150
|
+
flexmock(EM::Timer).should_receive(:new).once
|
151
|
+
@handler.enable.should be_true
|
152
|
+
end
|
153
|
+
|
154
|
+
it "sets state to running if was offline and now in flushing state" do
|
155
|
+
@handler.init
|
156
|
+
@handler.start
|
157
|
+
flexmock(@handler).should_receive(:start_timer)
|
158
|
+
@handler.enable
|
159
|
+
flexmock(EM).should_receive(:add_timer)
|
160
|
+
@handler.disable
|
161
|
+
@handler.enable.should be_true
|
162
|
+
@handler.state.should == :running
|
163
|
+
@handler.mode.should == :offline
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context :disable do
|
168
|
+
it "sets state to flushing and starts timer to begin flushing" do
|
169
|
+
@handler.init
|
170
|
+
@handler.start
|
171
|
+
flexmock(@handler).should_receive(:start_timer)
|
172
|
+
@handler.enable
|
173
|
+
flexmock(@handler).should_receive(:cancel_timer).once
|
174
|
+
flexmock(EM).should_receive(:add_timer).once
|
175
|
+
@handler.disable.should be_true
|
176
|
+
@handler.state.should == :flushing
|
177
|
+
end
|
178
|
+
|
179
|
+
it "does nothing if in created state" do
|
180
|
+
@handler.disable.should be_true
|
181
|
+
end
|
182
|
+
|
183
|
+
it "does nothing if not offline" do
|
184
|
+
@handler.init
|
185
|
+
@handler.disable.should be_true
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
context :queue_request do
|
190
|
+
before(:each) do
|
191
|
+
@kind = :send_request
|
192
|
+
@type = "/foo/bar"
|
193
|
+
@payload = {:pay => "load"}
|
194
|
+
@target = "target"
|
195
|
+
@callback = lambda { |_| }
|
196
|
+
end
|
197
|
+
|
198
|
+
it "queues request at head of queue if still initializing" do
|
199
|
+
@handler.init
|
200
|
+
@handler.queue_request(@kind, @type, @payload, "target1", @callback).should be_true
|
201
|
+
@handler.queue.size.should == 1
|
202
|
+
@handler.queue_request(@kind, @type, @payload, "target2", @callback).should be_true
|
203
|
+
@handler.queue.size.should == 2
|
204
|
+
@handler.queue.first[:target] == "target2"
|
205
|
+
end
|
206
|
+
|
207
|
+
it "queues request at end of queue if no longer initializing" do
|
208
|
+
@handler.init
|
209
|
+
@handler.start
|
210
|
+
@handler.queue_request(@kind, @type, @payload, "target1", @callback)
|
211
|
+
@handler.queue.size.should == 1
|
212
|
+
@handler.queue_request(@kind, @type, @payload, "target2", @callback)
|
213
|
+
@handler.queue.size.should == 2
|
214
|
+
@handler.queue.first[:target] == "target1"
|
215
|
+
end
|
216
|
+
|
217
|
+
it "votes to restart if restart vote count has exceeded max queue length" do
|
218
|
+
@handler.init
|
219
|
+
@handler.start
|
220
|
+
flexmock(@handler).should_receive(:vote_to_restart).once
|
221
|
+
RightScale::OfflineHandler::MAX_QUEUED_REQUESTS.times do |i|
|
222
|
+
@handler.queue_request(@kind, @type, @payload, @target, @callback)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
context :terminate do
|
228
|
+
it "sets state to terminating and cancels all timers" do
|
229
|
+
@handler.init
|
230
|
+
@handler.start
|
231
|
+
@handler.terminate
|
232
|
+
@handler.state.should == :terminating
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context :flush do
|
237
|
+
before(:each) do
|
238
|
+
@sender = flexmock("sender")
|
239
|
+
flexmock(RightScale::Sender).should_receive(:instance).and_return(@sender)
|
240
|
+
@kind = :send_request
|
241
|
+
@type = "/foo/bar"
|
242
|
+
@payload = {:pay => "load"}
|
243
|
+
@target = "target"
|
244
|
+
@result = nil
|
245
|
+
@callback = lambda { |result| @result = result }
|
246
|
+
end
|
247
|
+
|
248
|
+
context "when in flushing state" do
|
249
|
+
before(:each) do
|
250
|
+
@handler.init
|
251
|
+
@handler.start
|
252
|
+
flexmock(@handler).should_receive(:start_timer)
|
253
|
+
@handler.enable
|
254
|
+
@handler.queue_request(:send_push, @type, @payload, @target, nil)
|
255
|
+
@handler.queue_request(:send_request, @type, @payload, @target, @callback)
|
256
|
+
@handler.queue.size.should == 2
|
257
|
+
flexmock(EM).should_receive(:next_tick).and_yield.once
|
258
|
+
@sender.should_receive(:send_push).with(@type, @payload, @target).once.ordered
|
259
|
+
@sender.should_receive(:send_request).with(@type, @payload, @target, Proc).and_yield("result").once.ordered
|
260
|
+
flexmock(EM).should_receive(:add_timer).and_yield.once
|
261
|
+
log = flexmock(RightScale::Log)
|
262
|
+
log.should_receive(:info).with(/Connection to RightNet re-established/).once.ordered
|
263
|
+
log.should_receive(:info).with(/Starting to flush request queue/).once.ordered
|
264
|
+
log.should_receive(:info).with(/Request queue flushed/).once.ordered
|
265
|
+
@handler.disable.should be_true
|
266
|
+
end
|
267
|
+
|
268
|
+
it "submits all queued messages to the sender" do
|
269
|
+
@handler.queue.size.should == 0
|
270
|
+
end
|
271
|
+
|
272
|
+
it "sets up for callback to be executed" do
|
273
|
+
@result.should == "result"
|
274
|
+
end
|
275
|
+
|
276
|
+
it "changes state to running and mode to online" do
|
277
|
+
@handler.state.should == :running
|
278
|
+
@handler.mode.should == :online
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
it "does nothing if not in flushing state" do
|
283
|
+
@handler.init
|
284
|
+
@handler.start
|
285
|
+
@sender.should_receive(:send_push).never
|
286
|
+
@sender.should_receive(:send_request).never
|
287
|
+
@handler.send(:flush).should be_true
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
context :vote_to_restart do
|
292
|
+
it "makes a restart vote callback" do
|
293
|
+
@handler.send(:vote_to_restart).should be_true
|
294
|
+
@vote.should == 1
|
295
|
+
@handler.instance_variable_get(:@restart_vote_count).should == 0
|
296
|
+
end
|
297
|
+
|
298
|
+
it "starts a vote timer if requested" do
|
299
|
+
flexmock(@handler).should_receive(:start_timer).once
|
300
|
+
@handler.send(:vote_to_restart, timer_trigger = true).should be_true
|
301
|
+
end
|
302
|
+
|
303
|
+
it "does nothing if there is no restart vote callback" do
|
304
|
+
@handler = RightScale::OfflineHandler.new(restart_callback = nil, @offline_stats)
|
305
|
+
flexmock(@handler).should_receive(:start_timer).never
|
306
|
+
@handler.send(:vote_to_restart, timer_trigger = true).should be_true
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
context :start_timer do
|
311
|
+
it "starts a re-vote timer" do
|
312
|
+
timer = flexmock("timer")
|
313
|
+
flexmock(EM::Timer).should_receive(:new).and_return(timer).once
|
314
|
+
@handler.send(:start_timer).should be_true
|
315
|
+
@handler.instance_variable_get(:@restart_vote_timer).should == timer
|
316
|
+
end
|
317
|
+
|
318
|
+
it "does nothing if there is not restart vote callback or if terminating" do
|
319
|
+
@handler = RightScale::OfflineHandler.new(restart_callback = nil, @offline_stats)
|
320
|
+
flexmock(EM::Timer).should_receive(:new).never
|
321
|
+
@handler.send(:start_timer).should be_true
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
context :cancel_timer do
|
326
|
+
it "cancels restart vote timer and resets the vote count" do
|
327
|
+
timer = flexmock("timer")
|
328
|
+
timer.should_receive(:cancel).once
|
329
|
+
flexmock(EM::Timer).should_receive(:new).and_return(timer)
|
330
|
+
@handler.send(:start_timer)
|
331
|
+
@handler.send(:cancel_timer).should be_true
|
332
|
+
@handler.instance_variable_get(:@restart_vote_timer).should be_nil
|
333
|
+
@handler.instance_variable_get(:@restart_vote_count).should == 0
|
334
|
+
end
|
335
|
+
|
336
|
+
it "does nothing if the restart vote timer is not running" do
|
337
|
+
@handler.send(:cancel_timer).should be_true
|
338
|
+
end
|
339
|
+
end
|
340
|
+
end
|