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,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
+