wakame 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +20 -0
- data/README.rdoc +63 -0
- data/Rakefile +86 -0
- data/VERSION +1 -0
- data/app_generators/wakame/templates/README +0 -0
- data/app_generators/wakame/templates/Rakefile +18 -0
- data/app_generators/wakame/templates/bin/wakame-agent +9 -0
- data/app_generators/wakame/templates/bin/wakame-master +9 -0
- data/app_generators/wakame/templates/bin/wakameadm +9 -0
- data/app_generators/wakame/templates/cluster/resources/apache_app/apache_app.rb +54 -0
- data/app_generators/wakame/templates/cluster/resources/apache_app/conf/apache2.conf +46 -0
- data/app_generators/wakame/templates/cluster/resources/apache_app/conf/envvars-app +7 -0
- data/app_generators/wakame/templates/cluster/resources/apache_app/conf/sites-app.conf +23 -0
- data/app_generators/wakame/templates/cluster/resources/apache_app/conf/system-app.conf +67 -0
- data/app_generators/wakame/templates/cluster/resources/apache_app/init.d/apache2-app +192 -0
- data/app_generators/wakame/templates/cluster/resources/apache_lb/apache_lb.rb +56 -0
- data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/apache2.conf +46 -0
- data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/envvars-lb +6 -0
- data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/sites-lb.conf +54 -0
- data/app_generators/wakame/templates/cluster/resources/apache_lb/conf/system-lb.conf +75 -0
- data/app_generators/wakame/templates/cluster/resources/apache_lb/init.d/apache2-lb +192 -0
- data/app_generators/wakame/templates/cluster/resources/apache_www/apache_www.rb +50 -0
- data/app_generators/wakame/templates/cluster/resources/apache_www/conf/apache2.conf +47 -0
- data/app_generators/wakame/templates/cluster/resources/apache_www/conf/envvars-www +7 -0
- data/app_generators/wakame/templates/cluster/resources/apache_www/conf/sites-www.conf +23 -0
- data/app_generators/wakame/templates/cluster/resources/apache_www/conf/system-www.conf +63 -0
- data/app_generators/wakame/templates/cluster/resources/apache_www/init.d/apache2-www +192 -0
- data/app_generators/wakame/templates/cluster/resources/ec2_elastic_ip/ec2_elastic_ip.rb +39 -0
- data/app_generators/wakame/templates/cluster/resources/mysql_master/conf/my.cnf +154 -0
- data/app_generators/wakame/templates/cluster/resources/mysql_master/init.d/mysql +185 -0
- data/app_generators/wakame/templates/cluster/resources/mysql_master/mysql_master.rb +174 -0
- data/app_generators/wakame/templates/config/boot.rb +85 -0
- data/app_generators/wakame/templates/config/cluster.rb +64 -0
- data/app_generators/wakame/templates/config/environments/common.rb +0 -0
- data/app_generators/wakame/templates/config/environments/ec2.rb +3 -0
- data/app_generators/wakame/templates/config/environments/stand_alone.rb +0 -0
- data/app_generators/wakame/templates/config/init.d/wakame-agent +72 -0
- data/app_generators/wakame/templates/config/init.d/wakame-master +73 -0
- data/app_generators/wakame/wakame_generator.rb +124 -0
- data/bin/wakame +18 -0
- data/contrib/imagesetup.sh +77 -0
- data/lib/ext/eventmachine.rb +86 -0
- data/lib/ext/shellwords.rb +172 -0
- data/lib/ext/uri.rb +15 -0
- data/lib/wakame/action.rb +156 -0
- data/lib/wakame/actions/destroy_instances.rb +39 -0
- data/lib/wakame/actions/launch_cluster.rb +31 -0
- data/lib/wakame/actions/migrate_service.rb +65 -0
- data/lib/wakame/actions/propagate_instances.rb +95 -0
- data/lib/wakame/actions/reload_service.rb +21 -0
- data/lib/wakame/actions/scaleout_when_high_load.rb +44 -0
- data/lib/wakame/actions/shutdown_cluster.rb +22 -0
- data/lib/wakame/actions/shutdown_vm.rb +19 -0
- data/lib/wakame/actions/start_service.rb +64 -0
- data/lib/wakame/actions/stop_service.rb +49 -0
- data/lib/wakame/actions/util.rb +71 -0
- data/lib/wakame/actor/daemon.rb +37 -0
- data/lib/wakame/actor/service_monitor.rb +21 -0
- data/lib/wakame/actor/system.rb +46 -0
- data/lib/wakame/actor.rb +33 -0
- data/lib/wakame/agent.rb +226 -0
- data/lib/wakame/amqp_client.rb +219 -0
- data/lib/wakame/command/action_status.rb +62 -0
- data/lib/wakame/command/actor.rb +23 -0
- data/lib/wakame/command/clone_service.rb +12 -0
- data/lib/wakame/command/launch_cluster.rb +15 -0
- data/lib/wakame/command/migrate_service.rb +21 -0
- data/lib/wakame/command/propagate_service.rb +24 -0
- data/lib/wakame/command/shutdown_cluster.rb +15 -0
- data/lib/wakame/command/status.rb +81 -0
- data/lib/wakame/command.rb +31 -0
- data/lib/wakame/command_queue.rb +44 -0
- data/lib/wakame/configuration.rb +93 -0
- data/lib/wakame/daemonize.rb +96 -0
- data/lib/wakame/event.rb +232 -0
- data/lib/wakame/event_dispatcher.rb +154 -0
- data/lib/wakame/graph.rb +79 -0
- data/lib/wakame/initializer.rb +162 -0
- data/lib/wakame/instance_counter.rb +78 -0
- data/lib/wakame/logger.rb +12 -0
- data/lib/wakame/manager/commands.rb +134 -0
- data/lib/wakame/master.rb +369 -0
- data/lib/wakame/monitor/agent.rb +50 -0
- data/lib/wakame/monitor/service.rb +183 -0
- data/lib/wakame/monitor.rb +69 -0
- data/lib/wakame/packets.rb +160 -0
- data/lib/wakame/queue_declare.rb +14 -0
- data/lib/wakame/rule.rb +116 -0
- data/lib/wakame/rule_engine.rb +202 -0
- data/lib/wakame/runner/administrator_command.rb +112 -0
- data/lib/wakame/runner/agent.rb +81 -0
- data/lib/wakame/runner/master.rb +93 -0
- data/lib/wakame/scheduler.rb +251 -0
- data/lib/wakame/service.rb +914 -0
- data/lib/wakame/template.rb +189 -0
- data/lib/wakame/trigger.rb +66 -0
- data/lib/wakame/triggers/instance_count_update.rb +45 -0
- data/lib/wakame/triggers/load_history.rb +107 -0
- data/lib/wakame/triggers/maintain_ssh_known_hosts.rb +43 -0
- data/lib/wakame/triggers/process_command.rb +34 -0
- data/lib/wakame/triggers/shutdown_unused_vm.rb +16 -0
- data/lib/wakame/util.rb +569 -0
- data/lib/wakame/vm_manipulator.rb +186 -0
- data/lib/wakame.rb +59 -0
- data/tasks/ec2.rake +127 -0
- data/tests/cluster.json +3 -0
- data/tests/conf/a +1 -0
- data/tests/conf/b +1 -0
- data/tests/conf/c +1 -0
- data/tests/setup_agent.rb +39 -0
- data/tests/setup_master.rb +28 -0
- data/tests/test_actor.rb +54 -0
- data/tests/test_agent.rb +218 -0
- data/tests/test_amqp_client.rb +94 -0
- data/tests/test_graph.rb +36 -0
- data/tests/test_master.rb +167 -0
- data/tests/test_monitor.rb +47 -0
- data/tests/test_rule_engine.rb +127 -0
- data/tests/test_scheduler.rb +123 -0
- data/tests/test_service.rb +60 -0
- data/tests/test_template.rb +67 -0
- data/tests/test_uri_amqp.rb +19 -0
- data/tests/test_util.rb +71 -0
- data/wakame_generators/resource/resource_generator.rb +54 -0
- data/wakame_generators/resource/templates/apache_app/apache_app.rb +60 -0
- data/wakame_generators/resource/templates/apache_app/conf/apache2.conf +46 -0
- data/wakame_generators/resource/templates/apache_app/conf/envvars-app +7 -0
- data/wakame_generators/resource/templates/apache_app/conf/sites-app.conf +23 -0
- data/wakame_generators/resource/templates/apache_app/conf/system-app.conf +67 -0
- data/wakame_generators/resource/templates/apache_app/init.d/apache2-app +192 -0
- data/wakame_generators/resource/templates/apache_lb/apache_lb.rb +67 -0
- data/wakame_generators/resource/templates/apache_lb/conf/apache2.conf +46 -0
- data/wakame_generators/resource/templates/apache_lb/conf/envvars-lb +6 -0
- data/wakame_generators/resource/templates/apache_lb/conf/sites-lb.conf +54 -0
- data/wakame_generators/resource/templates/apache_lb/conf/system-lb.conf +75 -0
- data/wakame_generators/resource/templates/apache_lb/init.d/apache2-lb +192 -0
- data/wakame_generators/resource/templates/apache_www/apache_www.rb +56 -0
- data/wakame_generators/resource/templates/apache_www/conf/apache2.conf +47 -0
- data/wakame_generators/resource/templates/apache_www/conf/envvars-www +7 -0
- data/wakame_generators/resource/templates/apache_www/conf/sites-www.conf +23 -0
- data/wakame_generators/resource/templates/apache_www/conf/system-www.conf +63 -0
- data/wakame_generators/resource/templates/apache_www/init.d/apache2-www +192 -0
- data/wakame_generators/resource/templates/ec2_elastic_ip/ec2_elastic_ip.rb +39 -0
- data/wakame_generators/resource/templates/mysql_master/conf/my.cnf +154 -0
- data/wakame_generators/resource/templates/mysql_master/init.d/mysql +185 -0
- data/wakame_generators/resource/templates/mysql_master/mysql_master.rb +119 -0
- metadata +289 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
module Wakame
|
3
|
+
module Command
|
4
|
+
class CommandArgumentError < StandardError; end
|
5
|
+
|
6
|
+
def self.included(klass)
|
7
|
+
klass.class_eval {
|
8
|
+
class << self
|
9
|
+
def command_name
|
10
|
+
@command_name ||= Util.snake_case(self.to_s.split('::').last)
|
11
|
+
end
|
12
|
+
|
13
|
+
def command_name=(name)
|
14
|
+
@command_name=name
|
15
|
+
end
|
16
|
+
end
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def parse(args)
|
22
|
+
end
|
23
|
+
|
24
|
+
def run(rule)
|
25
|
+
end
|
26
|
+
|
27
|
+
def print_result
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
require 'drb/drb'
|
3
|
+
require 'thread'
|
4
|
+
|
5
|
+
module Wakame
|
6
|
+
class CommandQueue
|
7
|
+
attr_reader :master
|
8
|
+
|
9
|
+
def initialize(master)
|
10
|
+
@master = master
|
11
|
+
@queue = Queue.new
|
12
|
+
@result_queue = Queue.new
|
13
|
+
|
14
|
+
DRb.start_service(Wakame.config.drb_command_server_uri, self)
|
15
|
+
#@drb_server = DRb.start_drbserver(Wakame.config.drb_command_server_uri, self)
|
16
|
+
end
|
17
|
+
|
18
|
+
def shutdown
|
19
|
+
DRb.stop_service()
|
20
|
+
#@drb_server.stop_service()
|
21
|
+
end
|
22
|
+
|
23
|
+
def deq_cmd()
|
24
|
+
@queue.deq
|
25
|
+
end
|
26
|
+
|
27
|
+
def enq_result(res)
|
28
|
+
@result_queue.enq(res)
|
29
|
+
end
|
30
|
+
|
31
|
+
def send_cmd(cmd)
|
32
|
+
begin
|
33
|
+
#cmd = Marshal.load(cmd)
|
34
|
+
@queue.enq(cmd)
|
35
|
+
ED.fire_event(Event::CommandReceived.new(cmd))
|
36
|
+
return @result_queue.deq()
|
37
|
+
rescue => e
|
38
|
+
Wakame.log.error("#{self.class}:")
|
39
|
+
Wakame.log.error(e)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
module Wakame
|
6
|
+
# System wide configuration parameters
|
7
|
+
class Configuration < OpenStruct
|
8
|
+
|
9
|
+
PARAMS = {
|
10
|
+
#:config_template_root => nil,
|
11
|
+
#:config_tmp_root => nil,
|
12
|
+
:config_root => nil,
|
13
|
+
:cluster_class => 'WebCluster',
|
14
|
+
:load_paths => [],
|
15
|
+
:ssh_private_key => nil,
|
16
|
+
:drb_command_server_uri => 'druby://localhost:12345',
|
17
|
+
:amqp_server_uri => nil,
|
18
|
+
:unused_vm_live_period => 60 * 10,
|
19
|
+
:eventmachine_use_epoll => true
|
20
|
+
}
|
21
|
+
|
22
|
+
def initialize(env=WAKAME_ENV)
|
23
|
+
super(PARAMS)
|
24
|
+
if root_path.nil?
|
25
|
+
root_path = Object.const_defined?(:WAKAME_ROOT) ? WAKAME_ROOT : '../'
|
26
|
+
end
|
27
|
+
|
28
|
+
@root_path = root_path
|
29
|
+
|
30
|
+
self.class.const_get(env).new.process(self)
|
31
|
+
end
|
32
|
+
|
33
|
+
def environment
|
34
|
+
::WAKAME_ENV.to_sym
|
35
|
+
end
|
36
|
+
alias :vm_environment :environment
|
37
|
+
|
38
|
+
def environment_path(key=environment)
|
39
|
+
File.expand_path("config/environments/#{Util.snake_case(key.to_s)}.rb", root_path)
|
40
|
+
end
|
41
|
+
|
42
|
+
def root_path
|
43
|
+
::WAKAME_ROOT
|
44
|
+
end
|
45
|
+
|
46
|
+
def tmp_path
|
47
|
+
File.join(root_path, 'tmp')
|
48
|
+
end
|
49
|
+
|
50
|
+
def ssh_known_hosts
|
51
|
+
File.join(self.config_root, "ssh", "known_hosts")
|
52
|
+
end
|
53
|
+
|
54
|
+
def config_tmp_root
|
55
|
+
File.join(self.config_root, "tmp")
|
56
|
+
end
|
57
|
+
|
58
|
+
def framework_root_path
|
59
|
+
defined?(::WAKAME_FRAMEWORK_ROOT) ? ::WAKAME_FRAMEWORK_ROOT : "#{root_path}/vendor/wakame"
|
60
|
+
end
|
61
|
+
|
62
|
+
def framework_paths
|
63
|
+
paths = %w(lib)
|
64
|
+
|
65
|
+
paths.map{|dir| File.join(framework_root_path, dir) }.select{|path| File.directory?(path) }
|
66
|
+
end
|
67
|
+
#
|
68
|
+
class DefaultSet
|
69
|
+
def process(config)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class EC2 < DefaultSet
|
74
|
+
def process(config)
|
75
|
+
super(config)
|
76
|
+
config.config_root = File.join(config.root_path, 'tmp', 'config')
|
77
|
+
|
78
|
+
config.ssh_private_key = '/home/wakame/config/root.id_rsa'
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class StandAlone < DefaultSet
|
84
|
+
def process(config)
|
85
|
+
super(config)
|
86
|
+
config.config_root = File.join(config.root_path, 'tmp', 'config')
|
87
|
+
config.amqp_server_uri = 'amqp://localhost/'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require 'daemons/daemonize'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module Process
|
7
|
+
# Returns +true+ the process identied by +pid+ is running.
|
8
|
+
def running?(pid)
|
9
|
+
Process.getpgid(pid) != -1
|
10
|
+
rescue Errno::ESRCH
|
11
|
+
false
|
12
|
+
end
|
13
|
+
module_function :running?
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
module Wakame
|
18
|
+
module Daemonize
|
19
|
+
# Change privileges of the process
|
20
|
+
# to the specified user and group.
|
21
|
+
def change_privilege(user, group=user)
|
22
|
+
Wakame.log.info("Changing process privilege to #{user}:#{group}")
|
23
|
+
|
24
|
+
uid, gid = Process.euid, Process.egid
|
25
|
+
target_uid = Etc.getpwnam(user).uid
|
26
|
+
target_gid = Etc.getgrnam(group).gid
|
27
|
+
|
28
|
+
if uid != target_uid || gid != target_gid
|
29
|
+
if pid_file && File.exist?(pid_file) && uid == 0
|
30
|
+
File.chown(target_uid, target_gid, pid_file)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Change process ownership
|
34
|
+
Process.initgroups(user, target_gid)
|
35
|
+
Process::GID.change_privilege(target_gid)
|
36
|
+
Process::UID.change_privilege(target_uid)
|
37
|
+
end
|
38
|
+
rescue Errno::EPERM => e
|
39
|
+
Wakame.log.error("Couldn't change user and group to #{user}:#{group}: #{e}")
|
40
|
+
end
|
41
|
+
|
42
|
+
def pid_file
|
43
|
+
@options[:pid_file]
|
44
|
+
end
|
45
|
+
|
46
|
+
def pid
|
47
|
+
File.exist?(pid_file) ? open(pid_file).read.to_i : nil
|
48
|
+
end
|
49
|
+
|
50
|
+
def setup_pidfile
|
51
|
+
#raise 'Please implement pid_file() method' unless respond_to? :pid_file
|
52
|
+
|
53
|
+
unless File.exist?(File.dirname(pid_file))
|
54
|
+
FileUtils.mkpath(File.dirname(pid_file))
|
55
|
+
end
|
56
|
+
|
57
|
+
open(pid_file, "w") { |f| f.write(Process.pid) }
|
58
|
+
File.chmod(0644, pid_file)
|
59
|
+
end
|
60
|
+
|
61
|
+
def daemonize(log_path)
|
62
|
+
# Cleanup stale pidfile or prevent from multiple process running.
|
63
|
+
if File.exist?(pid_file)
|
64
|
+
if pid && Process.running?(pid)
|
65
|
+
raise "#{pid_file} already exists, seems like it's already running (process ID: #{pid}). " +
|
66
|
+
"Stop the process or delete #{pid_file}."
|
67
|
+
else
|
68
|
+
Wakame.log.info "Deleting the stale PID file: #{pid_file}"
|
69
|
+
remove_pidfile
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
::Daemonize.daemonize(log_path, File.basename($0.to_s))
|
74
|
+
|
75
|
+
setup_pidfile
|
76
|
+
#Signal.trap('HUP') {}
|
77
|
+
end
|
78
|
+
|
79
|
+
def on_restart(&blk)
|
80
|
+
@on_restart = blk
|
81
|
+
end
|
82
|
+
|
83
|
+
def restart
|
84
|
+
raise '' if @on_restart.nil?
|
85
|
+
|
86
|
+
@on_restart.call
|
87
|
+
end
|
88
|
+
|
89
|
+
def remove_pidfile
|
90
|
+
File.delete(pid_file) if pid_file && File.exists?(pid_file)
|
91
|
+
rescue => e
|
92
|
+
Wakame.log.error(e)
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
data/lib/wakame/event.rb
ADDED
@@ -0,0 +1,232 @@
|
|
1
|
+
require 'wakame/util'
|
2
|
+
|
3
|
+
module Wakame
|
4
|
+
module Event
|
5
|
+
class Base
|
6
|
+
attr_accessor :time
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@time = Time.now
|
10
|
+
end
|
11
|
+
|
12
|
+
def log_message
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
class ClusterStatusChanged < Base
|
18
|
+
attr_reader :instance_id, :status
|
19
|
+
def initialize(instance_id, status)
|
20
|
+
super()
|
21
|
+
@instance_id = instance_id
|
22
|
+
@status = status
|
23
|
+
end
|
24
|
+
|
25
|
+
def log_message
|
26
|
+
"#{instance_id}, #{@status}"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
class ServiceStatus < Base
|
32
|
+
attr_reader :instance_id, :property
|
33
|
+
def initialize(instance_id, property)
|
34
|
+
super()
|
35
|
+
@instance_id = instance_id
|
36
|
+
@property = property
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class ServiceStatusChanged < ServiceStatus
|
41
|
+
attr_reader :status, :previous_status
|
42
|
+
def initialize(instance_id, property, new_status, prev_status)
|
43
|
+
super(instance_id, property)
|
44
|
+
@status = new_status
|
45
|
+
@previous_status = prev_status
|
46
|
+
end
|
47
|
+
|
48
|
+
def log_message
|
49
|
+
"#{instance_id}, #{@previous_status} -> #{@status}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class ServiceOnline < ServiceStatus
|
54
|
+
end
|
55
|
+
class ServiceOffline < ServiceStatus
|
56
|
+
end
|
57
|
+
class ServiceFailed < ServiceStatus
|
58
|
+
attr_reader :message
|
59
|
+
def initialize(instance_id, property, message)
|
60
|
+
super(instance_id, property)
|
61
|
+
@message = message
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class AgentEvent < Base
|
66
|
+
attr_reader :agent
|
67
|
+
def initialize(agent)
|
68
|
+
super()
|
69
|
+
@agent = agent
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class AgentPong < AgentEvent
|
74
|
+
end
|
75
|
+
|
76
|
+
class AgentTimedOut < AgentEvent
|
77
|
+
end
|
78
|
+
class AgentMonitored < AgentEvent
|
79
|
+
end
|
80
|
+
class AgentUnMonitored < AgentEvent
|
81
|
+
end
|
82
|
+
class AgentStatusChanged < AgentEvent
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
class ServiceUnboundAgent < Base
|
87
|
+
attr_reader :service, :agent
|
88
|
+
def initialize(service, agent)
|
89
|
+
super()
|
90
|
+
@service = service
|
91
|
+
@agent = agent
|
92
|
+
end
|
93
|
+
end
|
94
|
+
class ServiceBoundAgent < Base
|
95
|
+
attr_reader :service, :agent
|
96
|
+
def initialize(service, agent)
|
97
|
+
super()
|
98
|
+
@service = service
|
99
|
+
@agent = agent
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class ServiceBoundCluster < Base
|
104
|
+
attr_reader :service, :service_cluster
|
105
|
+
def initialize(svc_inst, cluster)
|
106
|
+
super()
|
107
|
+
@service = svc_inst
|
108
|
+
@service_cluster = cluster
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class ServiceUnboundCluster < Base
|
113
|
+
attr_reader :service, :service_cluster
|
114
|
+
def initialize(svc_inst, cluster)
|
115
|
+
super()
|
116
|
+
@service = svc_inst
|
117
|
+
@service_cluster = cluster
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class ServiceDestroied < Base
|
122
|
+
attr_reader :service
|
123
|
+
def initialize(svc_inst)
|
124
|
+
super()
|
125
|
+
@service = svc_inst
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class ServicePropagated < Base
|
130
|
+
attr_reader :service
|
131
|
+
def initialize(svc_inst)
|
132
|
+
super()
|
133
|
+
@service = svc_inst
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class CommandReceived < Base
|
138
|
+
attr_reader :command
|
139
|
+
def initialize(command)
|
140
|
+
@command = command
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
class ActionEvent < Base
|
145
|
+
attr_reader :action
|
146
|
+
def initialize(action)
|
147
|
+
super()
|
148
|
+
@action = action
|
149
|
+
end
|
150
|
+
|
151
|
+
def log_message
|
152
|
+
"#{@action.class}"
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
class ActionStart < ActionEvent
|
158
|
+
end
|
159
|
+
class ActionComplete < ActionEvent
|
160
|
+
end
|
161
|
+
class ActionFailed < ActionEvent
|
162
|
+
attr_reader :exception
|
163
|
+
def initialize(action, e)
|
164
|
+
super(action)
|
165
|
+
@exception = e
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
class JobEvent < Base
|
170
|
+
attr_reader :job_id
|
171
|
+
def initialize(job_id)
|
172
|
+
super()
|
173
|
+
@action = job_id
|
174
|
+
end
|
175
|
+
|
176
|
+
def log_message
|
177
|
+
"#{@action.class}"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
class JobStart < JobEvent
|
181
|
+
end
|
182
|
+
class JobComplete < JobEvent
|
183
|
+
end
|
184
|
+
class JobFailed < JobEvent
|
185
|
+
attr_reader :exception
|
186
|
+
def initialize(job_id, e)
|
187
|
+
super(job_id)
|
188
|
+
@exception = e
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
|
193
|
+
class AgentShutdown < Base; end
|
194
|
+
class MasterShutdown < Base; end
|
195
|
+
|
196
|
+
class InstanceCountChanged < Base
|
197
|
+
attr_reader :resource, :prev_count, :count
|
198
|
+
def initialize(resource, prev_count, count)
|
199
|
+
@resource = resource
|
200
|
+
@prev_count = prev_count
|
201
|
+
@count = count
|
202
|
+
end
|
203
|
+
|
204
|
+
def increased?
|
205
|
+
@prev_count < @count
|
206
|
+
end
|
207
|
+
|
208
|
+
def decreased?
|
209
|
+
@prev_count > @count
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
class ActorProgress < Base
|
214
|
+
attr_reader :agent_id, :token, :progress
|
215
|
+
def initialize(agent_id, token, progress)
|
216
|
+
@agent_id = agent_id
|
217
|
+
@token = token
|
218
|
+
@progress = progress
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
class ActorComplete < Base
|
223
|
+
attr_reader :agent_id, :token, :status
|
224
|
+
def initialize(agent_id, token, status)
|
225
|
+
@agent_id = agent_id
|
226
|
+
@token = token
|
227
|
+
@status = status
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
|
2
|
+
module Wakame
|
3
|
+
class EventDispatcher
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def instance
|
7
|
+
if @instance.nil?
|
8
|
+
@instance = self.new
|
9
|
+
end
|
10
|
+
@instance
|
11
|
+
end
|
12
|
+
|
13
|
+
def subscribe(event_class, *args, &blk)
|
14
|
+
self.instance.subscribe(event_class, *args, &blk)
|
15
|
+
end
|
16
|
+
|
17
|
+
def unsubscribe(event_class)
|
18
|
+
self.instance.unsubscribe(event_class)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def fire_event(event_obj)
|
23
|
+
self.instance.fire_event(event_obj)
|
24
|
+
end
|
25
|
+
|
26
|
+
def reset
|
27
|
+
@instance = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
include ThreadImmutable
|
33
|
+
|
34
|
+
def initialize
|
35
|
+
@event_handlers = {}
|
36
|
+
@tickets = {}
|
37
|
+
|
38
|
+
@unsubscribe_queue = []
|
39
|
+
end
|
40
|
+
|
41
|
+
def subscribe(event_class, *args, &blk)
|
42
|
+
event_class = case event_class
|
43
|
+
when Class
|
44
|
+
event_class
|
45
|
+
when String
|
46
|
+
Util.str2const(event_class)
|
47
|
+
else
|
48
|
+
raise ArgumentError, "event_class has to be a form of String or Class type"
|
49
|
+
end
|
50
|
+
|
51
|
+
EM.barrier {
|
52
|
+
tlist = @event_handlers[event_class]
|
53
|
+
if tlist.nil?
|
54
|
+
tlist = @event_handlers[event_class] = []
|
55
|
+
end
|
56
|
+
|
57
|
+
tickets = []
|
58
|
+
args.each { |o|
|
59
|
+
tickets << Util.gen_id
|
60
|
+
@tickets.store(tickets.last, [event_class, o])
|
61
|
+
tlist << tickets.last
|
62
|
+
}
|
63
|
+
|
64
|
+
if blk
|
65
|
+
tickets << Util.gen_id
|
66
|
+
@tickets.store(tickets.last, [event_class, blk])
|
67
|
+
tlist << tickets.last
|
68
|
+
end
|
69
|
+
|
70
|
+
# Return in array if num of ticket to be returned is more than or equal 2.
|
71
|
+
tickets.size > 1 ? tickets : tickets.first
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
def unsubscribe(ticket)
|
76
|
+
unless @tickets.has_key?(ticket)
|
77
|
+
#Wakame.log.warn("EventHander.unsubscribe(#{ticket}) has been tried but the ticket was not registered.")
|
78
|
+
return nil
|
79
|
+
end
|
80
|
+
|
81
|
+
EM.barrier {
|
82
|
+
Wakame.log.debug("#{self.class}.unsubscribe(#{ticket})")
|
83
|
+
|
84
|
+
@unsubscribe_queue << ticket
|
85
|
+
ticket
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
def fire_event(event_obj)
|
90
|
+
raise ArgumentError unless event_obj.is_a?(Event::Base)
|
91
|
+
log_msg = ""
|
92
|
+
log_msg = " #{event_obj.log_message}" unless event_obj.log_message.nil?
|
93
|
+
|
94
|
+
Wakame.log.debug("Event #{event_obj.class} has been fired:" + log_msg )
|
95
|
+
tlist = @event_handlers[event_obj.class]
|
96
|
+
return if tlist.nil?
|
97
|
+
|
98
|
+
run_callbacks = proc {
|
99
|
+
@unsubscribe_queue.each { |t|
|
100
|
+
@tickets.delete(t)
|
101
|
+
tlist.delete(t)
|
102
|
+
}
|
103
|
+
|
104
|
+
tlist.each { |t|
|
105
|
+
ary = @tickets[t]
|
106
|
+
c = ary[1]
|
107
|
+
if c.nil?
|
108
|
+
next
|
109
|
+
end
|
110
|
+
|
111
|
+
begin
|
112
|
+
c.call(event_obj)
|
113
|
+
rescue => e
|
114
|
+
Wakame.log.error(e)
|
115
|
+
#raise e
|
116
|
+
end
|
117
|
+
}
|
118
|
+
|
119
|
+
@unsubscribe_queue.each { |t|
|
120
|
+
@tickets.delete(t)
|
121
|
+
tlist.delete(t)
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
#@handler_run_queue.push(run_handlers)
|
126
|
+
|
127
|
+
::EventMachine.barrier {
|
128
|
+
begin
|
129
|
+
run_callbacks.call
|
130
|
+
rescue => e
|
131
|
+
Wakame.log.error(e)
|
132
|
+
end
|
133
|
+
}
|
134
|
+
end
|
135
|
+
|
136
|
+
def reset(event_class=nil)
|
137
|
+
if event_class.nil?
|
138
|
+
@event_handlers.clear
|
139
|
+
@tickets.clear
|
140
|
+
else
|
141
|
+
unless @event_handlers[event_class.to_s].nil?
|
142
|
+
@event_handlers[event_class.to_s].each_key { |k|
|
143
|
+
@tickets.delete(k)
|
144
|
+
}
|
145
|
+
@event_handlers[event_class.to_s].clear
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
thread_immutable_methods :reset
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
ED = EventDispatcher
|
154
|
+
end
|