staugaard-cloudmaster 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +4 -0
- data/bin/cloudmaster +45 -0
- data/lib/AWS/AWS.rb +3 -0
- data/lib/AWS/EC2.rb +14 -0
- data/lib/AWS/S3.rb +14 -0
- data/lib/AWS/SQS.rb +14 -0
- data/lib/AWS/SimpleDB.rb +14 -0
- data/lib/MockAWS/EC2.rb +119 -0
- data/lib/MockAWS/S3.rb +39 -0
- data/lib/MockAWS/SQS.rb +82 -0
- data/lib/MockAWS/SimpleDB.rb +46 -0
- data/lib/MockAWS/clock.rb +67 -0
- data/lib/OriginalAWS/AWS.rb +475 -0
- data/lib/OriginalAWS/EC2.rb +783 -0
- data/lib/OriginalAWS/S3.rb +559 -0
- data/lib/OriginalAWS/SQS.rb +159 -0
- data/lib/OriginalAWS/SimpleDB.rb +460 -0
- data/lib/RetryAWS/EC2.rb +88 -0
- data/lib/RetryAWS/S3.rb +77 -0
- data/lib/RetryAWS/SQS.rb +109 -0
- data/lib/RetryAWS/SimpleDB.rb +118 -0
- data/lib/SafeAWS/EC2.rb +63 -0
- data/lib/SafeAWS/S3.rb +56 -0
- data/lib/SafeAWS/SQS.rb +75 -0
- data/lib/SafeAWS/SimpleDB.rb +88 -0
- data/lib/aws_context.rb +165 -0
- data/lib/basic_configuration.rb +120 -0
- data/lib/clock.rb +10 -0
- data/lib/factory.rb +14 -0
- data/lib/file_logger.rb +36 -0
- data/lib/inifile.rb +148 -0
- data/lib/instance_logger.rb +25 -0
- data/lib/logger_factory.rb +38 -0
- data/lib/periodic.rb +29 -0
- data/lib/string_logger.rb +29 -0
- data/lib/sys_logger.rb +40 -0
- data/lib/user_data.rb +30 -0
- data/test/aws-config.ini +9 -0
- data/test/cloudmaster-tests.rb +329 -0
- data/test/configuration-test.rb +62 -0
- data/test/daytime-policy-tests.rb +47 -0
- data/test/enumerator-test.rb +47 -0
- data/test/fixed-policy-tests.rb +50 -0
- data/test/instance-pool-test.rb +359 -0
- data/test/instance-test.rb +98 -0
- data/test/job-policy-test.rb +95 -0
- data/test/manual-policy-tests.rb +63 -0
- data/test/named-queue-test.rb +90 -0
- data/test/resource-policy-tests.rb +126 -0
- data/test/suite +17 -0
- data/test/test-config.ini +47 -0
- metadata +111 -0
@@ -0,0 +1,126 @@
|
|
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 PolicyResource class.
|
12
|
+
class ResourcePolicyTests < Test::Unit::TestCase
|
13
|
+
def setup
|
14
|
+
LoggerFactory.setup("/tmp/test.out")
|
15
|
+
logf = LoggerFactory.create(:file)
|
16
|
+
Clock.set(0)
|
17
|
+
config_files = ['aws-config.ini', 'default-config.ini', 'test-config.ini']
|
18
|
+
Cloudmaster::Configuration.setup_config_files(config_files)
|
19
|
+
tc = Cloudmaster::Configuration.new([], [:fib])
|
20
|
+
cfg = Cloudmaster::PoolConfiguration.new(tc.aws, tc.default, tc.pools[0])
|
21
|
+
reporter = Cloudmaster::Reporter.setup(cfg[:name], logf)
|
22
|
+
cfg[:ami_id] = "ami-08856161"
|
23
|
+
@cfg = cfg
|
24
|
+
AwsContext.setup(:mock, logf)
|
25
|
+
@pool = Cloudmaster::InstancePool.new(reporter, @cfg)
|
26
|
+
@nq = @cfg[:work_queue] = Cloudmaster::NamedQueue.new(@cfg[:work_queue_name])
|
27
|
+
@rp = Cloudmaster::PolicyFactory.create(@cfg[:policy], reporter, @cfg, @pool)
|
28
|
+
@lp = Cloudmaster::PolicyLimit.new(reporter, @cfg, @pool)
|
29
|
+
queue_name = 'fib-work'
|
30
|
+
@queue = AwsContext.instance.sqs.list_queues(queue_name).first
|
31
|
+
@message = 'this is a test'
|
32
|
+
end
|
33
|
+
|
34
|
+
def send_work(n)
|
35
|
+
n.times { AwsContext.instance.sqs.send_message(@queue, @message)}
|
36
|
+
@nq.read_queue_depth
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_idle
|
40
|
+
assert_equal(0, @rp.adjust)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_start_first
|
44
|
+
send_work(1)
|
45
|
+
assert_equal(1, @rp.adjust)
|
46
|
+
# given load factor=10 and target upper load=0.75
|
47
|
+
# it goes to 2 between 7 and 8
|
48
|
+
send_work(7)
|
49
|
+
assert_equal(1, @rp.adjust)
|
50
|
+
send_work(8)
|
51
|
+
assert_equal(2, @rp.adjust)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_start_more
|
55
|
+
# two instances, both busy
|
56
|
+
@pool.start_n_instances(2)
|
57
|
+
@pool.each {|i| i.activate}
|
58
|
+
@pool.each {|i| i.load_estimate = 0.8}
|
59
|
+
# need to start another -- a little over threshold
|
60
|
+
assert_equal(1, @rp.adjust)
|
61
|
+
# two instances, not busy, don't start another
|
62
|
+
@pool.each {|i| i.load_estimate = 0.5}
|
63
|
+
assert_equal(0, @rp.adjust)
|
64
|
+
# make sure limit honored (start_limit == 1)
|
65
|
+
@pool.each {|i| i.load_estimate = 0.75}
|
66
|
+
assert_equal(0, @lp.adjust(@rp.adjust))
|
67
|
+
# only stops 1 due to limmit (stop_limit == 1)
|
68
|
+
@pool.each {|i| i.load_estimate = 0}
|
69
|
+
assert_equal(-2, @rp.adjust)
|
70
|
+
assert_equal(-1, @lp.adjust(@rp.adjust))
|
71
|
+
# now it can stop two
|
72
|
+
@cfg[:stop_limit] = 2
|
73
|
+
assert_equal(-2, @rp.adjust)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_shut_down_n_instances
|
77
|
+
# activate two
|
78
|
+
@pool.start_n_instances(2)
|
79
|
+
@pool.each {|i| i.activate}
|
80
|
+
# shut down one
|
81
|
+
@rp.shut_down_n_instances(1)
|
82
|
+
sd = @pool.inject(0) {|sum, i| sum + (i.state == :shut_down ? 1 : 0)}
|
83
|
+
# see that one is shut down
|
84
|
+
assert_equal(1, sd)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_shut_down_instances
|
88
|
+
# activate two
|
89
|
+
@pool.start_n_instances(2)
|
90
|
+
# shut down one
|
91
|
+
@pool.each {|i| i.activate}
|
92
|
+
@rp.shut_down_instances([@pool.first])
|
93
|
+
sd = @pool.inject(0) {|sum, i| sum + (i.state == :shut_down ? 1 : 0)}
|
94
|
+
# see that one is shut down
|
95
|
+
assert_equal(1, sd)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_active_shut_down_instances
|
99
|
+
# activate two
|
100
|
+
@pool.start_n_instances(2)
|
101
|
+
@pool.each {|i| i.activate}
|
102
|
+
# shut down one
|
103
|
+
@rp.shut_down_instances([@pool.first])
|
104
|
+
@rp.activate_shut_down_instances(1)
|
105
|
+
active = @pool.inject(0) {|sum, i| sum + (i.state == :active ? 1 : 0)}
|
106
|
+
# see that both are active
|
107
|
+
assert_equal(2, active)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_cleanup_shut_down_instances
|
111
|
+
# activate two
|
112
|
+
@pool.start_n_instances(2)
|
113
|
+
Clock.set(3605)
|
114
|
+
# shut down one
|
115
|
+
@pool.each {|i| i.activate}
|
116
|
+
@rp.shut_down_instances([@pool.first])
|
117
|
+
sd = @pool.inject(0) {|sum, i| sum + (i.state == :shut_down ? 1 : 0)}
|
118
|
+
@rp.clean_up_shut_down_instances
|
119
|
+
sd = @pool.inject(0) {|sum, i| sum + (i.state == :shut_down ? 1 : 0)}
|
120
|
+
# see that none is shut down
|
121
|
+
assert_equal(0, sd)
|
122
|
+
active = @pool.inject(0) {|sum, i| sum + (i.state == :active ? 1 : 0)}
|
123
|
+
# see that one is active
|
124
|
+
assert_equal(1, active)
|
125
|
+
end
|
126
|
+
end
|
data/test/suite
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require 'test/unit/testsuite'
|
3
|
+
|
4
|
+
require 'configuration-test'
|
5
|
+
require 'instance-test'
|
6
|
+
require 'instance-pool-test'
|
7
|
+
require 'enumerator-test'
|
8
|
+
require 'named-queue-test'
|
9
|
+
require 'job-policy-test'
|
10
|
+
require 'resource-policy-tests'
|
11
|
+
require 'fixed-policy-tests'
|
12
|
+
require 'daytime-policy-tests'
|
13
|
+
require 'manual-policy-tests'
|
14
|
+
require 'cloudmaster-tests'
|
15
|
+
|
16
|
+
# Clear out putput file to start with
|
17
|
+
File.new("/tmp/test.out", "w").close
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#
|
2
|
+
# EC2 Instance Manager Test Configuration
|
3
|
+
|
4
|
+
[default]
|
5
|
+
logger=file
|
6
|
+
logfile=/tmp/test.out
|
7
|
+
|
8
|
+
[Pool-primes]
|
9
|
+
policy=job
|
10
|
+
logger=string
|
11
|
+
start_limit=2
|
12
|
+
minimum_lifetime=5
|
13
|
+
stop_limit=2
|
14
|
+
active_set_type=s3
|
15
|
+
active_set_interval=1
|
16
|
+
security_groups="["a", "b"]"
|
17
|
+
user_data="{:newkey => 1234}"
|
18
|
+
instance_log=/var/log/instances
|
19
|
+
minimum_active_time=0
|
20
|
+
|
21
|
+
[Pool-fib]
|
22
|
+
policy=resource
|
23
|
+
ami_name=chayden-ami-fibonacci
|
24
|
+
minimum_lifetime=5
|
25
|
+
watchdog_interval=10
|
26
|
+
queue_load_factor=10
|
27
|
+
maximum_number_of_instances=3
|
28
|
+
minimum_active_time=0
|
29
|
+
|
30
|
+
[Pool-fixed]
|
31
|
+
policy=fixed
|
32
|
+
ami_name=chayden-ami-fixed
|
33
|
+
minimum_lifetime=5
|
34
|
+
watchdog_interval=10
|
35
|
+
minimum_number_of_instances=2
|
36
|
+
maximum_number_of_instances=2
|
37
|
+
|
38
|
+
[Pool-manual]
|
39
|
+
policy=manual
|
40
|
+
ami_name=chayden-ami-manual
|
41
|
+
|
42
|
+
[Pool-bad]
|
43
|
+
policy=bad
|
44
|
+
|
45
|
+
[Pool-daytime]
|
46
|
+
policy=daytime
|
47
|
+
minimum_number_of_instances_daytime=3
|
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: staugaard-cloudmaster
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- cchayden
|
8
|
+
- vadimj
|
9
|
+
- Mick Staugaard
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
|
14
|
+
date: 2009-04-15 00:00:00 -07:00
|
15
|
+
default_executable: cloudmaster
|
16
|
+
dependencies: []
|
17
|
+
|
18
|
+
description:
|
19
|
+
email: mick@staugaard.com
|
20
|
+
executables:
|
21
|
+
- cloudmaster
|
22
|
+
extensions: []
|
23
|
+
|
24
|
+
extra_rdoc_files: []
|
25
|
+
|
26
|
+
files:
|
27
|
+
- VERSION.yml
|
28
|
+
- bin/cloudmaster
|
29
|
+
- lib/AWS
|
30
|
+
- lib/AWS/AWS.rb
|
31
|
+
- lib/AWS/EC2.rb
|
32
|
+
- lib/AWS/S3.rb
|
33
|
+
- lib/AWS/SimpleDB.rb
|
34
|
+
- lib/AWS/SQS.rb
|
35
|
+
- lib/aws_context.rb
|
36
|
+
- lib/basic_configuration.rb
|
37
|
+
- lib/clock.rb
|
38
|
+
- lib/factory.rb
|
39
|
+
- lib/file_logger.rb
|
40
|
+
- lib/inifile.rb
|
41
|
+
- lib/instance_logger.rb
|
42
|
+
- lib/logger_factory.rb
|
43
|
+
- lib/MockAWS
|
44
|
+
- lib/MockAWS/clock.rb
|
45
|
+
- lib/MockAWS/EC2.rb
|
46
|
+
- lib/MockAWS/S3.rb
|
47
|
+
- lib/MockAWS/SimpleDB.rb
|
48
|
+
- lib/MockAWS/SQS.rb
|
49
|
+
- lib/OriginalAWS
|
50
|
+
- lib/OriginalAWS/AWS.rb
|
51
|
+
- lib/OriginalAWS/EC2.rb
|
52
|
+
- lib/OriginalAWS/S3.rb
|
53
|
+
- lib/OriginalAWS/SimpleDB.rb
|
54
|
+
- lib/OriginalAWS/SQS.rb
|
55
|
+
- lib/periodic.rb
|
56
|
+
- lib/RetryAWS
|
57
|
+
- lib/RetryAWS/EC2.rb
|
58
|
+
- lib/RetryAWS/S3.rb
|
59
|
+
- lib/RetryAWS/SimpleDB.rb
|
60
|
+
- lib/RetryAWS/SQS.rb
|
61
|
+
- lib/SafeAWS
|
62
|
+
- lib/SafeAWS/EC2.rb
|
63
|
+
- lib/SafeAWS/S3.rb
|
64
|
+
- lib/SafeAWS/SimpleDB.rb
|
65
|
+
- lib/SafeAWS/SQS.rb
|
66
|
+
- lib/string_logger.rb
|
67
|
+
- lib/sys_logger.rb
|
68
|
+
- lib/user_data.rb
|
69
|
+
- test/aws-config.ini
|
70
|
+
- test/cloudmaster-tests.rb
|
71
|
+
- test/configuration-test.rb
|
72
|
+
- test/daytime-policy-tests.rb
|
73
|
+
- test/enumerator-test.rb
|
74
|
+
- test/fixed-policy-tests.rb
|
75
|
+
- test/instance-pool-test.rb
|
76
|
+
- test/instance-test.rb
|
77
|
+
- test/job-policy-test.rb
|
78
|
+
- test/manual-policy-tests.rb
|
79
|
+
- test/named-queue-test.rb
|
80
|
+
- test/resource-policy-tests.rb
|
81
|
+
- test/suite
|
82
|
+
- test/test-config.ini
|
83
|
+
has_rdoc: true
|
84
|
+
homepage: http://github.com/staugaard/cloudmaster
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options:
|
87
|
+
- --inline-source
|
88
|
+
- --charset=UTF-8
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: "0"
|
96
|
+
version:
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: "0"
|
102
|
+
version:
|
103
|
+
requirements: []
|
104
|
+
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 1.2.0
|
107
|
+
signing_key:
|
108
|
+
specification_version: 2
|
109
|
+
summary: "Creates, terminates, and monitors Amazon EC2 instances. Creates more instance to meet increased demand, and terminates them when they are no longer needed. Any number of pools of instances may be managed. Provides periodic status reports. Three policies are provided: a fixed size pool policy, a job-oriented batch policy, and a resource-limited stateful policy. The user can define additional policies. To get started, see http://code.google.com/p/cloudmaster/wiki/Introduction"
|
110
|
+
test_files: []
|
111
|
+
|