wakame 0.4.0

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 (147) hide show
  1. data/History.txt +20 -0
  2. data/README.rdoc +63 -0
  3. data/Rakefile +86 -0
  4. data/VERSION +1 -0
  5. data/app_generators/wakame/templates/README +0 -0
  6. data/app_generators/wakame/templates/Rakefile +18 -0
  7. data/app_generators/wakame/templates/bin/wakame-agent +9 -0
  8. data/app_generators/wakame/templates/bin/wakame-master +9 -0
  9. data/app_generators/wakame/templates/bin/wakameadm +9 -0
  10. data/app_generators/wakame/templates/cluster/resources/apache_app/apache_app.rb +54 -0
  11. data/app_generators/wakame/templates/cluster/resources/apache_app/conf/apache2.conf +46 -0
  12. data/app_generators/wakame/templates/cluster/resources/apache_app/conf/envvars-app +7 -0
  13. data/app_generators/wakame/templates/cluster/resources/apache_app/conf/sites-app.conf +23 -0
  14. data/app_generators/wakame/templates/cluster/resources/apache_app/conf/system-app.conf +67 -0
  15. data/app_generators/wakame/templates/cluster/resources/apache_app/init.d/apache2-app +192 -0
  16. data/app_generators/wakame/templates/cluster/resources/apache_lb/apache_lb.rb +56 -0
  17. data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/apache2.conf +46 -0
  18. data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/envvars-lb +6 -0
  19. data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/sites-lb.conf +54 -0
  20. data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/system-lb.conf +75 -0
  21. data/app_generators/wakame/templates/cluster/resources/apache_lb/init.d/apache2-lb +192 -0
  22. data/app_generators/wakame/templates/cluster/resources/apache_www/apache_www.rb +50 -0
  23. data/app_generators/wakame/templates/cluster/resources/apache_www/conf/apache2.conf +47 -0
  24. data/app_generators/wakame/templates/cluster/resources/apache_www/conf/envvars-www +7 -0
  25. data/app_generators/wakame/templates/cluster/resources/apache_www/conf/sites-www.conf +23 -0
  26. data/app_generators/wakame/templates/cluster/resources/apache_www/conf/system-www.conf +63 -0
  27. data/app_generators/wakame/templates/cluster/resources/apache_www/init.d/apache2-www +192 -0
  28. data/app_generators/wakame/templates/cluster/resources/ec2_elastic_ip/ec2_elastic_ip.rb +39 -0
  29. data/app_generators/wakame/templates/cluster/resources/mysql_master/conf/my.cnf +154 -0
  30. data/app_generators/wakame/templates/cluster/resources/mysql_master/init.d/mysql +185 -0
  31. data/app_generators/wakame/templates/cluster/resources/mysql_master/mysql_master.rb +174 -0
  32. data/app_generators/wakame/templates/config/boot.rb +85 -0
  33. data/app_generators/wakame/templates/config/cluster.rb +64 -0
  34. data/app_generators/wakame/templates/config/environments/common.rb +0 -0
  35. data/app_generators/wakame/templates/config/environments/ec2.rb +3 -0
  36. data/app_generators/wakame/templates/config/environments/stand_alone.rb +0 -0
  37. data/app_generators/wakame/templates/config/init.d/wakame-agent +72 -0
  38. data/app_generators/wakame/templates/config/init.d/wakame-master +73 -0
  39. data/app_generators/wakame/wakame_generator.rb +124 -0
  40. data/bin/wakame +18 -0
  41. data/contrib/imagesetup.sh +77 -0
  42. data/lib/ext/eventmachine.rb +86 -0
  43. data/lib/ext/shellwords.rb +172 -0
  44. data/lib/ext/uri.rb +15 -0
  45. data/lib/wakame/action.rb +156 -0
  46. data/lib/wakame/actions/destroy_instances.rb +39 -0
  47. data/lib/wakame/actions/launch_cluster.rb +31 -0
  48. data/lib/wakame/actions/migrate_service.rb +65 -0
  49. data/lib/wakame/actions/propagate_instances.rb +95 -0
  50. data/lib/wakame/actions/reload_service.rb +21 -0
  51. data/lib/wakame/actions/scaleout_when_high_load.rb +44 -0
  52. data/lib/wakame/actions/shutdown_cluster.rb +22 -0
  53. data/lib/wakame/actions/shutdown_vm.rb +19 -0
  54. data/lib/wakame/actions/start_service.rb +64 -0
  55. data/lib/wakame/actions/stop_service.rb +49 -0
  56. data/lib/wakame/actions/util.rb +71 -0
  57. data/lib/wakame/actor/daemon.rb +37 -0
  58. data/lib/wakame/actor/service_monitor.rb +21 -0
  59. data/lib/wakame/actor/system.rb +46 -0
  60. data/lib/wakame/actor.rb +33 -0
  61. data/lib/wakame/agent.rb +226 -0
  62. data/lib/wakame/amqp_client.rb +219 -0
  63. data/lib/wakame/command/action_status.rb +62 -0
  64. data/lib/wakame/command/actor.rb +23 -0
  65. data/lib/wakame/command/clone_service.rb +12 -0
  66. data/lib/wakame/command/launch_cluster.rb +15 -0
  67. data/lib/wakame/command/migrate_service.rb +21 -0
  68. data/lib/wakame/command/propagate_service.rb +24 -0
  69. data/lib/wakame/command/shutdown_cluster.rb +15 -0
  70. data/lib/wakame/command/status.rb +81 -0
  71. data/lib/wakame/command.rb +31 -0
  72. data/lib/wakame/command_queue.rb +44 -0
  73. data/lib/wakame/configuration.rb +93 -0
  74. data/lib/wakame/daemonize.rb +96 -0
  75. data/lib/wakame/event.rb +232 -0
  76. data/lib/wakame/event_dispatcher.rb +154 -0
  77. data/lib/wakame/graph.rb +79 -0
  78. data/lib/wakame/initializer.rb +162 -0
  79. data/lib/wakame/instance_counter.rb +78 -0
  80. data/lib/wakame/logger.rb +12 -0
  81. data/lib/wakame/manager/commands.rb +134 -0
  82. data/lib/wakame/master.rb +369 -0
  83. data/lib/wakame/monitor/agent.rb +50 -0
  84. data/lib/wakame/monitor/service.rb +183 -0
  85. data/lib/wakame/monitor.rb +69 -0
  86. data/lib/wakame/packets.rb +160 -0
  87. data/lib/wakame/queue_declare.rb +14 -0
  88. data/lib/wakame/rule.rb +116 -0
  89. data/lib/wakame/rule_engine.rb +202 -0
  90. data/lib/wakame/runner/administrator_command.rb +112 -0
  91. data/lib/wakame/runner/agent.rb +81 -0
  92. data/lib/wakame/runner/master.rb +93 -0
  93. data/lib/wakame/scheduler.rb +251 -0
  94. data/lib/wakame/service.rb +914 -0
  95. data/lib/wakame/template.rb +189 -0
  96. data/lib/wakame/trigger.rb +66 -0
  97. data/lib/wakame/triggers/instance_count_update.rb +45 -0
  98. data/lib/wakame/triggers/load_history.rb +107 -0
  99. data/lib/wakame/triggers/maintain_ssh_known_hosts.rb +43 -0
  100. data/lib/wakame/triggers/process_command.rb +34 -0
  101. data/lib/wakame/triggers/shutdown_unused_vm.rb +16 -0
  102. data/lib/wakame/util.rb +569 -0
  103. data/lib/wakame/vm_manipulator.rb +186 -0
  104. data/lib/wakame.rb +59 -0
  105. data/tasks/ec2.rake +127 -0
  106. data/tests/cluster.json +3 -0
  107. data/tests/conf/a +1 -0
  108. data/tests/conf/b +1 -0
  109. data/tests/conf/c +1 -0
  110. data/tests/setup_agent.rb +39 -0
  111. data/tests/setup_master.rb +28 -0
  112. data/tests/test_actor.rb +54 -0
  113. data/tests/test_agent.rb +218 -0
  114. data/tests/test_amqp_client.rb +94 -0
  115. data/tests/test_graph.rb +36 -0
  116. data/tests/test_master.rb +167 -0
  117. data/tests/test_monitor.rb +47 -0
  118. data/tests/test_rule_engine.rb +127 -0
  119. data/tests/test_scheduler.rb +123 -0
  120. data/tests/test_service.rb +60 -0
  121. data/tests/test_template.rb +67 -0
  122. data/tests/test_uri_amqp.rb +19 -0
  123. data/tests/test_util.rb +71 -0
  124. data/wakame_generators/resource/resource_generator.rb +54 -0
  125. data/wakame_generators/resource/templates/apache_app/apache_app.rb +60 -0
  126. data/wakame_generators/resource/templates/apache_app/conf/apache2.conf +46 -0
  127. data/wakame_generators/resource/templates/apache_app/conf/envvars-app +7 -0
  128. data/wakame_generators/resource/templates/apache_app/conf/sites-app.conf +23 -0
  129. data/wakame_generators/resource/templates/apache_app/conf/system-app.conf +67 -0
  130. data/wakame_generators/resource/templates/apache_app/init.d/apache2-app +192 -0
  131. data/wakame_generators/resource/templates/apache_lb/apache_lb.rb +67 -0
  132. data/wakame_generators/resource/templates/apache_lb/conf/apache2.conf +46 -0
  133. data/wakame_generators/resource/templates/apache_lb/conf/envvars-lb +6 -0
  134. data/wakame_generators/resource/templates/apache_lb/conf/sites-lb.conf +54 -0
  135. data/wakame_generators/resource/templates/apache_lb/conf/system-lb.conf +75 -0
  136. data/wakame_generators/resource/templates/apache_lb/init.d/apache2-lb +192 -0
  137. data/wakame_generators/resource/templates/apache_www/apache_www.rb +56 -0
  138. data/wakame_generators/resource/templates/apache_www/conf/apache2.conf +47 -0
  139. data/wakame_generators/resource/templates/apache_www/conf/envvars-www +7 -0
  140. data/wakame_generators/resource/templates/apache_www/conf/sites-www.conf +23 -0
  141. data/wakame_generators/resource/templates/apache_www/conf/system-www.conf +63 -0
  142. data/wakame_generators/resource/templates/apache_www/init.d/apache2-www +192 -0
  143. data/wakame_generators/resource/templates/ec2_elastic_ip/ec2_elastic_ip.rb +39 -0
  144. data/wakame_generators/resource/templates/mysql_master/conf/my.cnf +154 -0
  145. data/wakame_generators/resource/templates/mysql_master/init.d/mysql +185 -0
  146. data/wakame_generators/resource/templates/mysql_master/mysql_master.rb +119 -0
  147. metadata +289 -0
@@ -0,0 +1,186 @@
1
+
2
+ require 'wakame'
3
+
4
+ module Wakame
5
+ module VmManipulator
6
+ def self.create
7
+ Wakame.new_([self.to_s, Wakame.config.vm_environment ].join('::'))
8
+ end
9
+
10
+ class Base
11
+ def start_instance(attr)
12
+ end
13
+
14
+ def stop_instance(instance_id)
15
+ end
16
+
17
+ # expected_status : :online, :offline, :failed
18
+ def check_status(instance_id, expected_status=:online)
19
+ end
20
+
21
+ # Expected common keys/attributes when returned.
22
+ # local_ipv4 : Internal IP address which is assigned to the VM instance.
23
+ # local_hostname : Internal hostname assigned to the VM instance.
24
+ def fetch_local_attrs
25
+
26
+ end
27
+ end
28
+
29
+ class StandAlone < Base
30
+ INSTANCE_ID='__standalone__'
31
+
32
+ def start_instance(attr)
33
+ # Nothing to be done
34
+ {:instance_id =>INSTANCE_ID}
35
+ end
36
+
37
+ def stop_instance(instance_id)
38
+ # Nothing to be done
39
+ end
40
+
41
+ def check_status(instance_id, expected_status=:online)
42
+ # Always running
43
+ expected_status == :online
44
+ end
45
+
46
+ def self.fetch_local_attrs
47
+ attrs = {:instance_id=>INSTANCE_ID, :local_ipv4=>'127.0.0.1', :local_hostname=>'localhost', :ami_id=>'localimage'}
48
+ attrs
49
+ end
50
+ end
51
+
52
+ class EC2 < Base
53
+
54
+ require 'EC2'
55
+
56
+ def initialize()
57
+ @ec2 = ::EC2::Base.new(:access_key_id => Wakame.config.aws_access_key, :secret_access_key => Wakame.config.aws_secret_key )
58
+ end
59
+
60
+ def start_instance(image_id, attr={})
61
+ res = @ec2.run_instances(:image_id => image_id,
62
+ :availability_zone => attr[:availability_zone],
63
+ :group_id => attr[:security_groups],
64
+ :instance_type => attr[:instance_type],
65
+ :user_data => attr[:user_data]
66
+ )
67
+ {:instance_id => res.instancesSet.item[0].instanceId}
68
+ end
69
+
70
+ def stop_instance(instance_id)
71
+ @ec2.terminate_instances(:instance_id=>instance_id)
72
+ end
73
+
74
+ def check_status(instance_id, expected_status=:online)
75
+ res = @ec2.describe_instances(:instance_id => instance_id)
76
+
77
+ status = res.reservationSet.item[0].instancesSet.item[0].instanceState
78
+ # status is returned in a hash structure. i.e. {'name'=>'running', 'code'=>'16' }
79
+ Wakame.log.debug("VM (#{instance_id}) status: #{status['name']}")
80
+ return case status['name']
81
+ when "running"
82
+ expected_status == :online
83
+ when "terminated"
84
+ expected_status == :offline
85
+ when "rebooting"
86
+ expected_status == :offline
87
+ when "starting"
88
+ expected_status == :offline
89
+ when "pending"
90
+ expected_status == :offline
91
+ else
92
+ raise "Unknown status from AWS: #{status['name']}"
93
+ end
94
+ end
95
+
96
+ def associate_address(instance_id, ip_addr)
97
+ res = @ec2.associate_address(:instance_id=>instance_id, :public_ip=>ip_addr)
98
+ # {"requestId"=>"000ac66b-4a9c-43be-8176-b1b96ed6d4b7", "return"=>"true", "xmlns"=>"http://ec2.amazonaws.com/doc/2008-12-01/"}
99
+ res['return'] == 'true'
100
+ end
101
+ def disassociate_address(ip_addr)
102
+ res = @ec2.disassociate_address(:public_ip=>ip_addr)
103
+ # {"requestId"=>"2f38c8bb-4b1a-4df3-9f30-fa17317c89c4", "return"=>"true", "xmlns"=>"http://ec2.amazonaws.com/doc/2008-12-01/"}
104
+ res['return'] == 'true'
105
+ end
106
+
107
+ # volume
108
+ def describe_volume(vol_id)
109
+ res = @ec2.describe_volumes(:volume_id=>vol_id)
110
+ if res['volumeSet']['item'][0]['attachmentSet']
111
+ res['volumeSet']['item'][0]['attachmentSet']['item'][0]
112
+ else
113
+ res['volumeSet']['item'][0]
114
+ end
115
+ end
116
+ # >> @ec2.attach_volume(:instance_id => 'i-1fa1cd76', :volume_id => "vol-1f927176", :device=>'/dev/sde')
117
+ # => {"attachTime"=>"2009-04-17T05:46:18.000Z", "status"=>"attaching", "device"=>"/dev/sde", "requestId"=>"0fd3797b-b4f9-476b-8cb2-3e7401c6fae2", "instanceId"=>"i-1fa1cd76", "volumeId"=>"vol-1f927176", "xmlns"=>"http://ec2.amazonaws.com/doc/2008-12-01/"}
118
+ def attach_volume(instance_id, vol_id, vol_dev)
119
+ res = @ec2.attach_volume(:instance_id=>instance_id, :volume_id=>vol_id, :device=>vol_dev)
120
+ end
121
+ def detach_volume(vol_id)
122
+ res = @ec2.detach_volume(:volume_id=>vol_id)
123
+ end
124
+
125
+ # volume
126
+ # >> @ec2.describe_volumes(:volume_id => "vol-c58360ac")
127
+ # => {"volumeSet"=>{"item"=>[{"status"=>"available", "size"=>"1", "snapshotId"=>nil, "availabilityZone"=>"us-east-1a", "attachmentSet"=>nil, "createTime"=>"2009-04-16T09:56:01.000Z", "volumeId"=>"vol-c58360ac"}]}, "requestId"=>"0e6d0923-eba8-425a-b939-87c7fe8e835e", "xmlns"=>"http://ec2.amazonaws.com/doc/2008-12-01/"}
128
+ def describe_volume(vol_id)
129
+ res = @ec2.describe_volumes(:volume_id=>vol_id)
130
+ res['volumeSet']['item'][0]
131
+ end
132
+ def create_volume(availability_zone, size)
133
+ res = @ec2.create_volume(:availability_zone=>availability_zone, :size=>size)
134
+ end
135
+ # >> @ec2.create_volume(:availability_zone=>"us-east-1b", :snapshot_id=>"snap-27c1324e")
136
+ # => {"status"=>"creating", "size"=>"1", "snapshotId"=>"snap-27c1324e", "requestId"=>"f3a0ddbf-9eb8-4594-b43e-8486459a0168", "availabilityZone"=>"us-east-1b", "createTime"=>"2009-04-17T05:44:58.000Z", "volumeId"=>"vol-1f927176", "xmlns"=>"http://ec2.amazonaws.com/doc/2008-12-01/"}
137
+ def create_volume_from_snapshot(availability_zone, snapshot_id)
138
+ res = @ec2.create_volume(:availability_zone=>availability_zone, :snapshot_id=>snapshot_id)
139
+ end
140
+ def delete_volume(vol_id)
141
+ res = @ec2.delete_volume(:volume_id=>vol_id)
142
+ end
143
+
144
+ # snapshot
145
+ def describe_snapshot(snapshot_id)
146
+ res = @ec2.describe_snapshots(:snapshot_id=>snapshot_id)
147
+ res['snapshotSet']['item'][0]
148
+ end
149
+
150
+ # >> @ec2.create_snapshot(:volume_id => 'vol-c58360ac')
151
+ # => {"status"=>"pending", "snapshotId"=>"snap-18c13271", "requestId"=>"9d1d586a-44b7-4edd-b94a-aaccb54e888d", "progress"=>nil, "startTime"=>"2009-04-16T10:13:37.000Z", "volumeId"=>"vol-c58360ac", "xmlns"=>"http://ec2.amazonaws.com/doc/2008-12-01/"}
152
+ def create_snapshot(vol_id)
153
+ res = @ec2.create_snapshot(:volume_id=>vol_id)
154
+ end
155
+ def delete_snapshot(snapshot_id)
156
+ res = @ec2.delete_snapshot(:snapshot_id=>snapshot_id)
157
+ end
158
+
159
+ module MetadataService
160
+ def query_metadata_uri(key)
161
+ require 'open-uri'
162
+ open("http://169.254.169.254/2008-02-01/meta-data/#{key}") { |f|
163
+ return f.readline
164
+ }
165
+ end
166
+ module_function :query_metadata_uri
167
+ public :query_metadata_uri
168
+
169
+ def fetch_local_attrs
170
+ attrs = {}
171
+ %w[instance-id instance-type local-ipv4 local-hostname public-hostname public-ipv4 ami-id].each { |key|
172
+ rkey = key.tr('-', '_')
173
+ attrs[rkey.to_sym]=query_metadata_uri(key)
174
+ }
175
+ attrs
176
+ end
177
+ module_function :fetch_local_attrs
178
+ public :fetch_local_attrs
179
+
180
+ end
181
+
182
+ include MetadataService
183
+ end
184
+
185
+ end
186
+ end
data/lib/wakame.rb ADDED
@@ -0,0 +1,59 @@
1
+
2
+ require 'rubygems'
3
+
4
+ # For debugging
5
+ Thread.abort_on_exception = true
6
+
7
+ module Wakame
8
+ require 'jeweler/version_helper'
9
+ VERSION=Jeweler::VersionHelper.new(File.expand_path('../', File.dirname(__FILE__))).to_s
10
+
11
+ autoload :Agent, 'wakame/agent'
12
+ autoload :Master, 'wakame/master'
13
+ autoload :Daemonize, 'wakame/daemonize'
14
+ autoload :Util, 'wakame/util'
15
+ autoload :Event, 'wakame/event'
16
+ autoload :Service, 'wakame/service'
17
+ autoload :Rule, 'wakame/rule'
18
+ autoload :Graph, 'wakame/graph'
19
+ autoload :Monitor, 'wakame/monitor'
20
+ autoload :Actor, 'wakame/actor'
21
+ autoload :Configuration, 'wakame/configuration'
22
+ autoload :Logger, 'wakame/logger'
23
+ autoload :Packets, 'wakame/packets'
24
+ autoload :AMQPClient, 'wakame/amqp_client'
25
+ autoload :EventDispatcher, 'wakame/event_dispatcher'
26
+ autoload :Scheduler, 'wakame/scheduler'
27
+ autoload :Command, 'wakame/command'
28
+ autoload :CommandQueue, 'wakame/command_queue'
29
+ autoload :Template, 'wakame/template'
30
+ autoload :Trigger, 'wakame/trigger'
31
+ autoload :Action, 'wakame/action'
32
+ autoload :RuleEngine, 'wakame/rule_engine'
33
+ #autoload :Initializer, 'wakame/initializer' # Do not autoload this class since the constant is used for the flag in bootstrap.
34
+
35
+ def gen_id(str=nil)
36
+ Util.gen_id(str)
37
+ end
38
+
39
+ def log
40
+ Logger.log
41
+ end
42
+
43
+ module_function :gen_id, :log
44
+
45
+ class << self
46
+ def config
47
+ Initializer.instance.configuration
48
+ end
49
+
50
+ def environment
51
+ config.environment
52
+ end
53
+
54
+ def new_(class_or_str)
55
+ Util.new_(class_or_str)
56
+ end
57
+ end
58
+
59
+ end
data/tasks/ec2.rake ADDED
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #require 'wakame'
4
+ require 'timeout'
5
+
6
+ #AWS_ACCESS_KEY=ENV['AMAZON_ACCESS_KEY_ID'] || Wakame.config.aws_access_key
7
+ #AWS_SECRET_KEY=ENV['AMAZON_SECRET_ACCESS_KEY'] || Wakame.config.aws_secret_key
8
+ AWS_ACCESS_KEY=ENV['AMAZON_ACCESS_KEY_ID']
9
+ AWS_SECRET_KEY=ENV['AMAZON_SECRET_ACCESS_KEY']
10
+
11
+ def create_ec2
12
+ require 'EC2'
13
+ ec2 = EC2::Base.new(:access_key_id =>AWS_ACCESS_KEY, :secret_access_key =>AWS_SECRET_KEY)
14
+ end
15
+
16
+ def request_metadata_url(key)
17
+ require 'open-uri'
18
+ open("http://169.254.169.254/2008-09-01/meta-data/#{key}") { |f|
19
+ return f.readline
20
+ }
21
+ end
22
+
23
+ namespace :ec2 do
24
+ desc "Automate the EC2 image bundle procedure.(ec2-bundle-vol + ec2-upload-bundle + ec2-register)"
25
+ task :bundle, :manifest_path do |t, args|
26
+ raise 'This task requires root privilege.' unless Process.uid == 0
27
+ raise 'Required key files counld not be detected: /mnt/cert.pem or /mnt/pk.pem' unless File.exist?('/mnt/cert.pem') && File.exist?('/mnt/pk.pem')
28
+
29
+ #sh("/etc/init.d/rabbitmq-server stop") rescue puts $!
30
+
31
+ bundle_tmpdir='/mnt/wakame-bundle'
32
+ # If the arg was not set, it tries to overwrite the running image.
33
+ manifest_path= args.manifest_path || request_metadata_url('ami-manifest-path')
34
+
35
+ #manifest_path.sub!(/.manifest.xml\Z/, '')
36
+ if manifest_path =~ %r{\A([^/]+)/(.+)\.manifest\.xml\Z}
37
+ #s3bucket = manifest_path[0, manifest_path.index('/') - 1]
38
+ #manifest_prefix = manifest_path[manifest_path.index('/')]
39
+ s3bucket = $1
40
+ manifest_basename = File.basename($2)
41
+ manifest_path = "#{s3bucket}/#{manifest_basename}.manifest.xml"
42
+ #puts "#{manifest_path}"
43
+ else
44
+ fail "Given manifest path is not valid: #{manifest_path}"
45
+ end
46
+
47
+ puts "Manifest Path: #{manifest_path}"
48
+
49
+ ec2 = create_ec2()
50
+
51
+ ami_id = request_metadata_url('ami-id')
52
+
53
+ instance_id = request_metadata_url('instance-id')
54
+ res = ec2.describe_instances(:instance_id=>instance_id)
55
+ account_no = res['reservationSet']['item'][0]['ownerId']
56
+
57
+ res = ec2.describe_images(:image_id=>ami_id)
58
+ arch = res['imagesSet']['item'][0]['architecture']
59
+
60
+ begin
61
+ FileUtils.rm_rf(bundle_tmpdir) if File.exist?(bundle_tmpdir)
62
+ FileUtils.mkpath(bundle_tmpdir)
63
+
64
+ sh("ec2-bundle-vol --batch -d '#{bundle_tmpdir}' -p '#{manifest_basename}' -c /mnt/cert.pem -k /mnt/pk.pem -u '#{account_no}' -r '#{arch}'")
65
+ sh("ec2-upload-bundle -d '#{bundle_tmpdir}' -b '#{s3bucket}' -m '#{File.join(bundle_tmpdir, manifest_basename + '.manifest.xml')}' -a '#{AWS_ACCESS_KEY}' -s '#{AWS_SECRET_KEY}'")
66
+ res = ec2.register_image(:image_location=>manifest_path)
67
+ puts "New AMI ID for #{manifest_path}: #{res['imageId']}"
68
+ ensure
69
+ FileUtils.rm_rf(bundle_tmpdir) if File.exist?(bundle_tmpdir)
70
+ end
71
+ end
72
+
73
+
74
+ desc "Initiate the mysql master volume using Amazon EBS"
75
+ task :mysqlsetupvol, :size do |t, args|
76
+ raise 'This task requires root privilege.' unless Process.uid == 0
77
+
78
+ ATTACH_DEV='/dev/sdw'
79
+ TMP_MNT='/mnt/mysql-tmp'
80
+ vol_size = (args.size || '1').to_s
81
+ zone = request_metadata_url('placement/availability-zone')
82
+ instance_id = request_metadata_url('instance-id')
83
+
84
+ ec2 = create_ec2
85
+ res = ec2.create_volume(:size=>vol_size, :availability_zone=>zone)
86
+ vol_id = res['volumeId']
87
+
88
+ timeout(10) {
89
+ begin
90
+ res = ec2.describe_volumes(:volume_id=>vol_id)
91
+ next if res['volumeSet']['item'][0]['status'] == 'available'
92
+ sleep 0.5
93
+ retry
94
+ end
95
+ }
96
+
97
+ begin
98
+ res = ec2.attach_volume(:instance_id=>instance_id, :volume_id=>vol_id, :device=>ATTACH_DEV)
99
+
100
+ timeout(10) {
101
+ begin
102
+ res = ec2.describe_volumes(:volume_id=>vol_id)
103
+ next if res['volumeSet']['item'][0]['status'] == 'in-use' && File.blockdev?(ATTACH_DEV)
104
+ sleep 0.5
105
+ retry
106
+ end
107
+ }
108
+
109
+ sh("echo 'y' | mkfs.ext3 -q #{ATTACH_DEV}")
110
+
111
+ begin
112
+ FileUtils.mkpath(TMP_MNT) unless File.exist?(TMP_MNT)
113
+ sh("mount #{ATTACH_DEV} #{TMP_MNT}")
114
+ sleep 1.0
115
+ sh("/usr/bin/mysql_install_db --datadir=#{TMP_MNT}")
116
+ ensure
117
+ sh("umount #{TMP_MNT}")
118
+ sleep 1.0
119
+ end
120
+
121
+ ensure
122
+ ec2.detach_volume(:volume_id=>vol_id, :instance_id=>instance_id) rescue puts $!
123
+ end
124
+
125
+ puts "Initialized EBS Volume: #{vol_id} "
126
+ end
127
+ end
@@ -0,0 +1,3 @@
1
+ {
2
+
3
+ }
data/tests/conf/a ADDED
@@ -0,0 +1 @@
1
+ aaaaaa
data/tests/conf/b ADDED
@@ -0,0 +1 @@
1
+ bbbbbbb
data/tests/conf/c ADDED
@@ -0,0 +1 @@
1
+ ccccccc
@@ -0,0 +1,39 @@
1
+
2
+ $:.unshift File.dirname(__FILE__) + '/../lib'
3
+
4
+ WAKAME_ROOT="#{File.dirname(__FILE__)}/.."
5
+ WAKAME_FRAMEWORK_ROOT="#{File.dirname(__FILE__)}/.."
6
+ WAKAME_ENV=:StandAlone
7
+
8
+ require 'rubygems' rescue nil
9
+
10
+ require 'test/unit'
11
+
12
+ require 'wakame'
13
+ require 'wakame/initializer'
14
+
15
+ #require "#{WAKAME_ROOT}/config/boot"
16
+ #Wakame::Bootstrap.boot_agent!
17
+
18
+ Wakame::Initializer.run(:process_agent)
19
+
20
+
21
+ class DummyAgent
22
+ attr_reader :publish_count
23
+
24
+ attr_accessor :actor_registry, :monitor_registry
25
+
26
+ def initialize(&blk)
27
+ blk.call(self) if blk
28
+ @publish_count = 0
29
+ end
30
+
31
+ def agent_id
32
+ 'test_id'
33
+ end
34
+
35
+ def publish_to(*args)
36
+ @publish_count += 1
37
+ end
38
+
39
+ end
@@ -0,0 +1,28 @@
1
+
2
+ $:.unshift File.dirname(__FILE__) + '/../lib'
3
+
4
+ WAKAME_ROOT="#{File.dirname(__FILE__)}/.."
5
+ WAKAME_FRAMEWORK_ROOT="#{File.dirname(__FILE__)}/.."
6
+ WAKAME_ENV=:StandAlone
7
+
8
+ require 'rubygems' rescue nil
9
+
10
+ require 'test/unit'
11
+
12
+ require 'wakame'
13
+ require 'wakame/initializer'
14
+
15
+ require 'ext/eventmachine'
16
+
17
+ #require "#{WAKAME_ROOT}/config/boot"
18
+ #Wakame::Bootstrap.boot_agent!
19
+
20
+ #Wakame::Initializer.run(:process_master)
21
+ Wakame::Initializer.run(:setup_load_paths)
22
+ Wakame::Initializer.run(:setup_logger)
23
+
24
+
25
+ class MockCluster < Wakame::Service::ServiceCluster
26
+ end
27
+
28
+ Wakame.config.cluster_class = 'MockCluster'
@@ -0,0 +1,54 @@
1
+
2
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
3
+ $:.unshift(File.dirname(__FILE__))
4
+
5
+ require 'setup_agent.rb'
6
+
7
+ require 'rubygems'
8
+
9
+ require 'test/unit'
10
+
11
+ require 'wakame'
12
+ require 'wakame/packets'
13
+ require 'wakame/agent'
14
+ require 'wakame/actor'
15
+ require 'wakame/actor/service_monitor'
16
+
17
+ class TestActor < Test::Unit::TestCase
18
+ include Wakame
19
+
20
+
21
+ def test_actor_registry
22
+ reg = ActorRegistry.new
23
+ reg.register(Actor::ServiceMonitor.new)
24
+ assert(reg.actors.keys.include?('/wakame/actor/service_monitor'))
25
+ reg.unregister('/wakame/actor/service_monitor')
26
+ assert(reg.actors.size == 0)
27
+ end
28
+
29
+ def test_service_monitor
30
+ require 'wakame/monitor/service'
31
+
32
+ EM.run {
33
+ agent = DummyAgent.new { |me|
34
+ me.actor_registry = ActorRegistry.new
35
+ me.monitor_registry = MonitorRegistry.new
36
+ mon = Wakame::Monitor::Service.new
37
+ mon.agent = me
38
+ me.monitor_registry.register(mon, '/service')
39
+ }
40
+
41
+ d = Dispatcher.new(agent)
42
+ svcmon = Actor::ServiceMonitor.new
43
+ svcmon.agent = agent
44
+
45
+ agent.actor_registry.register(svcmon, '/service_monitor')
46
+ d.handle_request({:path=>'/service_monitor/register', :args=>['aaaa', 'ls -l /tmp']})
47
+ EM.next_tick {
48
+ assert(agent.monitor_registry.find_monitor('/service').checkers.keys.include?('aaaa'))
49
+ EM.stop
50
+ }
51
+ }
52
+ end
53
+
54
+ end