eye 0.1.11

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 (190) hide show
  1. data/.gitignore +31 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +22 -0
  5. data/README.md +132 -0
  6. data/Rakefile +18 -0
  7. data/bin/eye +282 -0
  8. data/bin/loader_eye +56 -0
  9. data/examples/processes/em.rb +56 -0
  10. data/examples/processes/forking.rb +20 -0
  11. data/examples/processes/sample.rb +144 -0
  12. data/examples/rbenv.eye +11 -0
  13. data/examples/test.eye +65 -0
  14. data/examples/unicorn.eye +29 -0
  15. data/eye.gemspec +37 -0
  16. data/lib/eye.rb +25 -0
  17. data/lib/eye/application.rb +65 -0
  18. data/lib/eye/checker.rb +118 -0
  19. data/lib/eye/checker/cpu.rb +27 -0
  20. data/lib/eye/checker/file_ctime.rb +29 -0
  21. data/lib/eye/checker/file_size.rb +38 -0
  22. data/lib/eye/checker/http.rb +94 -0
  23. data/lib/eye/checker/memory.rb +27 -0
  24. data/lib/eye/checker/socket.rb +148 -0
  25. data/lib/eye/checker/validation.rb +49 -0
  26. data/lib/eye/child_process.rb +75 -0
  27. data/lib/eye/client.rb +32 -0
  28. data/lib/eye/control.rb +2 -0
  29. data/lib/eye/controller.rb +43 -0
  30. data/lib/eye/controller/commands.rb +64 -0
  31. data/lib/eye/controller/helpers.rb +61 -0
  32. data/lib/eye/controller/load.rb +224 -0
  33. data/lib/eye/controller/send_command.rb +88 -0
  34. data/lib/eye/controller/status.rb +136 -0
  35. data/lib/eye/dsl.rb +52 -0
  36. data/lib/eye/dsl/application_opts.rb +33 -0
  37. data/lib/eye/dsl/chain.rb +12 -0
  38. data/lib/eye/dsl/child_process_opts.rb +7 -0
  39. data/lib/eye/dsl/config_opts.rb +11 -0
  40. data/lib/eye/dsl/group_opts.rb +27 -0
  41. data/lib/eye/dsl/helpers.rb +12 -0
  42. data/lib/eye/dsl/main.rb +58 -0
  43. data/lib/eye/dsl/opts.rb +88 -0
  44. data/lib/eye/dsl/process_opts.rb +21 -0
  45. data/lib/eye/dsl/pure_opts.rb +132 -0
  46. data/lib/eye/dsl/validate.rb +41 -0
  47. data/lib/eye/group.rb +125 -0
  48. data/lib/eye/group/chain.rb +68 -0
  49. data/lib/eye/io/unix_server.rb +44 -0
  50. data/lib/eye/io/unix_socket.rb +39 -0
  51. data/lib/eye/loader.rb +13 -0
  52. data/lib/eye/logger.rb +80 -0
  53. data/lib/eye/process.rb +83 -0
  54. data/lib/eye/process/child.rb +61 -0
  55. data/lib/eye/process/commands.rb +256 -0
  56. data/lib/eye/process/config.rb +70 -0
  57. data/lib/eye/process/controller.rb +72 -0
  58. data/lib/eye/process/data.rb +46 -0
  59. data/lib/eye/process/monitor.rb +97 -0
  60. data/lib/eye/process/notify.rb +17 -0
  61. data/lib/eye/process/scheduler.rb +50 -0
  62. data/lib/eye/process/states.rb +92 -0
  63. data/lib/eye/process/states_history.rb +62 -0
  64. data/lib/eye/process/system.rb +60 -0
  65. data/lib/eye/process/trigger.rb +32 -0
  66. data/lib/eye/process/watchers.rb +67 -0
  67. data/lib/eye/server.rb +51 -0
  68. data/lib/eye/settings.rb +35 -0
  69. data/lib/eye/system.rb +145 -0
  70. data/lib/eye/system_resources.rb +83 -0
  71. data/lib/eye/trigger.rb +53 -0
  72. data/lib/eye/trigger/flapping.rb +24 -0
  73. data/lib/eye/utils.rb +5 -0
  74. data/lib/eye/utils/alive_array.rb +31 -0
  75. data/lib/eye/utils/celluloid_chain.rb +51 -0
  76. data/lib/eye/utils/leak_19.rb +7 -0
  77. data/lib/eye/utils/tail.rb +20 -0
  78. data/spec/checker/cpu_spec.rb +58 -0
  79. data/spec/checker/file_ctime_spec.rb +34 -0
  80. data/spec/checker/file_size_spec.rb +107 -0
  81. data/spec/checker/http_spec.rb +109 -0
  82. data/spec/checker/memory_spec.rb +64 -0
  83. data/spec/checker/socket_spec.rb +116 -0
  84. data/spec/checker_spec.rb +188 -0
  85. data/spec/child_process/child_process_spec.rb +46 -0
  86. data/spec/client_server_spec.rb +34 -0
  87. data/spec/controller/commands_spec.rb +92 -0
  88. data/spec/controller/controller_spec.rb +133 -0
  89. data/spec/controller/find_objects_spec.rb +150 -0
  90. data/spec/controller/group_spec.rb +110 -0
  91. data/spec/controller/intergration_spec.rb +327 -0
  92. data/spec/controller/load_spec.rb +326 -0
  93. data/spec/controller/races_spec.rb +70 -0
  94. data/spec/controller/stop_on_delete_spec.rb +157 -0
  95. data/spec/dsl/chain_spec.rb +140 -0
  96. data/spec/dsl/checks_spec.rb +202 -0
  97. data/spec/dsl/config_spec.rb +44 -0
  98. data/spec/dsl/dsl_spec.rb +73 -0
  99. data/spec/dsl/getter_spec.rb +223 -0
  100. data/spec/dsl/integration_spec.rb +311 -0
  101. data/spec/dsl/load_spec.rb +52 -0
  102. data/spec/dsl/process_spec.rb +330 -0
  103. data/spec/dsl/sub_procs_spec.rb +93 -0
  104. data/spec/dsl/with_server_spec.rb +104 -0
  105. data/spec/example/em.rb +57 -0
  106. data/spec/example/forking.rb +20 -0
  107. data/spec/example/sample.rb +154 -0
  108. data/spec/fixtures/dsl/0.rb +8 -0
  109. data/spec/fixtures/dsl/0a.rb +8 -0
  110. data/spec/fixtures/dsl/0c.rb +8 -0
  111. data/spec/fixtures/dsl/1.rb +5 -0
  112. data/spec/fixtures/dsl/bad.eye +6 -0
  113. data/spec/fixtures/dsl/configs/1.eye +3 -0
  114. data/spec/fixtures/dsl/configs/2.eye +1 -0
  115. data/spec/fixtures/dsl/configs/3.eye +1 -0
  116. data/spec/fixtures/dsl/configs/4.eye +3 -0
  117. data/spec/fixtures/dsl/empty.eye +20 -0
  118. data/spec/fixtures/dsl/include_test.eye +5 -0
  119. data/spec/fixtures/dsl/include_test/1.rb +6 -0
  120. data/spec/fixtures/dsl/include_test/ha.rb +4 -0
  121. data/spec/fixtures/dsl/include_test2.eye +5 -0
  122. data/spec/fixtures/dsl/integration.eye +30 -0
  123. data/spec/fixtures/dsl/integration2.eye +32 -0
  124. data/spec/fixtures/dsl/integration_locks.eye +30 -0
  125. data/spec/fixtures/dsl/integration_sor.eye +32 -0
  126. data/spec/fixtures/dsl/integration_sor2.eye +27 -0
  127. data/spec/fixtures/dsl/integration_sor3.eye +32 -0
  128. data/spec/fixtures/dsl/load.eye +25 -0
  129. data/spec/fixtures/dsl/load2.eye +7 -0
  130. data/spec/fixtures/dsl/load2_dup2.eye +13 -0
  131. data/spec/fixtures/dsl/load2_dup_pid.eye +7 -0
  132. data/spec/fixtures/dsl/load3.eye +10 -0
  133. data/spec/fixtures/dsl/load4.eye +7 -0
  134. data/spec/fixtures/dsl/load5.eye +8 -0
  135. data/spec/fixtures/dsl/load6.eye +17 -0
  136. data/spec/fixtures/dsl/load_dubls.eye +36 -0
  137. data/spec/fixtures/dsl/load_dup_ex_names.eye +15 -0
  138. data/spec/fixtures/dsl/load_error.eye +5 -0
  139. data/spec/fixtures/dsl/load_error_folder/load3.eye +10 -0
  140. data/spec/fixtures/dsl/load_error_folder/load4.eye +7 -0
  141. data/spec/fixtures/dsl/load_folder/load3.eye +10 -0
  142. data/spec/fixtures/dsl/load_folder/load4.eye +7 -0
  143. data/spec/fixtures/dsl/load_int.eye +8 -0
  144. data/spec/fixtures/dsl/load_int2.eye +13 -0
  145. data/spec/fixtures/dsl/load_logger.eye +26 -0
  146. data/spec/fixtures/dsl/load_logger2.eye +3 -0
  147. data/spec/fixtures/dsl/long_load.eye +5 -0
  148. data/spec/fixtures/dsl/subfolder1/proc1.rb +3 -0
  149. data/spec/fixtures/dsl/subfolder2.eye +9 -0
  150. data/spec/fixtures/dsl/subfolder2/common.rb +1 -0
  151. data/spec/fixtures/dsl/subfolder2/proc2.rb +3 -0
  152. data/spec/fixtures/dsl/subfolder2/sub/proc3.rb +6 -0
  153. data/spec/fixtures/dsl/subfolder3.eye +8 -0
  154. data/spec/fixtures/dsl/subfolder3/common.rb +1 -0
  155. data/spec/fixtures/dsl/subfolder3/proc4.rb +3 -0
  156. data/spec/fixtures/dsl/subfolder3/sub/proc5.rb +6 -0
  157. data/spec/fixtures/dsl/subfolder4.eye +6 -0
  158. data/spec/fixtures/dsl/subfolder4/a.rb +2 -0
  159. data/spec/fixtures/dsl/subfolder4/b.rb +1 -0
  160. data/spec/fixtures/dsl/subfolder4/c.rb +1 -0
  161. data/spec/mock_spec.rb +32 -0
  162. data/spec/process/checks/child_checks_spec.rb +79 -0
  163. data/spec/process/checks/cpu_spec.rb +114 -0
  164. data/spec/process/checks/ctime_spec.rb +43 -0
  165. data/spec/process/checks/fsize_spec.rb +22 -0
  166. data/spec/process/checks/http_spec.rb +52 -0
  167. data/spec/process/checks/intergration_spec.rb +32 -0
  168. data/spec/process/checks/memory_spec.rb +113 -0
  169. data/spec/process/child_process_spec.rb +125 -0
  170. data/spec/process/config_spec.rb +75 -0
  171. data/spec/process/controller_spec.rb +173 -0
  172. data/spec/process/monitoring_spec.rb +180 -0
  173. data/spec/process/restart_spec.rb +174 -0
  174. data/spec/process/scheduler_spec.rb +150 -0
  175. data/spec/process/start_spec.rb +261 -0
  176. data/spec/process/states_history_spec.rb +118 -0
  177. data/spec/process/stop_spec.rb +150 -0
  178. data/spec/process/system_spec.rb +100 -0
  179. data/spec/process/triggers/flapping_spec.rb +81 -0
  180. data/spec/process/update_config_spec.rb +63 -0
  181. data/spec/spec_helper.rb +120 -0
  182. data/spec/support/rr_celluloid.rb +36 -0
  183. data/spec/support/scheduler_hack.rb +16 -0
  184. data/spec/support/spec_support.rb +164 -0
  185. data/spec/system_resources_spec.rb +59 -0
  186. data/spec/system_spec.rb +170 -0
  187. data/spec/utils/alive_array_spec.rb +50 -0
  188. data/spec/utils/celluloid_chain_spec.rb +82 -0
  189. data/spec/utils/tail_spec.rb +21 -0
  190. metadata +558 -0
@@ -0,0 +1,70 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Some crazey situations" do
4
+
5
+ before :each do
6
+ @c = Eye::Controller.new
7
+ @c.load(fixture("dsl/integration.eye"))
8
+ @processes = @c.all_processes
9
+ @p1 = @processes.detect{|c| c.name == 'sample1'}
10
+ @p2 = @processes.detect{|c| c.name == 'sample2'}
11
+ @p3 = @processes.detect{|c| c.name == 'forking'}
12
+ @samples = @c.all_groups.detect{|c| c.name == 'samples'}
13
+ sleep 10 # to ensure that all processes started
14
+
15
+ @processes.size.should == 3
16
+ @processes.map{|c| c.state_name}.uniq.should == [:up]
17
+ @childs = @p3.childs.keys rescue []
18
+ end
19
+
20
+ after :each do
21
+ @processes.each do |p|
22
+ p.schedule(:stop) if p.alive?
23
+ end
24
+ sleep 5
25
+ @processes.each do |process|
26
+ force_kill_process(process) if process.alive?
27
+ end
28
+
29
+ force_kill_pid(@old_pid1)
30
+ force_kill_pid(@old_pid2)
31
+ force_kill_pid(@old_pid3)
32
+ (@childs || []).each do |pid|
33
+ force_kill_pid(pid)
34
+ end
35
+
36
+ File.delete(File.join(C.sample_dir, "lock1.lock")) rescue nil
37
+ File.delete(File.join(C.sample_dir, "lock2.lock")) rescue nil
38
+ end
39
+
40
+ it "load another config, with same processes but changed names" do
41
+ @old_pid1 = @p1.pid
42
+ @old_pid2 = @p2.pid
43
+ @old_pid3 = @p3.pid
44
+
45
+ @c.load(fixture("dsl/integration2.eye"))
46
+ sleep 10
47
+
48
+ # @p1, @p2 recreates
49
+ # @p3 the same
50
+
51
+ procs = @c.all_processes
52
+ @p1_ = procs.detect{|c| c.name == 'sample1_'}
53
+ @p2_ = procs.detect{|c| c.name == 'sample2_'}
54
+ @p3_ = procs.detect{|c| c.name == 'forking'}
55
+
56
+ @p3.object_id.should == @p3_.object_id
57
+ @p1.alive?.should == false
58
+ @p1_.alive?.should == true
59
+
60
+ @p2.alive?.should == false
61
+ @p2_.alive?.should == true
62
+
63
+ @p1_.pid.should == @old_pid1
64
+ @p2_.pid.should == @old_pid2
65
+ @p3_.pid.should == @old_pid3
66
+
67
+ @p1_.state_name.should == :up
68
+ end
69
+
70
+ end
@@ -0,0 +1,157 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "StopOnDelete behaviour" do
4
+ before :each do
5
+ @c = Eye::Controller.new
6
+ @c.load(fixture("dsl/integration_sor.eye"))
7
+ @processes = @c.all_processes
8
+ @p1 = @processes.detect{|c| c.name == 'sample1'}
9
+ @p2 = @processes.detect{|c| c.name == 'sample2'}
10
+ @p3 = @processes.detect{|c| c.name == 'forking'}
11
+ @samples = @c.all_groups.detect{|c| c.name == 'samples'}
12
+ sleep 10 # to ensure that all processes started
13
+
14
+ @processes.size.should == 3
15
+ @processes.map{|c| c.state_name}.uniq.should == [:up]
16
+ @childs = @p3.childs.keys rescue []
17
+
18
+ @old_pid1 = @p1.pid
19
+ @old_pid2 = @p2.pid
20
+ @old_pid3 = @p3.pid
21
+ end
22
+
23
+ after :each do
24
+ @processes = @c.all_processes
25
+ @processes.each do |p|
26
+ p.schedule(:stop) if p.alive?
27
+ end
28
+ sleep 5
29
+ @processes.each do |process|
30
+ force_kill_process(process) if process.alive?
31
+ end
32
+
33
+ force_kill_pid(@old_pid1)
34
+ force_kill_pid(@old_pid2)
35
+ force_kill_pid(@old_pid3)
36
+ (@childs || []).each do |pid|
37
+ force_kill_pid(pid)
38
+ end
39
+ end
40
+
41
+ it "delete process => stop process" do
42
+ @c.send_command(:delete, "sample1")
43
+ sleep 7 # while
44
+
45
+ @c.all_processes.map(&:name).sort.should == %w{forking sample2}
46
+ @c.all_groups.map(&:name).sort.should == %w{__default__ samples}
47
+
48
+ Eye::System.pid_alive?(@old_pid1).should == false
49
+ Eye::System.pid_alive?(@old_pid2).should == true
50
+ Eye::System.pid_alive?(@old_pid3).should == true
51
+
52
+ sleep 0.5
53
+ Eye::System.pid_alive?(@old_pid1).should == false
54
+ end
55
+
56
+ it "delete application => stop group proceses" do
57
+ @c.send_command(:delete, "samples").should == ["int:samples"]
58
+ sleep 7 # while
59
+
60
+ @c.all_processes.should == [@p3]
61
+ @c.all_groups.map(&:name).should == ['__default__']
62
+
63
+ Eye::System.pid_alive?(@old_pid1).should == false
64
+ Eye::System.pid_alive?(@old_pid2).should == false
65
+ Eye::System.pid_alive?(@old_pid3).should == true
66
+
67
+ sleep 0.5
68
+ Eye::System.pid_alive?(@old_pid1).should == false
69
+
70
+ # noone up this
71
+ sleep 2
72
+ Eye::System.pid_alive?(@old_pid1).should == false
73
+ end
74
+
75
+ it "delete application => stop all proceses" do
76
+ @c.send_command(:delete, "int")
77
+ sleep 7 # while
78
+
79
+ @c.all_processes.should == []
80
+ @c.all_groups.should == []
81
+ @c.applications.should == []
82
+
83
+ Eye::System.pid_alive?(@old_pid1).should == false
84
+ Eye::System.pid_alive?(@old_pid2).should == false
85
+ Eye::System.pid_alive?(@old_pid3).should == false
86
+
87
+ sleep 0.5
88
+ Eye::System.pid_alive?(@old_pid1).should == false
89
+
90
+ actors = Celluloid::Actor.all.map(&:class)
91
+ actors.should_not include(Eye::Utils::CelluloidChain)
92
+ actors.should_not include(Eye::Process)
93
+ actors.should_not include(Eye::Group)
94
+ actors.should_not include(Eye::Application)
95
+ actors.should_not include(Eye::Checker::Memory)
96
+ end
97
+
98
+ it "load config when 1 process deleted, it should stopped" do
99
+ @c.load(fixture("dsl/integration_sor2.eye"))
100
+ sleep 10
101
+
102
+ procs = @c.all_processes
103
+ @p1_ = procs.detect{|c| c.name == 'sample1'}
104
+ @p2_ = procs.detect{|c| c.name == 'sample2'}
105
+ @p3_ = procs.detect{|c| c.name == 'sample3'}
106
+
107
+ @p1_.object_id.should == @p1.object_id
108
+ @p2_.object_id.should == @p2.object_id
109
+ @p3_.state_name.should == :up
110
+
111
+ @p1_.pid.should == @old_pid1
112
+ @p2_.pid.should == @old_pid2
113
+
114
+ Eye::System.pid_alive?(@old_pid1).should == true
115
+ Eye::System.pid_alive?(@old_pid2).should == true
116
+ Eye::System.pid_alive?(@old_pid3).should == false
117
+
118
+ @p3.alive?.should == false
119
+ @c.all_processes.map{|c| c.name}.sort.should == %w{sample1 sample2 sample3}
120
+ end
121
+
122
+ it "load another config, with same processes but changed names" do
123
+ @c.load(fixture("dsl/integration_sor3.eye"))
124
+ sleep 15
125
+
126
+ # @p1, @p2 recreates
127
+ # @p3 the same
128
+
129
+ procs = @c.all_processes
130
+ @p1_ = procs.detect{|c| c.name == 'sample1_'}
131
+ @p2_ = procs.detect{|c| c.name == 'sample2_'}
132
+ @p3_ = procs.detect{|c| c.name == 'forking'}
133
+
134
+ @p3.object_id.should == @p3_.object_id
135
+ @p1.alive?.should == false
136
+ @p1_.alive?.should == true
137
+
138
+ @p2.alive?.should == false
139
+ @p2_.alive?.should == true
140
+
141
+ @p1_.pid.should_not == @old_pid1
142
+ @p2_.pid.should_not == @old_pid2
143
+ @p3_.pid.should == @old_pid3
144
+
145
+ @p1_.state_name.should == :up
146
+ @p2_.state_name.should == :up
147
+ @p3_.state_name.should == :up
148
+
149
+ Eye::System.pid_alive?(@old_pid1).should == false
150
+ Eye::System.pid_alive?(@old_pid2).should == false
151
+ Eye::System.pid_alive?(@old_pid3).should == true
152
+
153
+ Eye::System.pid_alive?(@p1_.pid).should == true
154
+ Eye::System.pid_alive?(@p2_.pid).should == true
155
+ end
156
+
157
+ end
@@ -0,0 +1,140 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Eye::Dsl::Chain" do
4
+
5
+ it "should understand chain options" do
6
+ conf = <<-E
7
+ Eye.application("bla") do
8
+ chain :grace => 5.seconds
9
+
10
+ process("3") do
11
+ pid_file "3"
12
+ end
13
+ end
14
+ E
15
+
16
+ h = {
17
+ "bla" => {:name => "bla",
18
+ :chain=>{
19
+ :start=>{:grace=>5, :action=>:start},
20
+ :restart=>{:grace=>5, :action=>:restart}},
21
+ :groups=>{
22
+ "__default__"=>{:name => "__default__", :application => "bla",
23
+ :chain=>{
24
+ :start=>{:grace=>5, :action=>:start},
25
+ :restart=>{:grace=>5, :action=>:restart}},
26
+ :processes=>{
27
+ "3"=>{
28
+ :chain=>{:start=>{:grace=>5, :action=>:start},
29
+ :restart=>{:grace=>5, :action=>:restart}},
30
+ :pid_file=>"3",
31
+ :application=>"bla",
32
+ :group=>"__default__",
33
+ :name=>"3"}}}}}}
34
+
35
+ Eye::Dsl.parse_apps(conf).should == h
36
+ end
37
+
38
+ it "1 inner group have" do
39
+ conf = <<-E
40
+ Eye.application("bla") do
41
+ group "gr1" do
42
+ chain :grace => 5.seconds
43
+ end
44
+
45
+ process("p1"){pid_file('1')}
46
+ end
47
+ E
48
+
49
+ h = {
50
+ "bla" => {:name => "bla",
51
+ :groups=>{
52
+ "gr1"=>{:name => "gr1", :application => "bla",
53
+ :chain=>{:start=>{:grace=>5, :action=>:start},
54
+ :restart=>{:grace=>5, :action=>:restart}},
55
+ :processes=>{}},
56
+ "__default__"=>{:name => "__default__", :application => "bla",
57
+ :processes=>{"p1"=>{:pid_file=>"1", :application=>"bla", :group=>"__default__", :name=>"p1"}}}}}}
58
+
59
+ Eye::Dsl.parse_apps(conf).should == h
60
+ end
61
+
62
+ it "1 group have, 1 not" do
63
+ conf = <<-E
64
+ Eye.application("bla") do
65
+ group "gr1" do
66
+ working_dir "/tmp"
67
+ chain :grace => 5.seconds
68
+ end
69
+
70
+ group("gr2"){
71
+ working_dir '/tmp'
72
+ }
73
+ end
74
+ E
75
+
76
+ h = {
77
+ "bla" => {:name => "bla",
78
+ :groups=>{
79
+ "gr1"=>{:name => "gr1", :application => "bla",
80
+ :working_dir=>"/tmp",
81
+ :chain=>{:start=>{:grace=>5, :action=>:start}, :restart=>{:grace=>5, :action=>:restart}},
82
+ :processes=>{}},
83
+ "gr2"=>{:working_dir=>"/tmp", :processes=>{}, :name => "gr2", :application => "bla"}}}}
84
+
85
+ Eye::Dsl.parse_apps(conf).should == h
86
+ end
87
+
88
+ it "one option" do
89
+ conf = <<-E
90
+ Eye.application("bla") do
91
+ chain :grace => 5.seconds, :action => :start, :type => :async
92
+
93
+ process("3") do
94
+ pid_file "3"
95
+ end
96
+ end
97
+ E
98
+
99
+ h = {"bla" => {:name => "bla",
100
+ :chain=>{
101
+ :start=>{:grace=>5, :action=>:start, :type=>:async}},
102
+ :groups=>{
103
+ "__default__"=>{:name => "__default__", :application => "bla",
104
+ :chain=>{:start=>{:grace=>5, :action=>:start, :type=>:async}},
105
+ :processes=>{"3"=>{:chain=>{:start=>{:grace=>5, :action=>:start, :type=>:async}}, :pid_file=>"3", :application=>"bla", :group=>"__default__", :name=>"3"}}}}}}
106
+
107
+ Eye::Dsl.parse_apps(conf).should == h
108
+ end
109
+
110
+ it "group can rewrite part of options" do
111
+ conf = <<-E
112
+ Eye.application("bla") do
113
+ chain :grace => 5.seconds
114
+
115
+ group "gr" do
116
+ chain :grace => 10.seconds, :action => :start, :type => :sync
117
+
118
+ process("3") do
119
+ pid_file "3"
120
+ end
121
+ end
122
+ end
123
+ E
124
+
125
+ h = {"bla" => {:name => "bla",
126
+ :chain=>{
127
+ :start=>{:grace=>5, :action=>:start},
128
+ :restart=>{:grace=>5, :action=>:restart}},
129
+ :groups=>{
130
+ "gr"=>{:name => "gr", :application => "bla",
131
+ :chain=>{
132
+ :start=>{:grace=>10, :action=>:start, :type=>:sync},
133
+ :restart=>{:grace=>5, :action=>:restart}},
134
+ :processes=>{"3"=>{:chain=>{:start=>{:grace=>10, :action=>:start, :type=>:sync}, :restart=>{:grace=>5, :action=>:restart}}, :pid_file=>"3", :application=>"bla", :group=>"gr", :name=>"3"}}}}}}
135
+
136
+ Eye::Dsl.parse_apps(conf).should == h
137
+ end
138
+
139
+
140
+ end
@@ -0,0 +1,202 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Eye::Dsl checks" do
4
+
5
+ it "ok checks" do
6
+ conf = <<-E
7
+ Eye.application("bla") do
8
+ process("1") do
9
+ pid_file "1.pid"
10
+
11
+ checks :memory, :below => 100.megabytes, :every => 10.seconds
12
+ checks :cpu, :below => 100, :every => 20.seconds
13
+ end
14
+ end
15
+ E
16
+ Eye::Dsl.parse_apps(conf).should == {"bla" => {:name => "bla", :groups=>{"__default__"=>{:name => "__default__", :application => "bla", :processes=>{"1"=>{:pid_file=>"1.pid", :checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}, :cpu=>{:below=>100, :every=>20, :type=>:cpu}}, :application=>"bla", :group=>"__default__", :name=>"1"}}}}}}
17
+ end
18
+
19
+ it "inherit checks" do
20
+ conf = <<-E
21
+ Eye.application("bla") do
22
+ checks :memory, :below => 100.megabytes, :every => 10.seconds
23
+
24
+ process("1") do
25
+ pid_file "1.pid"
26
+
27
+ checks :memory, :below => 90.megabytes, :every => 5.seconds
28
+ checks :cpu, :below => 100, :every => 20.seconds
29
+ end
30
+
31
+ process("2") do
32
+ pid_file "2.pid"
33
+ end
34
+ end
35
+ E
36
+ Eye::Dsl.parse_apps(conf).should == {"bla" => {:name => "bla", :checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}}, :groups=>{"__default__"=>{:name => "__default__", :application => "bla", :checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}}, :processes=>{"1"=>{:checks=>{:memory=>{:below=>94371840, :every=>5, :type=>:memory}, :cpu=>{:below=>100, :every=>20, :type=>:cpu}}, :pid_file=>"1.pid", :application=>"bla", :group=>"__default__", :name=>"1"}, "2"=>{:checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}}, :pid_file=>"2.pid", :application=>"bla", :group=>"__default__", :name=>"2"}}}}}}
37
+ end
38
+
39
+ it "checks in monitor_children" do
40
+ conf = <<-E
41
+ Eye.application("bla") do
42
+ process("1") do
43
+ pid_file "1.pid"
44
+ monitor_children{
45
+ checks :cpu, :below => 100, :every => 20.seconds
46
+ }
47
+ end
48
+ end
49
+ E
50
+ Eye::Dsl.parse_apps(conf).should == {"bla" => {:name => "bla", :groups=>{"__default__"=>{:name => "__default__", :application => "bla", :processes=>{"1"=>{:pid_file=>"1.pid", :monitor_children=>{:checks=>{:cpu=>{:below=>100, :every=>20, :type=>:cpu}}}, :application=>"bla", :group=>"__default__", :name=>"1"}}}}}}
51
+ end
52
+
53
+ it "child should not inherit checks" do
54
+ conf = <<-E
55
+ Eye.application("bla") do
56
+ process("1") do
57
+ pid_file "1.pid"
58
+ checks :cpu, :below => 100, :every => 20.seconds
59
+ monitor_children{
60
+ }
61
+ end
62
+ end
63
+ E
64
+ Eye::Dsl.parse_apps(conf).should == {"bla" => {:name=>"bla", :groups=>{"__default__"=>{:name=>"__default__", :application=>"bla", :processes=>{"1"=>{:name=>"1", :application=>"bla", :group=>"__default__", :pid_file=>"1.pid", :checks=>{:cpu=>{:below=>100, :every=>20, :type=>:cpu}}, :monitor_children=>{}}}}}}}
65
+ end
66
+
67
+ it "no valid checks" do
68
+ conf = <<-E
69
+ Eye.application("bla") do
70
+ process("1") do
71
+ pid_file "1.pid"
72
+ checks :cpu, :below => {1 => 2}, :every => 20.seconds
73
+ end
74
+ end
75
+ E
76
+ expect{Eye::Dsl.parse_apps(conf)}.to raise_error(Eye::Checker::Validation::Error)
77
+ end
78
+
79
+ it "ok trigger" do
80
+ conf = <<-E
81
+ Eye.application("bla") do
82
+ process("1") do
83
+ pid_file "1.pid"
84
+
85
+ triggers :flapping, :times => 2, :within => 15.seconds
86
+ end
87
+ end
88
+ E
89
+ Eye::Dsl.parse_apps(conf).should == {"bla" => {:name => "bla", :groups=>{"__default__"=>{:name => "__default__", :application => "bla", :processes=>{"1"=>{:pid_file=>"1.pid", :triggers=>{:flapping=>{:times=>2, :within=>15, :type=>:flapping}}, :application=>"bla", :group=>"__default__", :name=>"1"}}}}}}
90
+ end
91
+
92
+ it "no valid trigger" do
93
+ conf = <<-E
94
+ Eye.application("bla") do
95
+ process("1") do
96
+ pid_file "1.pid"
97
+ triggers :flapping, :times => 2, :within => "bla"
98
+ end
99
+ end
100
+ E
101
+ expect{Eye::Dsl.parse_apps(conf)}.to raise_error(Eye::Checker::Validation::Error)
102
+ end
103
+
104
+ it "nochecks to remove inherit checks" do
105
+ conf = <<-E
106
+ Eye.application("bla") do
107
+ checks :memory, :below => 100.megabytes, :every => 10.seconds
108
+
109
+ process("1") do
110
+ pid_file "1.pid"
111
+ nochecks :memory
112
+ end
113
+
114
+ process("2") do
115
+ pid_file "2.pid"
116
+ end
117
+ end
118
+ E
119
+ Eye::Dsl.parse_apps(conf).should == {
120
+ "bla" => {:name => "bla", :checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}},
121
+ :groups=>{
122
+ "__default__"=>{:name => "__default__", :application => "bla",
123
+ :checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}},
124
+ :processes=>{
125
+ "1"=>{:checks=>{}, :pid_file=>"1.pid", :application=>"bla", :group=>"__default__", :name=>"1"},
126
+ "2"=>{:checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}}, :pid_file=>"2.pid", :application=>"bla", :group=>"__default__", :name=>"2"}}}}}}
127
+ end
128
+
129
+ it "empty nocheck do nothing and inherit" do
130
+ conf = <<-E
131
+ Eye.application("bla") do
132
+ checks :memory, :below => 100.megabytes, :every => 10.seconds
133
+ nochecks :cpu
134
+
135
+ group :blagr do
136
+ process("1") do
137
+ pid_file "1.pid"
138
+ nochecks :cpu
139
+ nochecks :memory
140
+ end
141
+ end
142
+
143
+ process("2") do
144
+ pid_file "2.pid"
145
+ end
146
+ end
147
+ E
148
+ Eye::Dsl.parse_apps(conf).should == {
149
+ "bla" => {:name => "bla",
150
+ :checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}},
151
+ :groups=>{
152
+ "blagr" => {:name=>"blagr", :checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}}, :application=>"bla",
153
+ :processes => {"1"=>{:checks=>{}, :pid_file=>"1.pid", :application=>"bla", :group=>"blagr", :name=>"1"}}},
154
+ "__default__"=>{:name =>
155
+ "__default__", :application => "bla",
156
+ :checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}}, :processes=>{
157
+ "2"=>{:checks=>{:memory=>{:below=>104857600, :every=>10, :type=>:memory}}, :pid_file=>"2.pid", :application=>"bla", :group=>"__default__", :name=>"2"}}}}}}
158
+ end
159
+
160
+ it "process with unknown checker type" do
161
+ conf = <<-E
162
+ Eye.application("bla") do |app|
163
+ app.process("1") do
164
+ pid_file "2.pid"
165
+
166
+ checks :bla, :a => 1
167
+ end
168
+ end
169
+ E
170
+ expect{Eye::Dsl.parse_apps(conf)}.to raise_error(Eye::Dsl::Error)
171
+ end
172
+
173
+ it "process with unknown triggers type" do
174
+ conf = <<-E
175
+ Eye.application("bla") do |app|
176
+ app.process("1") do
177
+ pid_file "2.pid"
178
+
179
+ triggers :bla, :a => 1
180
+ end
181
+ end
182
+ E
183
+ expect{Eye::Dsl.parse_apps(conf)}.to raise_error(Eye::Dsl::Error)
184
+ end
185
+
186
+ it "check with Proc" do
187
+ conf = <<-E
188
+ Eye.application("bla") do
189
+ process("1") do
190
+ pid_file "1.pid"
191
+
192
+ checks :socket, :addr => "unix:/tmp/1", :expect_data => Proc.new{|data| data == 1}
193
+ end
194
+ end
195
+ E
196
+ res = Eye::Dsl.parse_apps(conf)
197
+ proc = res['bla'][:groups]['__default__'][:processes]['1'][:checks][:socket][:expect_data]
198
+ proc[0].should == false
199
+ proc[1].should == true
200
+ end
201
+
202
+ end