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,123 @@
1
+
2
+ $:.unshift File.dirname(__FILE__) + '/../lib'
3
+ require 'rubygems'
4
+ require 'eventmachine'
5
+
6
+ require 'test/unit'
7
+ require 'wakame'
8
+ require 'wakame/manager/scheduler'
9
+
10
+ WAKAME_ROOT="#{File.dirname(__FILE__)}/.."
11
+
12
+ class TestScheduler < Test::Unit::TestCase
13
+ include Wakame::Manager
14
+
15
+ def test_sequence
16
+ seq = Scheduler::TimedSequence.new
17
+ seq.start_at = Time.now
18
+
19
+ seq[0]=1
20
+ seq[30]=3
21
+ seq[780]=1
22
+ seq[110]=2
23
+ seq[320]=4
24
+
25
+ p seq
26
+ p seq.duration
27
+ p (seq.start_at + seq.duration)
28
+
29
+ seq2 = Scheduler::PerMinuteSequence.new
30
+ seq2.start_at = Time.now
31
+
32
+ seq2[0]=1
33
+ seq2[20]=2
34
+ seq2[59]=2
35
+ seq2[10]=3
36
+ seq2[15]=8
37
+ seq2[30]=4
38
+ seq2[55]=3
39
+ seq2[5]=8
40
+ seq2[2930]=1
41
+ seq2[430]=1
42
+ seq2[3430]=3
43
+ seq2[1410]=1
44
+ seq2[159]=2
45
+
46
+ #assert_equal([0, 5, 10, 15, 20, 30, 55, 59], seq2.keys)
47
+ assert(seq2.duration == 60)
48
+ assert(seq2.range_check?(seq2.start_at))
49
+ assert(seq2.range_check?(seq2.start_at + 0.0))
50
+ assert(seq2.range_check?(seq2.start_at + 59.0))
51
+ assert(seq2.range_check?(seq2.start_at + 59.1))
52
+ assert(seq2.range_check?(seq2.start_at + 59.9))
53
+ assert(seq2.range_check?(seq2.start_at + 60.0) == true )
54
+ assert(seq2.range_check?(seq2.start_at - 1.0) == false )
55
+ assert_equal(1, seq2.value_at(seq2.start_at))
56
+ assert_equal(1, seq2.value_at(seq2.start_at + 0.0))
57
+ assert_equal(1, seq2.value_at(seq2.start_at + 2.0))
58
+ assert_equal(2, seq2.value_at(seq2.start_at + 59.0))
59
+ assert_equal(2, seq2.value_at(seq2.start_at + 59.32939))
60
+ assert_equal(2, seq2.value_at(seq2.start_at + 60.0))
61
+ assert_equal(nil, seq2.value_at(seq2.start_at + 61.0))
62
+ assert_equal(nil, seq2.value_at(seq2.start_at + 99999.0))
63
+ assert_equal([5.0, 8], seq2.next_event(seq2.start_at) )
64
+ assert_equal([5.0, 8], seq2.next_event(seq2.start_at + 0.0) )
65
+ assert_equal([4.0, 8], seq2.next_event(seq2.start_at + 1.0) )
66
+ assert_equal([5.0, 3], seq2.next_event(seq2.start_at + 5.0) )
67
+ assert_equal([1.0, 3], seq2.next_event(seq2.start_at + 9.0) )
68
+ assert_equal([1.0, 8], seq2.next_event(seq2.start_at + 14.0) )
69
+ assert_equal([4.0, 2], seq2.next_event(seq2.start_at + 55.0) )
70
+ assert_equal([1.0, 2], seq2.next_event(seq2.start_at + 58.0) )
71
+ assert_equal(nil, seq2.next_event(seq2.start_at + 59.0) )
72
+ assert_equal(nil, seq2.next_event(seq2.start_at + 59.1883) )
73
+ assert_equal(nil, seq2.next_event(seq2.start_at + 60.0) )
74
+ assert_equal(nil, seq2.next_event(seq2.start_at + 99999.0) )
75
+
76
+
77
+ seq = Scheduler::LoopSequence.new(seq2)
78
+
79
+ check_at = seq2.start_at + 360.0
80
+ assert_equal(1, seq.value_at(check_at))
81
+ assert_equal(1, seq.value_at(check_at + 0.0))
82
+ assert_equal(1, seq.value_at(check_at + 2.0))
83
+ assert_equal(8, seq.value_at(check_at + 10.0))
84
+ assert_equal(3, seq.value_at(check_at + 10.88393))
85
+ assert_equal(2, seq.value_at(check_at + 59.0))
86
+ assert_equal(2, seq.value_at(check_at + 59.32939))
87
+ assert_equal(2, seq.value_at(check_at + 60.0))
88
+ assert_equal(1, seq.value_at(check_at + 61.0))
89
+ assert_equal(1, seq.value_at(check_at + 361.0))
90
+ assert_equal([5.0, 8], seq.next_event(check_at) )
91
+ assert_equal([5.0, 8], seq.next_event(check_at + 0.0) )
92
+ assert_equal([4.0, 8], seq.next_event(check_at + 1.0) )
93
+ assert_equal([5.0, 3], seq.next_event(check_at + 5.0) )
94
+ assert_equal([1.0, 3], seq.next_event(check_at + 9.0) )
95
+ assert_equal([1.0, 8], seq.next_event(check_at + 14.0) )
96
+ assert_equal([4.0, 2], seq.next_event(check_at + 55.0) )
97
+ assert_equal([1.0, 2], seq.next_event(check_at + 58.0) )
98
+ assert_equal([4.0, 2], seq.next_event(check_at + 55.0) )
99
+
100
+
101
+ seq2 = Scheduler::PerMinuteSequence.new
102
+ seq2.start_at = Time.now
103
+ seq2[0]=1
104
+
105
+ seq = Scheduler::LoopSequence.new(seq2)
106
+
107
+ check_at = seq2.start_at + 360.0
108
+ assert_equal(1, seq.value_at(check_at))
109
+ assert_equal(1, seq.value_at(check_at + 0.0))
110
+ assert_equal(1, seq.value_at(check_at + 2.0))
111
+ assert_equal(1, seq.value_at(check_at + 10.0))
112
+ assert_equal(1, seq.value_at(check_at + 61.0))
113
+ assert_equal(1, seq.value_at(check_at + 361.0))
114
+ assert_equal([60.0, 1], seq.next_event(check_at) )
115
+ assert_equal([60.0, 1], seq.next_event(check_at + 0.0) )
116
+ assert_equal([59.0, 1], seq.next_event(check_at + 1.0) )
117
+ assert_equal([25.0, 1], seq.next_event(check_at + 35.0) )
118
+ assert_equal([1.0, 1], seq.next_event(check_at + 59.0) )
119
+ assert_equal([0.0, 1], seq.next_event(check_at + 60.0) )
120
+ assert_equal([59.0, 1], seq.next_event(check_at + 61.0) )
121
+
122
+ end
123
+ end
@@ -0,0 +1,60 @@
1
+
2
+
3
+ $:.unshift File.dirname(__FILE__) + '/../lib'
4
+ require 'rubygems'
5
+
6
+ require 'test/unit'
7
+ require 'wakame'
8
+ require 'wakame/service.rb'
9
+
10
+ WAKAME_ROOT="#{File.dirname(__FILE__)}/.."
11
+
12
+ class TestService < Test::Unit::TestCase
13
+ include Wakame::Service
14
+
15
+ def test_dg
16
+ c = WebCluster.new(nil)
17
+ c.dg.each_level{ |s|
18
+ p s
19
+ }
20
+
21
+ p c.dg.levels
22
+
23
+ p c.dg.children(MySQL_Master)
24
+ p c.dg.parents(Apache_APP)
25
+ end
26
+
27
+
28
+ def test_each_instance
29
+ c = WebCluster.new(nil)
30
+ c.launch
31
+ c.each_instance(WebCluster::HttpLoadBalanceServer) { |svc|
32
+ assert(svc.property.is_a?(Apache_LB))
33
+ }
34
+ end
35
+
36
+
37
+ def test_vmspec
38
+ spec = VmSpec.define {
39
+ environment(:EC2) { |ec2|
40
+ ec2.instance_type = 'm1.small'
41
+ ec2.availability_zone = 'us-east-c1'
42
+ ec2.security_groups << 'default'
43
+ }
44
+
45
+ environment(:StandAlone) {
46
+ }
47
+ }
48
+
49
+
50
+ Wakame.config.vm_environment = :EC2
51
+ p spec.current.attrs
52
+ Wakame.config.vm_environment = :StandAlone
53
+ p spec.current.attrs
54
+
55
+ assert_raise(RuntimeError) {
56
+ Wakame.config.vm_environment = :EC3
57
+ spec.current.attrs
58
+ }
59
+ end
60
+ end
@@ -0,0 +1,67 @@
1
+
2
+
3
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
4
+ $:.unshift(File.dirname(__FILE__))
5
+
6
+ require 'setup_master.rb'
7
+
8
+ require 'wakame'
9
+
10
+ require 'test/unit'
11
+ require 'wakame'
12
+ require 'wakame/template'
13
+ require 'wakame/service'
14
+ require 'wakame/event'
15
+ require 'wakame/event_dispatcher'
16
+
17
+ class TestTemplate < Test::Unit::TestCase
18
+ class DummyAgent
19
+ def agent_id
20
+ 'safasdfadsf'
21
+ end
22
+
23
+ def agent_ip
24
+ '127.0.0.1'
25
+ end
26
+
27
+ def services
28
+ {'aaa'=>nil}
29
+ end
30
+
31
+ def has_service_type?(n)
32
+ false
33
+ end
34
+ end
35
+
36
+ class A < Wakame::Service::Resource
37
+ def basedir
38
+ './tests/'
39
+ end
40
+
41
+ def render_config(template)
42
+ template.cp(%w(conf/a conf/b conf/c))
43
+ end
44
+ end
45
+
46
+ def test_render
47
+ cluster = Wakame::Service::ServiceCluster.new(nil) { |c|
48
+ c.add_service(A.new)
49
+ }
50
+ cluster.launch
51
+
52
+
53
+ agent = DummyAgent.new
54
+ cluster.each_instance { |n|
55
+ n.bind_agent(agent)
56
+
57
+ tmpl = Wakame::Template.new(n)
58
+ tmpl.render_config
59
+ assert(File.exists?(File.join(tmpl.tmp_basedir, 'conf/a')))
60
+ assert(File.exists?(File.join(tmpl.tmp_basedir, 'conf/b')))
61
+ assert(File.exists?(File.join(tmpl.tmp_basedir, 'conf/c')))
62
+ tmpl.cleanup
63
+ assert(File.directory?(tmpl.tmp_basedir) == false )
64
+ }
65
+
66
+ end
67
+ end
@@ -0,0 +1,19 @@
1
+
2
+ $:.unshift File.dirname(__FILE__) + '/../lib'
3
+ require 'rubygems'
4
+
5
+ require 'test/unit'
6
+ require 'uri'
7
+ require 'ext/uri'
8
+
9
+ class TestUriAMQP < Test::Unit::TestCase
10
+ def test_parse
11
+
12
+ assert_equal('amqp://localhost/', URI.parse('amqp://localhost/').to_s)
13
+ assert_equal('amqp://localhost:1122/', URI.parse('amqp://localhost:1122/').to_s)
14
+ assert_equal('amqp://127.0.0.1/vvv', URI.parse('amqp://127.0.0.1/vvv').to_s)
15
+
16
+ u=URI.parse('amqp://127.0.0.1/vvv')
17
+ assert_equal('/vvv', u.vhost)
18
+ end
19
+ end
@@ -0,0 +1,71 @@
1
+
2
+ $:.unshift File.dirname(__FILE__) + '/../lib'
3
+ require 'rubygems'
4
+
5
+ require 'test/unit'
6
+ require 'wakame/util'
7
+
8
+ WAKAME_ROOT="#{File.dirname(__FILE__)}/.."
9
+
10
+ class TestUtilClass < Test::Unit::TestCase
11
+ class A
12
+ include AttributeHelper
13
+
14
+ def_attribute :a, 1
15
+ def_attribute :b, 2
16
+ def_attribute :c, []
17
+ attr :m
18
+ attr_accessor :n, :o
19
+ attr_reader :p
20
+ end
21
+
22
+
23
+ class B < A
24
+ def_attribute :d, 30
25
+ def_attribute :e, 'aaa'
26
+ def_attribute :f
27
+ end
28
+
29
+ def test_attribute_helper1
30
+ a = A.new
31
+ assert_equal(1, a.a)
32
+ assert_equal(2, a.b)
33
+ assert_equal([], a.c)
34
+ assert_equal({:type=>'TestUtilClass::A', :a=>1, :b=>2, :c=>[], :m=>nil, :n=>nil, :o=>nil, :p=>nil}, a.dump_attrs)
35
+
36
+ b = B.new
37
+ assert(b.kind_of?(AttributeHelper))
38
+ assert_equal(1, b.a)
39
+ assert_equal(2, b.b)
40
+ assert_equal([], b.c)
41
+ assert_equal(30, b.d)
42
+ assert_equal('aaa', b.e)
43
+ assert(b.f == nil)
44
+ assert_equal( {:type=>'TestUtilClass::B', :a=>1, :b=>2, :c=>[], :d=>30, :e=>'aaa', :f=>nil, :m=>nil, :n=>nil, :o=>nil, :p=>nil}, b.dump_attrs)
45
+ end
46
+
47
+
48
+
49
+ H={23=>1, 38=>3, 2837=>1, 3727=>4, 937=>1, 184=>5, 328=>2, 8939=>1}
50
+ def test_sorted_hash1
51
+ s = SortedHash.new
52
+
53
+ H.keys.sort_by{rand}.each { |k|
54
+ s[k]=H[k]
55
+ }
56
+
57
+ assert_equal(H.keys.sort, s.keys)
58
+
59
+ s.clear
60
+ assert_equal([], s.keys)
61
+
62
+ end
63
+
64
+
65
+ def test_snake_case
66
+ {'CNN'=>'cnn', 'CNNNews'=>'cnn_news', 'NewsCNN'=>'news_cnn', 'Apache_WWW'=>'apache_www', 'ApacheAPP'=>'apache_app', 'HeadlineCNNNews'=>'headline_cnn_news'}.each { |k,v|
67
+ assert_equal(v, Wakame::Util.snake_case(k))
68
+ }
69
+ end
70
+
71
+ end
@@ -0,0 +1,54 @@
1
+ class ResourceGenerator < RubiGen::Base
2
+ DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
3
+ Config::CONFIG['ruby_install_name'])
4
+
5
+ def initialize(runtime_args, runtime_options = {})
6
+ super
7
+ usage if args.empty?
8
+ @resource_template = args.shift
9
+ @resource_name = nil
10
+ @resource_name = args.shift unless args.empty?
11
+ end
12
+
13
+ def manifest
14
+ # Use /usr/bin/env if no special shebang was specified
15
+ script_options = { :chmod => 0755, :shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang] }
16
+ windows = (RUBY_PLATFORM =~ /dos|win32|cygwin/i) || (RUBY_PLATFORM =~ /(:?mswin|mingw)/)
17
+
18
+ source_dir = source_path('.').sub(%r{/\.\Z}, '')
19
+
20
+ fail "[ERROR] The resource folder does not exist: #{@resource_template}" unless File.directory? source_path(@resource_template)
21
+ @resource_name ||= @resource_template
22
+
23
+ record do |m|
24
+ Dir.glob(source_path(@resource_template) + "/**/*").each { |path|
25
+ relpath = path.sub(%r{\A#{source_root}\/}, '')
26
+
27
+ if File.directory? path
28
+ m.directory File.join('cluster', 'resources', relpath)
29
+ else
30
+ m.file relpath, File.join('cluster', 'resources', relpath)
31
+ end
32
+ }
33
+ end
34
+ end
35
+
36
+
37
+ protected
38
+ def banner
39
+ templates = Dir.glob(spec.path + "/templates/*").collect { |path|
40
+ File.basename(path)
41
+ }
42
+
43
+ <<-EOS
44
+ Generate a wakame resource folder under cluster/resources/.
45
+
46
+ USAGE: #{$0} resource "resource template name" [resource instance name]
47
+
48
+ Installed Templates:
49
+ #{templates.join(', ')}
50
+
51
+ EOS
52
+ end
53
+
54
+ end
@@ -0,0 +1,60 @@
1
+ class Apache_APP < Wakame::Service::Resource
2
+ include Wakame::Service::ApacheBasicProps
3
+ include WebCluster::HttpAppServer
4
+
5
+ def_attribute :listen_port, {:default=>8001}
6
+ def_attribute :listen_port_https, {:default=>443}
7
+ def_attribute :max_instance, {:default=>5}
8
+
9
+ def render_config(template)
10
+ template.cp(%w(conf/envvars-app init.d/apache2-app))
11
+ template.render(%w(conf/system-app.conf conf/apache2.conf conf/sites-app.conf))
12
+ template.chmod("init.d/apache2-app", 0755)
13
+ end
14
+
15
+
16
+ def start(svc, action)
17
+ cond = ConditionalWait.new { |cond|
18
+ cond.wait_event(Wakame::Event::ServiceOnline) { |event|
19
+ event.instance_id == svc.instance_id
20
+ }
21
+ }
22
+
23
+ request = action.actor_request(svc.agent.agent_id,
24
+ '/service_monitor/register', svc.instance_id, :pidfile, '/var/run/apache2-app.pid').request
25
+ action.actor_request(svc.agent.agent_id,
26
+ '/daemon/start', "apache_app", 'init.d/apache2-app'){ |req|
27
+ req.wait
28
+ Wakame.log.debug("#{self.class} process started")
29
+ }
30
+ cond.wait
31
+ end
32
+
33
+
34
+ def stop(svc, action)
35
+ cond = ConditionalWait.new { |cond|
36
+ cond.wait_event(Wakame::Event::ServiceOffline) { |event|
37
+ event.instance_id == svc.instance_id
38
+ }
39
+ }
40
+
41
+ request = action.actor_request(svc.agent.agent_id,
42
+ '/daemon/stop', 'apache_app', 'init.d/apache2-app'){ |req|
43
+ req.wait
44
+ Wakame.log.debug("#{self.class} process stopped")
45
+ }
46
+ cond.wait
47
+
48
+ request = action.actor_request(svc.agent.agent_id,
49
+ '/service_monitor/unregister', svc.instance_id ).request
50
+ end
51
+
52
+ def reload(svc, action)
53
+ action.actor_request(svc.agent.agent_id,
54
+ '/daemon/reload', "apache_app", 'init.d/apache2-app'){ |req|
55
+ req.wait
56
+ Wakame.log.debug("#{self.class} process reloaded")
57
+ }
58
+ end
59
+
60
+ end
@@ -0,0 +1,46 @@
1
+ #ServerRoot "/etc/apache2"
2
+ #ServerRoot "/home/wakame/config/apache2"
3
+ ServerRoot "<%= agent.root_path %>/tmp/config/apache_app/conf"
4
+
5
+ LockFile /var/lock/apache2/accept.lock
6
+ PidFile ${APACHE_PID_FILE}
7
+
8
+ User ${APACHE_RUN_USER}
9
+ Group ${APACHE_RUN_GROUP}
10
+
11
+ Include ${SYSTEM_INCLUDE_FILE}
12
+
13
+ LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so
14
+ <IfModule mod_mime.c>
15
+ TypesConfig /etc/mime.types
16
+
17
+ AddType application/x-compress .Z
18
+ AddType application/x-gzip .gz .tgz
19
+ AddType application/x-bzip2 .bz2
20
+ </IfModule>
21
+
22
+ AccessFileName .htaccess
23
+ <Files ~ "^\.ht">
24
+ Order allow,deny
25
+ Deny from all
26
+ </Files>
27
+
28
+ ErrorLog ${APACHE_ERROR_LOG_FILE}
29
+
30
+ ServerTokens Full
31
+ ServerSignature On
32
+
33
+ #
34
+ # The following directives define some format nicknames for use with
35
+ # a CustomLog directive (see below).
36
+ # If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
37
+ #
38
+ <IfModule mod_log_config.c>
39
+ LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
40
+ LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_proxy
41
+ LogFormat "%h %l %u %t \"%r\" %>s %b" common
42
+ LogFormat "%{Referer}i -> %U" referer
43
+ LogFormat "%{User-agent}i" agent
44
+ </IfModule>
45
+
46
+ Include ${SITES_INCLUDE_FILE}
@@ -0,0 +1,7 @@
1
+ export APACHE_RUN_USER=www-data
2
+ export APACHE_RUN_GROUP=www-data
3
+ export APACHE_PID_FILE=/var/run/apache2-app.pid
4
+ export APACHE_ACCESS_LOG_FILE=/var/log/apache2/access-app.log
5
+ export APACHE_ERROR_LOG_FILE=/var/log/apache2/error-app.log
6
+ export SYSTEM_INCLUDE_FILE=system-app.conf
7
+ export SITES_INCLUDE_FILE=sites-app.conf
@@ -0,0 +1,23 @@
1
+ NameVirtualHost *:<%= property.listen_port %>
2
+
3
+ # Wild Card Virtual Host
4
+ #<VirtualHost *:<%= property.listen_port %>>
5
+ #DocumentRoot /var/www
6
+ #
7
+ #LogLevel warn
8
+ #CustomLog /var/log/apache2/access-app.log combined
9
+ #ErrorLog /var/log/apache2/error-app.log
10
+ #
11
+ #</VirtualHost>
12
+
13
+ <%- cluster.virtual_hosts.each { |vh| -%>
14
+ <VirtualHost *:<%= property.listen_port %>>
15
+ ServerName <%= vh.server_name %>
16
+ DocumentRoot /home/wakame/apps/development/test/public
17
+ RailsEnv development
18
+
19
+ LogLevel warn
20
+ CustomLog /var/log/apache2/access-app.log combined
21
+ ErrorLog /var/log/apache2/error-app.log
22
+ </VirtualHost>
23
+ <%- } -%>
@@ -0,0 +1,67 @@
1
+ Timeout 300
2
+ KeepAlive Off
3
+ #MaxKeepAliveRequests 100
4
+ #KeepAliveTimeout 15
5
+
6
+ <IfModule mpm_prefork_module>
7
+ StartServers 5
8
+ MinSpareServers 5
9
+ MaxSpareServers 10
10
+ MaxClients 10
11
+ MaxRequestsPerChild 5000
12
+ </IfModule>
13
+
14
+ <IfModule mpm_worker_module>
15
+ StartServers 2
16
+ MaxClients 150
17
+ MinSpareThreads 25
18
+ MaxSpareThreads 75
19
+ ThreadsPerChild 25
20
+ MaxRequestsPerChild 0
21
+ </IfModule>
22
+
23
+
24
+ LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so
25
+ LoadModule auth_basic_module /usr/lib/apache2/modules/mod_auth_basic.so
26
+ LoadModule authn_file_module /usr/lib/apache2/modules/mod_authn_file.so
27
+ LoadModule authz_default_module /usr/lib/apache2/modules/mod_authz_default.so
28
+ LoadModule authz_groupfile_module /usr/lib/apache2/modules/mod_authz_groupfile.so
29
+ LoadModule authz_host_module /usr/lib/apache2/modules/mod_authz_host.so
30
+ LoadModule authz_user_module /usr/lib/apache2/modules/mod_authz_user.so
31
+ LoadModule env_module /usr/lib/apache2/modules/mod_env.so
32
+ LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
33
+ LoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so
34
+ LoadModule status_module /usr/lib/apache2/modules/mod_status.so
35
+ LoadModule info_module /usr/lib/apache2/modules/mod_info.so
36
+ LoadModule passenger_module /usr/local/gems/gems/passenger-2.2.1/ext/apache2/mod_passenger.so
37
+
38
+ ### Port configuration
39
+ Listen <%= property.listen_port %>
40
+
41
+ #<IfModule mod_ssl.c>
42
+ # Listen 443
43
+ #</IfModule>
44
+
45
+
46
+ <IfModule mod_status.c>
47
+ <Location /server-status>
48
+ SetHandler server-status
49
+ Order deny,allow
50
+ Deny from all
51
+ Allow from 127.0.0.1 localhost.localdomain localhost ip6-localhost
52
+ </Location>
53
+ </IfModule>
54
+
55
+ <IfModule mod_info.c>
56
+ <Location /server-info>
57
+ SetHandler server-info
58
+ Order deny,allow
59
+ Deny from all
60
+ Allow from 127.0.0.1 localhost.localdomain localhost ip6-localhost
61
+ </Location>
62
+ </IfModule>
63
+
64
+ <IfModule mod_passenger.c>
65
+ PassengerRoot /usr/local/gems/gems/passenger-2.2.1
66
+ PassengerRuby "/usr/local/bin/passenger_ruby.sh"
67
+ </IfModule>