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
@@ -0,0 +1,159 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'swagger/blocks'
4
+
5
+ require 'zermelo/records/redis'
6
+
7
+ require 'flapjack/data/extensions/short_name'
8
+ require 'flapjack/data/validators/id_validator'
9
+
10
+ require 'flapjack/data/extensions/associations'
11
+ require 'flapjack/gateways/jsonapi/data/join_descriptor'
12
+ require 'flapjack/gateways/jsonapi/data/method_descriptor'
13
+
14
+ module Flapjack
15
+ module Data
16
+ class UnscheduledMaintenance
17
+
18
+ include Zermelo::Records::RedisSortedSet
19
+ include ActiveModel::Serializers::JSON
20
+ self.include_root_in_json = false
21
+ include Swagger::Blocks
22
+
23
+ include Flapjack::Data::Extensions::Associations
24
+ include Flapjack::Data::Extensions::ShortName
25
+
26
+ define_attributes :start_time => :timestamp,
27
+ :end_time => :timestamp,
28
+ :summary => :string
29
+
30
+ define_sort_attribute :start_time
31
+
32
+ belongs_to :check, :class_name => 'Flapjack::Data::Check',
33
+ :inverse_of => :unscheduled_maintenances
34
+
35
+ # TODO :check before_set -- should fail if already set
36
+
37
+ range_index_by :start_time, :end_time
38
+
39
+ before_validation :ensure_start_time
40
+
41
+ validates :start_time, :presence => true
42
+ validates :end_time, :presence => true
43
+
44
+ validates_with Flapjack::Data::Validators::IdValidator
45
+
46
+ def duration
47
+ self.end_time - self.start_time
48
+ end
49
+
50
+ swagger_schema :UnscheduledMaintenance do
51
+ key :required, [:id, :type, :start_time, :end_time]
52
+ property :id do
53
+ key :type, :string
54
+ key :format, :uuid
55
+ end
56
+ property :type do
57
+ key :type, :string
58
+ key :enum, [Flapjack::Data::UnscheduledMaintenance.short_model_name.singular]
59
+ end
60
+ property :start_time do
61
+ key :type, :string
62
+ key :format, :"date-time"
63
+ end
64
+ property :end_time do
65
+ key :type, :string
66
+ key :format, :"date-time"
67
+ end
68
+ property :relationships do
69
+ key :"$ref", :UnscheduledMaintenanceLinks
70
+ end
71
+ end
72
+
73
+ swagger_schema :UnscheduledMaintenanceLinks do
74
+ key :required, [:check]
75
+ property :check do
76
+ key :"$ref", :CheckLinkage
77
+ end
78
+ end
79
+
80
+ swagger_schema :UnscheduledMaintenanceUpdate do
81
+ key :required, [:id, :type]
82
+ property :id do
83
+ key :type, :string
84
+ key :format, :uuid
85
+ end
86
+ property :type do
87
+ key :type, :string
88
+ key :enum, [Flapjack::Data::UnscheduledMaintenance.short_model_name.singular]
89
+ end
90
+ property :end_time do
91
+ key :type, :string
92
+ key :format, :"date-time"
93
+ end
94
+ end
95
+
96
+ def self.swagger_included_classes
97
+ # hack -- hardcoding for now
98
+ [
99
+ Flapjack::Data::Check,
100
+ Flapjack::Data::Contact,
101
+ Flapjack::Data::Medium,
102
+ Flapjack::Data::Rule,
103
+ Flapjack::Data::ScheduledMaintenance,
104
+ Flapjack::Data::State,
105
+ Flapjack::Data::Tag,
106
+ Flapjack::Data::UnscheduledMaintenance
107
+ ]
108
+ end
109
+
110
+ def self.jsonapi_methods
111
+ @jsonapi_methods ||= {
112
+ :get => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
113
+ :attributes => [:start_time, :end_time, :summary],
114
+ :descriptions => {
115
+ :singular => "Get data for an un scheduled maintenance period.",
116
+ :multiple => "Get data for multiple unscheduled maintenance periods."
117
+ }
118
+ ),
119
+ :patch => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
120
+ :attributes => [:start_time, :end_time, :summary],
121
+ :descriptions => {
122
+ :singular => "Update data for an unscheduled maintenance period.",
123
+ :multiple => "Update data for unscheduled maintenance periods.",
124
+ }
125
+ ),
126
+ :delete => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
127
+ :descriptions => {
128
+ :singular => "Delete an scheduled maintenance period.",
129
+ :multiple => "Delete unscheduled maintenance periods."
130
+ }
131
+ )
132
+ }
133
+ end
134
+
135
+ def self.jsonapi_associations
136
+ unless instance_variable_defined?('@jsonapi_associations')
137
+ @jsonapi_associations ||= {
138
+ :check => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
139
+ :get => true,
140
+ :number => :singular, :link => true, :includable => true,
141
+ :descriptions => {
142
+ :get => "Returns the check an unscheduled maintenance period applies to."
143
+ }
144
+ )
145
+ }
146
+ populate_association_data(@jsonapi_associations)
147
+ end
148
+ @jsonapi_associations
149
+ end
150
+
151
+ private
152
+
153
+ def ensure_start_time
154
+ self.start_time ||= Time.now
155
+ end
156
+
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'flapjack'
4
+
5
+ module Flapjack
6
+ module Data
7
+ module Validators
8
+ class IdValidator < ActiveModel::Validator
9
+
10
+ UUID_REGEXP = /^#{Flapjack::UUID_RE}$/
11
+
12
+ def validate(record)
13
+ if !record.id.nil? && UUID_REGEXP.match(record.id.to_s).nil?
14
+ record.errors.add(:id, 'is not a UUID')
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Flapjack
4
+ class PikeletStop < StandardError; end
5
+ class GlobalStop < StandardError; end
6
+ end
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'flapjack/data/unscheduled_maintenance'
4
+
3
5
  require 'flapjack/filters/base'
4
6
 
5
7
  module Flapjack
@@ -11,32 +13,37 @@ module Flapjack
11
13
  class Acknowledgement
12
14
  include Base
13
15
 
14
- def block?(event, entity_check, previous_state)
15
- timestamp = Time.now.to_i
16
+ def block?(check, opts = {})
17
+ old_state = opts[:old_state]
18
+ new_state = opts[:new_state]
19
+ timestamp = opts[:timestamp]
16
20
 
17
21
  label = 'Filter: Acknowledgement:'
18
22
 
19
- return false unless event.type == 'action'
20
-
21
- unless event.acknowledgement?
22
- @logger.debug("#{label} pass (not an ack)")
23
+ unless 'acknowledgement'.eql?(new_state.action)
24
+ Flapjack.logger.debug { "#{label} pass (not an ack)" }
23
25
  return false
24
26
  end
25
27
 
26
- if entity_check.nil?
27
- @logger.error "#{label} unknown entity for event '#{event.id}'"
28
- return false
29
- end
30
-
31
- unless @redis.zscore("failed_checks", event.id)
32
- @logger.debug("#{label} blocking because zscore of failed_checks for #{event.id} is false")
28
+ if old_state.nil? || Flapjack::Data::Condition.healthy?(old_state.condition)
29
+ Flapjack.logger.debug {
30
+ "#{label} blocking because check '#{check.name}' is not failing"
31
+ }
33
32
  return true
34
33
  end
35
34
 
36
- um_duration = event.duration || (4 * 60 * 60)
37
- entity_check.create_unscheduled_maintenance(timestamp, um_duration, :summary => event.summary)
35
+ end_time = timestamp + (opts[:duration] || (4 * 60 * 60))
36
+
37
+ unsched_maint = Flapjack::Data::UnscheduledMaintenance.new(:start_time => timestamp,
38
+ :end_time => end_time, :summary => new_state.summary)
39
+ unsched_maint.save
40
+
41
+ check.set_unscheduled_maintenance(unsched_maint)
38
42
 
39
- @logger.debug("#{label} pass (unscheduled maintenance created for #{event.id}, duration: #{um_duration})")
43
+ Flapjack.logger.debug{
44
+ "#{label} pass (unscheduled maintenance created for #{check.name}, " \
45
+ " duration: #{end_time - timestamp})"
46
+ }
40
47
  false
41
48
  end
42
49
  end
@@ -3,11 +3,6 @@
3
3
  module Flapjack
4
4
  module Filters
5
5
  module Base
6
- def initialize(opts={})
7
- @logger = opts[:logger]
8
- @redis = opts[:redis]
9
- end
10
-
11
6
  def name
12
7
  self.class.to_s.split('::').last
13
8
  end
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'flapjack/data/entity_check'
3
+ require 'flapjack'
4
+
4
5
  require 'flapjack/filters/base'
5
6
 
6
7
  module Flapjack
@@ -19,65 +20,74 @@ module Flapjack
19
20
  class Delays
20
21
  include Base
21
22
 
22
- def block?(event, entity_check, previous_state)
23
- initial_failure_delay = entity_check.initial_failure_delay
24
- if initial_failure_delay.nil? || (initial_failure_delay < 0)
25
- initial_failure_delay = Flapjack::DEFAULT_INITIAL_FAILURE_DELAY
26
- end
23
+ def block?(check, opts = {})
24
+ old_state = opts[:old_state]
25
+ new_state = opts[:new_state]
26
+ timestamp = opts[:timestamp]
27
27
 
28
- repeat_failure_delay = entity_check.repeat_failure_delay
29
- if repeat_failure_delay.nil? || (repeat_failure_delay < 0)
30
- repeat_failure_delay = Flapjack::DEFAULT_REPEAT_FAILURE_DELAY
31
- end
28
+ initial_failure_delay = opts[:initial_failure_delay]
29
+ repeat_failure_delay = opts[:repeat_failure_delay]
32
30
 
33
31
  label = 'Filter: Delays:'
34
32
 
35
- unless event.service? && event.failure?
36
- @logger.debug("#{label} pass - not a service event in a failure state")
37
- return false
38
- end
33
+ if new_state.nil? || !new_state.action.nil? ||
34
+ Flapjack::Data::Condition.healthy?(new_state.condition)
39
35
 
40
- unless entity_check.failed?
41
- @logger.debug("#{label} entity_check.failed? returned false ...")
36
+ Flapjack.logger.debug {
37
+ "#{label} pass - not a service event in a failure state"
38
+ }
42
39
  return false
43
40
  end
44
41
 
45
- last_problem_alert = entity_check.last_notification_for_state(:problem)[:timestamp]
46
- last_change = entity_check.last_change
47
- last_alert_state = entity_check.last_notification[:type]
48
-
49
- current_time = Time.now.to_i
50
- current_state_duration = current_time - last_change
51
- time_since_last_alert = current_time - last_problem_alert unless last_problem_alert.nil?
52
-
53
- @logger.debug("#{label} last_problem_alert: #{last_problem_alert.to_s}, " +
54
- "last_change: #{last_change.inspect}, " +
55
- "current_state_duration: #{current_state_duration.inspect}, " +
56
- "time_since_last_alert: #{time_since_last_alert.inspect}, " +
57
- "last_alert_state: [#{last_alert_state.inspect}], " +
58
- "event.state: [#{event.state.inspect}], " +
59
- "last_alert_state == event.state ? #{last_alert_state.to_s == event.state}")
60
-
61
- if current_state_duration < initial_failure_delay
62
- @logger.debug("#{label} block - duration of current failure " +
63
- "(#{current_state_duration}) is less than initial_failure_delay (#{initial_failure_delay})")
42
+ last_problem = check.latest_notifications.
43
+ intersect(:condition => Flapjack::Data::Condition.unhealthy.keys).first
44
+ last_recovery = check.latest_notifications.
45
+ intersect(:condition => Flapjack::Data::Condition.healthy.keys).first
46
+ last_ack = check.latest_notifications.
47
+ intersect(:action => 'acknowledgement').first
48
+
49
+ last_problem_time = last_problem.nil? ? nil : last_problem.created_at
50
+ last_notif = [last_problem, last_recovery, last_ack].compact.
51
+ sort_by(&:created_at).last
52
+
53
+ last_change_time = old_state.nil? ? nil : old_state.created_at
54
+
55
+ alert_type = Flapjack::Data::Alert.notification_type(new_state.action,
56
+ new_state.condition)
57
+
58
+ last_alert_type = last_notif.nil? ? nil :
59
+ Flapjack::Data::Alert.notification_type(last_notif.action, last_notif.condition)
60
+
61
+ current_condition_duration = last_change_time.nil? ? nil : (timestamp - last_change_time)
62
+ time_since_last_alert = last_problem_time.nil? ? nil : (timestamp - last_problem_time)
63
+
64
+ Flapjack.logger.debug("#{label} last_problem: #{last_problem_time || 'nil'}, " +
65
+ "last_change: #{last_change_time || 'nil'}, " +
66
+ "current_condition_duration: #{current_condition_duration || 'nil'}, " +
67
+ "time_since_last_alert: #{time_since_last_alert || 'nil'}, " +
68
+ "alert type: [#{alert_type}], " +
69
+ "last_alert_type == alert_type ? #{last_alert_type == alert_type}")
70
+
71
+ if !current_condition_duration.nil? && (current_condition_duration < initial_failure_delay)
72
+ Flapjack.logger.debug("#{label} block - duration of current failure " +
73
+ "(#{current_condition_duration}) is less than failure_delay (#{initial_failure_delay})")
64
74
  return true
65
75
  end
66
76
 
67
- if !last_problem_alert.nil? && (time_since_last_alert < repeat_failure_delay) &&
68
- (last_alert_state.to_s == event.state)
77
+ if !(last_problem_time.nil? || time_since_last_alert.nil?) &&
78
+ (time_since_last_alert <= repeat_failure_delay) &&
79
+ (last_alert_type == alert_type)
69
80
 
70
- @logger.debug("#{label} block - time since last alert for " +
81
+ Flapjack.logger.debug("#{label} block - time since last alert for " +
71
82
  "current problem (#{time_since_last_alert}) is less than " +
72
- "repeat_failure_delay (#{repeat_failure_delay}) and last alert state (#{last_alert_state}) " +
73
- "is equal to current event state (#{event.state})")
83
+ "repeat_failure_delay (#{repeat_failure_delay}) and last alert type (#{last_alert_type}) " +
84
+ "is equal to current alert type (#{alert_type})")
74
85
  return true
75
86
  end
76
87
 
77
- @logger.debug("#{label} pass - not blocking because neither of the time comparison " +
88
+ Flapjack.logger.debug("#{label} pass - not blocking because neither of the time comparison " +
78
89
  "conditions were met")
79
- return false
80
-
90
+ false
81
91
  end
82
92
  end
83
93
  end
@@ -13,34 +13,43 @@ module Flapjack
13
13
  class Ok
14
14
  include Base
15
15
 
16
- def block?(event, entity_check, previous_state)
17
- unless event.ok?
18
- @logger.debug("Filter: Ok: pass")
16
+ def block?(check, opts = {})
17
+ old_state = opts[:old_state]
18
+ new_state = opts[:new_state]
19
+ timestamp = opts[:timestamp]
20
+
21
+ if !new_state.nil? && !(new_state.action.nil? &&
22
+ Flapjack::Data::Condition.healthy?(new_state.condition))
23
+
24
+ Flapjack.logger.debug("Filter: Ok: pass")
19
25
  return false
20
26
  end
21
27
 
22
- entity_check.end_unscheduled_maintenance(Time.now.to_i)
28
+ check.clear_unscheduled_maintenance(timestamp)
23
29
 
24
- if previous_state == 'ok'
25
- @logger.debug("Filter: Ok: block - previous state was ok, so blocking")
30
+ if old_state.nil? || Flapjack::Data::Condition.healthy?(old_state.condition)
31
+ Flapjack.logger.debug("Filter: Ok: block - previous state was ok, so blocking")
32
+ Flapjack.logger.debug(old_state.inspect)
33
+ Flapjack.logger.debug(new_state.inspect) unless new_state.nil?
26
34
  return true
27
35
  end
28
36
 
29
- last_notification = entity_check.last_notification
30
- @logger.debug("Filter: Ok: last notification: #{last_notification.inspect}")
37
+ last_notification = check.latest_notifications.first
31
38
 
32
- unless last_notification[:type]
33
- @logger.debug("Filter: Ok: block - last notification type is nil (never notified)")
39
+ if last_notification.nil?
40
+ Flapjack.logger.debug("Filter: Ok: block - last notification is nil (never notified)")
34
41
  return true
35
42
  end
36
43
 
37
- if [:recovery, :ok].include?(last_notification[:type])
38
- @logger.debug("Filter: Ok: block - last notification was a recovery")
44
+ Flapjack.logger.debug("Filter: Ok: last notification: #{last_notification.inspect}")
45
+
46
+ if Flapjack::Data::Condition.healthy?(last_notification.condition)
47
+ Flapjack.logger.debug("Filter: Ok: block - last notification was a recovery")
39
48
  return true
40
49
  end
41
50
 
42
- @logger.debug("Filter: Ok: previous_state: #{previous_state}")
43
- @logger.debug("Filter: Ok: pass")
51
+ Flapjack.logger.debug("Filter: Ok: old_state: #{old_state.inspect}")
52
+ Flapjack.logger.debug("Filter: Ok: pass")
44
53
  false
45
54
  end
46
55
  end
@@ -7,9 +7,9 @@ module Flapjack
7
7
  class ScheduledMaintenance
8
8
  include Base
9
9
 
10
- def block?(event, entity_check, previous_state)
11
- result = entity_check.in_scheduled_maintenance?
12
- @logger.debug("Filter: Scheduled Maintenance: #{result ? "block" : "pass"}")
10
+ def block?(check, opts = {})
11
+ result = check.in_scheduled_maintenance?
12
+ Flapjack.logger.debug("Filter: Scheduled Maintenance: #{result ? "block" : "pass"}")
13
13
  result
14
14
  end
15
15
  end