wakame 0.4.1 → 0.4.2

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 (83) hide show
  1. data/History.txt +18 -0
  2. data/README.rdoc +2 -4
  3. data/Rakefile +4 -1
  4. data/VERSION +1 -1
  5. data/app_generators/wakame/templates/config/cluster.rb +36 -0
  6. data/app_generators/wakame/wakame_generator.rb +1 -0
  7. data/lib/wakame/action.rb +19 -34
  8. data/lib/wakame/actions/launch_cluster.rb +6 -3
  9. data/lib/wakame/actions/launch_vm.rb +57 -0
  10. data/lib/wakame/actions/migrate_service.rb +6 -25
  11. data/lib/wakame/actions/propagate_instances.rb +16 -41
  12. data/lib/wakame/actions/reload_service.rb +2 -2
  13. data/lib/wakame/actions/shutdown_cluster.rb +4 -0
  14. data/lib/wakame/actions/start_service.rb +30 -9
  15. data/lib/wakame/actions/stop_service.rb +1 -4
  16. data/lib/wakame/actions/util.rb +0 -24
  17. data/lib/wakame/actor/mysql.rb +106 -0
  18. data/lib/wakame/actor/service_monitor.rb +10 -0
  19. data/lib/wakame/actor/system.rb +19 -9
  20. data/lib/wakame/actor.rb +1 -1
  21. data/lib/wakame/agent.rb +23 -17
  22. data/lib/wakame/command/action_status.rb +7 -38
  23. data/lib/wakame/command/agent_status.rb +18 -0
  24. data/lib/wakame/command/launch_cluster.rb +0 -4
  25. data/lib/wakame/command/launch_vm.rb +11 -0
  26. data/lib/wakame/command/migrate_service.rb +12 -9
  27. data/lib/wakame/command/propagate_service.rb +15 -7
  28. data/lib/wakame/command/reload_service.rb +21 -0
  29. data/lib/wakame/command/shutdown_cluster.rb +0 -5
  30. data/lib/wakame/command/shutdown_vm.rb +20 -0
  31. data/lib/wakame/command/status.rb +6 -66
  32. data/lib/wakame/command/stop_service.rb +31 -0
  33. data/lib/wakame/command.rb +3 -0
  34. data/lib/wakame/command_queue.rb +76 -5
  35. data/lib/wakame/configuration.rb +6 -1
  36. data/lib/wakame/event.rb +6 -5
  37. data/lib/wakame/event_dispatcher.rb +5 -3
  38. data/lib/wakame/initializer.rb +1 -1
  39. data/lib/wakame/master.rb +14 -10
  40. data/lib/wakame/monitor/agent.rb +1 -6
  41. data/lib/wakame/monitor/service.rb +13 -1
  42. data/lib/wakame/packets.rb +51 -13
  43. data/lib/wakame/rule_engine.rb +7 -18
  44. data/lib/wakame/runner/administrator_command.rb +517 -46
  45. data/lib/wakame/service.rb +104 -173
  46. data/lib/wakame/trigger.rb +1 -10
  47. data/lib/wakame/triggers/process_command.rb +9 -2
  48. data/lib/wakame/util.rb +21 -21
  49. data/lib/wakame/vm_manipulator.rb +1 -0
  50. data/tests/test_service.rb +30 -6
  51. data/wakame_generators/resource/templates/ec2_elb/ec2_elb.rb +80 -0
  52. data/wakame_generators/resource/templates/mysql_master/conf/my.cnf +3 -1
  53. data/wakame_generators/resource/templates/mysql_master/init.d/mysql +3 -3
  54. data/wakame_generators/resource/templates/mysql_master/mysql_master.rb +11 -12
  55. data/{app_generators/wakame/templates/cluster/resources/mysql_master → wakame_generators/resource/templates/mysql_slave}/conf/my.cnf +19 -9
  56. data/{app_generators/wakame/templates/cluster/resources/mysql_master/init.d/mysql → wakame_generators/resource/templates/mysql_slave/init.d/mysql-slave} +4 -4
  57. data/wakame_generators/resource/templates/mysql_slave/mysql_slave.rb +123 -0
  58. data/wakame_generators/resource/templates/nginx/conf/nginx.conf +166 -0
  59. data/wakame_generators/resource/templates/nginx/init.d/nginx +70 -0
  60. data/{app_generators/wakame/templates/cluster/resources/apache_lb/apache_lb.rb → wakame_generators/resource/templates/nginx/nginx.rb} +28 -17
  61. metadata +46 -27
  62. data/app_generators/wakame/templates/cluster/resources/apache_app/apache_app.rb +0 -54
  63. data/app_generators/wakame/templates/cluster/resources/apache_app/conf/apache2.conf +0 -46
  64. data/app_generators/wakame/templates/cluster/resources/apache_app/conf/envvars-app +0 -7
  65. data/app_generators/wakame/templates/cluster/resources/apache_app/conf/sites-app.conf +0 -23
  66. data/app_generators/wakame/templates/cluster/resources/apache_app/conf/system-app.conf +0 -67
  67. data/app_generators/wakame/templates/cluster/resources/apache_app/init.d/apache2-app +0 -192
  68. data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/apache2.conf +0 -46
  69. data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/envvars-lb +0 -6
  70. data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/sites-lb.conf +0 -54
  71. data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/system-lb.conf +0 -75
  72. data/app_generators/wakame/templates/cluster/resources/apache_lb/init.d/apache2-lb +0 -192
  73. data/app_generators/wakame/templates/cluster/resources/apache_www/apache_www.rb +0 -50
  74. data/app_generators/wakame/templates/cluster/resources/apache_www/conf/apache2.conf +0 -47
  75. data/app_generators/wakame/templates/cluster/resources/apache_www/conf/envvars-www +0 -7
  76. data/app_generators/wakame/templates/cluster/resources/apache_www/conf/sites-www.conf +0 -23
  77. data/app_generators/wakame/templates/cluster/resources/apache_www/conf/system-www.conf +0 -63
  78. data/app_generators/wakame/templates/cluster/resources/apache_www/init.d/apache2-www +0 -192
  79. data/app_generators/wakame/templates/cluster/resources/ec2_elastic_ip/ec2_elastic_ip.rb +0 -39
  80. data/app_generators/wakame/templates/cluster/resources/mysql_master/mysql_master.rb +0 -174
  81. data/tests/conf/a +0 -1
  82. data/tests/conf/b +0 -1
  83. data/tests/conf/c +0 -1
data/History.txt CHANGED
@@ -1,3 +1,21 @@
1
+ == 0.4.2 2009-07-24
2
+
3
+ * Add Web API for master control. (Note that the API design is not fixed yet)
4
+
5
+ * Rewrote the CLI to use HTTP instead of old DRb interface.
6
+
7
+ * Add support for agent less resource.
8
+
9
+ * Add LockQueue to avoid confliction when multiple actions run.
10
+
11
+ * Add MySQL_Slave resource.
12
+
13
+ * Add Elastic IP resource.
14
+
15
+ * Add Elastic Load Balancer resource.
16
+
17
+ * Add Nginx resource.
18
+
1
19
  == 0.4.1 2009-06-29
2
20
 
3
21
  * Fixed the packaging bugs.
data/README.rdoc CHANGED
@@ -6,10 +6,6 @@
6
6
 
7
7
  * Wakame is a framework to simplify the complex virtual machine manipulation over multiple instances in Clound envrionment. This project aims to provide the management/monitoring services with server/daemon configuration set to build scalable web applications.
8
8
 
9
- == SYNOPSIS:
10
-
11
- *
12
-
13
9
  == REQUIREMENTS:
14
10
 
15
11
  * eventmachine
@@ -19,6 +15,8 @@
19
15
  * right_aws
20
16
  * log4r
21
17
  * jeweler
18
+ * thin
19
+ * json
22
20
 
23
21
  == INSTALL:
24
22
 
data/Rakefile CHANGED
@@ -25,7 +25,10 @@ __END__
25
25
  ['daemons', '>= 1.0.10'],
26
26
  ['rubigen', '>= 1.5.2'],
27
27
  ['open4', '>= 0.9.6'],
28
- ['jeweler', '>= 1.0.0']
28
+ ['jeweler', '>= 1.0.0'],
29
+ ['rack', '>= 1.0.0'],
30
+ ['thin', '>= 1.2.2'],
31
+ ['json', '>= 1.1.7']
29
32
  ].each { |i|
30
33
  gem.add_dependency(i[0], i[1])
31
34
  }
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.4.2
@@ -13,11 +13,13 @@ class WebCluster < Wakame::Service::ServiceCluster
13
13
  c.add_resource(Apache_APP.new)
14
14
  c.add_resource(Apache_LB.new)
15
15
  c.add_resource(MySQL_Master.new)
16
+ #c.add_resource(MySQL_Slave.new)
16
17
 
17
18
  c.set_dependency(Apache_LB, Ec2ElasticIp)
18
19
  c.set_dependency(Apache_WWW, Apache_LB)
19
20
  c.set_dependency(Apache_APP, Apache_LB)
20
21
  c.set_dependency(MySQL_Master, Apache_APP)
22
+ #c.set_dependency(MySQL_Master, MySQL_Slave)
21
23
  }
22
24
 
23
25
  define_rule { |r|
@@ -61,4 +63,38 @@ class WebCluster < Wakame::Service::ServiceCluster
61
63
  }
62
64
  end
63
65
 
66
+ def each_mysql_master(&blk)
67
+ each_instance(MySQL_Master) { |n|
68
+ blk.call(n)
69
+ }
70
+ end
71
+
72
+ def fetch_mysql_master_ip
73
+ mysql_master_ip = nil
74
+ each_mysql_master do |mysql|
75
+ mysql_master_ip = mysql.agent.agent_ip
76
+ end
77
+ mysql_master_ip
78
+ end
79
+
80
+ def each_mysql_slave(&blk)
81
+ each_instance(MySQL_Slave) { |n|
82
+ blk.call(n)
83
+ }
84
+ end
85
+
86
+ def fetch_mysql_slave_ip
87
+ mysql_slave_ips = []
88
+ each_mysql_slave do |mysql|
89
+ mysql_slave_ips << mysql.agent.agent_ip
90
+ end
91
+ mysql_master_ips
92
+ end
93
+
94
+ # def each_postgresql(&blk)
95
+ # each_instance(PostgreSQL_Master) { |n|
96
+ # blk.call(n)
97
+ # }
98
+ # end
99
+
64
100
  end
@@ -20,6 +20,7 @@ class WakameGenerator < RubiGen::Base
20
20
  config/environments
21
21
  lib
22
22
  tasks
23
+ tmp
23
24
  vendor
24
25
  )
25
26
 
data/lib/wakame/action.rb CHANGED
@@ -7,7 +7,6 @@ module Wakame
7
7
  def_attribute :status, :ready
8
8
  def_attribute :completion_status
9
9
  def_attribute :parent_action
10
- def_attribute :acquire_lock, false
11
10
 
12
11
  attr_reader :trigger
13
12
 
@@ -36,20 +35,17 @@ module Wakame
36
35
  @subactions ||= []
37
36
  end
38
37
 
39
- def bind_triggered_rule(trigger)
38
+ def bind_trigger(trigger)
40
39
  @trigger = trigger
41
40
  end
42
41
 
43
42
  def trigger_action(subaction, opts={})
44
- if opts.is_a? Hash
45
- succ_proc = opts[:success] || opts[:succ]
46
- fail_proc = opts[:fail]
47
- end
48
43
  subactions << subaction
49
44
  subaction.parent_action = self
50
- #subaction.observers << self
45
+ subaction.job_id = self.job_id
46
+ subaction.bind_trigger(self.trigger)
51
47
 
52
- async_trigger_action(subaction, succ_proc, fail_proc)
48
+ trigger.rule_engine.run_action(subaction)
53
49
  end
54
50
 
55
51
  def flush_subactions(sec=nil)
@@ -92,8 +88,8 @@ module Wakame
92
88
  notify_queue.enq(src) #if notify_queue.num_waiting > 0
93
89
  end
94
90
  end
95
-
96
-
91
+
92
+ # Recursively iterate the sub action descendants.
97
93
  def walk_subactions(&blk)
98
94
  blk.call(self)
99
95
  self.subactions.each{ |a|
@@ -118,6 +114,18 @@ module Wakame
118
114
  def notes
119
115
  trigger.rule_engine.active_jobs[self.job_id][:notes]
120
116
  end
117
+
118
+ # Set the lock flags to resources
119
+ def acquire_lock(&blk)
120
+ EM.barrier {
121
+ reslist = []
122
+ blk.call(reslist)
123
+ reslist.flatten!
124
+ reslist.each {|r| service_cluster.lock_queue.set(r.to_s, self.job_id) }
125
+ }
126
+
127
+ service_cluster.lock_queue.wait(self.job_id)
128
+ end
121
129
 
122
130
  def run
123
131
  raise NotImplementedError
@@ -128,29 +136,6 @@ module Wakame
128
136
 
129
137
  def on_canceled
130
138
  end
131
-
132
- private
133
- def sync_trigger_action(action, succ_proc, fail_proc)
134
- action.job_id = self.job_id
135
- action.bind_triggered_rule(self.trigger)
136
-
137
- Wakame.log.debug("Start nested action in SYNC: #{action.class.to_s}")
138
- begin
139
- action.run
140
- succ_proc.call if succ_proc
141
- rescue => e
142
- fail_proc.call if fail_proc
143
- raise
144
- end
145
- Wakame.log.debug("Complete nested action : #{action.class.to_s}")
146
- end
147
-
148
- def async_trigger_action(action, succ_proc, fail_proc)
149
- action.job_id = self.job_id
150
- action.bind_triggered_rule(self.trigger)
151
-
152
- trigger.rule_engine.run_action(action)
153
- end
154
-
139
+
155
140
  end
156
141
  end
@@ -14,10 +14,13 @@ module Wakame
14
14
  EM.barrier {
15
15
  service_cluster.launch
16
16
  }
17
+ levels = service_cluster.dg.levels
18
+ Wakame.log.debug("#{self.class}: Resource launch order: " + levels.collect {|lv| '['+ lv.collect{|prop| "#{prop.class}" }.join(', ') + ']' }.join(', '))
19
+ acquire_lock { |list|
20
+ levels.each {|lv| list << lv.collect{|res| res.class } }
21
+ }
17
22
 
18
- Wakame.log.debug("#{self.class}: Resource Launch Order: " + service_cluster.dg.levels.collect {|lv| '['+ lv.collect{|prop| "#{prop.class}" }.join(', ') + ']' }.join(', '))
19
-
20
- service_cluster.dg.levels.each { |lv|
23
+ levels.each { |lv|
21
24
  lv.each { |svc_prop|
22
25
  trigger_action(PropagateInstances.new(svc_prop))
23
26
  }
@@ -0,0 +1,57 @@
1
+ module Wakame
2
+ module Actions
3
+ class LaunchVM < Action
4
+ def initialize(notes_key, ref_agent=nil)
5
+ @ref_agent = ref_agent
6
+ @notes_key = notes_key
7
+ end
8
+
9
+ USER_DATA_TMPL=<<__END__
10
+ node=agent
11
+ amqp_server=amqp://%s/
12
+ agent_id=%s
13
+ __END__
14
+
15
+ def run
16
+ require 'right_aws'
17
+ ec2 = RightAws::Ec2.new(Wakame.config.aws_access_key, Wakame.config.aws_secret_key, {:cache=>false})
18
+
19
+ # Fetch the reference vm slice attributes.
20
+ @ref_agent ||= master.agent_monitor.master_local
21
+ ref_attr = ec2.describe_instances([@ref_agent.attr[:instance_id]])
22
+ ref_attr = ref_attr[0]
23
+
24
+
25
+ user_data = sprintf(USER_DATA_TMPL, master.attr[:local_ipv4], '')
26
+ Wakame.log.debug("#{self.class}: Lauching VM: #{ref_attr.inspect}\nuser_data: #{user_data}")
27
+ res = ec2.run_instances(ref_attr[:aws_image_id], 1, 1,
28
+ ref_attr[:aws_groups],
29
+ ref_attr[:ssh_key_name],
30
+ user_data,
31
+ 'public', # addressing_type
32
+ ref_attr[:aws_instance_type], # instance_type
33
+ nil, # kernel_id
34
+ nil, # ramdisk_id
35
+ ref_attr[:aws_availability_zone], # availability_zone
36
+ nil # block_device_mappings
37
+ )[0]
38
+ inst_id = res[:aws_instance_id]
39
+
40
+ ConditionalWait.wait { | cond |
41
+ cond.wait_event(Event::AgentMonitored) { |event|
42
+ event.agent.attr[:instance_id] == inst_id
43
+ }
44
+
45
+ cond.poll(5, 100) {
46
+ d = ec2.describe_instances([inst_id])[0]
47
+ Wakame.log.debug("#{self.class}: Polling describe_instances(#{inst_id}): #{d[:aws_state]} ")
48
+ d[:aws_state] == "running"
49
+ }
50
+ }
51
+
52
+ notes[@notes_key] = inst_id
53
+
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,23 +1,23 @@
1
1
 
2
- require 'wakame/actions/util'
3
-
4
2
  module Wakame
5
3
  module Actions
6
4
  class MigrateService < Action
7
- include Actions::Util
8
-
9
5
  def initialize(service_instance, dest_agent=nil)
10
6
  @service_instance = service_instance
11
7
  @destination_agent = dest_agent
12
8
  end
13
9
 
14
10
  def run
11
+ acquire_lock { |list|
12
+ list << @service_instance.resource.class
13
+ }
14
+
15
15
  raise CancelActionError if @service_instance.status == Service::STATUS_MIGRATING
16
16
 
17
17
  EM.barrier {
18
18
  @service_instance.update_status(Service::STATUS_MIGRATING)
19
19
  }
20
- prop = @service_instance.property
20
+ prop = @service_instance.resource
21
21
  if prop.duplicable
22
22
  clone_service(prop)
23
23
  flush_subactions
@@ -38,26 +38,7 @@ module Wakame
38
38
  new_svc = service_cluster.propagate(resource, true)
39
39
  }
40
40
 
41
- agent = @destination_agent
42
- if agent.nil?
43
- EM.barrier {
44
- agent = arrange_agent(resource)
45
- }
46
- if agent.nil?
47
- inst_id = start_instance(master.attr[:ami_id], resource.vm_spec.current.attrs)
48
- agent = agent_monitor.registered_agents[inst_id]
49
- end
50
- end
51
-
52
- if !(agent && test_agent_candidate(resource, agent))
53
- raise "Found confiction(s) when the agent is assigned to sevice: #{resource} #{agent} "
54
- end
55
-
56
- EM.barrier {
57
- new_svc.bind_agent(agent)
58
- }
59
-
60
- trigger_action(StartService.new(new_svc))
41
+ trigger_action(StartService.new(new_svc, @destination_agent))
61
42
  new_svc
62
43
  end
63
44
  end
@@ -1,10 +1,6 @@
1
-
2
- require 'wakame/actions/util'
3
-
4
1
  module Wakame
5
2
  module Actions
6
3
  class PropagateInstances < Action
7
- include Actions::Util
8
4
 
9
5
  def initialize(svc_prop, propagate_num=0)
10
6
  raise ArgumentError unless svc_prop.is_a?(Wakame::Service::Resource)
@@ -40,56 +36,35 @@ module Wakame
40
36
  end
41
37
  }
42
38
 
39
+ acquire_lock { |ary|
40
+ svc_to_start.each { |svc|
41
+ ary << svc.resource.class
42
+ }
43
+ }
44
+
43
45
  svc_to_start.each { |svc|
46
+ target_agent = nil
44
47
  if svc.property.require_agent
45
48
  # Try to arrange agent from existing agent pool.
46
49
  if svc.agent.nil?
47
50
  EM.barrier {
48
- arrange_agent(svc)
49
- }
50
- end
51
-
52
- # If the agent pool is empty, will start a new VM slice.
53
- if svc.agent.nil?
54
- inst_id = start_instance(master.attr[:ami_id], @svc_prop.vm_spec.current.attrs)
55
- EM.barrier {
56
- arrange_agent(svc, inst_id)
51
+ agent_monitor.each_online { |ag|
52
+ if !ag.has_service_type?(@svc_prop.class) && @svc_prop.vm_spec.current.satisfy?(ag)
53
+ target_agent = ag
54
+ break
55
+ end
56
+ }
57
57
  }
58
58
  end
59
-
60
- if svc.agent.nil?
61
- Wakame.log.error("Failed to arrange the agent #{svc.instance_id} (#{svc.property.class})")
62
- raise "Failed to arrange the agent #{@svc_prop.class}"
63
- end
59
+
60
+ Wakame.log.debug("#{self.class}: arranged agent for #{svc.resource.class}: #{target_agent ? target_agent.agent_id : nil}")
64
61
  end
65
62
 
66
- trigger_action(StartService.new(svc))
63
+ trigger_action(StartService.new(svc, target_agent))
67
64
  }
68
65
  flush_subactions
69
66
  end
70
67
 
71
- private
72
- # Arrange an agent for the paticular service instance which does not have agent.
73
- def arrange_agent(svc, vm_inst_id=nil)
74
- agent = nil
75
- if vm_inst_id
76
- agent = agent_monitor.registered_agents[vm_inst_id]
77
- raise "Cound not find the specified VM instance \"#{vm_inst_id}\"" if agent.nil?
78
- raise "Same service is running" if agent.has_service_type? @svc_prop.class
79
- else
80
- agent_monitor.each_online { |ag|
81
- Wakame.log.debug "has_service_type?(#{@svc_prop.class}): #{ag.has_service_type?(@svc_prop.class)}"
82
- if test_agent_candidate(@svc_prop, ag)
83
- agent = ag
84
- break
85
- end
86
- }
87
- end
88
- if agent
89
- svc.bind_agent(agent)
90
- end
91
- end
92
-
93
68
  end
94
69
  end
95
70
  end
@@ -13,8 +13,8 @@ module Wakame
13
13
  #if @service_instance.status == Service::STATUS_STARTING || @service_instance.status == Service::STATUS_ONLINE
14
14
  # raise "Canceled as the service is being or already ONLINE: #{@service_instance.property}"
15
15
  #end
16
-
17
- master.send_agent_command(Packets::ServiceReload.new(@service_instance.instance_id), @service_instance.agent.agent_id)
16
+
17
+ @service_instance.resource.reload(@service_instance, self)
18
18
  end
19
19
  end
20
20
  end
@@ -3,6 +3,10 @@ module Wakame
3
3
  class ShutdownCluster < Action
4
4
  def run
5
5
  levels = service_cluster.dg.levels
6
+ Wakame.log.debug("#{self.class}: Resource shutdown order: " + levels.collect {|lv| '['+ lv.collect{|prop| "#{prop.class}" }.join(', ') + ']' }.join(', '))
7
+ acquire_lock { |list|
8
+ levels.each {|lv| list << lv.collect{|res| res.class } }
9
+ }
6
10
 
7
11
  levels.reverse.each { |lv|
8
12
  lv.each { |svc_prop|
@@ -4,36 +4,57 @@ require 'wakame/rule'
4
4
  module Wakame
5
5
  module Actions
6
6
  class StartService < Action
7
- def initialize(service_instance)
8
- @acquire_lock = true
7
+ def initialize(service_instance, target_agent=nil)
9
8
  @service_instance = service_instance
9
+ @target_agent = target_agent
10
10
  end
11
11
 
12
12
  def run
13
- if @service_instance.property.require_agent
13
+ if @service_instance.resource.require_agent
14
+
15
+ if @service_instance.agent.nil?
16
+ # Start new VM when the target agent is nil.
17
+ if @target_agent.nil?
18
+ inst_id_key = "new_inst_id_" + Wakame::Util.gen_id
19
+ trigger_action(LaunchVM.new(inst_id_key))
20
+ flush_subactions
21
+
22
+ EM.barrier {
23
+ @target_agent = agent_monitor.registered_agents[notes[inst_id_key]]
24
+ raise "Cound not find the specified VM instance \"#{notes[inst_id_key]}\"" if @target_agent.nil?
25
+ raise "Same service is running" if @target_agent.has_service_type? @service_instance.resource.class
26
+ }
27
+ end
28
+
29
+ EM.barrier {
30
+ @service_instance.bind_agent(@target_agent)
31
+ }
32
+ end
33
+
34
+
14
35
  raise "Agent is not bound on this service : #{@service_instance}" if @service_instance.agent.nil?
15
36
  raise "The assigned agent for the service instance #{@service_instance.instance_id} is not online." unless @service_instance.agent.status == Service::Agent::STATUS_ONLINE
16
37
  end
17
38
 
18
39
  # Skip to act when the service is having below status.
19
40
  if @service_instance.status == Service::STATUS_STARTING || @service_instance.status == Service::STATUS_ONLINE
20
- raise "Canceled as the service is being or already ONLINE: #{@service_instance.property}"
41
+ raise "Canceled as the service is being or already ONLINE: #{@service_instance.resource}"
21
42
  end
22
43
  EM.barrier {
23
44
  @service_instance.update_status(Service::STATUS_STARTING)
24
45
  }
25
46
 
26
- if @service_instance.property.require_agent
47
+ if @service_instance.resource.require_agent
27
48
  Rule::BasicActionSet.deploy_configuration(@service_instance)
28
49
  end
29
50
 
30
51
  @service_instance.resource.start(@service_instance, self)
31
52
 
32
53
  EM.barrier {
33
- Wakame.log.debug("Child nodes: #{@service_instance.property.class}: " + service_cluster.dg.children(@service_instance.property.class).inspect)
34
- service_cluster.dg.children(@service_instance.property.class).each { |svc_prop|
35
- Wakame.log.debug("Spreading DG child changed: #{@service_instance.property.class} -> #{svc_prop.class}")
36
- trigger_action(Actions::CallChildChangeAction.new(svc_prop))
54
+ Wakame.log.debug("Child nodes: #{@service_instance.resource.class}: " + service_cluster.dg.children(@service_instance.property.class).inspect)
55
+ service_cluster.dg.children(@service_instance.resource.class).each { |svc_res|
56
+ Wakame.log.debug("Spreading DG child changed: #{@service_instance.resource.class} -> #{svc_res.class}")
57
+ trigger_action(Actions::CallChildChangeAction.new(svc_res))
37
58
  }
38
59
  }
39
60
 
@@ -28,10 +28,7 @@ module Wakame
28
28
 
29
29
  flush_subactions()
30
30
 
31
- if @service_instance.status == Service::STATUS_ONLINE
32
- @service_instance.property.stop(@service_instance, self)
33
- else
34
- end
31
+ @service_instance.property.stop(@service_instance, self)
35
32
 
36
33
  EM.barrier {
37
34
  service_cluster.destroy(@service_instance.instance_id)
@@ -42,30 +42,6 @@ module Wakame
42
42
 
43
43
  agent
44
44
  end
45
-
46
-
47
- def start_instance(image_id, attr={})
48
- Wakame.log.debug("#{self.class} called start_instance(#{image_id})")
49
-
50
- attr[:user_data] = "node=agent\namqp_server=amqp://#{master.attr[:local_ipv4]}/"
51
- Wakame.log.debug("user_data: #{attr[:user_data]}")
52
- vm_manipulator = VmManipulator.create
53
- res = vm_manipulator.start_instance(image_id, attr)
54
- inst_id = res[:instance_id]
55
-
56
- ConditionalWait.wait { | cond |
57
- cond.wait_event(Event::AgentMonitored) { |event|
58
- event.agent.attr[:instance_id] == inst_id
59
- }
60
-
61
- cond.poll(5, 100) {
62
- vm_manipulator.check_status(inst_id, :online)
63
- }
64
- }
65
-
66
- inst_id
67
- end
68
-
69
45
  end
70
46
  end
71
47
  end
@@ -0,0 +1,106 @@
1
+ class Wakame::Actor::MySQL
2
+ include Wakame::Actor
3
+
4
+ # for Amazon EC2
5
+ def take_master_snapshot(opt_map)
6
+ Wakame.log.debug("take_master_snapshot: #{opt_map.inspect}")
7
+
8
+ mysql_client = "/usr/bin/mysql -h#{opt_map[:master_ip]} -P#{opt_map[:master_port]} -u#{opt_map[:repl_user]} -p#{opt_map[:repl_pass]} -s"
9
+
10
+ # master info
11
+ Wakame::Util.exec("echo 'FLUSH TABLES WITH READ LOCK;' | #{mysql_client}")
12
+ master_status = `echo show master status | #{mysql_client}`.to_s.split(/\t/)[0..1]
13
+
14
+ # mysql/data/master.info
15
+ master_infos = []
16
+ master_infos << 14
17
+ master_infos << master_status[0]
18
+ master_infos << master_status[1]
19
+ master_infos << opt_map[:master_ip]
20
+ master_infos << opt_map[:repl_user]
21
+ master_infos << opt_map[:repl_pass]
22
+ master_infos << opt_map[:master_port]
23
+ master_infos << 60
24
+ master_infos << 0
25
+ master_infos << ""
26
+ master_infos << ""
27
+ master_infos << ""
28
+ master_infos << ""
29
+ master_infos << ""
30
+ master_infos << ""
31
+ Wakame.log.debug(master_infos)
32
+
33
+ master_info = File.expand_path('master.info', opt_map[:master_mysqld_datadir])
34
+ Wakame.log.debug("master_info : #{master_info}")
35
+ file = File.new(master_info, "w")
36
+ file.puts(master_infos.join("\n"))
37
+ file.chmod(0664)
38
+ file.close
39
+
40
+ require 'fileutils'
41
+ FileUtils.chown('mysql', 'mysql', master_info)
42
+ Wakame::Util.exec("/bin/sync")
43
+ sleep 1.0
44
+
45
+ #
46
+ require 'right_aws'
47
+ ec2 = RightAws::Ec2.new(opt_map[:aws_access_key], opt_map[:aws_secret_key])
48
+
49
+ volume_map = ec2.describe_volumes([opt_map[:master_ebs_volume]])[0]
50
+ Wakame.log.debug("describe_volume(#{opt_map[:master_ebs_volume]}): #{volume_map.inspect}")
51
+ if volume_map[:aws_status] == 'in-use'
52
+ # Nothin to be done
53
+ else
54
+ Wakame.log.debug("The EBS volume(slave) is not ready to attach: #{opt_map[:master_ebs_volume]}")
55
+ return
56
+ end
57
+
58
+ # create_snapshot
59
+ snapshot_map = ec2.create_snapshot(opt_map[:master_ebs_volume])
60
+ Wakame.log.debug("create_snapshot #{snapshot_map.inspect}")
61
+ cond = ConditionalWait.new { |c|
62
+ c.poll {
63
+ snapshot_map = ec2.describe_snapshots([snapshot_map[:aws_id]])[0]
64
+ Wakame.log.debug("describe_snapshot #{snapshot_map.inspect}")
65
+ Wakame::Util.exec("/bin/sync")
66
+ snapshot_map[:aws_status] == "completed"
67
+ }
68
+ }
69
+ cond.wait
70
+
71
+ # unlock
72
+ Wakame::Util.exec("echo 'UNLOCK TABLES;' | #{mysql_client}")
73
+
74
+ # create volume from snapshot
75
+ created_volume_from_snapshot_map = ec2.create_volume(snapshot_map[:aws_id], volume_map[:aws_size], volume_map[:zone])
76
+ Wakame.log.debug("create_volume_from_snapshot #{created_volume_from_snapshot_map}")
77
+ cond = ConditionalWait.new { |c|
78
+ c.poll {
79
+ volume_map = ec2.describe_volumes([created_volume_from_snapshot_map[:aws_id]])[0]
80
+ Wakame.log.debug("describe_volume: #{volume_map.inspect}")
81
+ Wakame::Util.exec("/bin/sync")
82
+ volume_map[:aws_status] == "available"
83
+ }
84
+ }
85
+ cond.wait
86
+
87
+ # delete_snapshot
88
+ delete_map = ec2.delete_snapshot(snapshot_map[:aws_id])
89
+ Wakame.log.debug("delete_map #{delete_map.inspect}")
90
+
91
+ # attach_volume
92
+ Wakame.log.debug("attach-target #{volume_map.inspect}")
93
+ attach_volume_map = ec2.attach_volume(volume_map[:aws_id], agent.agent_id, opt_map[:ebs_device])
94
+ Wakame.log.debug("attach_volume_map #{attach_volume_map.inspect}")
95
+ cond = ConditionalWait.new { |c|
96
+ c.poll {
97
+ volume_map = ec2.describe_volumes([attach_volume_map[:aws_id]])[0]
98
+ Wakame.log.debug("describe_volume #{volume_map.inspect}")
99
+ Wakame::Util.exec("/bin/sync")
100
+ volume_map[:aws_status] == "in-use"
101
+ }
102
+ }
103
+ cond.wait
104
+
105
+ end
106
+ end