staugaard-cloudmaster 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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