flapjack 0.5.5 → 0.6.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. data/.gitignore +10 -0
  2. data/.rbenv-version +1 -0
  3. data/.rspec +10 -0
  4. data/Gemfile +18 -0
  5. data/Guardfile +14 -0
  6. data/README.md +152 -173
  7. data/Rakefile +53 -150
  8. data/bin/flapjack +72 -0
  9. data/bin/flapjack-nagios-receiver +111 -0
  10. data/bin/flapjack-nagios-receiver-control +15 -0
  11. data/bin/flapjack-netsaint-parser +0 -2
  12. data/bin/flapjack-populator +133 -16
  13. data/bin/install-flapjack-systemwide +2 -2
  14. data/config.ru +11 -0
  15. data/dist/etc/init.d/flapjack +46 -0
  16. data/dist/etc/init.d/flapjack-nagios-receiver +36 -0
  17. data/doc/GLOSSARY.md +19 -0
  18. data/etc/flapjack_config.yaml.example +90 -0
  19. data/features/events.feature +132 -0
  20. data/features/notifications.feature +57 -0
  21. data/features/packaging-lintian.feature +5 -3
  22. data/features/steps/events_steps.rb +164 -0
  23. data/features/steps/flapjack-importer_steps.rb +2 -5
  24. data/features/steps/flapjack-worker_steps.rb +13 -6
  25. data/features/steps/notifications_steps.rb +178 -0
  26. data/features/steps/packaging-lintian_steps.rb +14 -0
  27. data/features/steps/time_travel_steps.rb +34 -0
  28. data/features/support/env.rb +63 -36
  29. data/flapjack.gemspec +35 -186
  30. data/lib/flapjack.rb +2 -0
  31. data/lib/flapjack/api.rb +274 -0
  32. data/lib/flapjack/api/entity_check_presenter.rb +184 -0
  33. data/lib/flapjack/api/entity_presenter.rb +66 -0
  34. data/lib/flapjack/cli/worker_manager.rb +1 -2
  35. data/lib/flapjack/configuration.rb +11 -0
  36. data/lib/flapjack/coordinator.rb +288 -0
  37. data/lib/flapjack/daemonizing.rb +186 -0
  38. data/lib/flapjack/data/contact.rb +45 -0
  39. data/lib/flapjack/data/entity.rb +89 -0
  40. data/lib/flapjack/data/entity_check.rb +396 -0
  41. data/lib/flapjack/data/event.rb +144 -0
  42. data/lib/flapjack/data/notification.rb +13 -0
  43. data/lib/flapjack/executive.rb +289 -0
  44. data/lib/flapjack/filters/acknowledgement.rb +39 -0
  45. data/lib/flapjack/filters/{any_parents_failed.rb → base.rb} +6 -4
  46. data/lib/flapjack/filters/delays.rb +53 -0
  47. data/lib/flapjack/filters/detect_mass_client_failures.rb +44 -0
  48. data/lib/flapjack/filters/ok.rb +25 -5
  49. data/lib/flapjack/filters/scheduled_maintenance.rb +17 -0
  50. data/lib/flapjack/filters/unscheduled_maintenance.rb +17 -0
  51. data/lib/flapjack/jabber.rb +294 -0
  52. data/lib/flapjack/notification/common.rb +23 -0
  53. data/lib/flapjack/notification/email.rb +107 -0
  54. data/lib/flapjack/notification/email/alert.html.haml +48 -0
  55. data/lib/flapjack/notification/email/alert.text.erb +14 -0
  56. data/lib/flapjack/notification/sms.rb +42 -0
  57. data/lib/flapjack/notification/sms/messagenet.rb +49 -0
  58. data/lib/flapjack/notifier_engine.rb +4 -4
  59. data/lib/flapjack/notifiers/mailer/mailer.rb +6 -7
  60. data/lib/flapjack/notifiers/xmpp/xmpp.rb +12 -12
  61. data/lib/flapjack/pagerduty.rb +230 -0
  62. data/lib/flapjack/patches.rb +108 -19
  63. data/lib/flapjack/persistence/data_mapper/models/check.rb +5 -3
  64. data/lib/flapjack/persistence/data_mapper/models/check_template.rb +2 -0
  65. data/lib/flapjack/persistence/data_mapper/models/event.rb +2 -0
  66. data/lib/flapjack/persistence/data_mapper/models/node.rb +3 -1
  67. data/lib/flapjack/persistence/data_mapper/models/related_check.rb +3 -1
  68. data/lib/flapjack/pikelet.rb +56 -0
  69. data/lib/flapjack/transports/beanstalkd.rb +1 -1
  70. data/lib/flapjack/transports/result.rb +6 -6
  71. data/lib/flapjack/utility.rb +46 -0
  72. data/lib/flapjack/version.rb +5 -0
  73. data/lib/flapjack/web.rb +198 -0
  74. data/lib/flapjack/web/views/acknowledge.haml +55 -0
  75. data/lib/flapjack/web/views/check.haml +162 -0
  76. data/lib/flapjack/web/views/index.haml +92 -0
  77. data/lib/flapjack/web/views/self_stats.haml +56 -0
  78. data/lib/flapjack/{applications/worker.rb → worker/application.rb} +0 -0
  79. data/lib/flapjack/worker/cli.rb +49 -0
  80. data/{spec → spec.old}/check_sandbox/echo +0 -0
  81. data/{spec → spec.old}/check_sandbox/sandboxed_check +0 -0
  82. data/{spec → spec.old}/configs/flapjack-notifier-couchdb.ini +0 -0
  83. data/{spec → spec.old}/configs/flapjack-notifier.ini +0 -0
  84. data/{spec → spec.old}/configs/recipients.ini +0 -0
  85. data/{spec → spec.old}/helpers.rb +0 -0
  86. data/{spec → spec.old}/inifile_spec.rb +0 -0
  87. data/{spec → spec.old}/mock-notifiers/mock/init.rb +0 -0
  88. data/{spec → spec.old}/mock-notifiers/mock/mock.rb +0 -0
  89. data/{spec → spec.old}/notifier-directories/spoons/testmailer/init.rb +0 -0
  90. data/{spec → spec.old}/notifier_application_spec.rb +0 -0
  91. data/{spec → spec.old}/notifier_filters_spec.rb +0 -0
  92. data/{spec → spec.old}/notifier_options_multiplexer_spec.rb +0 -0
  93. data/{spec → spec.old}/notifier_options_spec.rb +0 -0
  94. data/{spec → spec.old}/notifier_spec.rb +0 -0
  95. data/{spec → spec.old}/notifiers/mailer_spec.rb +0 -0
  96. data/{spec → spec.old}/notifiers/xmpp_spec.rb +0 -0
  97. data/{spec → spec.old}/persistence/datamapper_spec.rb +0 -0
  98. data/{spec → spec.old}/persistence/mock_persistence_backend.rb +0 -0
  99. data/{spec → spec.old}/simple.ini +0 -0
  100. data/{spec → spec.old}/spec.opts +0 -0
  101. data/{spec → spec.old}/test-filters/blocker.rb +0 -0
  102. data/{spec → spec.old}/test-filters/mock.rb +0 -0
  103. data/{spec → spec.old}/transports/beanstalkd_spec.rb +0 -0
  104. data/{spec → spec.old}/transports/mock_transport.rb +0 -0
  105. data/{spec → spec.old}/worker_application_spec.rb +0 -0
  106. data/{spec → spec.old}/worker_options_spec.rb +0 -0
  107. data/spec/lib/flapjack/api/entity_check_presenter_spec.rb +117 -0
  108. data/spec/lib/flapjack/api/entity_presenter_spec.rb +92 -0
  109. data/spec/lib/flapjack/api_spec.rb +170 -0
  110. data/spec/lib/flapjack/coordinator_spec.rb +16 -0
  111. data/spec/lib/flapjack/data/entity_check_spec.rb +398 -0
  112. data/spec/lib/flapjack/data/entity_spec.rb +71 -0
  113. data/spec/lib/flapjack/data/event_spec.rb +6 -0
  114. data/spec/lib/flapjack/executive_spec.rb +59 -0
  115. data/spec/lib/flapjack/filters/acknowledgement_spec.rb +6 -0
  116. data/spec/lib/flapjack/filters/delays_spec.rb +6 -0
  117. data/spec/lib/flapjack/filters/detect_mass_client_failures_spec.rb +6 -0
  118. data/spec/lib/flapjack/filters/ok_spec.rb +6 -0
  119. data/spec/lib/flapjack/filters/scheduled_maintenance_spec.rb +6 -0
  120. data/spec/lib/flapjack/filters/unscheduled_maintenance_spec.rb +6 -0
  121. data/spec/lib/flapjack/jabber_spec.rb +150 -0
  122. data/spec/lib/flapjack/notification/email_spec.rb +6 -0
  123. data/spec/lib/flapjack/notification/sms_spec.rb +6 -0
  124. data/spec/lib/flapjack/pikelet_spec.rb +28 -0
  125. data/spec/lib/flapjack/web_spec.rb +188 -0
  126. data/spec/spec_helper.rb +44 -0
  127. data/spec/support/profile_all_formatter.rb +44 -0
  128. data/spec/support/uncolored_doc_formatter.rb +9 -0
  129. data/tasks/events.rake +85 -0
  130. data/tmp/acknowledge.rb +14 -0
  131. data/tmp/create_config_yaml.rb +16 -0
  132. data/tmp/create_events_failure.rb +33 -0
  133. data/tmp/create_events_ok.rb +33 -0
  134. data/tmp/create_events_ok_fail_ack_ok.rb +54 -0
  135. data/tmp/create_events_ok_failure.rb +40 -0
  136. data/tmp/create_events_ok_failure_ack.rb +54 -0
  137. data/tmp/dummy_entities.json +1 -0
  138. data/tmp/generate_nagios_test_hosts.rb +16 -0
  139. data/tmp/parse_config_yaml.rb +7 -0
  140. data/tmp/redis_delete_all_keys.rb +11 -0
  141. data/tmp/test_entities.json +1 -0
  142. metadata +482 -221
  143. data/TODO.md +0 -36
  144. data/VERSION +0 -1
  145. data/bin/flapjack-benchmark +0 -50
  146. data/bin/flapjack-notifier +0 -21
  147. data/bin/flapjack-notifier-manager +0 -43
  148. data/bin/flapjack-stats +0 -27
  149. data/bin/flapjack-worker +0 -13
  150. data/bin/flapjack-worker-manager +0 -35
  151. data/dist/etc/init.d/flapjack-notifier +0 -47
  152. data/dist/etc/init.d/flapjack-workers +0 -44
  153. data/features/flapjack-notifier-manager.feature +0 -19
  154. data/features/flapjack-worker-manager.feature +0 -27
  155. data/features/flapjack-worker.feature +0 -27
  156. data/features/netsaint-config-converter.feature +0 -126
  157. data/features/persistence/couch.feature +0 -105
  158. data/features/persistence/sqlite3.feature +0 -105
  159. data/features/persistence/steps/couch_steps.rb +0 -25
  160. data/features/persistence/steps/generic_steps.rb +0 -102
  161. data/features/persistence/steps/sqlite3_steps.rb +0 -13
  162. data/features/steps/flapjack-notifier-manager_steps.rb +0 -24
  163. data/features/steps/flapjack-worker-manager_steps.rb +0 -48
  164. data/lib/flapjack/applications/notifier.rb +0 -222
  165. data/lib/flapjack/cli/notifier.rb +0 -108
  166. data/lib/flapjack/cli/notifier_manager.rb +0 -86
  167. data/lib/flapjack/cli/worker.rb +0 -51
@@ -71,14 +71,11 @@ end
71
71
  Given /^beanstalkd is running$/ do
72
72
  system("which beanstalkd > /dev/null 2>&1").should be_true
73
73
 
74
- @beanstalk = IO.popen("beanstalkd")
74
+ command = "beanstalkd"
75
+ @beanstalk = spawn_daemon(command)
75
76
 
76
77
  # So beanstalkd has a moment to catch its breath.
77
78
  sleep 0.5
78
-
79
- at_exit do
80
- Process.kill("KILL", @beanstalk.pid)
81
- end
82
79
  end
83
80
 
84
81
  Given /^there are no jobs on the "([^"]*)" beanstalkd queue$/ do |queue_name|
@@ -14,15 +14,11 @@ end
14
14
  When /^I background run "flapjack-worker"$/ do
15
15
  @root = Pathname.new(File.dirname(__FILE__)).parent.parent.expand_path
16
16
  bin_path = @root.join('bin')
17
- command = "#{bin_path}/flapjack-worker 2>&1"
17
+ command = "ruby -rubygems #{bin_path}/flapjack-worker 2>&1"
18
18
 
19
- @worker = IO.popen(command, 'r')
19
+ @worker = spawn_daemon(command)
20
20
 
21
21
  sleep 1
22
-
23
- at_exit do
24
- Process.kill("KILL", @worker.pid)
25
- end
26
22
  end
27
23
 
28
24
  Then /^I should see "([^"]*)" in the "([^"]*)" output$/ do |string, command|
@@ -59,3 +55,14 @@ end
59
55
  When /^I sleep "(\d+)" seconds$/ do |time|
60
56
  sleep(time.to_i)
61
57
  end
58
+
59
+ When /^I insert a check onto the beanstalk$/ do
60
+ @queue = Beanstalk::Connection.new('localhost:11300', 'checks')
61
+
62
+
63
+ pending # express the regexp above with the code you wish you had
64
+ end
65
+
66
+ Then /^I should see a job on the "([^"]*)" beanstalk queue$/ do |arg1|
67
+ pending # express the regexp above with the code you wish you had
68
+ end
@@ -0,0 +1,178 @@
1
+
2
+ include Mail::Matchers
3
+
4
+ # copied from flapjack-populator
5
+ def add_contact(contact = {})
6
+ @redis.multi
7
+ @redis.del("contact:#{contact['id']}")
8
+ @redis.del("contact_media:#{contact['id']}")
9
+ @redis.hset("contact:#{contact['id']}", 'first_name', contact['first_name'])
10
+ @redis.hset("contact:#{contact['id']}", 'last_name', contact['last_name'])
11
+ @redis.hset("contact:#{contact['id']}", 'email', contact['email'])
12
+ contact['media'].each_pair {|medium, address|
13
+ @redis.hset("contact_media:#{contact['id']}", medium, address)
14
+ }
15
+ @redis.exec
16
+ end
17
+
18
+ Given /^the user wants to receive SMS notifications for entity '([\w\.\-]+)'$/ do |entity|
19
+ add_contact( 'id' => '0999',
20
+ 'first_name' => 'John',
21
+ 'last_name' => 'Smith',
22
+ 'email' => 'johns@example.dom',
23
+ 'media' => {'sms' => '+61888888888'} )
24
+ Flapjack::Data::Entity.add({'id' => '5000',
25
+ 'name' => entity,
26
+ 'contacts' => ["0999"]},
27
+ :redis => @redis )
28
+ end
29
+
30
+ Given /^the user wants to receive email notifications for entity '([\w\.\-]+)'$/ do |entity|
31
+ add_contact( 'id' => '0999',
32
+ 'first_name' => 'John',
33
+ 'last_name' => 'Smith',
34
+ 'email' => 'johns@example.dom',
35
+ 'media' => {'email' => 'johns@example.dom'} )
36
+ Flapjack::Data::Entity.add({'id' => '5000',
37
+ 'name' => entity,
38
+ 'contacts' => ["0999"]},
39
+ :redis => @redis )
40
+ end
41
+
42
+ Given /^the user wants to receive SMS notifications for entity '([\w\.\-]+)' and email notifications for entity '([\w\.\-]+)'$/ do |entity1, entity2|
43
+ add_contact( 'id' => '0998',
44
+ 'first_name' => 'John',
45
+ 'last_name' => 'Smith',
46
+ 'email' => 'johns@example.dom',
47
+ 'media' => {'sms' => '+61888888888'} )
48
+ add_contact( 'id' => '0999',
49
+ 'first_name' => 'John',
50
+ 'last_name' => 'Smith',
51
+ 'email' => 'johns@example.dom',
52
+ 'media' => {'email' => 'johns@example.dom'} )
53
+ Flapjack::Data::Entity.add({'id' => '5000',
54
+ 'name' => entity1,
55
+ 'contacts' => ["0998"]},
56
+ :redis => @redis )
57
+ Flapjack::Data::Entity.add({'id' => '5001',
58
+ 'name' => entity2,
59
+ 'contacts' => ["0999"]},
60
+ :redis => @redis )
61
+ end
62
+
63
+ When /^an event notification is generated for entity '([\w\.\-]+)'$/ do |entity|
64
+ event = Flapjack::Data::Event.new('type' => 'service',
65
+ 'state' => 'critical',
66
+ 'summary' => '100% packet loss',
67
+ 'entity' => entity,
68
+ 'check' => 'ping')
69
+ entity_check = Flapjack::Data::EntityCheck.for_entity_name(entity, 'ping', :redis => @redis)
70
+ @app.send(:generate_notification, event, entity_check)
71
+ end
72
+
73
+ Then /^an SMS notification for entity '([\w\.\-]+)' should be queued for the user$/ do |entity|
74
+ queue = ResqueSpec.peek('sms_notifications')
75
+ queue.select {|n| n[:args].first['event_id'] =~ /#{entity}:ping/ }.should_not be_empty
76
+ end
77
+
78
+ Then /^an email notification for entity '([\w\.\-]+)' should be queued for the user$/ do |entity|
79
+ queue = ResqueSpec.peek('email_notifications')
80
+ queue.select {|n| n[:args].first['event_id'] =~ /#{entity}:ping/ }.should_not be_empty
81
+ end
82
+
83
+ Then /^an SMS notification for entity '([\w\.\-]+)' should not be queued for the user$/ do |entity|
84
+ queue = ResqueSpec.peek('sms_notifications')
85
+ queue.select {|n| n[:args].first['event_id'] =~ /#{entity}:ping/ }.should be_empty
86
+ end
87
+
88
+ Then /^an email notification for entity '([\w\.\-]+)' should not be queued for the user$/ do |entity|
89
+ queue = ResqueSpec.peek('email_notifications')
90
+ queue.select {|n| n[:args].first['event_id'] =~ /#{entity}:ping/ }.should be_empty
91
+ end
92
+
93
+ Given /^a user SMS notification has been queued for entity '([\w\.\-]+)'$/ do |entity|
94
+ Flapjack::Data::Entity.add({'id' => '5000',
95
+ 'name' => entity},
96
+ :redis => @redis )
97
+ @sms_notification = {'notification_type' => 'problem',
98
+ 'contact_first_name' => 'John',
99
+ 'contact_last_name' => 'Smith',
100
+ 'state' => 'CRITICAL',
101
+ 'summary' => 'Socket timeout after 10 seconds',
102
+ 'time' => Time.now.to_i,
103
+ 'event_id' => "#{entity}:ping",
104
+ 'address' => '+61412345678',
105
+ 'id' => 1}
106
+ end
107
+
108
+ Given /^a user email notification has been queued for entity '([\w\.\-]+)'$/ do |entity|
109
+ Flapjack::Data::Entity.add({'id' => '5001',
110
+ 'name' => entity},
111
+ :redis => @redis )
112
+ @email_notification = {'notification_type' => 'problem',
113
+ 'contact_first_name' => 'John',
114
+ 'contact_last_name' => 'Smith',
115
+ 'state' => 'CRITICAL',
116
+ 'summary' => 'Socket timeout after 10 seconds',
117
+ 'time' => Time.now.to_i,
118
+ 'event_id' => "#{entity}:ping",
119
+ 'address' => 'johns@example.dom',
120
+ 'id' => 2}
121
+ end
122
+
123
+ # NB using perform, the notifiers were accessing the wrong Redis DB number
124
+
125
+ # TODO may need to get more complex, depending which SMS provider is used
126
+ When /^the SMS notification handler runs successfully$/ do
127
+ # returns success by default - currently matches all addresses, maybe load from config?
128
+ stub_request(:get, /.*/)
129
+ # TODO load config from cfg file instead?
130
+ Flapjack::Notification::Sms.class_variable_set('@@config', {'username' => 'abcd', 'password' => 'efgh'})
131
+
132
+ lambda {
133
+ Flapjack::Notification::Sms.dispatch(@sms_notification, :logger => @logger, :redis => @redis)
134
+ }.should_not raise_error
135
+ @sms_sent = true
136
+ end
137
+
138
+ When /^the SMS notification handler fails to send an SMS$/ do
139
+ stub_request(:any, /.*/).to_return(:status => [500, "Internal Server Error"])
140
+
141
+ lambda {
142
+ Flapjack::Notification::Sms.dispatch(@sms_notification, :logger => @logger, :redis => @redis)
143
+ }.should raise_error
144
+ @sms_sent = false
145
+ end
146
+
147
+ When /^the email notification handler runs successfully$/ do
148
+ lambda {
149
+ Flapjack::Notification::Email.dispatch(@email_notification, :logger => @logger, :redis => @redis)
150
+ }.should_not raise_error
151
+ end
152
+
153
+ # This doesn't work as I have it here -- sends a mail with an empty To: header instead.
154
+ # Might have to introduce Rspec's stubs here to fake bad mailer behaviour -- or if mail sending
155
+ # won't ever fail, don't test for failure?
156
+ When /^the email notification handler fails to send an email$/ do
157
+ pending
158
+ lambda {
159
+ @email_notification['address'] = nil
160
+ Flapjack::Notification::Email.dispatch(@email_notification, :logger => @logger, :redis => @redis)
161
+ }.should_not raise_error
162
+ end
163
+
164
+ Then /^the user should receive an SMS notification$/ do
165
+ @sms_sent.should be_true
166
+ end
167
+
168
+ Then /^the user should receive an email notification$/ do
169
+ have_sent_email.should be_true
170
+ end
171
+
172
+ Then /^the user should not receive an SMS notification$/ do
173
+ @sms_sent.should be_false
174
+ end
175
+
176
+ Then /^the user should not receive an email notification$/ do
177
+ have_sent_email.should be_false
178
+ end
@@ -11,3 +11,17 @@ Then /^every file in the output should start with "([^\"]*)"$/ do |string|
11
11
  `head -n 1 #{file}`.should =~ /^#{string}\s*$/
12
12
  end
13
13
  end
14
+
15
+ When /^I run "([^"]*)"$/ do |cmd|
16
+ #bin_path = '/usr/bin'
17
+ #command = "#{bin_path}/#{cmd}"
18
+
19
+ #@output = `#{command}`
20
+ @output = `#{cmd} 2>&1`
21
+ @exit_status = $?.exitstatus
22
+ end
23
+
24
+ Then /^the exit status should be (\d+)$/ do |number|
25
+ @exit_status.should == number.to_i
26
+ end
27
+
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'delorean'
4
+ require 'chronic'
5
+
6
+ When /^(.+) passes$/ do |time|
7
+ period = Chronic.parse("#{time} from now")
8
+ Delorean.time_travel_to(period)
9
+ puts "Time Travelled to #{Time.now.to_s}"
10
+ end
11
+
12
+ Given /^I time travel to (.+)$/ do |period|
13
+ Delorean.time_travel_to(period)
14
+ puts "Time Travelled to #{Time.now.to_s}"
15
+ end
16
+
17
+ Given /^I come back to the present$/ do
18
+ Delorean.back_to_the_present
19
+ puts "Time Travelled to the present, #{Time.now.to_s}"
20
+ end
21
+
22
+ Given /^I time travel in (.+) to (.+)$/ do |zone_name, timestamp|
23
+ zone = ::Time.find_zone!(zone_name)
24
+ time = zone.parse timestamp
25
+ Delorean.time_travel_to time
26
+ puts "Time Travelled to #{Time.now.to_s}"
27
+ end
28
+
29
+ Then /^the time in UTC should be about (.+)$/ do |timestamp|
30
+ actual = Time.now.in_time_zone('UTC')
31
+ expected = Time.parse("#{timestamp} UTC")
32
+ (expected..expected+5).cover?(actual).should be_true
33
+ end
34
+
@@ -1,51 +1,78 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ if ENV['COVERAGE']
4
+ require 'simplecov'
5
+ SimpleCov.start do
6
+ add_filter '/features/'
7
+ end
8
+ end
9
+
10
+ ENV["FLAPJACK_ENV"] = 'test'
11
+ require 'bundler'
12
+ Bundler.require(:default, :test)
13
+
3
14
  $: << File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
4
15
 
5
16
  require 'pathname'
6
- require 'yajl'
7
- require 'beanstalk-client'
8
-
9
- class ProcessManagement
10
- # Cleans up daemons that were started in a scenario.
11
- # We kill these daemons so the test state is clean at the beginning of every
12
- # scenario, and scenarios don't become coupled with one another.
13
- def kill_lingering_daemons
14
- # FIXME: iterate through a collection of daemons registered during the scenario
15
- Process.kill("KILL", @beanstalk.pid) if @beanstalk
17
+
18
+ require 'webmock/cucumber'
19
+ WebMock.disable_net_connect!
20
+
21
+ require 'flapjack/executive'
22
+ require 'flapjack/patches'
23
+
24
+ class MockLogger
25
+ attr_accessor :messages
26
+
27
+ def initialize
28
+ @messages = []
16
29
  end
17
30
 
18
- # Testing daemons with Ruby backticks blocks indefinitely, because the
19
- # backtick method waits for the program to exit. We use the select() system
20
- # call to read from a pipe connected to a daemon, and return if no data is
21
- # read within the specified timeout.
22
- #
23
- # http://weblog.jamisbuck.org/assets/2006/9/25/gdb.rb
24
- def read_until_timeout(pipe, timeout=1, verbose=false)
25
- output = []
26
- line = ""
27
- while data = IO.select([pipe], nil, nil, timeout) do
28
- next if data.empty?
29
- char = pipe.read(1)
30
- break if char.nil?
31
-
32
- line << char
33
- if line[-1] == ?\n
34
- puts line if verbose
35
- output << line
36
- line = ""
31
+ %w(debug info warn error fatal).each do |level|
32
+ class_eval <<-RUBY
33
+ def #{level}(msg)
34
+ @messages << msg
37
35
  end
38
- end
39
-
40
- output
36
+ RUBY
41
37
  end
38
+ end
42
39
 
40
+ Mail.defaults do
41
+ delivery_method :test
43
42
  end
44
43
 
45
- After do |scenario|
46
- kill_lingering_daemons
44
+ redis_opts = { :db => 14, :driver => :ruby }
45
+ redis = ::Redis.new(redis_opts)
46
+ redis.flushdb
47
+ redis.quit
48
+
49
+ Before do
50
+ @logger = MockLogger.new
51
+ # Use a separate database whilst testing
52
+ @app = Flapjack::Executive.new
53
+ @app.bootstrap(:logger => @logger, :redis => redis_opts,
54
+ :config => {'email_queue' => 'email_notifications',
55
+ 'sms_queue' => 'sms_notifications'})
56
+ @app.setup
57
+ @redis = @app.redis
47
58
  end
48
59
 
49
- World do
50
- ProcessManagement.new
60
+ After do
61
+ @redis.flushdb
62
+ @redis.quit
63
+ # Reset the logged messages
64
+ @logger.messages = []
51
65
  end
66
+
67
+ Before('@resque') do
68
+ ResqueSpec.reset!
69
+ end
70
+
71
+ Before('@email') do
72
+ Mail::TestMailer.deliveries.clear
73
+ end
74
+
75
+ After('@time') do
76
+ Delorean.back_to_the_present
77
+ end
78
+
data/flapjack.gemspec CHANGED
@@ -1,192 +1,41 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
1
  # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/flapjack/version', __FILE__)
5
3
 
6
- Gem::Specification.new do |s|
7
- s.name = %q{flapjack}
8
- s.version = "0.5.5"
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Lindsay Holmwood"]
6
+ gem.email = %q{lindsay@holmwood.id.au}
7
+ gem.description = %q{Flapjack is highly scalable and distributed monitoring system. It understands the Nagios plugin format, and can easily be scaled from 1 server to 1000.}
8
+ gem.summary = %q{a scalable and distributed monitoring system}
9
+ gem.homepage = %q{http://flapjack-project.com/}
9
10
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Lindsay Holmwood"]
12
- s.date = %q{2011-01-18}
13
- s.description = %q{lapjack is highly scalable and distributed monitoring system. It understands the Nagios plugin format, and can easily be scaled from 1 server to 1000.}
14
- s.email = %q{lindsay@holmwood.id.au}
15
- s.executables = ["flapjack-benchmark", "flapjack-netsaint-parser", "flapjack-notifier", "flapjack-notifier-manager", "flapjack-populator", "flapjack-stats", "flapjack-worker", "flapjack-worker-manager", "install-flapjack-systemwide"]
16
- s.extra_rdoc_files = [
17
- "README.md"
18
- ]
19
- s.files = [
20
- ".gitignore",
21
- "LICENCE",
22
- "README.md",
23
- "Rakefile",
24
- "TODO.md",
25
- "VERSION",
26
- "bin/flapjack-benchmark",
27
- "bin/flapjack-netsaint-parser",
28
- "bin/flapjack-notifier",
29
- "bin/flapjack-notifier-manager",
30
- "bin/flapjack-populator",
31
- "bin/flapjack-stats",
32
- "bin/flapjack-worker",
33
- "bin/flapjack-worker-manager",
34
- "bin/install-flapjack-systemwide",
35
- "dist/etc/default/flapjack-notifier",
36
- "dist/etc/default/flapjack-workers",
37
- "dist/etc/flapjack/flapjack-notifier.conf.example",
38
- "dist/etc/flapjack/recipients.conf.example",
39
- "dist/etc/init.d/flapjack-notifier",
40
- "dist/etc/init.d/flapjack-workers",
41
- "dist/puppet/flapjack/files/.stub",
42
- "dist/puppet/flapjack/manifests/common.pp",
43
- "dist/puppet/flapjack/manifests/notifier.pp",
44
- "dist/puppet/flapjack/manifests/worker.pp",
45
- "dist/puppet/flapjack/templates/.stub",
46
- "dist/puppet/ruby/manifests/dev.pp",
47
- "dist/puppet/ruby/manifests/rubygems.pp",
48
- "dist/puppet/sqlite3/manifests/dev.pp",
49
- "doc/CONFIGURING.md",
50
- "doc/DEVELOPING.md",
51
- "doc/INSTALL.md",
52
- "doc/PACKAGING.md",
53
- "features/flapjack-notifier-manager.feature",
54
- "features/flapjack-worker-manager.feature",
55
- "features/flapjack-worker.feature",
56
- "features/netsaint-config-converter.feature",
57
- "features/packaging-lintian.feature",
58
- "features/persistence/couch.feature",
59
- "features/persistence/sqlite3.feature",
60
- "features/persistence/steps/couch_steps.rb",
61
- "features/persistence/steps/generic_steps.rb",
62
- "features/persistence/steps/sqlite3_steps.rb",
63
- "features/steps/flapjack-importer_steps.rb",
64
- "features/steps/flapjack-netsaint-parser_steps.rb",
65
- "features/steps/flapjack-notifier-manager_steps.rb",
66
- "features/steps/flapjack-worker-manager_steps.rb",
67
- "features/steps/flapjack-worker_steps.rb",
68
- "features/steps/packaging-lintian_steps.rb",
69
- "features/support/env.rb",
70
- "features/support/silent_system.rb",
71
- "features/support/tmp/.stub",
72
- "flapjack.gemspec",
73
- "lib/flapjack.rb",
74
- "lib/flapjack/applications/notifier.rb",
75
- "lib/flapjack/applications/worker.rb",
76
- "lib/flapjack/checks/http_content",
77
- "lib/flapjack/checks/ping",
78
- "lib/flapjack/cli/notifier.rb",
79
- "lib/flapjack/cli/notifier_manager.rb",
80
- "lib/flapjack/cli/worker.rb",
81
- "lib/flapjack/cli/worker_manager.rb",
82
- "lib/flapjack/filters/any_parents_failed.rb",
83
- "lib/flapjack/filters/ok.rb",
84
- "lib/flapjack/inifile.rb",
85
- "lib/flapjack/notifier_engine.rb",
86
- "lib/flapjack/notifiers/mailer/init.rb",
87
- "lib/flapjack/notifiers/mailer/mailer.rb",
88
- "lib/flapjack/notifiers/xmpp/init.rb",
89
- "lib/flapjack/notifiers/xmpp/xmpp.rb",
90
- "lib/flapjack/patches.rb",
91
- "lib/flapjack/persistence/couch.rb",
92
- "lib/flapjack/persistence/couch/connection.rb",
93
- "lib/flapjack/persistence/couch/couch.rb",
94
- "lib/flapjack/persistence/data_mapper.rb",
95
- "lib/flapjack/persistence/data_mapper/data_mapper.rb",
96
- "lib/flapjack/persistence/data_mapper/models/check.rb",
97
- "lib/flapjack/persistence/data_mapper/models/check_template.rb",
98
- "lib/flapjack/persistence/data_mapper/models/event.rb",
99
- "lib/flapjack/persistence/data_mapper/models/node.rb",
100
- "lib/flapjack/persistence/data_mapper/models/related_check.rb",
101
- "lib/flapjack/persistence/sqlite3.rb",
102
- "lib/flapjack/persistence/sqlite3/sqlite3.rb",
103
- "lib/flapjack/transports/beanstalkd.rb",
104
- "lib/flapjack/transports/result.rb",
105
- "spec/check_sandbox/echo",
106
- "spec/check_sandbox/sandboxed_check",
107
- "spec/configs/flapjack-notifier-couchdb.ini",
108
- "spec/configs/flapjack-notifier.ini",
109
- "spec/configs/recipients.ini",
110
- "spec/helpers.rb",
111
- "spec/inifile_spec.rb",
112
- "spec/mock-notifiers/mock/init.rb",
113
- "spec/mock-notifiers/mock/mock.rb",
114
- "spec/notifier-directories/spoons/testmailer/init.rb",
115
- "spec/notifier_application_spec.rb",
116
- "spec/notifier_filters_spec.rb",
117
- "spec/notifier_options_multiplexer_spec.rb",
118
- "spec/notifier_options_spec.rb",
119
- "spec/notifier_spec.rb",
120
- "spec/notifiers/mailer_spec.rb",
121
- "spec/notifiers/xmpp_spec.rb",
122
- "spec/persistence/datamapper_spec.rb",
123
- "spec/persistence/mock_persistence_backend.rb",
124
- "spec/simple.ini",
125
- "spec/spec.opts",
126
- "spec/test-filters/blocker.rb",
127
- "spec/test-filters/mock.rb",
128
- "spec/transports/beanstalkd_spec.rb",
129
- "spec/transports/mock_transport.rb",
130
- "spec/worker_application_spec.rb",
131
- "spec/worker_options_spec.rb"
132
- ]
133
- s.homepage = %q{http://flapjack-project.com/}
134
- s.rdoc_options = ["--charset=UTF-8"]
135
- s.require_paths = ["lib"]
136
- s.rubygems_version = %q{1.3.7}
137
- s.summary = %q{a scalable and distributed monitoring system}
138
- s.test_files = [
139
- "spec/helpers.rb",
140
- "spec/inifile_spec.rb",
141
- "spec/mock-notifiers/mock/init.rb",
142
- "spec/mock-notifiers/mock/mock.rb",
143
- "spec/notifier-directories/spoons/testmailer/init.rb",
144
- "spec/notifier_application_spec.rb",
145
- "spec/notifier_filters_spec.rb",
146
- "spec/notifier_options_multiplexer_spec.rb",
147
- "spec/notifier_options_spec.rb",
148
- "spec/notifier_spec.rb",
149
- "spec/notifiers/mailer_spec.rb",
150
- "spec/notifiers/xmpp_spec.rb",
151
- "spec/persistence/datamapper_spec.rb",
152
- "spec/persistence/mock_persistence_backend.rb",
153
- "spec/test-filters/blocker.rb",
154
- "spec/test-filters/mock.rb",
155
- "spec/transports/beanstalkd_spec.rb",
156
- "spec/transports/mock_transport.rb",
157
- "spec/worker_application_spec.rb",
158
- "spec/worker_options_spec.rb"
159
- ]
11
+ # see http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/
12
+ # following a middle road here, not shipping it with the gem :)
13
+ gem.files = `git ls-files`.split($\) - ['Gemfile.lock', 'bin/flapjack-bpimport']
14
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
15
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
16
+ gem.name = "flapjack"
17
+ gem.require_paths = ["lib"]
18
+ gem.version = Flapjack::VERSION
160
19
 
161
- if s.respond_to? :specification_version then
162
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
163
- s.specification_version = 3
20
+ gem.add_dependency 'daemons'
21
+ gem.add_dependency 'log4r'
22
+ gem.add_dependency 'yajl-ruby'
23
+ gem.add_dependency 'eventmachine', '~> 1.0.0'
24
+ gem.add_dependency 'hiredis'
25
+ gem.add_dependency 'em-synchrony', '~> 1.0.2'
26
+ gem.add_dependency 'em-http-request'
27
+ gem.add_dependency 'redis'
28
+ gem.add_dependency 'em-resque'
29
+ gem.add_dependency 'sinatra'
30
+ gem.add_dependency 'rack-fiber_pool'
31
+ gem.add_dependency 'haml'
32
+ gem.add_dependency 'thin'
33
+ gem.add_dependency 'mail'
34
+ gem.add_dependency 'blather'
35
+ gem.add_dependency 'chronic'
36
+ gem.add_dependency 'chronic_duration'
37
+ gem.add_dependency 'httparty'
164
38
 
165
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
166
- s.add_runtime_dependency(%q<daemons>, ["= 1.0.10"])
167
- s.add_runtime_dependency(%q<beanstalk-client>, ["= 1.0.2"])
168
- s.add_runtime_dependency(%q<log4r>, ["= 1.1.5"])
169
- s.add_runtime_dependency(%q<xmpp4r>, ["= 0.5"])
170
- s.add_runtime_dependency(%q<tmail>, ["= 1.2.3.1"])
171
- s.add_runtime_dependency(%q<yajl-ruby>, ["= 0.6.4"])
172
- s.add_runtime_dependency(%q<sqlite3-ruby>, ["= 1.2.5"])
173
- else
174
- s.add_dependency(%q<daemons>, ["= 1.0.10"])
175
- s.add_dependency(%q<beanstalk-client>, ["= 1.0.2"])
176
- s.add_dependency(%q<log4r>, ["= 1.1.5"])
177
- s.add_dependency(%q<xmpp4r>, ["= 0.5"])
178
- s.add_dependency(%q<tmail>, ["= 1.2.3.1"])
179
- s.add_dependency(%q<yajl-ruby>, ["= 0.6.4"])
180
- s.add_dependency(%q<sqlite3-ruby>, ["= 1.2.5"])
181
- end
182
- else
183
- s.add_dependency(%q<daemons>, ["= 1.0.10"])
184
- s.add_dependency(%q<beanstalk-client>, ["= 1.0.2"])
185
- s.add_dependency(%q<log4r>, ["= 1.1.5"])
186
- s.add_dependency(%q<xmpp4r>, ["= 0.5"])
187
- s.add_dependency(%q<tmail>, ["= 1.2.3.1"])
188
- s.add_dependency(%q<yajl-ruby>, ["= 0.6.4"])
189
- s.add_dependency(%q<sqlite3-ruby>, ["= 1.2.5"])
190
- end
39
+ gem.add_development_dependency 'rake'
40
+ gem.add_development_dependency 'colorize'
191
41
  end
192
-