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,113 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe "Process Memory check" do
4
+
5
+ before :each do
6
+ @c = C.p1.merge(
7
+ :checks => C.check_mem
8
+ )
9
+ end
10
+
11
+ it "should start periodical watcher" do
12
+ start_ok_process(@c)
13
+
14
+ @process.watchers.keys.should == [:check_alive, :check_memory]
15
+
16
+ @process.stop
17
+
18
+ # after process stop should remove watcher
19
+ @process.watchers.keys.should == []
20
+ end
21
+
22
+ describe "1 times" do
23
+ before :each do
24
+ @check = {:memory => {:every => 2, :below => 40.megabytes, :times => 1, :type => :memory}}
25
+ end
26
+
27
+ it "when memory exceed limit process should restart" do
28
+ start_ok_process(@c.merge(:checks => @check))
29
+ stub(Eye::SystemResources).memory(@process.pid){ 20_000 }
30
+
31
+ sleep 3
32
+
33
+ stub(Eye::SystemResources).memory(@process.pid){ 50_000 }
34
+ mock(@process).notify(:crit, anything)
35
+ mock(@process).schedule(:restart, anything)
36
+
37
+ sleep 1
38
+ end
39
+
40
+ it "else should not restart" do
41
+ start_ok_process(@c.merge(:checks => @check))
42
+
43
+ stub(Eye::SystemResources).memory(@process.pid){ 20_000 }
44
+ sleep 3
45
+
46
+ stub(Eye::SystemResources).memory(@process.pid){ 25_000 }
47
+ dont_allow(@process).schedule(:restart)
48
+
49
+ sleep 1
50
+ end
51
+ end
52
+
53
+ describe "3 times" do
54
+ before :each do
55
+ @check = {:memory => {:every => 2, :below => 40.megabytes, :times => 3, :type => :memory}}
56
+ end
57
+
58
+ it "when memory exceed limit process should restart" do
59
+ start_ok_process(@c.merge(:checks => @check))
60
+
61
+ stub(Eye::SystemResources).memory(@process.pid){ 20_000 }
62
+ sleep 3
63
+
64
+ stub(Eye::SystemResources).memory(@process.pid){ 50_000 }
65
+ mock(@process).schedule(:restart, anything)
66
+
67
+ sleep 6
68
+ end
69
+
70
+ it "else should not restart" do
71
+ start_ok_process(@c.merge(:checks => @check))
72
+
73
+ stub(Eye::SystemResources).memory(@process.pid){ 20_000 }
74
+ sleep 3
75
+
76
+ stub(Eye::SystemResources).memory(@process.pid){ 25_000 }
77
+ dont_allow(@process).schedule(:restart)
78
+
79
+ sleep 6
80
+ end
81
+ end
82
+
83
+ describe "3,5 times" do
84
+ before :each do
85
+ @check = {:memory => {:every => 2, :below => 40.megabytes, :times => [3,5], :type => :memory}}
86
+ end
87
+
88
+ it "when memory exceed limit process should restart" do
89
+ start_ok_process(@c.merge(:checks => @check))
90
+
91
+ stub(Eye::SystemResources).memory(@process.pid){ 20_000 }
92
+ sleep 5
93
+
94
+ stub(Eye::SystemResources).memory(@process.pid){ 50_000 }
95
+ mock(@process).schedule(:restart, anything)
96
+
97
+ sleep 6
98
+ end
99
+
100
+ it "else should not restart" do
101
+ start_ok_process(@c.merge(:checks => @check))
102
+
103
+ stub(Eye::SystemResources).memory(@process.pid){ 20_000 }
104
+ sleep 5
105
+
106
+ stub(Eye::SystemResources).memory(@process.pid){ 25_000 }
107
+ dont_allow(@process).schedule(:restart)
108
+
109
+ sleep 6
110
+ end
111
+ end
112
+
113
+ end
@@ -0,0 +1,125 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "ChildProcess" do
4
+
5
+ describe "starting, monitoring" do
6
+ after :each do
7
+ @process.stop if @process
8
+ end
9
+
10
+ it "should monitoring when process has childs and enable option" do
11
+ cfg = C.p3.merge(:monitor_children => {})
12
+ start_ok_process(cfg)
13
+ sleep 5 # ensure that childs finds
14
+
15
+ @process.state_name.should == :up
16
+ @process.childs.keys.should_not == []
17
+ @process.childs.keys.size.should == 3
18
+ @process.watchers.keys.should == [:check_alive, :check_childs]
19
+ end
20
+
21
+ it "should not monitoring when process has childs and disable option" do
22
+ start_ok_process(C.p3)
23
+ @process.childs.should == {}
24
+ @process.watchers.keys.should == [:check_alive]
25
+ end
26
+
27
+ it "should not monitoring when process has no childs and enable option" do
28
+ start_ok_process(C.p1.merge(:monitor_children => {}))
29
+ @process.childs.should == {}
30
+ @process.watchers.keys.should == [:check_alive, :check_childs]
31
+ end
32
+
33
+ it "when one of child is die, should update list" do
34
+ start_ok_process(C.p3.merge(:monitor_children => {}, :childs_update_period => Eye::SystemResources::PsAxActor::UPDATE_INTERVAL + 1))
35
+ @process.watchers.keys.should == [:check_alive, :check_childs]
36
+
37
+ sleep 5 # ensure that childs finds
38
+
39
+ #p @process.childs
40
+ pids = @process.childs.keys.sort
41
+
42
+ # one of the child is just die
43
+ died_pid = pids.sample
44
+ die_process!(died_pid, 9)
45
+
46
+ # sleep enought for update list
47
+ sleep (Eye::SystemResources::PsAxActor::UPDATE_INTERVAL * 2 + 1).seconds
48
+
49
+ new_pids = @process.childs.keys.sort
50
+
51
+ pids.should_not == new_pids
52
+ (pids - new_pids).should == [died_pid]
53
+ (new_pids - pids).size.should == 1
54
+ end
55
+
56
+ it "all childs is die, should update list" do
57
+ start_ok_process(C.p3.merge(:monitor_children => {}, :childs_update_period => Eye::SystemResources::PsAxActor::UPDATE_INTERVAL + 1))
58
+ @process.watchers.keys.should == [:check_alive, :check_childs]
59
+
60
+ sleep 5 # ensure that childs finds
61
+
62
+ #p @process.childs
63
+ master_pid = @process.pid
64
+ pids = @process.childs.keys.sort
65
+
66
+ # one of the child is just die
67
+ Eye::System.execute("kill -HUP #{master_pid}")
68
+
69
+ # sleep enought for update list
70
+ sleep (Eye::SystemResources::PsAxActor::UPDATE_INTERVAL * 2 + 1).seconds
71
+
72
+ new_pids = @process.childs.keys.sort
73
+
74
+ master_pid.should == @process.pid
75
+ new_pids.size.should == 3
76
+ (pids - new_pids).should == pids
77
+ (new_pids - pids).should == new_pids
78
+ end
79
+
80
+ it "when process stop, childs cleans" do
81
+ start_ok_process(C.p3.merge(:monitor_children => {}, :childs_update_period => Eye::SystemResources::PsAxActor::UPDATE_INTERVAL + 1))
82
+ sleep 5 # ensure that childs finds
83
+
84
+ pid = @process.pid
85
+ @process.watchers.keys.should == [:check_alive, :check_childs]
86
+ @process.childs.size.should == 3
87
+
88
+ @process.stop
89
+ sleep 2
90
+ @process.watchers.keys.should == []
91
+ @process.childs.size.should == 0
92
+
93
+ Eye::System.pid_alive?(pid).should == false
94
+ end
95
+
96
+ end
97
+
98
+ describe "add_or_update_childs" do
99
+ before :each do
100
+ start_ok_process(C.p1.merge(:monitor_children => {}))
101
+ end
102
+
103
+ it "add new childs, update && remove" do
104
+ stub(Eye::SystemResources).childs(@process.pid){ [3,4,5] }
105
+ @process.add_or_update_childs
106
+ @process.childs.keys.sort.should == [3,4,5]
107
+
108
+ stub(Eye::SystemResources).childs(@process.pid){ [3,5,6] }
109
+ @process.add_or_update_childs
110
+ @process.childs.keys.sort.should == [3,5,6]
111
+
112
+ stub(Eye::SystemResources).childs(@process.pid){ [3,5] }
113
+ @process.add_or_update_childs
114
+ @process.childs.keys.sort.should == [3,5]
115
+
116
+ stub(Eye::SystemResources).childs(@process.pid){ [6,7] }
117
+ @process.add_or_update_childs
118
+ @process.childs.keys.sort.should == [6,7]
119
+
120
+ @process.remove_childs
121
+ @process.childs.should == {}
122
+ end
123
+ end
124
+
125
+ end
@@ -0,0 +1,75 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require File.dirname(__FILE__) + '/../spec_helper'
3
+
4
+ describe "Eye::Process::Config" do
5
+
6
+ it "should use throught [], c" do
7
+ @p = Eye::Process.new({:pid_file => '1.pid', :start_command => "a", :working_dir => "/tmp"})
8
+ @p[:pid_file].should == "1.pid"
9
+ @p[:pid_file_ex].should == "/tmp/1.pid"
10
+ @p[:checks].should == {}
11
+ end
12
+
13
+ it "c interface" do
14
+ @p = Eye::Process.new({:pid_file => '/tmp/1.pid', :start_command => "a"})
15
+ @p.c(:pid_file_ex).should == "/tmp/1.pid"
16
+ end
17
+
18
+ it "should expand stdout" do
19
+ @p = Eye::Process.new({:working_dir => "/tmp", :stdout => '1.log', :start_command => "a", :pid_file => '/tmp/1.pid'})
20
+ @p[:stdout].should == "/tmp/1.log"
21
+ end
22
+
23
+ it "check and triggers should {} if empty" do
24
+ @p = Eye::Process.new({:working_dir => "/tmp", :stdout => '1.log', :start_command => "a", :pid_file => '/tmp/1.pid', :triggers => {}})
25
+ @p[:checks].should == {}
26
+ @p[:triggers].should == {:flapping => {:type=>:flapping, :times=>10, :within=>10}}
27
+ end
28
+
29
+ it "if trigger setted, no rewrite" do
30
+ @p = Eye::Process.new({:working_dir => "/tmp", :stdout => '1.log', :start_command => "a", :pid_file => '/tmp/1.pid', :triggers => {:flapping => {:type=>:flapping, :times=>100, :within=>100}}})
31
+ @p[:triggers].should == {:flapping => {:type=>:flapping, :times=>100, :within=>100}}
32
+ end
33
+
34
+ describe "control_pid?" do
35
+ it "if daemonize than true" do
36
+ @p = Eye::Process.new({:pid_file => '/tmp/1.pid', :daemonize => true})
37
+ @p.control_pid?.should == true
38
+ end
39
+
40
+ it "if not daemonize than false" do
41
+ @p = Eye::Process.new({:pid_file => '/tmp/1.pid'})
42
+ @p.control_pid?.should == false
43
+ end
44
+
45
+ it "true if not daemonize, but manual" do
46
+ @p = Eye::Process.new({:pid_file => '/tmp/1.pid', :daemonize => false, :control_pid => true})
47
+ @p.control_pid?.should == true
48
+ end
49
+
50
+ end
51
+
52
+ describe ":childs_update_period" do
53
+ it "should set default" do
54
+ @p = Eye::Process.new({:pid_file => '/tmp/1.pid'})
55
+ @p[:childs_update_period].should == 30.seconds
56
+ end
57
+
58
+ it "should set from global options" do
59
+ @p = Eye::Process.new({:pid_file => '/tmp/1.pid', :childs_update_period => 11.seconds})
60
+ @p[:childs_update_period].should == 11.seconds
61
+ end
62
+
63
+ it "should set from monitor_children sub options" do
64
+ @p = Eye::Process.new({:pid_file => '/tmp/1.pid', :monitor_children => {:childs_update_period => 12.seconds}})
65
+ @p[:childs_update_period].should == 12.seconds
66
+ end
67
+
68
+ it "should set from monitor_children sub options" do
69
+ @p = Eye::Process.new({:pid_file => '/tmp/1.pid', :childs_update_period => 11.seconds, :monitor_children => {:childs_update_period => 12.seconds}})
70
+ @p[:childs_update_period].should == 12.seconds
71
+ end
72
+
73
+ end
74
+
75
+ end
@@ -0,0 +1,173 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Process Controller" do
4
+
5
+ describe "monitor" do
6
+ it "monitor should call start, as the auto_start is default" do
7
+ @process = process C.p1
8
+
9
+ proxy(@process).start
10
+ @process.monitor
11
+ sleep 1
12
+
13
+ @process.state_name.should == :up
14
+ end
15
+
16
+ it "without auto_start and process not running" do
17
+ @process = process C.p1.merge(:auto_start => false)
18
+ @process.monitor
19
+ sleep 1
20
+
21
+ @process.state_name.should == :unmonitored
22
+ end
23
+
24
+ it "without auto_start and process already running" do
25
+ @pid = Eye::System.daemonize(C.p1[:start_command], C.p1)[:pid]
26
+ Eye::System.pid_alive?(@pid).should == true
27
+ File.open(C.p1[:pid_file], 'w'){|f| f.write(@pid) }
28
+ sleep 2
29
+
30
+ @process = process C.p1.merge(:auto_start => false)
31
+ @process.monitor
32
+ sleep 1
33
+
34
+ @process.state_name.should == :up
35
+ @process.pid.should == @pid
36
+ end
37
+
38
+ end
39
+
40
+ describe "unmonitor" do
41
+ [C.p1, C.p2].each do |cfg|
42
+ it "should just forget about any process #{cfg[:name]}" do
43
+ start_ok_process
44
+ old_pid = @process.pid
45
+
46
+ @process.unmonitor
47
+
48
+ Eye::System.pid_alive?(old_pid).should == true
49
+
50
+ @process.pid.should == nil
51
+ @process.state_name.should == :unmonitored
52
+
53
+ @process.watchers.keys.should == []
54
+ @process.load_pid_from_file.should == old_pid
55
+
56
+ sleep 1
57
+
58
+ # event if something now kill the process
59
+ die_process!(old_pid)
60
+
61
+ # nothing try to up it
62
+ sleep 5
63
+
64
+ @process.state_name.should == :unmonitored
65
+ @process.load_pid_from_file.should == old_pid
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "delete" do
71
+ it "delete monitoring, not kill process" do
72
+ start_ok_process
73
+ old_pid = @process.pid
74
+
75
+ @process.delete
76
+ Eye::System.pid_alive?(old_pid).should == true
77
+ sleep 0.3
78
+ @process.alive?.should == false
79
+
80
+ @process = nil
81
+ end
82
+
83
+ it "if stop_on_delete process die" do
84
+ start_ok_process(C.p1.merge(:stop_on_delete => true))
85
+ old_pid = @process.pid
86
+
87
+ @process.delete
88
+ Eye::System.pid_alive?(old_pid).should == false
89
+ sleep 0.3
90
+ @process.alive?.should == false
91
+
92
+ @process = nil
93
+ end
94
+ end
95
+
96
+ describe "stop" do
97
+ it "stop kill process, and moving to unmonitored" do
98
+ start_ok_process
99
+
100
+ @process.stop
101
+
102
+ Eye::System.pid_alive?(@pid).should == false
103
+ @process.state_name.should == :unmonitored
104
+ @process.states_history.end?(:down, :unmonitored).should == true
105
+
106
+ # should clear pid
107
+ @process.pid.should == nil
108
+ end
109
+
110
+ it "if cant kill process, moving to unmonitored too" do
111
+ start_ok_process(C.p1.merge(:stop_command => "which ruby"))
112
+
113
+ @process.watchers.keys.should == [:check_alive]
114
+
115
+ @process.stop
116
+
117
+ Eye::System.pid_alive?(@pid).should == true
118
+ @process.state_name.should == :unmonitored
119
+ @process.states_history.end?(:stopping, :unmonitored, :unmonitored).should == true
120
+
121
+ # should clear pid
122
+ @process.pid.should == nil
123
+ @process.watchers.keys.should == []
124
+ end
125
+ end
126
+
127
+ describe "process cant start, crush each time" do
128
+ before :each do
129
+ @process = process(C.p2.merge(:start_command => C.p2[:start_command] + " -r" ))
130
+ @process.send_command :start
131
+ end
132
+
133
+ it "we send command to stop it" do
134
+ # process flapping here some times
135
+ sleep 10
136
+
137
+ # now send stop command
138
+ @process.send_command :stop
139
+ sleep 7
140
+
141
+ # process should be stopped here
142
+ @process.state_name.should == :unmonitored
143
+ end
144
+
145
+ it "we send command to unmonitor it" do
146
+ # process flapping here some times
147
+ sleep 10
148
+
149
+ # now send stop command
150
+ @process.send_command :unmonitor
151
+ sleep 7
152
+
153
+ # process should be stopped here
154
+ @process.state_name.should == :unmonitored
155
+ end
156
+ end
157
+
158
+ describe "signal" do
159
+ before :each do
160
+ @process = process(C.p1)
161
+ @process.pid = 122345
162
+ end
163
+
164
+ it "mock send_signal" do
165
+ mock(@process).send_signal(9)
166
+ @process.signal(9)
167
+
168
+ mock(@process).send_signal('9')
169
+ @process.signal('9')
170
+ end
171
+ end
172
+
173
+ end