eye 0.2.4 → 0.3

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -3
  3. data/bin/eye +7 -0
  4. data/bin/loader_eye +7 -5
  5. data/examples/notify.eye +1 -1
  6. data/eye.gemspec +4 -4
  7. data/lib/eye.rb +1 -3
  8. data/lib/eye/controller.rb +4 -0
  9. data/lib/eye/controller/status.rb +1 -1
  10. data/lib/eye/dsl.rb +1 -1
  11. data/lib/eye/dsl/main.rb +0 -13
  12. data/lib/eye/dsl/opts.rb +4 -2
  13. data/lib/eye/loader.rb +2 -3
  14. data/lib/eye/notify.rb +3 -3
  15. data/lib/eye/process/monitor.rb +5 -3
  16. data/lib/eye/process/notify.rb +5 -5
  17. data/lib/eye/process/scheduler.rb +4 -4
  18. data/lib/eye/process/system.rb +3 -10
  19. data/lib/eye/process/trigger.rb +1 -1
  20. data/lib/eye/process/watchers.rb +1 -1
  21. data/lib/eye/server.rb +9 -8
  22. data/lib/eye/system.rb +2 -7
  23. data/lib/eye/system_resources.rb +3 -3
  24. data/lib/eye/utils/celluloid_chain.rb +2 -2
  25. metadata +7 -241
  26. data/lib/eye/io/unix_server.rb +0 -44
  27. data/lib/eye/io/unix_socket.rb +0 -39
  28. data/spec/checker/cpu_spec.rb +0 -58
  29. data/spec/checker/file_ctime_spec.rb +0 -34
  30. data/spec/checker/file_size_spec.rb +0 -107
  31. data/spec/checker/http_spec.rb +0 -114
  32. data/spec/checker/memory_spec.rb +0 -64
  33. data/spec/checker/socket_spec.rb +0 -116
  34. data/spec/checker_spec.rb +0 -187
  35. data/spec/child_process/child_process_spec.rb +0 -46
  36. data/spec/client_server_spec.rb +0 -33
  37. data/spec/controller/commands_spec.rb +0 -92
  38. data/spec/controller/controller_spec.rb +0 -157
  39. data/spec/controller/find_objects_spec.rb +0 -176
  40. data/spec/controller/group_spec.rb +0 -110
  41. data/spec/controller/intergration_spec.rb +0 -366
  42. data/spec/controller/load_spec.rb +0 -371
  43. data/spec/controller/races_spec.rb +0 -70
  44. data/spec/controller/stop_on_delete_spec.rb +0 -157
  45. data/spec/dsl/chain_spec.rb +0 -146
  46. data/spec/dsl/checks_spec.rb +0 -219
  47. data/spec/dsl/config_spec.rb +0 -44
  48. data/spec/dsl/dsl_spec.rb +0 -73
  49. data/spec/dsl/getter_spec.rb +0 -223
  50. data/spec/dsl/integration_spec.rb +0 -376
  51. data/spec/dsl/load_spec.rb +0 -52
  52. data/spec/dsl/notify_spec.rb +0 -114
  53. data/spec/dsl/process_spec.rb +0 -380
  54. data/spec/dsl/sub_procs_spec.rb +0 -93
  55. data/spec/dsl/with_server_spec.rb +0 -128
  56. data/spec/example/em.rb +0 -57
  57. data/spec/example/forking.rb +0 -20
  58. data/spec/example/sample.rb +0 -154
  59. data/spec/fixtures/dsl/0.rb +0 -8
  60. data/spec/fixtures/dsl/0a.rb +0 -8
  61. data/spec/fixtures/dsl/0c.rb +0 -8
  62. data/spec/fixtures/dsl/1.rb +0 -5
  63. data/spec/fixtures/dsl/bad.eye +0 -6
  64. data/spec/fixtures/dsl/configs/1.eye +0 -3
  65. data/spec/fixtures/dsl/configs/2.eye +0 -1
  66. data/spec/fixtures/dsl/configs/3.eye +0 -1
  67. data/spec/fixtures/dsl/configs/4.eye +0 -3
  68. data/spec/fixtures/dsl/empty.eye +0 -20
  69. data/spec/fixtures/dsl/include_test.eye +0 -5
  70. data/spec/fixtures/dsl/include_test/1.rb +0 -6
  71. data/spec/fixtures/dsl/include_test/ha.rb +0 -4
  72. data/spec/fixtures/dsl/include_test2.eye +0 -5
  73. data/spec/fixtures/dsl/integration.eye +0 -30
  74. data/spec/fixtures/dsl/integration2.eye +0 -32
  75. data/spec/fixtures/dsl/integration_locks.eye +0 -30
  76. data/spec/fixtures/dsl/integration_sor.eye +0 -32
  77. data/spec/fixtures/dsl/integration_sor2.eye +0 -27
  78. data/spec/fixtures/dsl/integration_sor3.eye +0 -32
  79. data/spec/fixtures/dsl/load.eye +0 -25
  80. data/spec/fixtures/dsl/load2.eye +0 -7
  81. data/spec/fixtures/dsl/load2_dup2.eye +0 -13
  82. data/spec/fixtures/dsl/load2_dup_pid.eye +0 -7
  83. data/spec/fixtures/dsl/load3.eye +0 -10
  84. data/spec/fixtures/dsl/load4.eye +0 -7
  85. data/spec/fixtures/dsl/load5.eye +0 -8
  86. data/spec/fixtures/dsl/load6.eye +0 -17
  87. data/spec/fixtures/dsl/load_dubls.eye +0 -36
  88. data/spec/fixtures/dsl/load_dup_ex_names.eye +0 -15
  89. data/spec/fixtures/dsl/load_error.eye +0 -5
  90. data/spec/fixtures/dsl/load_error_folder/load3.eye +0 -10
  91. data/spec/fixtures/dsl/load_error_folder/load4.eye +0 -7
  92. data/spec/fixtures/dsl/load_folder/load3.eye +0 -10
  93. data/spec/fixtures/dsl/load_folder/load4.eye +0 -7
  94. data/spec/fixtures/dsl/load_int.eye +0 -8
  95. data/spec/fixtures/dsl/load_int2.eye +0 -13
  96. data/spec/fixtures/dsl/load_logger.eye +0 -26
  97. data/spec/fixtures/dsl/load_logger2.eye +0 -3
  98. data/spec/fixtures/dsl/long_load.eye +0 -5
  99. data/spec/fixtures/dsl/subfolder1/proc1.rb +0 -3
  100. data/spec/fixtures/dsl/subfolder2.eye +0 -9
  101. data/spec/fixtures/dsl/subfolder2/common.rb +0 -1
  102. data/spec/fixtures/dsl/subfolder2/proc2.rb +0 -3
  103. data/spec/fixtures/dsl/subfolder2/sub/proc3.rb +0 -6
  104. data/spec/fixtures/dsl/subfolder3.eye +0 -8
  105. data/spec/fixtures/dsl/subfolder3/common.rb +0 -1
  106. data/spec/fixtures/dsl/subfolder3/proc4.rb +0 -3
  107. data/spec/fixtures/dsl/subfolder3/sub/proc5.rb +0 -6
  108. data/spec/fixtures/dsl/subfolder4.eye +0 -6
  109. data/spec/fixtures/dsl/subfolder4/a.rb +0 -2
  110. data/spec/fixtures/dsl/subfolder4/b.rb +0 -1
  111. data/spec/fixtures/dsl/subfolder4/c.rb +0 -1
  112. data/spec/mock_spec.rb +0 -31
  113. data/spec/notify/jabber_spec.rb +0 -25
  114. data/spec/notify/mail_spec.rb +0 -26
  115. data/spec/notify_spec.rb +0 -90
  116. data/spec/process/checks/child_checks_spec.rb +0 -79
  117. data/spec/process/checks/cpu_spec.rb +0 -114
  118. data/spec/process/checks/ctime_spec.rb +0 -43
  119. data/spec/process/checks/fsize_spec.rb +0 -22
  120. data/spec/process/checks/http_spec.rb +0 -52
  121. data/spec/process/checks/intergration_spec.rb +0 -32
  122. data/spec/process/checks/memory_spec.rb +0 -127
  123. data/spec/process/child_process_spec.rb +0 -125
  124. data/spec/process/config_spec.rb +0 -74
  125. data/spec/process/controller_spec.rb +0 -173
  126. data/spec/process/monitoring_spec.rb +0 -180
  127. data/spec/process/notify_spec.rb +0 -27
  128. data/spec/process/restart_spec.rb +0 -186
  129. data/spec/process/scheduler_spec.rb +0 -178
  130. data/spec/process/start_spec.rb +0 -261
  131. data/spec/process/states_history_spec.rb +0 -123
  132. data/spec/process/stop_spec.rb +0 -156
  133. data/spec/process/system_spec.rb +0 -136
  134. data/spec/process/triggers/flapping_spec.rb +0 -242
  135. data/spec/process/update_config_spec.rb +0 -62
  136. data/spec/spec_helper.rb +0 -128
  137. data/spec/support/rr_celluloid.rb +0 -15
  138. data/spec/support/spec_support.rb +0 -163
  139. data/spec/system_resources_spec.rb +0 -56
  140. data/spec/system_spec.rb +0 -174
  141. data/spec/utils/alive_array_spec.rb +0 -49
  142. data/spec/utils/celluloid_chain_spec.rb +0 -89
  143. data/spec/utils/tail_spec.rb +0 -20
@@ -1,157 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- class String
4
- def clean_info
5
- self.gsub(%r{\033.*?m}im, '').gsub(%r[\(.*?\)], '')
6
- end
7
- end
8
-
9
- def app_check(app, name, gr_size)
10
- app.name.should == name
11
- app.class.should == Eye::Application
12
- app.groups.size.should == gr_size
13
- app.groups.class.should == Eye::Utils::AliveArray
14
- end
15
-
16
- def gr_check(gr, name, p_size, hidden = false)
17
- gr.class.should == Eye::Group
18
- gr.processes.class.should == Eye::Utils::AliveArray
19
- gr.processes.size.should == p_size
20
- gr.name.should == name
21
- gr.hidden.should == hidden
22
- end
23
-
24
- def p_check(p, name, pid_file)
25
- p.name.should == name
26
- p.class.should == Eye::Process
27
- p[:pid_file].should == "#{pid_file}"
28
- p[:pid_file_ex].should == "/tmp/#{pid_file}"
29
- end
30
-
31
- describe "Eye::Controller" do
32
- subject{ Eye::Controller.new }
33
-
34
- it "should ok load config" do
35
- subject.load(fixture("dsl/load.eye")).should include(error: false)
36
-
37
- apps = subject.applications
38
-
39
- app1 = apps.first
40
- app_check(app1, 'app1', 3)
41
- app1.processes.map(&:name).sort.should == ["g4", "g5", "p1", "p2", "q3"]
42
-
43
- app2 = apps.last
44
- app_check(app2, 'app2', 1)
45
-
46
- gr1 = app1.groups[0]
47
- gr_check(gr1, 'gr1', 2, false)
48
- gr2 = app1.groups[1]
49
- gr_check(gr2, 'gr2', 1, false)
50
- gr3 = app1.groups[2]
51
- gr_check(gr3, '__default__', 2, true)
52
- gr4 = app2.groups[0]
53
- gr_check(gr4, '__default__', 1, true)
54
-
55
- p1 = gr1.processes[0]
56
- p_check(p1, 'p1', "app1-gr1-p1.pid")
57
- p2 = gr1.processes[1]
58
- p_check(p2, 'p2', "app1-gr1-p2.pid")
59
-
60
- p3 = gr2.processes[0]
61
- p_check(p3, 'q3', "app1-gr2-q3.pid")
62
-
63
- p4 = gr3.processes[0]
64
- p_check(p4, 'g4', "app1-g4.pid")
65
- p5 = gr3.processes[1]
66
- p_check(p5, 'g5', "app1-g5.pid")
67
-
68
- p6 = gr4.processes[0]
69
- p_check(p6, 'z1', "app2-z1.pid")
70
- end
71
-
72
- it "raise when load config" do
73
- subject.load(fixture("dsl/bad.eye")).should include(:error => true, :message => "blank pid_file for: bad")
74
- end
75
-
76
- it "info_string" do
77
- app1 = <<S
78
- app1
79
- gr1 [monitor 1 of 2]
80
- p1 ............................ unmonitored
81
- p2 ............................ unmonitored
82
- gr2
83
- q3 ............................ unmonitored
84
- g4 .............................. unmonitored
85
- g5 .............................. unmonitored
86
- S
87
- app2 = <<S
88
- app2
89
- z1 .............................. unmonitored
90
- S
91
-
92
- subject.load(fixture("dsl/load.eye"))
93
- subject.info_string.clean_info.strip.should == (app1 + app2).strip
94
- subject.info_string('app1').clean_info.should == app1.chomp
95
- subject.info_string('app2').clean_info.strip.should == app2.strip
96
- subject.info_string('app3').clean_info.should == ''
97
- end
98
-
99
- it "info_string_debug should be" do
100
- subject.load(fixture("dsl/load.eye"))
101
- subject.info_string_debug.split("\n").size.should > 5
102
- end
103
-
104
- it "info_string_short should be" do
105
- subject.load(fixture("dsl/load.eye"))
106
- subject.info_string_short.split("\n").size.should == 2
107
- end
108
-
109
- it "history_string" do
110
- subject.load(fixture("dsl/load.eye"))
111
- str = subject.history_string('*')
112
- str.should be_a(String)
113
- str.size.should > 100
114
- end
115
-
116
- it "history_data" do
117
- subject.load(fixture("dsl/load.eye"))
118
- h = subject.history_data('app1')
119
- h.size.should == 5
120
- h.keys.sort.should == ["app1:g4", "app1:g5", "app1:gr1:p1", "app1:gr1:p2", "app1:gr2:q3"]
121
- end
122
-
123
- it "should delete all apps" do
124
- subject.load(fixture("dsl/load.eye")).should include(error: false)
125
- subject.send_command(:delete, 'all')
126
- subject.applications.should be_empty
127
- end
128
-
129
- describe "command" do
130
- it "should send_command" do
131
- mock(Eye::Control).send_command(:restart, 'samples')
132
- Eye::Control.command('restart', 'samples')
133
- end
134
-
135
- it "should send_command" do
136
- mock(Eye::Control).send_command(:restart)
137
- Eye::Control.command(:restart)
138
- end
139
-
140
- it "load" do
141
- mock(Eye::Control).load('/tmp/file')
142
- Eye::Control.command('load', '/tmp/file')
143
- end
144
-
145
- it "info" do
146
- mock(Eye::Control).info_string
147
- Eye::Control.command('info')
148
- end
149
-
150
- it "quit" do
151
- mock(Eye::Control).quit
152
- Eye::Control.command('quit')
153
- end
154
-
155
- end
156
-
157
- end
@@ -1,176 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe "find_objects" do
4
- subject{ c = Eye::Controller.new; c.load(fixture("dsl/load.eye")); c }
5
-
6
- it "1 process" do
7
- objs = subject.find_objects("p1")
8
- objs.map{|c| c.class}.should == [Eye::Process]
9
- objs.map{|c| c.name}.sort.should == %w{p1}
10
- end
11
-
12
- it "1 group" do
13
- objs = subject.find_objects("gr2")
14
- objs.map{|c| c.class}.should == [Eye::Group]
15
- objs.map{|c| c.name}.sort.should == %w{gr2}
16
- end
17
-
18
- it "1 app" do
19
- objs = subject.find_objects("app2")
20
- objs.map{|c| c.class}.should == [Eye::Application]
21
- objs.map{|c| c.name}.sort.should == %w{app2}
22
- end
23
-
24
- it "find * processes by mask" do
25
- objs = subject.find_objects("p*")
26
- objs.map{|c| c.class}.should == [Eye::Process, Eye::Process]
27
- objs.map{|c| c.name}.sort.should == %w{p1 p2}
28
- end
29
-
30
- it "find * groups by mask" do
31
- objs = subject.find_objects("gr*")
32
- objs.map{|c| c.class}.should == [Eye::Group, Eye::Group]
33
- objs.map{|c| c.name}.sort.should == %w{gr1 gr2}
34
- end
35
-
36
- it "find * apps by mask" do
37
- objs = subject.find_objects("app*")
38
- objs.map{|c| c.class}.should == [Eye::Application, Eye::Application]
39
- objs.map{|c| c.name}.sort.should == %w{app1 app2}
40
- end
41
-
42
- it "find by ','" do
43
- objs = subject.find_objects("p1,p2")
44
- objs.map{|c| c.class}.should == [Eye::Process, Eye::Process]
45
- objs.map{|c| c.name}.sort.should == %w{p1 p2}
46
- end
47
-
48
- it "find by many params" do
49
- objs = subject.find_objects("p1", "p2")
50
- objs.map{|c| c.class}.should == [Eye::Process, Eye::Process]
51
- objs.map{|c| c.name}.sort.should == %w{p1 p2}
52
- end
53
-
54
- it "find * apps by mask" do
55
- objs = subject.find_objects("z*\n")
56
- objs.map{|c| c.class}.should == [Eye::Process]
57
- objs.map{|c| c.name}.sort.should == %w{z1}
58
- end
59
-
60
- it "empty, find nothing" do
61
- subject.find_objects("").should == []
62
- end
63
-
64
- it "'all', find all projects" do
65
- objs = subject.find_objects("all")
66
- objs.map{|c| c.class}.should == [Eye::Application, Eye::Application]
67
- objs.map{|c| c.name}.sort.should == %w{app1 app2}
68
- end
69
-
70
- it "'*', find all projects" do
71
- objs = subject.find_objects("*")
72
- objs.map{|c| c.class}.should == [Eye::Application, Eye::Application]
73
- objs.map{|c| c.name}.sort.should == %w{app1 app2}
74
- end
75
-
76
- it "nothing" do
77
- subject.find_objects("asdfasdf").should == []
78
- end
79
-
80
- describe "submatching without * " do
81
- it "match by start symbols, apps" do
82
- objs = subject.find_objects("app")
83
- objs.map{|c| c.class}.should == [Eye::Application, Eye::Application]
84
- objs.map{|c| c.name}.sort.should == %w{app1 app2}
85
- end
86
-
87
- it "match by start symbols, groups" do
88
- objs = subject.find_objects("gr")
89
- objs.map{|c| c.class}.should == [Eye::Group, Eye::Group]
90
- objs.map{|c| c.name}.sort.should == %w{gr1 gr2}
91
- end
92
-
93
- it "match by start symbols, process" do
94
- objs = subject.find_objects("z")
95
- objs.map{|c| c.class}.should == [Eye::Process]
96
- objs.map{|c| c.name}.sort.should == %w{z1}
97
- end
98
- end
99
-
100
- describe "find by routes" do
101
- it "group" do
102
- objs = subject.find_objects("app1:gr2")
103
- obj = objs.first
104
- obj.class.should == Eye::Group
105
- obj.full_name.should == 'app1:gr2'
106
- end
107
-
108
- it "group + mask" do
109
- objs = subject.find_objects("app1:gr*")
110
- objs.map{|c| c.class}.should == [Eye::Group, Eye::Group]
111
- objs.map{|c| c.name}.sort.should == %w{gr1 gr2}
112
- end
113
-
114
- it "process" do
115
- objs = subject.find_objects("app1:gr2:q3")
116
- obj = objs.first
117
- obj.class.should == Eye::Process
118
- obj.full_name.should == 'app1:gr2:q3'
119
- end
120
-
121
- describe "dubls" do
122
- subject{ c = Eye::Controller.new; c.load(fixture("dsl/load_dubls.eye")); c }
123
-
124
- it "not found" do
125
- subject.find_objects("zu").should == []
126
- end
127
-
128
- it "found 2 processed" do
129
- objs = subject.find_objects("z*")
130
- objs.map{|c| c.class}.should == [Eye::Process, Eye::Process]
131
- objs.map{|c| c.name}.sort.should == %w{z1 z2}
132
- end
133
-
134
- it "find by gr1" do
135
- objs = subject.find_objects("gr1")
136
- objs.map{|c| c.class}.should == [Eye::Group, Eye::Group]
137
- objs.map{|c| c.full_name}.sort.should == %w{app1:gr1 app2:gr1}
138
- end
139
-
140
- it "correct by gr*" do
141
- objs = subject.find_objects("gr*")
142
- objs.map{|c| c.class}.should == [Eye::Group, Eye::Group, Eye::Group, Eye::Process]
143
- objs.map{|c| c.full_name}.should == %w{app1:gr1 app1:gr2 app2:gr1 app1:gr2and}
144
- end
145
-
146
- it "correct by gr1*" do
147
- objs = subject.find_objects("gr1*")
148
- objs.map{|c| c.class}.should == [Eye::Group, Eye::Group]
149
- objs.map{|c| c.full_name}.sort.should == %w{app1:gr1 app2:gr1}
150
- end
151
-
152
- it "correct process" do
153
- objs = subject.find_objects("gr1and")
154
- objs.map{|c| c.class}.should == [Eye::Process]
155
- objs.map{|c| c.full_name}.sort.should == %w{app2:gr1:gr1and}
156
- end
157
- end
158
- end
159
-
160
- describe "missing" do
161
- it "should not found" do
162
- subject.find_objects("app1:gr4").should == []
163
- subject.find_objects("gr:p").should == []
164
- subject.find_objects("pp1").should == []
165
- subject.find_objects("app1::").should == []
166
- subject.find_objects("app1:=").should == []
167
- end
168
- end
169
-
170
- describe "match" do
171
- it "should match" do
172
- subject.match("gr*").should == ["app1:gr1", "app1:gr2"]
173
- end
174
- end
175
-
176
- end
@@ -1,110 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe "Eye::Group" do
4
-
5
- describe "Chain calls" do
6
-
7
- it "should call chain_schedule for start" do
8
- @g = Eye::Group.new('gr', {:chain => {:start => {:type => :async, :command => :start, :grace => 7}}})
9
- mock(@g).chain_schedule(:async, 7, :start)
10
- @g.start
11
- end
12
-
13
- it "should call chain_schedule for start, with type sync" do
14
- @g = Eye::Group.new('gr', {:chain => {:start => {:type => :sync, :command => :start, :grace => 7}}})
15
- mock(@g).chain_schedule(:sync, 7, :start)
16
- @g.start
17
- end
18
-
19
- it "config for start and restart, use both" do
20
- @g = Eye::Group.new('gr', {:chain => {:start => {:type => :async, :command => :start, :grace => 7}, :restart => {:type => :sync, :command => :restart, :grace => 8}}})
21
- mock(@g).chain_schedule(:async, 7, :start)
22
- @g.start
23
-
24
- mock(@g).chain_schedule(:sync, 8, :restart)
25
- @g.restart
26
- end
27
-
28
- it "should use options type" do
29
- @g = Eye::Group.new('gr', {:chain => {:start => {:type => :sync, :command => :start}}})
30
- mock(@g).chain_schedule(:sync, Eye::Group::DEFAULT_CHAIN, :start)
31
- @g.start
32
- end
33
-
34
- it "with empty grace, should call default grace 0" do
35
- @g = Eye::Group.new('gr', {:chain => {:start => {:command => :start}}})
36
- mock(@g).chain_schedule(:async, Eye::Group::DEFAULT_CHAIN, :start)
37
- @g.start
38
- end
39
-
40
- it "chain options for restart, but called start, should call chain but with default options" do
41
- @g = Eye::Group.new('gr', {:chain => {:start => {:command => :restart}}})
42
- mock(@g).chain_schedule(:async, Eye::Group::DEFAULT_CHAIN, :restart)
43
- @g.restart
44
- end
45
-
46
- it "restart without grace, should call default grace 0" do
47
- @g = Eye::Group.new('gr', {:chain => {:restart => {:command => :restart}}})
48
- mock(@g).chain_schedule(:async, Eye::Group::DEFAULT_CHAIN, :restart)
49
- @g.restart
50
- end
51
-
52
- it "restart with invalid type, should call with async" do
53
- @g = Eye::Group.new('gr', {:chain => {:restart => {:command => :restart, :type => [12324]}}})
54
- mock(@g).chain_schedule(:async, Eye::Group::DEFAULT_CHAIN, :restart)
55
- @g.restart
56
- end
57
-
58
- it "restart with invalid grace, should call default grace 0" do
59
- @g = Eye::Group.new('gr', {:chain => {:restart => {:command => :restart, :grace => []}}})
60
- mock(@g).chain_schedule(:async, Eye::Group::DEFAULT_CHAIN, :restart)
61
- @g.restart
62
- end
63
-
64
- it "restart with invalid grace, should call default grace 0" do
65
- @g = Eye::Group.new('gr', {:chain => {:restart => {:command => :restart, :grace => :some_error}}})
66
- mock(@g).chain_schedule(:async, Eye::Group::DEFAULT_CHAIN, :restart)
67
- @g.restart
68
- end
69
-
70
- it "restart with empty config, should call chain_schedule" do
71
- @g = Eye::Group.new('gr', {})
72
- mock(@g).chain_schedule(:async, Eye::Group::DEFAULT_CHAIN, :restart)
73
- @g.restart
74
- end
75
-
76
- it "when chain clearing by force" do
77
- @g = Eye::Group.new('gr', {:chain => {:start => {:command => :start, :grace => 0}, :restart => {:command => :restart, :grace => 0}}})
78
- mock(@g).chain_schedule(:async, 0, :monitor)
79
- @g.monitor
80
-
81
- mock(@g).chain_schedule(:async, 0, :restart)
82
- @g.restart
83
-
84
- mock(@g).chain_schedule(:async, 0, :start)
85
- @g.start
86
- end
87
-
88
- it "with params" do
89
- @g = Eye::Group.new('gr', {})
90
- mock(@g).async_schedule(:signal, 15)
91
- @g.signal(15)
92
- end
93
-
94
- describe "monitor using chain as start" do
95
- it "monitor call chain" do
96
- @g = Eye::Group.new('gr', {:chain => {:start => {:command => :start, :grace => 3}}})
97
- mock(@g).chain_schedule(:async, 3, :monitor)
98
- @g.monitor
99
- end
100
-
101
- it "monitor not call chain" do
102
- @g = Eye::Group.new('gr', {:chain => {:restart => {:command => :restart, :grace => 3}}})
103
- mock(@g).chain_schedule(:async, Eye::Group::DEFAULT_CHAIN, :monitor)
104
- @g.monitor
105
- end
106
- end
107
-
108
- end
109
-
110
- end
@@ -1,366 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe "Intergration" do
4
- before :each do
5
- @c = Eye::Controller.new
6
- @c.load(fixture("dsl/integration.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
- @c.info_string.split("\n").size.should == 8
19
- @c.info_string.strip.size.should > 100
20
- end
21
-
22
- after :each do
23
- @processes.each do |p|
24
- p.schedule(:stop) if p.alive?
25
- end
26
- sleep 5
27
- @processes.each do |process|
28
- force_kill_process(process) if process.alive?
29
- end
30
-
31
- force_kill_pid(@old_pid1)
32
- force_kill_pid(@old_pid2)
33
- force_kill_pid(@old_pid3)
34
- (@childs || []).each do |pid|
35
- force_kill_pid(pid)
36
- end
37
- end
38
-
39
- it "restart process group samples" do
40
- @old_pid1 = @p1.pid
41
- @old_pid2 = @p2.pid
42
- @old_pid3 = @p3.pid
43
- @c.send_command(:restart, "samples")
44
- sleep 11 # while they restarting
45
-
46
- @processes.map{|c| c.state_name}.uniq.should == [:up]
47
- @p1.pid.should_not == @old_pid1
48
- @p2.pid.should_not == @old_pid2
49
- @p3.pid.should == @old_pid3
50
- end
51
-
52
- it "restart process" do
53
- @old_pid1 = @p1.pid
54
- @old_pid2 = @p2.pid
55
- @old_pid3 = @p3.pid
56
- @c.send_command(:restart, "sample1")
57
- sleep 10 # while they restarting
58
-
59
- @processes.map{|c| c.state_name}.uniq.should == [:up]
60
- @p1.pid.should_not == @old_pid1
61
- @p2.pid.should == @old_pid2
62
- @p3.pid.should == @old_pid3
63
- end
64
-
65
- it "restart process forking" do
66
- @old_pid1 = @p1.pid
67
- @old_pid2 = @p2.pid
68
- @old_pid3 = @p3.pid
69
- @c.send_command(:restart, "forking")
70
- sleep 11 # while they restarting
71
-
72
- @processes.map{|c| c.state_name}.uniq.should == [:up]
73
- @p1.pid.should == @old_pid1
74
- @p2.pid.should == @old_pid2
75
- @p3.pid.should_not == @old_pid3
76
-
77
- @p1.last_scheduled_reason.should == 'monitor by user'
78
- @p3.last_scheduled_reason.should == 'restart by user'
79
- end
80
-
81
- it "restart forking named child" do
82
- @p3.childs.size.should == 3
83
- dead_pid = @p3.childs.keys.sample
84
-
85
- @c.send_command(:restart, "child-#{dead_pid}").should == ["int:forking:child-#{dead_pid}"]
86
- sleep 11 # while it
87
-
88
- new_childs = @p3.childs.keys
89
- new_childs.size.should == 3
90
- new_childs.should_not include(dead_pid)
91
- (@childs - [dead_pid]).each do |pid|
92
- new_childs.should include(pid)
93
- end
94
- end
95
-
96
- it "restart missing" do
97
- @old_pid1 = @p1.pid
98
- @old_pid2 = @p2.pid
99
- @old_pid3 = @p3.pid
100
- @c.send_command(:restart, "blabla").should == []
101
- sleep 1
102
- @processes.map{|c| c.state_name}.uniq.should == [:up]
103
- @p1.pid.should == @old_pid1
104
- @p2.pid.should == @old_pid2
105
- @p3.pid.should == @old_pid3
106
- end
107
-
108
- describe "chain" do
109
- it "restart group with chain sync" do
110
- @samples.config.merge!(:chain => C.restart_sync)
111
-
112
- @old_pid1 = @p1.pid
113
- @old_pid2 = @p2.pid
114
- @old_pid3 = @p3.pid
115
- @c.send_command(:restart, "samples")
116
- sleep 15 # while they restarting
117
-
118
- @processes.map{|c| c.state_name}.uniq.should == [:up]
119
- @p1.pid.should_not == @old_pid1
120
- @p2.pid.should_not == @old_pid2
121
- @p3.pid.should == @old_pid3
122
-
123
- r1 = @p1.states_history.detect{|c| c[:state] == :restarting}[:at]
124
- r2 = @p2.states_history.detect{|c| c[:state] == :restarting}[:at]
125
-
126
- # >8 because, grace start, and grace stop added
127
- (r2 - r1).should >= 8
128
- end
129
-
130
- it "restart group with chain async" do
131
- @samples.config.merge!(:chain => C.restart_async)
132
-
133
- @old_pid1 = @p1.pid
134
- @old_pid2 = @p2.pid
135
- @old_pid3 = @p3.pid
136
- @c.send_command(:restart, "samples")
137
- sleep 15 # while they restarting
138
-
139
- @processes.map{|c| c.state_name}.uniq.should == [:up]
140
- @p1.pid.should_not == @old_pid1
141
- @p2.pid.should_not == @old_pid2
142
- @p3.pid.should == @old_pid3
143
-
144
- r1 = @p1.states_history.detect{|c| c[:state] == :restarting}[:at]
145
- r2 = @p2.states_history.detect{|c| c[:state] == :restarting}[:at]
146
-
147
- # restart sended, in 5 seconds to each
148
- (r2 - r1).should be_within(0.2).of(5)
149
- end
150
-
151
- it "if processes dead in chain restart, nothing raised" do
152
- @samples.config.merge!(:chain => C.restart_async)
153
-
154
- @old_pid1 = @p1.pid
155
- @old_pid2 = @p2.pid
156
- @old_pid3 = @p3.pid
157
- @c.send_command(:restart, "samples")
158
- sleep 3
159
-
160
- # in the middle of the process, we kill all processes
161
- @p1.terminate
162
- @p2.terminate
163
-
164
- sleep 3
165
-
166
- # nothing happens
167
- @samples.alive?.should == true
168
- end
169
-
170
- it "chain breaker breaks current chain and all pending requests" do
171
- @samples.config.merge!(:chain => C.restart_async)
172
-
173
- @c.send_command(:restart, "samples")
174
- @c.send_command(:stop, "samples")
175
- sleep 0.5
176
-
177
- @samples.current_scheduled_command.should == :restart
178
- @samples.scheduler_actions_list.should == [:stop]
179
-
180
- @c.send_command(:break_chain, "samples")
181
- sleep 3
182
- @samples.current_scheduled_command.should == :restart
183
- sleep 2
184
- @samples.current_scheduled_command.should == nil
185
- @samples.scheduler_actions_list.should == []
186
-
187
- sleep 1
188
-
189
- # only first process should be restarted
190
- @p1.last_scheduled_command.should == :restart
191
- @p2.last_scheduled_command.should == :monitor
192
- end
193
- end
194
-
195
- it "stop group" do
196
- @old_pid1 = @p1.pid
197
- @old_pid2 = @p2.pid
198
- @old_pid3 = @p3.pid
199
- @c.send_command(:stop, "samples")
200
- sleep 7 # while they stopping
201
-
202
- @p1.state_name.should == :unmonitored
203
- @p2.state_name.should == :unmonitored
204
- @p3.state_name.should == :up
205
-
206
- Eye::System.pid_alive?(@old_pid1).should == false
207
- Eye::System.pid_alive?(@old_pid2).should == false
208
- Eye::System.pid_alive?(@old_pid3).should == true
209
-
210
- sth = @p1.states_history.last
211
- sth[:reason].should == 'stop by user'
212
- sth[:state].should == :unmonitored
213
- end
214
-
215
- it "stop process" do
216
- @old_pid1 = @p1.pid
217
- @old_pid2 = @p2.pid
218
- @old_pid3 = @p3.pid
219
-
220
- @c.send_command(:stop, "sample1")
221
- sleep 7 # while they stopping
222
-
223
- @p1.state_name.should == :unmonitored
224
- @p2.state_name.should == :up
225
- @p3.state_name.should == :up
226
-
227
- Eye::System.pid_alive?(@old_pid1).should == false
228
- Eye::System.pid_alive?(@old_pid2).should == true
229
- Eye::System.pid_alive?(@old_pid3).should == true
230
- end
231
-
232
- it "unmonitor process" do
233
- @old_pid1 = @p1.pid
234
- @old_pid2 = @p2.pid
235
- @old_pid3 = @p3.pid
236
-
237
- @c.send_command(:unmonitor, "sample1").should == ["int:samples:sample1"]
238
- sleep 7 # while they stopping
239
-
240
- @p1.state_name.should == :unmonitored
241
- @p2.state_name.should == :up
242
- @p3.state_name.should == :up
243
-
244
- Eye::System.pid_alive?(@old_pid1).should == true
245
- Eye::System.pid_alive?(@old_pid2).should == true
246
- Eye::System.pid_alive?(@old_pid3).should == true
247
- end
248
-
249
- it "send signal to process throught all schedules" do
250
- mock(@p1).signal('usr2')
251
- mock(@p2).signal('usr2')
252
- mock(@p3).signal('usr2')
253
-
254
- @c.signal('usr2', "int").should == ["int"]
255
- sleep 3 # while they gettings
256
-
257
- @p1.last_scheduled_command.should == :signal
258
- @p1.last_scheduled_reason.should == 'signal by user'
259
-
260
- mock(@p1).signal('usr1')
261
- @c.signal('usr1', 'sample1')
262
- sleep 0.5
263
- end
264
-
265
- describe "delete" do
266
- it "delete group not monitoring anymore" do
267
- @old_pid1 = @p1.pid
268
- @old_pid2 = @p2.pid
269
- @old_pid3 = @p3.pid
270
-
271
- @c.send_command(:delete, "samples").should == ["int:samples"]
272
- sleep 7 # while
273
-
274
- @c.all_processes.should == [@p3]
275
- @c.all_groups.map(&:name).should == ['__default__']
276
-
277
- Eye::System.pid_alive?(@old_pid1).should == true
278
- Eye::System.pid_alive?(@old_pid2).should == true
279
- Eye::System.pid_alive?(@old_pid3).should == true
280
-
281
- Eye::System.send_signal(@old_pid1)
282
- sleep 0.5
283
- Eye::System.pid_alive?(@old_pid1).should == false
284
-
285
- # noone up this
286
- sleep 2
287
- Eye::System.pid_alive?(@old_pid1).should == false
288
- end
289
-
290
- it "delete process not monitoring anymore" do
291
- @old_pid1 = @p1.pid
292
- @old_pid2 = @p2.pid
293
- @old_pid3 = @p3.pid
294
-
295
- @c.send_command(:delete, "sample1")
296
- sleep 7 # while
297
-
298
- @c.all_processes.map(&:name).sort.should == %w{forking sample2}
299
- @c.all_groups.map(&:name).sort.should == %w{__default__ samples}
300
- @c.group_by_name('samples').processes.full_size.should == 1
301
- @c.group_by_name('samples').processes.map(&:name).should == %w{sample2}
302
-
303
- Eye::System.pid_alive?(@old_pid1).should == true
304
- Eye::System.pid_alive?(@old_pid2).should == true
305
- Eye::System.pid_alive?(@old_pid3).should == true
306
-
307
- Eye::System.send_signal(@old_pid1)
308
- sleep 0.5
309
- Eye::System.pid_alive?(@old_pid1).should == false
310
- end
311
-
312
- it "delete application" do
313
- @old_pid1 = @p1.pid
314
- @old_pid2 = @p2.pid
315
- @old_pid3 = @p3.pid
316
-
317
- @c.send_command(:delete, "int")
318
- sleep 7 # while
319
-
320
- @c.all_processes.should == []
321
- @c.all_groups.should == []
322
- @c.applications.should == []
323
-
324
- Eye::System.pid_alive?(@old_pid1).should == true
325
- Eye::System.pid_alive?(@old_pid2).should == true
326
- Eye::System.pid_alive?(@old_pid3).should == true
327
-
328
- Eye::System.send_signal(@old_pid1)
329
- sleep 0.5
330
- Eye::System.pid_alive?(@old_pid1).should == false
331
-
332
- actors = Celluloid::Actor.all.map(&:class)
333
- actors.should_not include(Eye::Utils::CelluloidChain)
334
- actors.should_not include(Eye::Process)
335
- actors.should_not include(Eye::Group)
336
- actors.should_not include(Eye::Application)
337
- actors.should_not include(Eye::Checker::Memory)
338
- end
339
-
340
- it "delete by mask" do
341
- @old_pid1 = @p1.pid
342
- @old_pid2 = @p2.pid
343
- @old_pid3 = @p3.pid
344
-
345
- @c.send_command(:delete, "sam*").should == ["int:samples"]
346
- sleep 7 # while
347
-
348
- @c.all_processes.should == [@p3]
349
- @c.all_groups.map(&:name).should == ['__default__']
350
-
351
- Eye::System.pid_alive?(@old_pid1).should == true
352
- Eye::System.pid_alive?(@old_pid2).should == true
353
- Eye::System.pid_alive?(@old_pid3).should == true
354
-
355
- Eye::System.send_signal(@old_pid1)
356
- sleep 0.5
357
- Eye::System.pid_alive?(@old_pid1).should == false
358
-
359
- # noone up this
360
- sleep 2
361
- Eye::System.pid_alive?(@old_pid1).should == false
362
- end
363
- end
364
-
365
-
366
- end