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.
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