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,93 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'ext/uri'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
require 'amqp'
|
6
|
+
|
7
|
+
module Wakame
|
8
|
+
module Runner
|
9
|
+
class Master
|
10
|
+
include Wakame::Daemonize
|
11
|
+
|
12
|
+
def initialize(argv)
|
13
|
+
@argv = argv
|
14
|
+
|
15
|
+
@options = {
|
16
|
+
:amqp_server => URI.parse('amqp://guest@localhost/'),
|
17
|
+
:log_file => '/var/log/wakame-master.log',
|
18
|
+
:pid_file => '/var/run/wakame/wakame-master.pid',
|
19
|
+
:daemonize => true
|
20
|
+
}
|
21
|
+
|
22
|
+
parser.parse! @argv
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def parser
|
27
|
+
@parser ||= OptionParser.new do |opts|
|
28
|
+
opts.banner = "Usage: master [options]"
|
29
|
+
|
30
|
+
opts.separator ""
|
31
|
+
opts.separator "Master options:"
|
32
|
+
opts.on( "-p", "--pid PIDFILE", "pid file path" ) {|str| @options[:pid_file] = str }
|
33
|
+
opts.on( "-u", "--uid UID", "user id for the running process" ) {|str| @options[:uid] = str }
|
34
|
+
opts.on( "-s", "--server AMQP_URI", "amqp server" ) {|str|
|
35
|
+
begin
|
36
|
+
@options[:amqp_server] = URI.parse(str)
|
37
|
+
rescue URI::InvalidURIError => e
|
38
|
+
fail "#{e}"
|
39
|
+
end
|
40
|
+
}
|
41
|
+
opts.on("-X", "", "daemonize flag" ) { @options[:daemonize] = false }
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def run
|
50
|
+
%w(QUIT INT TERM).each { |i|
|
51
|
+
Signal.trap(i) { Wakame::Master.stop{ remove_pidfile } }
|
52
|
+
}
|
53
|
+
|
54
|
+
unless @options[:amqp_server].nil?
|
55
|
+
uri = @options[:amqp_server]
|
56
|
+
default = ::AMQP.settings
|
57
|
+
opts = {:host => uri.host,
|
58
|
+
:port => uri.port || default[:port],
|
59
|
+
:vhost => uri.vhost || default[:vhost],
|
60
|
+
:user=>uri.user || default[:user],
|
61
|
+
:pass=>uri.password ||default[:pass]
|
62
|
+
}
|
63
|
+
else
|
64
|
+
opts = nil
|
65
|
+
end
|
66
|
+
|
67
|
+
if @options[:daemonize]
|
68
|
+
daemonize(@options[:log_file])
|
69
|
+
end
|
70
|
+
|
71
|
+
change_privilege(@options[:uid]) if @options[:uid]
|
72
|
+
|
73
|
+
|
74
|
+
EM.epoll if Wakame.config.eventmachine_use_epoll
|
75
|
+
EM.run {
|
76
|
+
Wakame::Master.start(opts)
|
77
|
+
|
78
|
+
EM.add_periodic_timer(5) {
|
79
|
+
next
|
80
|
+
buf = ''
|
81
|
+
buf << "<--- RUNNING THREADS --->\n"
|
82
|
+
ThreadGroup::Default.list.each { |i|
|
83
|
+
buf << "#{i.inspect} #{i[:name].to_s}\n"
|
84
|
+
}
|
85
|
+
buf << ">--- RUNNING THREADS ---<\n"
|
86
|
+
puts buf
|
87
|
+
}
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,251 @@
|
|
1
|
+
|
2
|
+
require 'wakame/util'
|
3
|
+
|
4
|
+
module Wakame
|
5
|
+
class Scheduler
|
6
|
+
def initialize
|
7
|
+
@channels = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_sequence(key, seq)
|
11
|
+
@channels[key]=seq
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def next_event(time)
|
16
|
+
n = @channels.collect { |k, seq|
|
17
|
+
seq.next_event(time)
|
18
|
+
}
|
19
|
+
n.compact!
|
20
|
+
n = n.sort {|a,b| a[0] <=> b[0] }
|
21
|
+
n.first
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
class Sequence
|
26
|
+
def next_event(time)
|
27
|
+
end
|
28
|
+
|
29
|
+
def value_at(time)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
class LoopSequence < Sequence
|
35
|
+
def initialize(timed_seq)
|
36
|
+
raise ArgumentError unless timed_seq.is_a?(TimedSequence)
|
37
|
+
@timed_sequence = timed_seq
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def next_event(time)
|
42
|
+
@timed_sequence.start_at ||= time
|
43
|
+
unless @timed_sequence.range_check?(time)
|
44
|
+
@timed_sequence.start_at = time
|
45
|
+
end
|
46
|
+
|
47
|
+
event = @timed_sequence.next_event(time)
|
48
|
+
if event.nil?
|
49
|
+
puts "overwrap : #{time}"
|
50
|
+
# Here comes means that the current offset time is larger than the last offset time.
|
51
|
+
# So the value at next first offset time will become the return value.
|
52
|
+
f = @timed_sequence.first_event
|
53
|
+
#l = @timed_sequence.last_event
|
54
|
+
|
55
|
+
offset = ((@timed_sequence.start_at + @timed_sequence.duration) - time) + f[0]
|
56
|
+
|
57
|
+
event = [offset, f[1]]
|
58
|
+
end
|
59
|
+
event
|
60
|
+
end
|
61
|
+
|
62
|
+
def value_at(time)
|
63
|
+
@timed_sequence.start_at ||= time
|
64
|
+
unless @timed_sequence.range_check?(time)
|
65
|
+
@timed_sequence.start_at = time
|
66
|
+
end
|
67
|
+
#next_event(time)
|
68
|
+
@timed_sequence.value_at(time)
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
class TimedSequence
|
75
|
+
attr_accessor :start_at
|
76
|
+
|
77
|
+
def initialize(*args)
|
78
|
+
@event_list = SortedHash.new
|
79
|
+
|
80
|
+
if args.size == 1
|
81
|
+
case args[0]
|
82
|
+
when SortedHash
|
83
|
+
@event_list = args[0]
|
84
|
+
when Array
|
85
|
+
args[0].each { |a|
|
86
|
+
@event_list[a[0]] = a[1]
|
87
|
+
}
|
88
|
+
end
|
89
|
+
elsif args.size > 1 && args.all? { |a| a.is_a?(Array) && a.size == 2 }
|
90
|
+
ary.each { |a|
|
91
|
+
@event_list[a[0]] = a[1]
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
@event_list[0]=1 if @event_list.empty?
|
96
|
+
end
|
97
|
+
|
98
|
+
def set(offset_time, value)
|
99
|
+
if value.nil?
|
100
|
+
@event_list.delete(offset_time)
|
101
|
+
else
|
102
|
+
@event_list[offset_time] = value
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def []=(offset_time, value)
|
107
|
+
set(offset_time, value)
|
108
|
+
end
|
109
|
+
|
110
|
+
def next_event(time)
|
111
|
+
if @start_at > time
|
112
|
+
event = first_event
|
113
|
+
elsif @start_at + duration <= time
|
114
|
+
event = nil
|
115
|
+
else
|
116
|
+
event = @event_list.find { |k, v|
|
117
|
+
start_at + k > time
|
118
|
+
}
|
119
|
+
end
|
120
|
+
|
121
|
+
return nil if event.nil?
|
122
|
+
|
123
|
+
# Set the offset time (in sec) from the given absolute time
|
124
|
+
event[0] = (@start_at + event[0].to_f) - time
|
125
|
+
event
|
126
|
+
end
|
127
|
+
|
128
|
+
def first_event
|
129
|
+
[@event_list.first_key, @event_list.first]
|
130
|
+
end
|
131
|
+
|
132
|
+
def last_event
|
133
|
+
[@event_list.last_key, @event_list.last]
|
134
|
+
end
|
135
|
+
|
136
|
+
def value_at(time)
|
137
|
+
return nil unless range_check?(time)
|
138
|
+
return @event_list.last if (start_at + @event_list.last_key) <= time
|
139
|
+
|
140
|
+
pos=0
|
141
|
+
@event_list.find { |k, v|
|
142
|
+
#puts "#{start_at} + #{k} > #{time}"
|
143
|
+
next true if start_at + k >= time
|
144
|
+
pos += 1
|
145
|
+
false
|
146
|
+
}
|
147
|
+
#puts "pos=#{pos}"
|
148
|
+
@event_list[@event_list.keys[((pos-1) < 0 ? 0 : (pos-1))]]
|
149
|
+
end
|
150
|
+
|
151
|
+
def duration
|
152
|
+
@event_list.last_key
|
153
|
+
end
|
154
|
+
|
155
|
+
def range_check?(time)
|
156
|
+
raise "start_at is not set (=nil)" if start_at.nil?
|
157
|
+
res = Range.new(start_at, start_at + duration.to_f).include?(time)
|
158
|
+
#Wakame.log.debug("#{self.class}.range_check?(#{start_at}, #{start_at + duration.to_f}).include?(#{time})=#{res}")
|
159
|
+
res
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
class UnitTimeSequence < TimedSequence
|
166
|
+
# Snap to the begging of the period
|
167
|
+
def start_at=(time)
|
168
|
+
@start_at = Time.at(time.tv_sec - (time.tv_sec % duration))
|
169
|
+
end
|
170
|
+
|
171
|
+
require 'time'
|
172
|
+
|
173
|
+
def set(offset_time, value)
|
174
|
+
offset_time = case offset_time
|
175
|
+
when String
|
176
|
+
t=Time.parse(offset_time)
|
177
|
+
t.tv_sec % duration
|
178
|
+
else
|
179
|
+
offset_time
|
180
|
+
end
|
181
|
+
super(offset_time, value) if offset_time < duration
|
182
|
+
self
|
183
|
+
end
|
184
|
+
|
185
|
+
def duration
|
186
|
+
raise NotImplementedError
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
class PerMinuteSequence < UnitTimeSequence
|
191
|
+
MINUTE_IN_SEC=60
|
192
|
+
|
193
|
+
def duration
|
194
|
+
MINUTE_IN_SEC
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
|
199
|
+
class PerHourSequence < UnitTimeSequence
|
200
|
+
HOUR_IN_SEC=60 * 60
|
201
|
+
|
202
|
+
def duration
|
203
|
+
HOUR_IN_SEC
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
class PerDaySequence < UnitTimeSequence
|
208
|
+
DAY_IN_SEC=60 * 60 * 24
|
209
|
+
|
210
|
+
def duration
|
211
|
+
DAY_IN_SEC
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
class PerWeekSequence < UnitTimeSequence
|
216
|
+
WEEK_IN_SEC=60 * 60 * 24 * 7
|
217
|
+
def duration
|
218
|
+
WEEK_IN_SEC
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
require 'observer'
|
223
|
+
|
224
|
+
class SequenceTimer < EM::PeriodicTimer
|
225
|
+
include Observable
|
226
|
+
|
227
|
+
def initialize(seq)
|
228
|
+
@sequence = seq
|
229
|
+
super(0) {
|
230
|
+
tnow = Time.now
|
231
|
+
v = @sequence.value_at(tnow)
|
232
|
+
self.changed
|
233
|
+
self.notify_observers(v)
|
234
|
+
|
235
|
+
ev = @sequence.next_event(tnow)
|
236
|
+
if ev.nil?
|
237
|
+
# Terminate this time when it runs out the event to be processed
|
238
|
+
Wakame.log.debug("#{self.class}: Quit the timer.")
|
239
|
+
cancel
|
240
|
+
else
|
241
|
+
@interval = ev[0]
|
242
|
+
Wakame.log.debug("#{tnow + ev[0]} - #{tnow}(offset sec=#{ev[0]}) : #{ev[1]}")
|
243
|
+
end
|
244
|
+
}
|
245
|
+
end
|
246
|
+
|
247
|
+
|
248
|
+
end
|
249
|
+
|
250
|
+
end
|
251
|
+
end
|