flapjack 1.6.0 → 2.0.0b1

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 (301) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -6
  3. data/.gitmodules +1 -1
  4. data/.rspec +1 -1
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +12 -13
  7. data/CHANGELOG.md +2 -9
  8. data/CONTRIBUTING.md +7 -2
  9. data/Gemfile +4 -13
  10. data/LICENCE +1 -0
  11. data/README.md +8 -2
  12. data/Rakefile +2 -2
  13. data/bin/flapjack +3 -12
  14. data/build.sh +4 -2
  15. data/etc/flapjack_config.toml.example +273 -0
  16. data/features/ack_after_sched_maint.feature +18 -21
  17. data/features/cli.feature +11 -71
  18. data/features/cli_flapjack-feed-events.feature +14 -15
  19. data/features/cli_flapjack-nagios-receiver.feature +12 -41
  20. data/features/cli_flapper.feature +12 -41
  21. data/features/cli_purge.feature +5 -6
  22. data/features/cli_receive-events.feature +6 -7
  23. data/features/cli_simulate-failed-check.feature +5 -6
  24. data/features/events.feature +206 -181
  25. data/features/events_check_names.feature +4 -7
  26. data/features/notification_rules.feature +144 -223
  27. data/features/notifications.feature +65 -57
  28. data/features/rollup.feature +45 -47
  29. data/features/steps/cli_steps.rb +4 -5
  30. data/features/steps/events_steps.rb +163 -373
  31. data/features/steps/notifications_steps.rb +408 -264
  32. data/features/steps/packaging-lintian_steps.rb +0 -4
  33. data/features/steps/time_travel_steps.rb +0 -26
  34. data/features/support/daemons.rb +6 -31
  35. data/features/support/env.rb +65 -74
  36. data/flapjack.gemspec +22 -24
  37. data/lib/flapjack.rb +14 -7
  38. data/lib/flapjack/cli/flapper.rb +74 -173
  39. data/lib/flapjack/cli/maintenance.rb +278 -109
  40. data/lib/flapjack/cli/migrate.rb +950 -0
  41. data/lib/flapjack/cli/purge.rb +19 -22
  42. data/lib/flapjack/cli/receiver.rb +150 -326
  43. data/lib/flapjack/cli/server.rb +8 -235
  44. data/lib/flapjack/cli/simulate.rb +42 -57
  45. data/lib/flapjack/configuration.rb +51 -37
  46. data/lib/flapjack/coordinator.rb +138 -129
  47. data/lib/flapjack/data/acknowledgement.rb +177 -0
  48. data/lib/flapjack/data/alert.rb +97 -158
  49. data/lib/flapjack/data/check.rb +611 -0
  50. data/lib/flapjack/data/condition.rb +70 -0
  51. data/lib/flapjack/data/contact.rb +226 -456
  52. data/lib/flapjack/data/event.rb +96 -184
  53. data/lib/flapjack/data/extensions/associations.rb +59 -0
  54. data/lib/flapjack/data/extensions/short_name.rb +25 -0
  55. data/lib/flapjack/data/medium.rb +428 -0
  56. data/lib/flapjack/data/metrics.rb +194 -0
  57. data/lib/flapjack/data/notification.rb +22 -281
  58. data/lib/flapjack/data/rule.rb +473 -0
  59. data/lib/flapjack/data/scheduled_maintenance.rb +244 -0
  60. data/lib/flapjack/data/state.rb +221 -0
  61. data/lib/flapjack/data/statistic.rb +112 -0
  62. data/lib/flapjack/data/tag.rb +277 -0
  63. data/lib/flapjack/data/test_notification.rb +182 -0
  64. data/lib/flapjack/data/unscheduled_maintenance.rb +159 -0
  65. data/lib/flapjack/data/validators/id_validator.rb +20 -0
  66. data/lib/flapjack/exceptions.rb +6 -0
  67. data/lib/flapjack/filters/acknowledgement.rb +23 -16
  68. data/lib/flapjack/filters/base.rb +0 -5
  69. data/lib/flapjack/filters/delays.rb +53 -43
  70. data/lib/flapjack/filters/ok.rb +23 -14
  71. data/lib/flapjack/filters/scheduled_maintenance.rb +3 -3
  72. data/lib/flapjack/filters/unscheduled_maintenance.rb +12 -3
  73. data/lib/flapjack/gateways/aws_sns.rb +65 -49
  74. data/lib/flapjack/gateways/aws_sns/alert.text.erb +2 -2
  75. data/lib/flapjack/gateways/aws_sns/alert_subject.text.erb +2 -2
  76. data/lib/flapjack/gateways/aws_sns/rollup_subject.text.erb +1 -1
  77. data/lib/flapjack/gateways/email.rb +107 -90
  78. data/lib/flapjack/gateways/email/alert.html.erb +19 -18
  79. data/lib/flapjack/gateways/email/alert.text.erb +20 -14
  80. data/lib/flapjack/gateways/email/alert_subject.text.erb +2 -1
  81. data/lib/flapjack/gateways/email/rollup.html.erb +14 -13
  82. data/lib/flapjack/gateways/email/rollup.text.erb +13 -10
  83. data/lib/flapjack/gateways/jabber.rb +679 -671
  84. data/lib/flapjack/gateways/jabber/alert.text.erb +9 -6
  85. data/lib/flapjack/gateways/jsonapi.rb +164 -350
  86. data/lib/flapjack/gateways/jsonapi/data/join_descriptor.rb +44 -0
  87. data/lib/flapjack/gateways/jsonapi/data/method_descriptor.rb +21 -0
  88. data/lib/flapjack/gateways/jsonapi/helpers/headers.rb +63 -0
  89. data/lib/flapjack/gateways/jsonapi/helpers/miscellaneous.rb +136 -0
  90. data/lib/flapjack/gateways/jsonapi/helpers/resources.rb +227 -0
  91. data/lib/flapjack/gateways/jsonapi/helpers/serialiser.rb +313 -0
  92. data/lib/flapjack/gateways/jsonapi/helpers/swagger_docs.rb +322 -0
  93. data/lib/flapjack/gateways/jsonapi/methods/association_delete.rb +115 -0
  94. data/lib/flapjack/gateways/jsonapi/methods/association_get.rb +288 -0
  95. data/lib/flapjack/gateways/jsonapi/methods/association_patch.rb +178 -0
  96. data/lib/flapjack/gateways/jsonapi/methods/association_post.rb +116 -0
  97. data/lib/flapjack/gateways/jsonapi/methods/metrics.rb +71 -0
  98. data/lib/flapjack/gateways/jsonapi/methods/resource_delete.rb +119 -0
  99. data/lib/flapjack/gateways/jsonapi/methods/resource_get.rb +186 -0
  100. data/lib/flapjack/gateways/jsonapi/methods/resource_patch.rb +239 -0
  101. data/lib/flapjack/gateways/jsonapi/methods/resource_post.rb +197 -0
  102. data/lib/flapjack/gateways/jsonapi/middleware/array_param_fixer.rb +27 -0
  103. data/lib/flapjack/gateways/jsonapi/{rack → middleware}/json_params_parser.rb +7 -6
  104. data/lib/flapjack/gateways/jsonapi/middleware/request_timestamp.rb +18 -0
  105. data/lib/flapjack/gateways/oobetet.rb +222 -170
  106. data/lib/flapjack/gateways/pager_duty.rb +388 -0
  107. data/lib/flapjack/gateways/pager_duty/alert.text.erb +13 -0
  108. data/lib/flapjack/gateways/slack.rb +56 -48
  109. data/lib/flapjack/gateways/slack/alert.text.erb +1 -1
  110. data/lib/flapjack/gateways/slack/rollup.text.erb +1 -1
  111. data/lib/flapjack/gateways/sms_aspsms.rb +155 -0
  112. data/lib/flapjack/gateways/sms_aspsms/alert.text.erb +7 -0
  113. data/lib/flapjack/gateways/sms_aspsms/rollup.text.erb +2 -0
  114. data/lib/flapjack/gateways/sms_messagenet.rb +77 -57
  115. data/lib/flapjack/gateways/sms_messagenet/alert.text.erb +3 -2
  116. data/lib/flapjack/gateways/sms_nexmo.rb +53 -51
  117. data/lib/flapjack/gateways/sms_nexmo/alert.text.erb +2 -2
  118. data/lib/flapjack/gateways/sms_nexmo/rollup.text.erb +1 -1
  119. data/lib/flapjack/gateways/sms_twilio.rb +79 -62
  120. data/lib/flapjack/gateways/sms_twilio/alert.text.erb +3 -2
  121. data/lib/flapjack/gateways/web.rb +437 -345
  122. data/lib/flapjack/gateways/web/middleware/request_timestamp.rb +18 -0
  123. data/lib/flapjack/gateways/web/public/css/bootstrap.css +3793 -4340
  124. data/lib/flapjack/gateways/web/public/css/bootstrap.css.map +1 -0
  125. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.eot +0 -0
  126. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.svg +273 -214
  127. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  128. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff +0 -0
  129. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  130. data/lib/flapjack/gateways/web/public/js/bootstrap.js +1637 -1607
  131. data/lib/flapjack/gateways/web/public/js/self_stats.js +1 -2
  132. data/lib/flapjack/gateways/web/views/_pagination.html.erb +19 -0
  133. data/lib/flapjack/gateways/web/views/check.html.erb +159 -121
  134. data/lib/flapjack/gateways/web/views/checks.html.erb +82 -41
  135. data/lib/flapjack/gateways/web/views/contact.html.erb +59 -71
  136. data/lib/flapjack/gateways/web/views/contacts.html.erb +32 -8
  137. data/lib/flapjack/gateways/web/views/index.html.erb +2 -2
  138. data/lib/flapjack/gateways/web/views/{layout.erb → layout.html.erb} +7 -23
  139. data/lib/flapjack/gateways/web/views/self_stats.html.erb +32 -33
  140. data/lib/flapjack/gateways/web/views/tag.html.erb +32 -0
  141. data/lib/flapjack/gateways/web/views/tags.html.erb +51 -0
  142. data/lib/flapjack/logger.rb +34 -3
  143. data/lib/flapjack/notifier.rb +180 -112
  144. data/lib/flapjack/patches.rb +8 -63
  145. data/lib/flapjack/pikelet.rb +185 -143
  146. data/lib/flapjack/processor.rb +323 -191
  147. data/lib/flapjack/record_queue.rb +33 -0
  148. data/lib/flapjack/redis_proxy.rb +66 -0
  149. data/lib/flapjack/utility.rb +21 -15
  150. data/lib/flapjack/version.rb +2 -1
  151. data/libexec/httpbroker.go +218 -14
  152. data/libexec/oneoff.go +13 -10
  153. data/spec/lib/flapjack/configuration_spec.rb +286 -0
  154. data/spec/lib/flapjack/coordinator_spec.rb +103 -157
  155. data/spec/lib/flapjack/data/check_spec.rb +175 -0
  156. data/spec/lib/flapjack/data/contact_spec.rb +26 -349
  157. data/spec/lib/flapjack/data/event_spec.rb +76 -291
  158. data/spec/lib/flapjack/data/medium_spec.rb +19 -0
  159. data/spec/lib/flapjack/data/rule_spec.rb +43 -0
  160. data/spec/lib/flapjack/data/scheduled_maintenance_spec.rb +976 -0
  161. data/spec/lib/flapjack/data/unscheduled_maintenance_spec.rb +34 -0
  162. data/spec/lib/flapjack/gateways/aws_sns_spec.rb +111 -60
  163. data/spec/lib/flapjack/gateways/email_spec.rb +194 -161
  164. data/spec/lib/flapjack/gateways/jabber_spec.rb +961 -162
  165. data/spec/lib/flapjack/gateways/jsonapi/methods/check_links_spec.rb +155 -0
  166. data/spec/lib/flapjack/gateways/jsonapi/methods/checks_spec.rb +426 -0
  167. data/spec/lib/flapjack/gateways/jsonapi/methods/contact_links_spec.rb +217 -0
  168. data/spec/lib/flapjack/gateways/jsonapi/methods/contacts_spec.rb +425 -0
  169. data/spec/lib/flapjack/gateways/jsonapi/methods/events_spec.rb +271 -0
  170. data/spec/lib/flapjack/gateways/jsonapi/methods/media_spec.rb +257 -0
  171. data/spec/lib/flapjack/gateways/jsonapi/methods/medium_links_spec.rb +163 -0
  172. data/spec/lib/flapjack/gateways/jsonapi/methods/metrics_spec.rb +8 -0
  173. data/spec/lib/flapjack/gateways/jsonapi/methods/rule_links_spec.rb +212 -0
  174. data/spec/lib/flapjack/gateways/jsonapi/methods/rules_spec.rb +289 -0
  175. data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenance_links_spec.rb +49 -0
  176. data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenances_spec.rb +242 -0
  177. data/spec/lib/flapjack/gateways/jsonapi/methods/tag_links_spec.rb +274 -0
  178. data/spec/lib/flapjack/gateways/jsonapi/methods/tags_spec.rb +302 -0
  179. data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenance_links_spec.rb +49 -0
  180. data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenances_spec.rb +339 -0
  181. data/spec/lib/flapjack/gateways/jsonapi_spec.rb +1 -1
  182. data/spec/lib/flapjack/gateways/oobetet_spec.rb +151 -79
  183. data/spec/lib/flapjack/gateways/pager_duty_spec.rb +353 -0
  184. data/spec/lib/flapjack/gateways/slack_spec.rb +53 -53
  185. data/spec/lib/flapjack/gateways/sms_aspsms_spec.rb +106 -0
  186. data/spec/lib/flapjack/gateways/sms_messagenet_spec.rb +111 -54
  187. data/spec/lib/flapjack/gateways/sms_nexmo_spec.rb +50 -51
  188. data/spec/lib/flapjack/gateways/sms_twilio_spec.rb +108 -48
  189. data/spec/lib/flapjack/gateways/web_spec.rb +144 -216
  190. data/spec/lib/flapjack/notifier_spec.rb +132 -1
  191. data/spec/lib/flapjack/pikelet_spec.rb +111 -50
  192. data/spec/lib/flapjack/processor_spec.rb +210 -40
  193. data/spec/lib/flapjack/redis_proxy_spec.rb +45 -0
  194. data/spec/lib/flapjack/utility_spec.rb +11 -15
  195. data/spec/service_consumers/fixture_data.rb +547 -0
  196. data/spec/service_consumers/pact_helper.rb +21 -32
  197. data/spec/service_consumers/pacts/flapjack-diner_v2.0.json +4652 -0
  198. data/spec/service_consumers/provider_states_for_flapjack-diner.rb +279 -322
  199. data/spec/service_consumers/provider_support.rb +8 -0
  200. data/spec/spec_helper.rb +34 -44
  201. data/spec/support/erb_view_helper.rb +1 -1
  202. data/spec/support/factories.rb +58 -0
  203. data/spec/support/jsonapi_helper.rb +15 -26
  204. data/spec/support/mock_logger.rb +43 -0
  205. data/spec/support/xmpp_comparable.rb +24 -0
  206. data/src/flapjack/transport_test.go +30 -1
  207. data/tasks/dump_keys.rake +82 -0
  208. data/tasks/events.rake +7 -7
  209. data/tasks/support/flapjack_config_benchmark.toml +28 -0
  210. data/tasks/support/flapjack_config_benchmark.yaml +0 -2
  211. metadata +175 -222
  212. data/Guardfile +0 -14
  213. data/etc/flapjack_config.yaml.example +0 -477
  214. data/features/cli_flapjack-populator.feature +0 -90
  215. data/features/support/silent_system.rb +0 -4
  216. data/lib/flapjack/cli/import.rb +0 -108
  217. data/lib/flapjack/data/entity.rb +0 -652
  218. data/lib/flapjack/data/entity_check.rb +0 -1044
  219. data/lib/flapjack/data/message.rb +0 -56
  220. data/lib/flapjack/data/migration.rb +0 -234
  221. data/lib/flapjack/data/notification_rule.rb +0 -425
  222. data/lib/flapjack/data/semaphore.rb +0 -44
  223. data/lib/flapjack/data/tagged.rb +0 -48
  224. data/lib/flapjack/gateways/jsonapi/check_methods.rb +0 -206
  225. data/lib/flapjack/gateways/jsonapi/check_presenter.rb +0 -221
  226. data/lib/flapjack/gateways/jsonapi/contact_methods.rb +0 -186
  227. data/lib/flapjack/gateways/jsonapi/entity_methods.rb +0 -223
  228. data/lib/flapjack/gateways/jsonapi/medium_methods.rb +0 -185
  229. data/lib/flapjack/gateways/jsonapi/metrics_methods.rb +0 -132
  230. data/lib/flapjack/gateways/jsonapi/notification_rule_methods.rb +0 -141
  231. data/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods.rb +0 -139
  232. data/lib/flapjack/gateways/jsonapi/report_methods.rb +0 -146
  233. data/lib/flapjack/gateways/pagerduty.rb +0 -318
  234. data/lib/flapjack/gateways/pagerduty/alert.text.erb +0 -10
  235. data/lib/flapjack/gateways/web/public/css/select2-bootstrap.css +0 -87
  236. data/lib/flapjack/gateways/web/public/css/select2.css +0 -615
  237. data/lib/flapjack/gateways/web/public/css/tablesort.css +0 -67
  238. data/lib/flapjack/gateways/web/public/img/select2-spinner.gif +0 -0
  239. data/lib/flapjack/gateways/web/public/img/select2.png +0 -0
  240. data/lib/flapjack/gateways/web/public/img/select2x2.png +0 -0
  241. data/lib/flapjack/gateways/web/public/js/backbone.js +0 -1581
  242. data/lib/flapjack/gateways/web/public/js/backbone.jsonapi.js +0 -322
  243. data/lib/flapjack/gateways/web/public/js/flapjack.js +0 -82
  244. data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.js +0 -1640
  245. data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.widgets.js +0 -1390
  246. data/lib/flapjack/gateways/web/public/js/modules/contact.js +0 -520
  247. data/lib/flapjack/gateways/web/public/js/modules/entity.js +0 -28
  248. data/lib/flapjack/gateways/web/public/js/modules/medium.js +0 -40
  249. data/lib/flapjack/gateways/web/public/js/select2.js +0 -3397
  250. data/lib/flapjack/gateways/web/public/js/tablesort.js +0 -44
  251. data/lib/flapjack/gateways/web/public/js/underscore.js +0 -1276
  252. data/lib/flapjack/gateways/web/views/edit_contacts.html.erb +0 -173
  253. data/lib/flapjack/gateways/web/views/entities.html.erb +0 -30
  254. data/lib/flapjack/gateways/web/views/entity.html.erb +0 -51
  255. data/lib/flapjack/rack_logger.rb +0 -47
  256. data/lib/flapjack/redis_pool.rb +0 -42
  257. data/spec/lib/flapjack/data/entity_check_spec.rb +0 -1418
  258. data/spec/lib/flapjack/data/entity_spec.rb +0 -872
  259. data/spec/lib/flapjack/data/message_spec.rb +0 -30
  260. data/spec/lib/flapjack/data/migration_spec.rb +0 -104
  261. data/spec/lib/flapjack/data/notification_rule_spec.rb +0 -232
  262. data/spec/lib/flapjack/data/notification_spec.rb +0 -53
  263. data/spec/lib/flapjack/data/semaphore_spec.rb +0 -24
  264. data/spec/lib/flapjack/filters/acknowledgement_spec.rb +0 -6
  265. data/spec/lib/flapjack/filters/delays_spec.rb +0 -6
  266. data/spec/lib/flapjack/filters/ok_spec.rb +0 -6
  267. data/spec/lib/flapjack/filters/scheduled_maintenance_spec.rb +0 -6
  268. data/spec/lib/flapjack/filters/unscheduled_maintenance_spec.rb +0 -6
  269. data/spec/lib/flapjack/gateways/jsonapi/check_methods_spec.rb +0 -315
  270. data/spec/lib/flapjack/gateways/jsonapi/check_presenter_spec.rb +0 -223
  271. data/spec/lib/flapjack/gateways/jsonapi/contact_methods_spec.rb +0 -131
  272. data/spec/lib/flapjack/gateways/jsonapi/entity_methods_spec.rb +0 -389
  273. data/spec/lib/flapjack/gateways/jsonapi/medium_methods_spec.rb +0 -231
  274. data/spec/lib/flapjack/gateways/jsonapi/notification_rule_methods_spec.rb +0 -169
  275. data/spec/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods_spec.rb +0 -114
  276. data/spec/lib/flapjack/gateways/jsonapi/report_methods_spec.rb +0 -590
  277. data/spec/lib/flapjack/gateways/pagerduty_spec.rb +0 -249
  278. data/spec/lib/flapjack/gateways/web/views/check.html.erb_spec.rb +0 -21
  279. data/spec/lib/flapjack/gateways/web/views/contact.html.erb_spec.rb +0 -24
  280. data/spec/lib/flapjack/gateways/web/views/index.html.erb_spec.rb +0 -16
  281. data/spec/lib/flapjack/redis_pool_spec.rb +0 -29
  282. data/spec/service_consumers/pacts/flapjack-diner_v1.0.json +0 -4702
  283. data/tasks/entities.rake +0 -151
  284. data/tasks/profile.rake +0 -282
  285. data/tmp/acknowledge.rb +0 -13
  286. data/tmp/create_config_yaml.rb +0 -16
  287. data/tmp/create_event_ok.rb +0 -30
  288. data/tmp/create_event_unknown.rb +0 -30
  289. data/tmp/create_events_failure.rb +0 -34
  290. data/tmp/create_events_ok.rb +0 -32
  291. data/tmp/create_events_ok_fail_ack_ok.rb +0 -53
  292. data/tmp/create_events_ok_failure.rb +0 -41
  293. data/tmp/create_events_ok_failure_ack.rb +0 -53
  294. data/tmp/dummy_contacts.json +0 -43
  295. data/tmp/dummy_entities.json +0 -37
  296. data/tmp/generate_nagios_test_hosts.rb +0 -16
  297. data/tmp/notification_rules.rb +0 -73
  298. data/tmp/parse_config_yaml.rb +0 -7
  299. data/tmp/redis_find_spurious_unknown_states.rb +0 -52
  300. data/tmp/test_json_post.rb +0 -19
  301. data/tmp/test_notification_rules_api.rb +0 -171
@@ -1,7 +1,3 @@
1
- Given /^I am at the project root$/ do
2
- expect(Dir.pwd.split('/').last).to eq("flapjack")
3
- end
4
-
5
1
  Then /^I should see (\d+) lines of output$/ do |number|
6
2
  expect(@output.split.size).to eq(number.to_i)
7
3
  end
@@ -7,14 +7,8 @@ require 'active_support/time'
7
7
  When /^(.+) passes$/ do |time|
8
8
  period = Chronic.parse("#{time} from now")
9
9
  RedisDelorean.time_travel_to(period)
10
- #puts "Time Travelled to #{Time.now.to_s}"
11
10
  end
12
11
 
13
- # Given /^I time travel to (.+)$/ do |period|
14
- # RedisDelorean.time_travel_to(period)
15
- # # puts "Time Travelled to #{Time.now.to_s}"
16
- # end
17
-
18
12
  Given /^the timezone is (.*)$/ do |tz|
19
13
  Time.zone = tz
20
14
  Chronic.time_class = Time.zone
@@ -22,24 +16,4 @@ end
22
16
 
23
17
  Given /^the time is (.*)$/ do |time|
24
18
  RedisDelorean.time_travel_to(Chronic.parse("#{time}"))
25
- #puts "Time Travelled to #{Time.now.to_s}"
26
19
  end
27
-
28
- # Given /^I come back to the present$/ do
29
- # RedisDelorean.back_to_the_present
30
- # # puts "Time Travelled to the present, #{Time.now.to_s}"
31
- # end
32
-
33
- # Given /^I time travel in (.+) to (.+)$/ do |zone_name, timestamp|
34
- # zone = ::Time.find_zone!(zone_name)
35
- # time = zone.parse timestamp
36
- # RedisDelorean.time_travel_to time
37
- # # puts "Time Travelled to #{Time.now.to_s}"
38
- # end
39
-
40
- # Then /^the time in UTC should be about (.+)$/ do |timestamp|
41
- # actual = Time.now.in_time_zone('UTC')
42
- # expected = Time.parse("#{timestamp} UTC")
43
- # (expected..expected+5).cover?(actual).should be true
44
- # end
45
-
@@ -59,13 +59,9 @@ def kill_lingering_processes
59
59
  puts green("Process #{pid} has already exited.") if @debug
60
60
  end
61
61
 
62
- if @debug
63
- if process
64
- puts blue("Output from #{pid} #{command}\n")
65
- puts process.read + "\n"
66
- else
67
- # TODO capture STDOUT from daemonize?
68
- end
62
+ if @debug && !process.nil?
63
+ puts blue("Output from #{pid} #{command}\n")
64
+ puts process.read + "\n"
69
65
  end
70
66
  end
71
67
  puts yellow("Done killing processes") if @debug
@@ -80,36 +76,15 @@ def time_and_pid_from_file(pid_file, cutoff_time = nil)
80
76
  end
81
77
 
82
78
  def spawn_process(command, opts={})
83
- @daemons_output ||= []
84
- @daemons_exit_status ||= []
85
-
86
79
  puts yellow("Running: #{command}") if @debug
87
80
 
88
81
  process_h = nil
89
82
 
90
83
  file = opts[:daemon_pidfile]
91
84
 
92
- if file
93
- time = Time.now
94
- attempts = 0
95
-
96
- @daemons_output << `#{command}`
97
- @daemons_exit_status << $?
98
-
99
- while attempts < 50
100
- time_and_pid = time_and_pid_from_file(file, time)
101
- if time_and_pid
102
- process_h = {:pid => time_and_pid.last, :command => command}
103
- break
104
- end
105
- attempts += 1
106
- sleep 0.2
107
- end
108
- else
109
- process = IO.popen(command)
110
- pid = process.pid
111
- process_h = {:process => process, :command => command}
112
- end
85
+ process = IO.popen(command)
86
+ pid = process.pid
87
+ process_h = {:process => process, :command => command}
113
88
 
114
89
  raise "failed to spawn process #{command}" if process_h.nil?
115
90
 
@@ -6,9 +6,8 @@ require 'delorean'
6
6
  require 'chronic'
7
7
  require 'active_support/time'
8
8
  require 'ice_cube'
9
+
9
10
  require 'flapjack/configuration'
10
- require 'flapjack/data/entity_check'
11
- require 'flapjack/data/event'
12
11
 
13
12
  if ENV['COVERAGE']
14
13
  require 'simplecov'
@@ -16,16 +15,19 @@ if ENV['COVERAGE']
16
15
  add_filter '/features/'
17
16
  end
18
17
  SimpleCov.at_exit do
18
+ # Oj.default_options = { :mode => :compat }
19
19
  SimpleCov.result.format!
20
20
  end
21
21
  end
22
22
 
23
23
  @debug = false
24
24
 
25
- ENV["FLAPJACK_ENV"] = 'test'
25
+ require 'i18n'
26
+ I18n.config.enforce_available_locales = true
27
+
26
28
  FLAPJACK_ENV = 'test'
27
29
  FLAPJACK_ROOT = File.join(File.dirname(__FILE__), '..', '..')
28
- FLAPJACK_CONFIG = File.join(FLAPJACK_ROOT, 'etc', 'flapjack_config.yaml')
30
+ FLAPJACK_CONFIG = File.join(FLAPJACK_ROOT, 'etc', 'flapjack_test_config.toml')
29
31
 
30
32
  $: << File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
31
33
 
@@ -35,29 +37,40 @@ require 'webmock/cucumber'
35
37
  WebMock.disable_net_connect!
36
38
 
37
39
  require 'flapjack'
40
+ require 'flapjack/patches'
41
+ require 'flapjack/redis_proxy'
42
+
43
+ require 'flapjack/data/check'
44
+ require 'flapjack/data/event'
45
+
38
46
  require 'flapjack/notifier'
39
47
  require 'flapjack/processor'
40
- require 'flapjack/patches'
41
48
 
42
49
  class MockLogger
43
50
  attr_accessor :messages
44
51
 
52
+ def self.configure_log(name)
53
+ @name = name
54
+ end
55
+
45
56
  def initialize
46
57
  @messages = []
47
58
  end
48
59
 
49
60
  %w(debug info warn error fatal).each do |level|
50
61
  class_eval <<-RUBY
51
- def #{level}(msg)
52
- @messages << msg
62
+ def #{level}(msg = nil, &block)
63
+ msg = yield if msg.nil? && block_given?
64
+ @messages << '[#{level.upcase}] :: ' +
65
+ (self.class.instance_variable_get('@name') || 'flapjack') + ' :: ' + msg
53
66
  end
54
67
  RUBY
55
68
  end
56
69
  end
57
70
 
58
- # poor man's stubbing
59
- class MockEmailer
60
- include EM::Deferrable
71
+ require 'mail'
72
+ Mail.defaults do
73
+ delivery_method :test
61
74
  end
62
75
 
63
76
  class RedisDelorean
@@ -84,105 +97,85 @@ class RedisDelorean
84
97
  return deleted
85
98
  SHIFT_TTLS
86
99
 
87
- def self.before_all(options = {})
88
- redis = options[:redis]
89
- @shift_ttls_sha = redis.script(:load, ShiftTTLsScript)
90
- end
91
-
92
- def self.before_each(options = {})
93
- @redis = options[:redis]
100
+ def self.before_all
101
+ @shift_ttls_sha = Flapjack.redis.script(:load, ShiftTTLsScript)
94
102
  end
95
103
 
96
104
  def self.time_travel_to(dest_time)
97
105
  old_maybe_fake_time = Time.now.in_time_zone
98
106
  Delorean.time_travel_to(dest_time)
99
- # puts "real time is #{Time.now_without_delorean.in_time_zone}"
100
- # puts "old assumed time is #{old_maybe_fake_time}"
101
- # puts "new assumed time is #{Time.now.in_time_zone}"
102
107
 
103
- # keys_prior = @redis.keys('*')
104
-
105
- del = @redis.evalsha(@shift_ttls_sha, ['*'],
106
- [(dest_time - old_maybe_fake_time).to_i])
107
-
108
- # keys_after = @redis.keys('*')
109
-
110
- # puts "Expired #{del} key#{(del == 1) ? '' : 's'}, #{(keys_prior - keys_after).inspect}"
108
+ Flapjack.redis.evalsha(@shift_ttls_sha, ['*'],
109
+ [(dest_time - old_maybe_fake_time).to_i])
111
110
  end
112
-
113
111
  end
114
112
 
115
113
  config = Flapjack::Configuration.new
116
- redis_opts = config.load(FLAPJACK_CONFIG) ?
117
- config.for_redis.merge(:driver => :ruby) :
118
- {:db => 14, :driver => :ruby}
119
- redis = ::Redis.new(redis_opts)
120
- redis.flushdb
121
- RedisDelorean.before_all(:redis => redis)
122
- redis.quit
114
+ Flapjack::RedisProxy.config = config.load(FLAPJACK_CONFIG) ?
115
+ config.for_redis :
116
+ {:db => 14, :driver => :ruby}
117
+ Zermelo.redis = Flapjack.redis
118
+ Flapjack.redis.flushdb
119
+ RedisDelorean.before_all
120
+ Flapjack.redis.quit
123
121
 
124
122
  # Not the most efficient of operations...
125
- def redis_peek(queue, start = 0, count = nil)
126
- size = @notifier_redis.llen(queue)
123
+ def redis_peek(queue, klass, start = 0, count = nil)
124
+ size = Flapjack.redis.llen(queue)
127
125
  start = 0 if start < 0
128
126
  count = (size - start) if count.nil? || (count > (size - start))
129
127
 
130
128
  (0..(size - 1)).inject([]) do |memo, n|
131
- object = @notifier_redis.rpoplpush(queue, queue)
132
- next memo unless (n >= start || n < (start + count))
133
- memo << Flapjack.load_json(object)
129
+ obj_id = Flapjack.redis.rpoplpush(queue, queue)
130
+ next memo unless (n >= start || n < (start + count)) &&
131
+ (object = klass.find_by_id(obj_id))
132
+ memo << object
134
133
  memo
135
134
  end
136
135
  end
137
136
 
138
- Around do |scenario, blk|
139
- EM.synchrony do
140
- blk.call
141
- EM.stop
142
- end
143
- end
144
-
145
137
  Before do
146
- @redis_opts = redis_opts
147
- @logger = MockLogger.new
138
+ Flapjack.logger = MockLogger.new
148
139
  end
149
140
 
150
141
  After do
151
- @logger.messages = []
152
- @redis_opts = nil
142
+ Flapjack.logger.messages = []
143
+ WebMock.reset!
153
144
  end
154
145
 
155
146
  Before('@processor') do
156
- @processor = Flapjack::Processor.new(:logger => @logger,
157
- :redis_config => redis_opts, :config => {})
158
- @redis = @processor.instance_variable_get('@redis')
147
+ Flapjack.redis.flushdb
148
+ MockLogger.configure_log('flapjack-processor')
149
+ @processor = Flapjack::Processor.new(:boot_time => Time.now,
150
+ :config => {'new_check_scheduled_maintenance_duration' => '0 seconds'})
151
+ @processor.start_stats
159
152
  end
160
153
 
161
154
  After('@processor') do
162
- @redis.flushdb
163
- @redis.quit
164
- @redis = nil
155
+ Flapjack.redis.quit
165
156
  end
166
157
 
167
158
  Before('@notifier') do
168
- @notifier = Flapjack::Notifier.new(:logger => @logger,
169
- :redis_config => redis_opts,
159
+ Flapjack.redis.flushdb
160
+ MockLogger.configure_log('flapjack-notifier')
161
+ @notifier = Flapjack::Notifier.new(
170
162
  :config => {'email_queue' => 'email_notifications',
171
163
  'sms_queue' => 'sms_notifications',
172
164
  'sms_nexmo_queue' => 'sms_nexmo_notifications',
173
165
  'sns_queue' => 'sns_notifications',
174
166
  'default_contact_timezone' => 'America/New_York'})
175
- @notifier_redis = @notifier.instance_variable_get('@redis')
176
167
  end
177
168
 
178
169
  After('@notifier') do
179
- @notifier_redis.flushdb
180
- @notifier_redis.quit
181
- @notifier_redis = nil
170
+ Flapjack.redis.quit
171
+ end
172
+
173
+ Before('@notifications') do
174
+ Mail::TestMailer.deliveries.clear
182
175
  end
183
176
 
184
- Before('@time') do
185
- RedisDelorean.before_each(:redis => @redis || @notifier_redis)
177
+ Before('@not_jruby') do
178
+ pending if 'java'.eql?(RUBY_PLATFORM)
186
179
  end
187
180
 
188
181
  After('@time') do
@@ -190,19 +183,19 @@ After('@time') do
190
183
  end
191
184
 
192
185
  After('@process') do
193
- ['tmp/cucumber_cli/flapjack_cfg.yaml',
194
- 'tmp/cucumber_cli/flapjack_cfg.yaml.bak',
195
- 'tmp/cucumber_cli/flapjack_cfg_d.yaml',
186
+ ['tmp/cucumber_cli/flapjack_cfg.toml',
187
+ 'tmp/cucumber_cli/flapjack_cfg.toml.bak',
188
+ 'tmp/cucumber_cli/flapjack_cfg_d.toml',
196
189
  'tmp/cucumber_cli/flapjack.log',
197
190
  'tmp/cucumber_cli/flapjack.pid',
198
191
  'tmp/cucumber_cli/nagios_perfdata.fifo',
199
192
  'tmp/cucumber_cli/flapjack-nagios-receiver.pid',
200
193
  'tmp/cucumber_cli/flapjack-nagios-receiver.log',
201
- 'tmp/cucumber_cli/flapjack-nagios-receiver_d.yaml',
202
- 'tmp/cucumber_cli/flapjack-nagios-receiver.yaml',
194
+ 'tmp/cucumber_cli/flapjack-nagios-receiver_d.toml',
195
+ 'tmp/cucumber_cli/flapjack-nagios-receiver.toml',
203
196
  'tmp/cucumber_cli/flapper.pid',
204
197
  'tmp/cucumber_cli/flapper.log',
205
- 'tmp/cucumber_cli/flapjack-populator.yaml',
198
+ 'tmp/cucumber_cli/flapjack-populator.toml',
206
199
  'tmp/cucumber_cli/flapjack-populator-contacts.json',
207
200
  'tmp/cucumber_cli/flapjack-populator-entities.json',
208
201
  ].each do |file|
@@ -210,5 +203,3 @@ After('@process') do
210
203
  File.unlink(file)
211
204
  end
212
205
  end
213
-
214
-
@@ -2,45 +2,43 @@
2
2
  require File.expand_path('../lib/flapjack/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = [ "Lindsay Holmwood", "Jesse Reynolds", "Ali Graham", "Sarah Kowalik" ]
6
- gem.email = "lindsay@holmwood.id.au"
7
- gem.description = "Flapjack is a distributed monitoring notification system that provides a scalable method for processing streams of events from Nagios and deciding who should be notified"
8
- gem.summary = "Intelligent, scalable, distributed monitoring notification system."
9
- gem.homepage = "http://flapjack.io/"
5
+ gem.authors = [ 'Lindsay Holmwood', 'Jesse Reynolds', 'Ali Graham', 'Sarah Kowalik' ]
6
+ gem.email = 'lindsay@holmwood.id.au'
7
+ gem.description = 'Flapjack is a distributed monitoring notification system that provides a scalable method for processing streams of events from Nagios and deciding who should be notified'
8
+ gem.summary = 'Intelligent, scalable, distributed monitoring notification system.'
9
+ gem.homepage = 'http://flapjack.io/'
10
10
  gem.license = 'MIT'
11
11
 
12
12
  # see http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/
13
13
  # following a middle road here, not shipping it with the gem :)
14
14
  gem.files = `git ls-files`.split($\) - ['Gemfile.lock']
15
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
15
+ gem.executables = gem.files.grep(%r{^bin/}).map{|f| File.basename(f) }
16
16
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
- gem.name = "flapjack"
18
- gem.require_paths = ["lib"]
17
+ gem.name = 'flapjack'
18
+ gem.require_paths = ['lib']
19
19
  gem.version = Flapjack::VERSION
20
20
 
21
- gem.add_dependency 'dante', '= 0.2.0'
22
- gem.add_dependency 'oj', '>= 2.9.0'
23
- gem.add_dependency 'eventmachine', '~> 1.0.0'
24
- gem.add_dependency 'redis', '~> 3.0.6'
25
21
  gem.add_dependency 'hiredis'
26
- gem.add_dependency 'em-hiredis'
27
- gem.add_dependency 'em-synchrony', '~> 1.0.2'
28
- gem.add_dependency 'em-http-request'
22
+ gem.add_dependency 'redis', '>= 3.0.7'
23
+ gem.add_dependency 'json-stream'
24
+ gem.add_dependency 'zermelo', '= 1.4.3'
29
25
  gem.add_dependency 'sinatra'
30
- gem.add_dependency 'rack-fiber_pool'
31
- gem.add_dependency 'thin', '~> 1.6.1'
26
+ gem.add_dependency 'swagger-blocks'
32
27
  gem.add_dependency 'mail'
33
- gem.add_dependency 'blather', '~> 0.8.3'
28
+ gem.add_dependency 'xmpp4r', '>= 0.5.5'
29
+ gem.add_dependency 'nexmo', '= 2.0.0'
34
30
  gem.add_dependency 'chronic'
35
31
  gem.add_dependency 'chronic_duration'
36
- gem.add_dependency 'terminal-table'
37
32
  gem.add_dependency 'activesupport'
38
33
  gem.add_dependency 'ice_cube'
34
+ gem.add_dependency 'icalendar'
39
35
  gem.add_dependency 'tzinfo'
40
36
  gem.add_dependency 'tzinfo-data'
41
- gem.add_dependency 'rbtrace'
42
- gem.add_dependency 'rake'
43
- gem.add_dependency 'gli', '= 2.12.0'
44
- gem.add_dependency 'nokogiri', '= 1.6.2.1'
45
- gem.add_dependency 'nexmo', '= 2.0.0'
37
+ gem.add_dependency 'gli', '= 2.13.1'
38
+ gem.add_dependency 'terminal-table'
39
+ gem.add_dependency 'toml-rb'
40
+ gem.add_dependency 'puma'
41
+ gem.add_dependency 'flapjack-diner', '= 2.0.0b1'
42
+
43
+ gem.add_development_dependency 'rake'
46
44
  end
@@ -1,25 +1,32 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'oj'
3
+ require 'active_support/time'
4
+ require 'active_support/json/encoding'
5
+
6
+ ActiveSupport.use_standard_json_time_format = true
7
+ ActiveSupport.time_precision = 0
8
+
9
+ require 'json'
10
+
11
+ require 'flapjack/logger'
4
12
 
5
13
  module Flapjack
14
+ UUID_RE = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"
6
15
 
7
16
  DEFAULT_INITIAL_FAILURE_DELAY = 30
8
17
  DEFAULT_REPEAT_FAILURE_DELAY = 60
9
18
 
10
19
  def self.load_json(data)
11
- Oj.load(data, :mode => :strict, :symbol_keys => false)
20
+ ActiveSupport::JSON.decode(data)
12
21
  end
13
22
 
14
23
  def self.dump_json(data)
15
- Oj.dump(data, :mode => :compat, :time_format => :ruby, :indent => 0)
24
+ ActiveSupport::JSON.encode(data)
16
25
  end
17
26
 
18
27
  def self.sanitize(str)
19
28
  return str if str.nil? || !str.is_a?(String) || str.valid_encoding?
20
- return str.scrub('?') if str.respond_to?(:scrub)
21
- str.chars.collect {|c| c.valid_encoding? ? c : '?' }.join
29
+ return str.scrub('?') if str.respond_to(:scrub)
30
+ str.chars.collect {|c| c.valid_encoding? ? c : '_' }.join
22
31
  end
23
-
24
32
  end
25
-