right_agent 2.0.7-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +82 -0
  3. data/Rakefile +113 -0
  4. data/lib/right_agent.rb +59 -0
  5. data/lib/right_agent/actor.rb +182 -0
  6. data/lib/right_agent/actor_registry.rb +76 -0
  7. data/lib/right_agent/actors/agent_manager.rb +232 -0
  8. data/lib/right_agent/agent.rb +1149 -0
  9. data/lib/right_agent/agent_config.rb +480 -0
  10. data/lib/right_agent/agent_identity.rb +210 -0
  11. data/lib/right_agent/agent_tag_manager.rb +237 -0
  12. data/lib/right_agent/audit_formatter.rb +107 -0
  13. data/lib/right_agent/clients.rb +31 -0
  14. data/lib/right_agent/clients/api_client.rb +383 -0
  15. data/lib/right_agent/clients/auth_client.rb +247 -0
  16. data/lib/right_agent/clients/balanced_http_client.rb +369 -0
  17. data/lib/right_agent/clients/base_retry_client.rb +495 -0
  18. data/lib/right_agent/clients/right_http_client.rb +279 -0
  19. data/lib/right_agent/clients/router_client.rb +493 -0
  20. data/lib/right_agent/command.rb +30 -0
  21. data/lib/right_agent/command/agent_manager_commands.rb +150 -0
  22. data/lib/right_agent/command/command_client.rb +136 -0
  23. data/lib/right_agent/command/command_constants.rb +33 -0
  24. data/lib/right_agent/command/command_io.rb +126 -0
  25. data/lib/right_agent/command/command_parser.rb +87 -0
  26. data/lib/right_agent/command/command_runner.rb +118 -0
  27. data/lib/right_agent/command/command_serializer.rb +63 -0
  28. data/lib/right_agent/connectivity_checker.rb +179 -0
  29. data/lib/right_agent/console.rb +65 -0
  30. data/lib/right_agent/core_payload_types.rb +44 -0
  31. data/lib/right_agent/core_payload_types/cookbook.rb +61 -0
  32. data/lib/right_agent/core_payload_types/cookbook_position.rb +46 -0
  33. data/lib/right_agent/core_payload_types/cookbook_repository.rb +116 -0
  34. data/lib/right_agent/core_payload_types/cookbook_sequence.rb +70 -0
  35. data/lib/right_agent/core_payload_types/dev_repositories.rb +100 -0
  36. data/lib/right_agent/core_payload_types/dev_repository.rb +76 -0
  37. data/lib/right_agent/core_payload_types/event_categories.rb +38 -0
  38. data/lib/right_agent/core_payload_types/executable_bundle.rb +130 -0
  39. data/lib/right_agent/core_payload_types/login_policy.rb +72 -0
  40. data/lib/right_agent/core_payload_types/login_user.rb +79 -0
  41. data/lib/right_agent/core_payload_types/planned_volume.rb +94 -0
  42. data/lib/right_agent/core_payload_types/recipe_instantiation.rb +73 -0
  43. data/lib/right_agent/core_payload_types/repositories_bundle.rb +50 -0
  44. data/lib/right_agent/core_payload_types/right_script_attachment.rb +95 -0
  45. data/lib/right_agent/core_payload_types/right_script_instantiation.rb +94 -0
  46. data/lib/right_agent/core_payload_types/runlist_policy.rb +44 -0
  47. data/lib/right_agent/core_payload_types/secure_document.rb +66 -0
  48. data/lib/right_agent/core_payload_types/secure_document_location.rb +63 -0
  49. data/lib/right_agent/core_payload_types/software_repository_instantiation.rb +61 -0
  50. data/lib/right_agent/daemonize.rb +35 -0
  51. data/lib/right_agent/dispatched_cache.rb +109 -0
  52. data/lib/right_agent/dispatcher.rb +272 -0
  53. data/lib/right_agent/enrollment_result.rb +221 -0
  54. data/lib/right_agent/exceptions.rb +87 -0
  55. data/lib/right_agent/history.rb +145 -0
  56. data/lib/right_agent/log.rb +460 -0
  57. data/lib/right_agent/minimal.rb +46 -0
  58. data/lib/right_agent/monkey_patches.rb +30 -0
  59. data/lib/right_agent/monkey_patches/ruby_patch.rb +55 -0
  60. data/lib/right_agent/monkey_patches/ruby_patch/array_patch.rb +29 -0
  61. data/lib/right_agent/monkey_patches/ruby_patch/darwin_patch.rb +24 -0
  62. data/lib/right_agent/monkey_patches/ruby_patch/linux_patch.rb +24 -0
  63. data/lib/right_agent/monkey_patches/ruby_patch/linux_patch/file_patch.rb +30 -0
  64. data/lib/right_agent/monkey_patches/ruby_patch/object_patch.rb +49 -0
  65. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch.rb +32 -0
  66. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/file_patch.rb +60 -0
  67. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/process_patch.rb +63 -0
  68. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/stdio_patch.rb +27 -0
  69. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/time_patch.rb +55 -0
  70. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/win32ole_patch.rb +34 -0
  71. data/lib/right_agent/multiplexer.rb +102 -0
  72. data/lib/right_agent/offline_handler.rb +270 -0
  73. data/lib/right_agent/operation_result.rb +300 -0
  74. data/lib/right_agent/packets.rb +673 -0
  75. data/lib/right_agent/payload_formatter.rb +104 -0
  76. data/lib/right_agent/pending_requests.rb +128 -0
  77. data/lib/right_agent/pid_file.rb +159 -0
  78. data/lib/right_agent/platform.rb +770 -0
  79. data/lib/right_agent/platform/unix/darwin/platform.rb +102 -0
  80. data/lib/right_agent/platform/unix/linux/platform.rb +305 -0
  81. data/lib/right_agent/platform/unix/platform.rb +226 -0
  82. data/lib/right_agent/platform/windows/mingw/platform.rb +447 -0
  83. data/lib/right_agent/platform/windows/mswin/platform.rb +236 -0
  84. data/lib/right_agent/platform/windows/platform.rb +1808 -0
  85. data/lib/right_agent/protocol_version_mixin.rb +69 -0
  86. data/lib/right_agent/retryable_request.rb +195 -0
  87. data/lib/right_agent/scripts/agent_controller.rb +543 -0
  88. data/lib/right_agent/scripts/agent_deployer.rb +400 -0
  89. data/lib/right_agent/scripts/common_parser.rb +160 -0
  90. data/lib/right_agent/scripts/log_level_manager.rb +192 -0
  91. data/lib/right_agent/scripts/stats_manager.rb +268 -0
  92. data/lib/right_agent/scripts/usage.rb +58 -0
  93. data/lib/right_agent/secure_identity.rb +92 -0
  94. data/lib/right_agent/security.rb +32 -0
  95. data/lib/right_agent/security/cached_certificate_store_proxy.rb +77 -0
  96. data/lib/right_agent/security/certificate.rb +102 -0
  97. data/lib/right_agent/security/certificate_cache.rb +89 -0
  98. data/lib/right_agent/security/distinguished_name.rb +56 -0
  99. data/lib/right_agent/security/encrypted_document.rb +83 -0
  100. data/lib/right_agent/security/rsa_key_pair.rb +76 -0
  101. data/lib/right_agent/security/signature.rb +86 -0
  102. data/lib/right_agent/security/static_certificate_store.rb +85 -0
  103. data/lib/right_agent/sender.rb +792 -0
  104. data/lib/right_agent/serialize.rb +29 -0
  105. data/lib/right_agent/serialize/message_pack.rb +107 -0
  106. data/lib/right_agent/serialize/secure_serializer.rb +151 -0
  107. data/lib/right_agent/serialize/secure_serializer_initializer.rb +47 -0
  108. data/lib/right_agent/serialize/serializable.rb +151 -0
  109. data/lib/right_agent/serialize/serializer.rb +159 -0
  110. data/lib/right_agent/subprocess.rb +38 -0
  111. data/lib/right_agent/tracer.rb +124 -0
  112. data/right_agent.gemspec +101 -0
  113. data/spec/actor_registry_spec.rb +80 -0
  114. data/spec/actor_spec.rb +162 -0
  115. data/spec/agent_config_spec.rb +235 -0
  116. data/spec/agent_identity_spec.rb +78 -0
  117. data/spec/agent_spec.rb +734 -0
  118. data/spec/agent_tag_manager_spec.rb +319 -0
  119. data/spec/clients/api_client_spec.rb +423 -0
  120. data/spec/clients/auth_client_spec.rb +272 -0
  121. data/spec/clients/balanced_http_client_spec.rb +576 -0
  122. data/spec/clients/base_retry_client_spec.rb +635 -0
  123. data/spec/clients/router_client_spec.rb +594 -0
  124. data/spec/clients/spec_helper.rb +111 -0
  125. data/spec/command/agent_manager_commands_spec.rb +51 -0
  126. data/spec/command/command_io_spec.rb +93 -0
  127. data/spec/command/command_parser_spec.rb +79 -0
  128. data/spec/command/command_runner_spec.rb +107 -0
  129. data/spec/command/command_serializer_spec.rb +51 -0
  130. data/spec/connectivity_checker_spec.rb +83 -0
  131. data/spec/core_payload_types/dev_repositories_spec.rb +64 -0
  132. data/spec/core_payload_types/dev_repository_spec.rb +33 -0
  133. data/spec/core_payload_types/executable_bundle_spec.rb +67 -0
  134. data/spec/core_payload_types/login_user_spec.rb +102 -0
  135. data/spec/core_payload_types/recipe_instantiation_spec.rb +81 -0
  136. data/spec/core_payload_types/right_script_attachment_spec.rb +65 -0
  137. data/spec/core_payload_types/right_script_instantiation_spec.rb +79 -0
  138. data/spec/core_payload_types/spec_helper.rb +23 -0
  139. data/spec/dispatched_cache_spec.rb +136 -0
  140. data/spec/dispatcher_spec.rb +324 -0
  141. data/spec/enrollment_result_spec.rb +53 -0
  142. data/spec/history_spec.rb +246 -0
  143. data/spec/log_spec.rb +192 -0
  144. data/spec/monkey_patches/eventmachine_spec.rb +62 -0
  145. data/spec/multiplexer_spec.rb +48 -0
  146. data/spec/offline_handler_spec.rb +340 -0
  147. data/spec/operation_result_spec.rb +208 -0
  148. data/spec/packets_spec.rb +461 -0
  149. data/spec/pending_requests_spec.rb +136 -0
  150. data/spec/platform/spec_helper.rb +216 -0
  151. data/spec/platform/unix/darwin/platform_spec.rb +181 -0
  152. data/spec/platform/unix/linux/platform_spec.rb +540 -0
  153. data/spec/platform/unix/spec_helper.rb +149 -0
  154. data/spec/platform/windows/mingw/platform_spec.rb +222 -0
  155. data/spec/platform/windows/mswin/platform_spec.rb +259 -0
  156. data/spec/platform/windows/spec_helper.rb +720 -0
  157. data/spec/retryable_request_spec.rb +306 -0
  158. data/spec/secure_identity_spec.rb +50 -0
  159. data/spec/security/cached_certificate_store_proxy_spec.rb +62 -0
  160. data/spec/security/certificate_cache_spec.rb +71 -0
  161. data/spec/security/certificate_spec.rb +49 -0
  162. data/spec/security/distinguished_name_spec.rb +46 -0
  163. data/spec/security/encrypted_document_spec.rb +55 -0
  164. data/spec/security/rsa_key_pair_spec.rb +55 -0
  165. data/spec/security/signature_spec.rb +66 -0
  166. data/spec/security/static_certificate_store_spec.rb +58 -0
  167. data/spec/sender_spec.rb +1045 -0
  168. data/spec/serialize/message_pack_spec.rb +131 -0
  169. data/spec/serialize/secure_serializer_spec.rb +132 -0
  170. data/spec/serialize/serializable_spec.rb +90 -0
  171. data/spec/serialize/serializer_spec.rb +197 -0
  172. data/spec/spec.opts +2 -0
  173. data/spec/spec.win32.opts +1 -0
  174. data/spec/spec_helper.rb +130 -0
  175. data/spec/tracer_spec.rb +114 -0
  176. 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