flapjack 0.5.5 → 0.6.23

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 (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
-