staugaard-cloudmaster 0.1.1

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 (52) hide show
  1. data/VERSION.yml +4 -0
  2. data/bin/cloudmaster +45 -0
  3. data/lib/AWS/AWS.rb +3 -0
  4. data/lib/AWS/EC2.rb +14 -0
  5. data/lib/AWS/S3.rb +14 -0
  6. data/lib/AWS/SQS.rb +14 -0
  7. data/lib/AWS/SimpleDB.rb +14 -0
  8. data/lib/MockAWS/EC2.rb +119 -0
  9. data/lib/MockAWS/S3.rb +39 -0
  10. data/lib/MockAWS/SQS.rb +82 -0
  11. data/lib/MockAWS/SimpleDB.rb +46 -0
  12. data/lib/MockAWS/clock.rb +67 -0
  13. data/lib/OriginalAWS/AWS.rb +475 -0
  14. data/lib/OriginalAWS/EC2.rb +783 -0
  15. data/lib/OriginalAWS/S3.rb +559 -0
  16. data/lib/OriginalAWS/SQS.rb +159 -0
  17. data/lib/OriginalAWS/SimpleDB.rb +460 -0
  18. data/lib/RetryAWS/EC2.rb +88 -0
  19. data/lib/RetryAWS/S3.rb +77 -0
  20. data/lib/RetryAWS/SQS.rb +109 -0
  21. data/lib/RetryAWS/SimpleDB.rb +118 -0
  22. data/lib/SafeAWS/EC2.rb +63 -0
  23. data/lib/SafeAWS/S3.rb +56 -0
  24. data/lib/SafeAWS/SQS.rb +75 -0
  25. data/lib/SafeAWS/SimpleDB.rb +88 -0
  26. data/lib/aws_context.rb +165 -0
  27. data/lib/basic_configuration.rb +120 -0
  28. data/lib/clock.rb +10 -0
  29. data/lib/factory.rb +14 -0
  30. data/lib/file_logger.rb +36 -0
  31. data/lib/inifile.rb +148 -0
  32. data/lib/instance_logger.rb +25 -0
  33. data/lib/logger_factory.rb +38 -0
  34. data/lib/periodic.rb +29 -0
  35. data/lib/string_logger.rb +29 -0
  36. data/lib/sys_logger.rb +40 -0
  37. data/lib/user_data.rb +30 -0
  38. data/test/aws-config.ini +9 -0
  39. data/test/cloudmaster-tests.rb +329 -0
  40. data/test/configuration-test.rb +62 -0
  41. data/test/daytime-policy-tests.rb +47 -0
  42. data/test/enumerator-test.rb +47 -0
  43. data/test/fixed-policy-tests.rb +50 -0
  44. data/test/instance-pool-test.rb +359 -0
  45. data/test/instance-test.rb +98 -0
  46. data/test/job-policy-test.rb +95 -0
  47. data/test/manual-policy-tests.rb +63 -0
  48. data/test/named-queue-test.rb +90 -0
  49. data/test/resource-policy-tests.rb +126 -0
  50. data/test/suite +17 -0
  51. data/test/test-config.ini +47 -0
  52. metadata +111 -0
@@ -0,0 +1,359 @@
1
+ $:.unshift(File.join(ENV['AWS_HOME'], "app"))
2
+ require 'test/unit'
3
+ require 'MockAWS/clock'
4
+ require 'logger_factory'
5
+ require 'configuration'
6
+ require 'pool_configuration'
7
+ require 'aws_context'
8
+ require 'pp'
9
+
10
+ # Test the InstancePool class.
11
+ class InstancePoolTests < Test::Unit::TestCase
12
+ def setup
13
+ LoggerFactory.setup("/tmp/test.out")
14
+ logf = LoggerFactory.create(:file)
15
+ Clock.set(0)
16
+ config_files = ['aws-config.ini', 'default-config.ini', 'test-config.ini']
17
+ Cloudmaster::Configuration.setup_config_files(config_files)
18
+ tc = Cloudmaster::Configuration.new([''], [:primes])
19
+ @cfg = Cloudmaster::PoolConfiguration.new(tc.aws, tc.default, tc.pools[0])
20
+ reporter = Cloudmaster::Reporter.setup(@cfg[:name], logf)
21
+ @cfg[:ami_id] = "ami-08856161"
22
+ @ec2 = AwsContext.setup(:mock, logf).ec2
23
+ @pool = Cloudmaster::InstancePool.new(reporter, @cfg)
24
+ end
25
+
26
+ def test_size
27
+ assert_equal(0, @pool.size)
28
+ @pool.add('iid-fake', '')
29
+ assert_equal(1, @pool.size)
30
+ end
31
+
32
+ def test_enumerator
33
+ count = 0
34
+ @pool.each {|i| count += 1}
35
+ assert_equal(0, count)
36
+ assert_equal(0, @pool.size)
37
+ @pool.add('iid-fake', '')
38
+ count = 0
39
+ @pool.each {|i| count += 1}
40
+ assert_equal(1, count)
41
+ assert_equal(1, @pool.size)
42
+ end
43
+
44
+ def test_delete
45
+ assert_equal(0, @pool.size)
46
+ inst = @pool.add('iid-fake', '')
47
+ assert_equal(1, @pool.size)
48
+ @pool.delete(inst)
49
+ assert_equal(0, @pool.size)
50
+ end
51
+
52
+ def test_find_by_id
53
+ assert_equal(nil, @pool.find_by_id('iid-fake'))
54
+ inst = @pool.add('iid-fake', '')
55
+ assert_equal(inst, @pool.find_by_id('iid-fake'))
56
+ end
57
+
58
+ def test_id_list
59
+ assert_equal([], @pool.id_list)
60
+ inst = @pool.add('iid-fake', '')
61
+ assert_equal(['iid-fake'], @pool.id_list)
62
+ end
63
+
64
+ def test_less_than_minimum
65
+ assert(!@pool.less_than_minimum?)
66
+ @cfg[:minimum_number_of_instances] = 1
67
+ assert(@pool.less_than_minimum?)
68
+ end
69
+
70
+ def test_greater_than_maximum
71
+ assert(!@pool.greater_than_maximum?)
72
+ inst = @pool.add('iid-fake1', '')
73
+ inst = @pool.add('iid-fake2', '')
74
+ inst = @pool.add('iid-fake3', '')
75
+ assert_equal(3, @pool.size)
76
+ assert(@pool.greater_than_maximum?)
77
+ end
78
+
79
+ def test_below_minimum_count
80
+ assert_equal(0, @pool.below_minimum_count)
81
+ @cfg[:minimum_number_of_instances] = 1
82
+ assert_equal(1, @pool.below_minimum_count)
83
+ end
84
+
85
+ def test_above_maximum_count
86
+ assert_equal(0, @pool.above_maximum_count)
87
+ inst = @pool.add('iid-fake1', '')
88
+ inst = @pool.add('iid-fake2', '')
89
+ inst = @pool.add('iid-fake3', '')
90
+ assert_equal(1, @pool.above_maximum_count)
91
+ end
92
+
93
+ def test_missing_public_dns_instances
94
+ assert_equal([], @pool.missing_public_dns_instances)
95
+ inst1 = @pool.add('iid-fake1', '')
96
+ assert_equal([inst1], @pool.missing_public_dns_instances)
97
+ inst2 = @pool.add('iid-fake2', 'present')
98
+ assert_equal([inst1], @pool.missing_public_dns_instances)
99
+ end
100
+
101
+ def test_missing_public_dns_ids
102
+ assert_equal([], @pool.missing_public_dns_ids)
103
+ inst1 = @pool.add('iid-fake1', '')
104
+ assert_equal(['iid-fake1'], @pool.missing_public_dns_ids)
105
+ inst2 = @pool.add('iid-fake2', 'present')
106
+ assert_equal(['iid-fake1'], @pool.missing_public_dns_ids)
107
+ end
108
+
109
+ def test_update_public_dns
110
+ assert_equal([], @pool.missing_public_dns_ids)
111
+ inst1 = @pool.add('iid-fake1', '')
112
+ assert_equal(['iid-fake1'], @pool.missing_public_dns_ids)
113
+ @pool.update_public_dns('iid-fake1', '')
114
+ assert_equal(['iid-fake1'], @pool.missing_public_dns_ids)
115
+ @pool.update_public_dns('iid-fake1', 'pub-dns-1')
116
+ assert_equal([], @pool.missing_public_dns_ids)
117
+ end
118
+
119
+ def test_hung_instances
120
+ inst1 = @pool.add('iid-fake1', '')
121
+ assert_equal([], @pool.hung_instances)
122
+ Clock.set(3600)
123
+ assert_equal([inst1], @pool.hung_instances)
124
+ end
125
+
126
+ def test_active_instances
127
+ inst1 = @pool.add('iid-fake1', '')
128
+ assert_equal([], @pool.active_instances)
129
+ msg = { :type => 'status',
130
+ :instance_id => 'iid-fake2',
131
+ :state => 'active',
132
+ :load_estimate => 1,
133
+ :timestamp => Clock.at(5)}
134
+ @pool.update_status(msg)
135
+ assert_equal([], @pool.active_instances)
136
+ msg = { :type => 'status',
137
+ :instance_id => 'iid-fake1',
138
+ :state => 'active',
139
+ :load_estimate => 1,
140
+ :timestamp => Clock.at(5)}
141
+ @pool.update_status(msg)
142
+ assert_equal([inst1], @pool.active_instances)
143
+ end
144
+
145
+ def test_shut_down_instances
146
+ assert_equal([], @pool.shut_down_instances)
147
+ inst1 = @pool.add('iid-fake1', '')
148
+ inst2 = @pool.add('iid-fake2', '')
149
+ assert_equal([], @pool.shut_down_instances)
150
+ @pool.shut_down([inst1])
151
+ assert_equal([inst1], @pool.shut_down_instances)
152
+ end
153
+
154
+ def test_active_idle_instances
155
+ inst1 = @pool.add('iid-fake1', '')
156
+ inst2 = @pool.add('iid-fake2', '')
157
+ msg = { :type => 'status',
158
+ :instance_id => 'iid-fake1',
159
+ :state => 'active',
160
+ :load_estimate => 0.5,
161
+ :timestamp => Clock.at(10)}
162
+ @pool.update_status(msg)
163
+ msg = { :type => 'status',
164
+ :instance_id => 'iid-fake2',
165
+ :state => 'active',
166
+ :load_estimate => 0,
167
+ :timestamp => Clock.at(10)}
168
+ @pool.update_status(msg)
169
+ # both are active, but only inst2 is idle
170
+ assert_equal([inst2], @pool.active_idle_instances)
171
+ end
172
+
173
+ def test_shut_down_idle_instances
174
+ inst1 = @pool.add('iid-fake1', '')
175
+ inst2 = @pool.add('iid-fake2', '')
176
+ msg = { :type => 'status',
177
+ :instance_id => 'iid-fake1',
178
+ :state => 'active',
179
+ :load_estimate => 1,
180
+ :timestamp => Clock.at(10)}
181
+ @pool.update_status(msg)
182
+ @pool.shut_down([inst1, inst2])
183
+ # both shut down, but only one idle
184
+ assert_equal([inst2], @pool.shut_down_idle_instances)
185
+ end
186
+
187
+ def test_shut_down_timeout_instances
188
+ inst1 = @pool.add('iid-fake1', '')
189
+ inst2 = @pool.add('iid-fake2', '')
190
+ @pool.shut_down([inst1])
191
+ Clock.set(1800)
192
+ @pool.shut_down([inst2])
193
+ Clock.set(3595)
194
+ assert_equal([], @pool.shut_down_timeout_instances)
195
+ Clock.set(3605)
196
+ # both shut down, but only inst1 has timed out
197
+ assert_equal([inst1], @pool.shut_down_timeout_instances)
198
+ end
199
+
200
+ def test_state_change_time
201
+ inst1 = @pool.add('iid-fake1', '')
202
+ inst2 = @pool.add('iid-fake2', '')
203
+ msg = { :type => 'status',
204
+ :instance_id => 'iid-fake1',
205
+ :state => 'active',
206
+ :load_estimate => 0.5,
207
+ :timestamp => Clock.at(10)}
208
+ @pool.update_status(msg)
209
+ Clock.set(5)
210
+ msg = { :type => 'status',
211
+ :instance_id => 'iid-fake2',
212
+ :state => 'active',
213
+ :load_estimate => 0,
214
+ :timestamp => Clock.at(10)}
215
+ @pool.update_status(msg)
216
+ assert_equal(5, @pool.state_change_time.time)
217
+ end
218
+
219
+ def test_excess_capacity
220
+ inst1 = @pool.add('iid-fake1', '')
221
+ inst2 = @pool.add('iid-fake2', '')
222
+ msg = { :type => 'status',
223
+ :instance_id => 'iid-fake1',
224
+ :state => 'active',
225
+ :load_estimate => 0.5,
226
+ :timestamp => Clock.at(10)}
227
+ @pool.update_status(msg)
228
+ msg = { :type => 'status',
229
+ :instance_id => 'iid-fake2',
230
+ :state => 'active',
231
+ :load_estimate => 0.5,
232
+ :timestamp => Clock.at(10)}
233
+ @pool.update_status(msg)
234
+ assert_equal(0.5, @pool.excess_capacity)
235
+ end
236
+
237
+ def test_total_load
238
+ inst1 = @pool.add('iid-fake1', '')
239
+ inst2 = @pool.add('iid-fake2', '')
240
+ msg = { :type => 'status',
241
+ :instance_id => 'iid-fake1',
242
+ :state => 'active',
243
+ :load_estimate => 0.5,
244
+ :timestamp => Clock.at(10)}
245
+ @pool.update_status(msg)
246
+ msg = { :type => 'status',
247
+ :instance_id => 'iid-fake2',
248
+ :state => 'active',
249
+ :load_estimate => 0.5,
250
+ :timestamp => Clock.at(10)}
251
+ @pool.update_status(msg)
252
+ assert_equal(1, @pool.total_load)
253
+ end
254
+
255
+ def test_active_set
256
+ inst1 = @pool.add('iid-fake1', 'dns-1')
257
+ inst2 = @pool.add('iid-fake2', '')
258
+ msg = { :type => 'status',
259
+ :instance_id => 'iid-fake1',
260
+ :state => 'active',
261
+ :load_estimate => 0.5,
262
+ :timestamp => Clock.at(10)}
263
+ @pool.update_status(msg)
264
+ aset = YAML.load(@pool.active_set)
265
+ assert_equal(1, aset.size)
266
+ assert_equal('iid-fake1', aset[0][:id])
267
+ assert_equal(0.5, aset[0][:load_estimate])
268
+ assert_equal('dns-1', aset[0][:public_dns])
269
+ end
270
+
271
+ def test_sorted_by_lowest_load
272
+ inst1 = @pool.add('iid-fake1', '')
273
+ inst2 = @pool.add('iid-fake2', '')
274
+ msg = { :type => 'status',
275
+ :instance_id => 'iid-fake1',
276
+ :state => 'active',
277
+ :load_estimate => 0.5,
278
+ :timestamp => Clock.at(10)}
279
+ @pool.update_status(msg)
280
+ msg = { :type => 'status',
281
+ :instance_id => 'iid-fake2',
282
+ :state => 'active',
283
+ :load_estimate => 0.4,
284
+ :timestamp => Clock.at(10)}
285
+ @pool.update_status(msg)
286
+ assert_equal([inst2, inst1], @pool.sorted_by_lowest_load)
287
+ end
288
+
289
+ def test_update_public_dns_all
290
+ id1 = @ec2.run_instances('ami-08856161')[:instances][0][:id]
291
+ inst1 = @pool.add(id1, '')
292
+ id2 = @ec2.run_instances('ami-08856161')[:instances][0][:id]
293
+ inst2 = @pool.add(id2, '')
294
+ msg = { :type => 'status',
295
+ :instance_id => id1,
296
+ :state => 'active',
297
+ :load_estimate => 0.5,
298
+ :timestamp => Clock.at(10)}
299
+ @pool.update_status(msg)
300
+ msg = { :type => 'status',
301
+ :instance_id => id2,
302
+ :state => 'active',
303
+ :load_estimate => 0.4,
304
+ :timestamp => Clock.at(10)}
305
+ @pool.update_status(msg)
306
+ assert_equal([inst1, inst2], @pool.missing_public_dns_instances)
307
+ @ec2.set_public_dns(id1, "dns-1")
308
+ @pool.update_public_dns_all
309
+ assert_equal([inst2], @pool.missing_public_dns_instances)
310
+ end
311
+
312
+ def test_our_running_instances
313
+ assert_equal(0, @pool.our_running_instances.size)
314
+ id1 = @ec2.run_instances('ami-08856161')[:instances][0][:id]
315
+ id2 = @ec2.run_instances('ami-08856161')[:instances][0][:id]
316
+ assert_equal(2, @pool.our_running_instances.size)
317
+ @ec2.set_state(id1, "stopped")
318
+ assert_equal(1, @pool.our_running_instances.size)
319
+ end
320
+
321
+ def test_audit_existing_instances_discover
322
+ id1 = @ec2.run_instances('ami-08856161')[:instances][0][:id]
323
+ id2 = @ec2.run_instances('ami-08856161')[:instances][0][:id]
324
+ @pool.audit_existing_instances
325
+ assert_equal(2, @pool.size)
326
+ end
327
+
328
+ def test_audit_existing_instances_delete
329
+ id1 = 'iid-fake1'
330
+ @pool.add(id1, 'dns-1')
331
+ id2 = @ec2.run_instances('ami-08856161')[:instances][0][:id]
332
+ @pool.add(id2, 'dns-2')
333
+ assert_equal(2, @pool.size)
334
+ @pool.audit_existing_instances
335
+ # one is known, te other is not
336
+ assert_equal(1, @pool.size)
337
+ end
338
+
339
+ def test_start_n_instances
340
+ assert_equal(0, @pool.size)
341
+ @pool.start_n_instances(2)
342
+ assert_equal(2, @pool.size)
343
+ end
344
+
345
+ def test_stop_instances
346
+ @pool.start_n_instances(2)
347
+ assert_equal(2, @pool.size)
348
+ @pool.stop_instances([@pool.find{|i| true}])
349
+ assert_equal(1, @pool.size)
350
+ end
351
+
352
+ def test_shut_down
353
+ @pool.start_n_instances(2)
354
+ assert_equal(2, @pool.size)
355
+ inst = [@pool.find{|i| true}]
356
+ sd = @pool.shut_down(inst)
357
+ assert_equal(sd, inst)
358
+ end
359
+ end
@@ -0,0 +1,98 @@
1
+ $:.unshift(File.join(ENV['AWS_HOME'], "app"))
2
+ require 'test/unit'
3
+ require 'MockAWS/clock'
4
+ require 'logger_factory'
5
+ require 'configuration'
6
+ require 'pool_configuration'
7
+ require 'pp'
8
+
9
+ # Test the Instance class.
10
+ class InstanceTests < Test::Unit::TestCase
11
+ def setup
12
+ Clock.set(0)
13
+ config_files = ['aws-config.ini', 'default-config.ini', 'test-config.ini']
14
+ Cloudmaster::Configuration.setup_config_files(config_files)
15
+ tc = Cloudmaster::Configuration.new([''], [:primes])
16
+ cfg = Cloudmaster::PoolConfiguration.new(tc.aws, tc.default, tc.pools[0])
17
+ @inst = Cloudmaster::Instance.new('iid-fake', '', cfg)
18
+ end
19
+
20
+ def state_msg(t, st)
21
+ {:timestamp => Clock.at(t), :state => st}
22
+ end
23
+
24
+ def test_update_status
25
+ # verify more recent messages are stored, but old ones skipped
26
+ @inst.update_status(state_msg(1, "active1"))
27
+ assert_equal(1, @inst.timestamp.time)
28
+ assert_equal(:active1, @inst.state)
29
+ @inst.update_status(state_msg(2, "active2"))
30
+ assert_equal(2, @inst.timestamp.time)
31
+ assert_equal(:active2, @inst.state)
32
+ @inst.update_status(state_msg(1, "active1"))
33
+ assert_equal(:active2, @inst.state)
34
+ end
35
+
36
+ def test_time_time_since_status
37
+ assert_equal(0, @inst.time_since_status)
38
+ Clock.set(5)
39
+ assert_equal(5, @inst.time_since_status)
40
+ @inst.update_status(state_msg(10, "active"))
41
+ assert_equal(0, @inst.time_since_status)
42
+ end
43
+
44
+ def test_time_since_state_change
45
+ assert_equal(0, @inst.time_since_state_change)
46
+ Clock.set(5)
47
+ assert_equal(5, @inst.time_since_state_change)
48
+ @inst.update_status(state_msg(10, "active"))
49
+ assert_equal(0, @inst.time_since_state_change)
50
+ end
51
+
52
+ def test_time_since_startup
53
+ assert_equal(0, @inst.time_since_state_change)
54
+ Clock.set(5)
55
+ assert_equal(5, @inst.time_since_state_change)
56
+ Clock.set(10)
57
+ assert_equal(10, @inst.time_since_state_change)
58
+ end
59
+
60
+ def test_report
61
+ @inst.report
62
+ assert(true)
63
+ end
64
+
65
+ def test_minimum_lifetime_elapsed
66
+ assert(! @inst.minimum_lifetime_elapsed?)
67
+ Clock.set(3600)
68
+ assert(@inst.minimum_lifetime_elapsed?)
69
+ end
70
+
71
+ def test_minimum_lifetime_elapsed
72
+ assert(! @inst.watchdog_time_elapsed?)
73
+ Clock.set(3600)
74
+ assert(@inst.watchdog_time_elapsed?)
75
+ end
76
+
77
+ def test_shutdown
78
+ assert_equal(:startup, @inst.state)
79
+ @inst.update_status(state_msg(10, "active"))
80
+ assert_equal(:active, @inst.state)
81
+ Clock.set(5)
82
+ @inst.shutdown
83
+ assert_equal(:shut_down, @inst.state)
84
+ assert_equal(5, @inst.state_change_time.time)
85
+ end
86
+
87
+ def test_activate
88
+ Clock.set(5)
89
+ @inst.shutdown
90
+ assert_equal(:shut_down, @inst.state)
91
+ @inst.activate
92
+ assert_equal(:active, @inst.state)
93
+ assert_equal(5, @inst.state_change_time.time)
94
+ end
95
+
96
+ def test_one
97
+ end
98
+ end
@@ -0,0 +1,95 @@
1
+ $:.unshift(File.join(ENV['AWS_HOME'], "app"))
2
+ require 'test/unit'
3
+ require 'MockAWS/clock'
4
+ require 'logger_factory'
5
+ require 'configuration'
6
+ require 'pool_configuration'
7
+ require 'policy_limit'
8
+ require 'aws_context'
9
+ require 'pp'
10
+
11
+ # Test the JobPolicy class.
12
+ # Make sure it adjusts the number of instances appropriately in all cases.
13
+ class JobPolicyTests < Test::Unit::TestCase
14
+ def setup
15
+ LoggerFactory.setup("/tmp/test.out")
16
+ logf = LoggerFactory.create(:file)
17
+ Clock.set(0)
18
+ config_files = ['aws-config.ini', 'default-config.ini', 'test-config.ini']
19
+ Cloudmaster::Configuration.setup_config_files(config_files)
20
+ tc = Cloudmaster::Configuration.new([''], [:primes])
21
+ cfg = Cloudmaster::PoolConfiguration.new(tc.aws, tc.default, tc.pools[0])
22
+ reporter = Cloudmaster::Reporter.setup(cfg[:name], logf)
23
+ cfg[:ami_id] = "ami-08856161"
24
+ @cfg = cfg
25
+ AwsContext.setup(:mock, logf)
26
+ @pool = Cloudmaster::InstancePool.new(reporter, @cfg)
27
+ @nq = @cfg[:work_queue] = Cloudmaster::NamedQueue.new(@cfg[:work_queue_name])
28
+ @jp = Cloudmaster::PolicyFactory.create(@cfg[:policy], reporter, @cfg, @pool)
29
+ @lp = Cloudmaster::PolicyLimit.new(reporter, @cfg, @pool)
30
+ queue_name = 'primes-work'
31
+ @queue = AwsContext.instance.sqs.list_queues(queue_name).first
32
+ @message = 'this is a test'
33
+ end
34
+
35
+ def send_work(n)
36
+ n.times { AwsContext.instance.sqs.send_message(@queue, @message)}
37
+ @nq.read_queue_depth
38
+ end
39
+
40
+ def test_idle
41
+ assert_equal(0, @jp.adjust)
42
+ end
43
+
44
+ def test_start_more
45
+ send_work(1)
46
+ # with queue depth 1 ==> 1
47
+ assert_equal(1, @jp.adjust)
48
+ # with queue depth 2 ==> 1
49
+ send_work(1)
50
+ assert_equal(1, @jp.adjust)
51
+ # with queue depth 4 ==> 2
52
+ send_work(1)
53
+ send_work(1)
54
+ assert_equal(2, @jp.adjust)
55
+ # with queue depth 6 ==> 3
56
+ send_work(1)
57
+ send_work(1)
58
+ assert_equal(3, @jp.adjust)
59
+ # with queue depth 6 ==> 2 (start_limit == 2)
60
+ assert_equal(2, @lp.adjust(@jp.adjust))
61
+
62
+ # now start 1
63
+ @pool.start_n_instances(1)
64
+ # depth is 6
65
+ assert_equal(2, @jp.adjust)
66
+ # depth is 6, but can only start 1 (max limit == 2)
67
+ assert_equal(1, @lp.adjust(@jp.adjust))
68
+ end
69
+
70
+ def test_no_change
71
+ # there is work aut we are at max_limit
72
+ send_work(1)
73
+ @pool.start_n_instances(2)
74
+ assert_equal(0, @jp.adjust)
75
+ end
76
+
77
+ def test_stop_some
78
+ @pool.start_n_instances(2)
79
+ @pool.each {|i| i.activate}
80
+ # it stops all
81
+ assert_equal(-2, @jp.adjust)
82
+ # if min_instances == 1, then it only stops 1
83
+ @cfg[:minimum_number_of_instances] = 1
84
+ assert_equal(-2, @jp.adjust)
85
+ assert_equal(-1, @lp.adjust(@jp.adjust))
86
+ # put it back at 0
87
+ @cfg[:minimum_number_of_instances] = 0
88
+ @pool.start_n_instances(1)
89
+ @pool.each {|i| i.activate}
90
+ # it would stop all three, except for limit (stop_limit = 2)
91
+ assert_equal(-3, @jp.adjust)
92
+ assert_equal(-2, @lp.adjust(@jp.adjust))
93
+ end
94
+
95
+ end
@@ -0,0 +1,63 @@
1
+ $:.unshift(File.join(ENV['AWS_HOME'], "app"))
2
+ require 'test/unit'
3
+ require 'MockAWS/clock'
4
+ require 'logger_factory'
5
+ require 'configuration'
6
+ require 'pool_configuration'
7
+ require 'policy_limit'
8
+ require 'aws_context'
9
+ require 'pp'
10
+
11
+ # Test the ManualPolicy class.
12
+ # Make sure it adjusts the number of instances appropriately in all cases.
13
+ class ManualPolicyTests < Test::Unit::TestCase
14
+ def setup
15
+ LoggerFactory.setup("/tmp/test.out")
16
+ logf = LoggerFactory.create(:file)
17
+ Clock.set(0)
18
+ config_files = ['aws-config.ini', 'default-config.ini', 'test-config.ini']
19
+ Cloudmaster::Configuration.setup_config_files(config_files)
20
+ tc = Cloudmaster::Configuration.new([], [:manual])
21
+ cfg = Cloudmaster::PoolConfiguration.new(tc.aws, tc.default, tc.pools[0])
22
+ reporter = Cloudmaster::Reporter.setup(cfg[:name], logf)
23
+ cfg[:ami_id] = "ami-08856161"
24
+ @cfg = cfg
25
+ AwsContext.setup(:mock, logf)
26
+ @pool = Cloudmaster::InstancePool.new(reporter, @cfg)
27
+ @mq = Cloudmaster::NamedQueue.new(@cfg[:manual_queue_name])
28
+ @mp = Cloudmaster::PolicyFactory.create(@cfg[:policy], reporter, @cfg, @pool)
29
+ @lp = Cloudmaster::PolicyLimit.new(reporter, @cfg, @pool)
30
+ queue_name = 'manual-manual'
31
+ @queue = AwsContext.instance.sqs.list_queues(queue_name).first
32
+ end
33
+
34
+ def send_work(n, adjust)
35
+ message = YAML.dump({ :adjust => adjust})
36
+ n.times { AwsContext.instance.sqs.send_message(@queue, message)}
37
+ end
38
+
39
+ def test_idle
40
+ assert_equal(0, @mp.adjust)
41
+ end
42
+
43
+ def test_adjust_up
44
+ send_work(1, 1)
45
+ assert_equal(1, @mp.adjust)
46
+ send_work(1, 2)
47
+ assert_equal(2, @mp.adjust)
48
+ send_work(2, 1)
49
+ assert_equal(2, @mp.adjust)
50
+ send_work(2, 1)
51
+ send_work(1, -1)
52
+ assert_equal(1, @mp.adjust)
53
+ end
54
+
55
+ def test_adjust_down
56
+ send_work(1, -1)
57
+ assert_equal(-1, @mp.adjust)
58
+ send_work(1, -2)
59
+ assert_equal(-2, @mp.adjust)
60
+ send_work(2, -1)
61
+ assert_equal(-2, @mp.adjust)
62
+ end
63
+ end
@@ -0,0 +1,90 @@
1
+ $:.unshift(File.join(ENV['AWS_HOME'], "app"))
2
+ require 'test/unit'
3
+ require 'MockAWS/clock'
4
+ require 'logger_factory'
5
+ require 'aws_context'
6
+ require 'named_queue'
7
+ require 'pp'
8
+
9
+ # test the NamedQueue implementation.
10
+ class NamedQueueTests < Test::Unit::TestCase
11
+ def setup
12
+ LoggerFactory.setup("/tmp/test.out")
13
+ logf = LoggerFactory.create(:file)
14
+ @sqs = AwsContext.setup(:mock, logf).sqs
15
+ end
16
+
17
+ def test_none
18
+ nq = Cloudmaster::NamedQueue.new('xxx')
19
+ assert(true)
20
+ end
21
+
22
+ def test_one
23
+ nq = Cloudmaster::NamedQueue.new('primes-work')
24
+ assert(true)
25
+ end
26
+
27
+ def test_many
28
+ assert_raise(RuntimeError) do
29
+ nq = Cloudmaster::NamedQueue.new('primes')
30
+ end
31
+ end
32
+
33
+ def test_read_message
34
+ queue_name = 'primes-work'
35
+ queue = @sqs.list_queues(queue_name).first
36
+ nq = Cloudmaster::NamedQueue.new(queue_name)
37
+ msgs = nq.read_messages(1)
38
+ assert_equal([], msgs)
39
+ message = 'this is a test'
40
+ @sqs.send_message(queue, message)
41
+ # we can read
42
+ msgs = nq.read_messages(1)
43
+ assert_equal(1, msgs.size)
44
+ assert_equal(message, msgs.first[:body])
45
+ msgs = nq.read_messages(1)
46
+ assert_equal(1, msgs.size)
47
+ assert_equal(message, msgs.first[:body])
48
+ nq.delete_message(msgs.first[:receipt_handle])
49
+ msgs = nq.read_messages(1)
50
+ assert_equal(0, msgs.size)
51
+ end
52
+
53
+ def test_delete_message
54
+ queue_name = 'primes-work'
55
+ queue = @sqs.list_queues(queue_name).first
56
+ nq = Cloudmaster::NamedQueue.new(queue_name)
57
+ message = 'this is a test'
58
+ @sqs.send_message(queue, message)
59
+ msgs = nq.read_messages(1)
60
+ assert_equal(1, msgs.size)
61
+ assert_equal(message, msgs.first[:body])
62
+ msgs = nq.read_messages(1)
63
+ nq.delete_message(msgs.first[:receipt_handle])
64
+ msgs = nq.read_messages(1)
65
+ assert_equal(0, msgs.size)
66
+ end
67
+
68
+ def test_read_queue_depth
69
+ queue_name = 'primes-work'
70
+ queue = @sqs.list_queues(queue_name).first
71
+ nq = Cloudmaster::NamedQueue.new(queue_name)
72
+ message = 'this is a test'
73
+ @sqs.send_message(queue, message)
74
+ @sqs.send_message(queue, message)
75
+ @sqs.send_message(queue, message)
76
+ assert_equal(3, nq.read_queue_depth)
77
+ end
78
+
79
+ def test_empty_queue
80
+ queue_name = 'primes-work'
81
+ queue = @sqs.list_queues(queue_name).first
82
+ nq = Cloudmaster::NamedQueue.new(queue_name)
83
+ message = 'this is a test'
84
+ @sqs.send_message(queue, message)
85
+ @sqs.send_message(queue, message)
86
+ @sqs.send_message(queue, message)
87
+ nq.empty_queue
88
+ assert_equal(0, nq.read_queue_depth)
89
+ end
90
+ end