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,132 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'sinatra/base'
4
-
5
- require 'flapjack/data/contact'
6
-
7
- module Flapjack
8
-
9
- module Gateways
10
-
11
- class JSONAPI < Sinatra::Base
12
-
13
- module MetricsMethods
14
-
15
- module Helpers
16
-
17
- def fqdn
18
- `/bin/hostname -f`.chomp
19
- end
20
-
21
- def pid
22
- Process.pid
23
- end
24
-
25
- def total_keys
26
- redis.dbsize
27
- end
28
-
29
- def event_queue_length
30
- redis.llen('events')
31
- end
32
-
33
- def events
34
- { 'processed' => processed_events,
35
- 'queue' => {'length' => event_queue_length}
36
- }
37
- end
38
-
39
- def processed_events
40
- Hash[redis.hgetall('event_counters').map {|k,v| [k,v.to_i] }]
41
- end
42
-
43
- def processed_events_all_time
44
- { 'all_time' => processed_events }
45
- end
46
-
47
- def check_freshness
48
- freshnesses = [0, 60, 300, 900, 3600]
49
- options = {
50
- :redis => redis,
51
- :counts => true
52
- }
53
- Flapjack::Data::EntityCheck.find_all_split_by_freshness(freshnesses, options)
54
- end
55
-
56
- def entities
57
- {
58
- 'all' => Flapjack::Data::Entity.all(:redis => redis).length,
59
- 'enabled' => Flapjack::Data::Entity.all(:enabled => true, :redis => redis).length,
60
- 'failing' => Flapjack::Data::Entity.find_all_names_with_failing_checks(:redis => redis).length,
61
- }
62
- end
63
-
64
- def checks
65
- {
66
- 'all' => Flapjack::Data::EntityCheck.count_current(:redis => redis),
67
- 'failing' => Flapjack::Data::EntityCheck.count_current_failing(:redis => redis),
68
- }
69
- end
70
-
71
- def filter_query(query)
72
- case
73
- when query == 'all', query.empty?
74
- 'all'
75
- else
76
- filter = query.split(',')
77
- filter.find {|q| q == 'all'} ? 'all' : filter
78
- end
79
- end
80
- end
81
-
82
- def self.registered(app)
83
- app.helpers Flapjack::Gateways::JSONAPI::Helpers
84
- app.helpers Flapjack::Gateways::JSONAPI::MetricsMethods::Helpers
85
-
86
- app.get %r{^/metrics$} do
87
-
88
- filter = params[:filter] ? filter_query(params[:filter]) : 'all'
89
-
90
- keys = %w(fqdn pid total_keys processed_events_all_time event_queue_length check_freshness entities checks)
91
- keys = keys.find_all {|m| filter.include?(m) } unless filter == 'all'
92
-
93
- metrics = {}
94
- keys.each do |key|
95
- metrics[key] = self.send(key.to_sym)
96
- end
97
-
98
- Flapjack.dump_json(metrics)
99
- end
100
-
101
- app.get %r{^/metrics/check_freshness$} do
102
- cf = self.check_freshness
103
- Flapjack.dump_json({"check_freshness" => {
104
- "from_0_to_60" => cf[0],
105
- "from_60_to_300" => cf[60],
106
- "from_300_to_900" => cf[300],
107
- "from_900_to_3600" => cf[900],
108
- "from_3600_to_∞" => cf[3600]
109
- }})
110
- end
111
-
112
- app.get %r{^/metrics/entities$} do
113
- Flapjack.dump_json({"entities" => entities})
114
- end
115
-
116
- app.get %r{^/metrics/checks$} do
117
- Flapjack.dump_json({"checks" => checks})
118
- end
119
-
120
- app.get %r{^/metrics/events$} do
121
- Flapjack.dump_json({"events" => events})
122
- end
123
-
124
- end
125
-
126
- end
127
-
128
- end
129
-
130
- end
131
-
132
- end
@@ -1,141 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'sinatra/base'
4
-
5
- require 'flapjack/data/contact'
6
- require 'flapjack/data/notification_rule'
7
-
8
- module Flapjack
9
-
10
- module Gateways
11
-
12
- class JSONAPI < Sinatra::Base
13
-
14
- module NotificationRuleMethods
15
-
16
- # module Helpers
17
- # end
18
-
19
- def self.registered(app)
20
- app.helpers Flapjack::Gateways::JSONAPI::Helpers
21
- # app.helpers Flapjack::Gateways::JSONAPI::NotificationRuleMethods::Helpers
22
-
23
- # Creates a notification rule or rules for a contact
24
- app.post '/contacts/:contact_id/notification_rules' do
25
- rules_data = params[:notification_rules]
26
-
27
- if rules_data.nil? || !rules_data.is_a?(Enumerable)
28
- halt err(422, "No valid notification rules were submitted")
29
- end
30
-
31
- contact = find_contact(params[:contact_id])
32
-
33
- errors = []
34
- rules_data.each do |rule_data|
35
- errors << Flapjack::Data::NotificationRule.prevalidate_data(symbolize(rule_data), {:logger => logger})
36
- end
37
- errors.compact!
38
-
39
- unless errors.nil? || errors.empty?
40
- halt err(422, *errors)
41
- end
42
-
43
- rules = []
44
- errors = []
45
- rules_data.each do |rule_data|
46
- rule_data = symbolize(rule_data)
47
- rule_or_errors = contact.add_notification_rule(rule_data, :logger => logger)
48
- if rule_or_errors.respond_to?(:critical_media)
49
- rules << rule_or_errors
50
- else
51
- errors << rule_or_errors
52
- end
53
- end
54
-
55
- if rules.empty?
56
- halt err(422, *errors)
57
- else
58
- if errors.empty?
59
- status 201
60
- else
61
- logger.warn("Errors during bulk notification rules creation: " + errors.join(', '))
62
- halt 200
63
- end
64
- end
65
-
66
- rule_ids = rules.map {|r| r.id}
67
-
68
- unless rule_ids.empty?
69
- response.headers['Location'] = "#{base_url}/notification_rules/#{rule_ids.join(',')}"
70
- Flapjack.dump_json(rule_ids)
71
- end
72
- end
73
-
74
- app.get %r{^/notification_rules(?:/)?([^/]+)?$} do
75
- requested_notification_rules = if params[:captures] && params[:captures][0]
76
- params[:captures][0].split(',').uniq
77
- else
78
- nil
79
- end
80
-
81
- notification_rules = if requested_notification_rules
82
- Flapjack::Data::NotificationRule.find_by_ids(requested_notification_rules, :logger => logger, :redis => redis)
83
- else
84
- Flapjack::Data::NotificationRule.all(:redis => redis).reject {|nr| nr.id.nil? || nr.id.empty? }
85
- end
86
- notification_rules.compact!
87
-
88
- if requested_notification_rules && notification_rules.empty?
89
- raise Flapjack::Gateways::JSONAPI::NotificationRulesNotFound.new(requested_notification_rules)
90
- end
91
-
92
- notification_rules_json = notification_rules.collect {|notification_rule|
93
- notification_rule.to_jsonapi
94
- }.join(", ")
95
-
96
- '{"notification_rules":[' + notification_rules_json + ']}'
97
- end
98
-
99
- app.patch '/notification_rules/:id' do
100
- params[:id].split(',').collect {|rule_id|
101
- find_rule(rule_id)
102
- }.each do |rule|
103
- apply_json_patch('notification_rules') do |op, property, linked, value|
104
- case op
105
- when 'replace'
106
- case property
107
- when 'entities', 'regex_entities', 'tags', 'regex_tags',
108
- 'time_restrictions', 'unknown_media', 'warning_media',
109
- 'critical_media', 'unknown_blackhole', 'warning_blackhole',
110
- 'critical_blackhole'
111
-
112
- rule.update({property.to_sym => value}, :logger => logger)
113
- end
114
- end
115
- end
116
- end
117
-
118
- status 204
119
- end
120
-
121
- # Deletes one or more notification rules
122
- app.delete '/notification_rules/:id' do
123
- params[:id].split(',').each do |rule_id|
124
- rule = find_rule(rule_id)
125
- logger.debug("rule to delete: #{rule.inspect}, contact_id: #{rule.contact_id}")
126
- contact = find_contact(rule.contact_id)
127
- contact.delete_notification_rule(rule)
128
- end
129
-
130
- status 204
131
- end
132
-
133
- end
134
-
135
- end
136
-
137
- end
138
-
139
- end
140
-
141
- end
@@ -1,139 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'sinatra/base'
4
-
5
- require 'flapjack/data/contact'
6
-
7
- module Flapjack
8
-
9
- module Gateways
10
-
11
- class JSONAPI < Sinatra::Base
12
-
13
- module PagerdutyCredentialMethods
14
-
15
- SEMAPHORE_CONTACT_MASS_UPDATE = 'contact_mass_update'
16
-
17
- # module Helpers
18
- # end
19
-
20
- def self.registered(app)
21
- app.helpers Flapjack::Gateways::JSONAPI::Helpers
22
- # app.helpers Flapjack::Gateways::JSONAPI::PagerdutyCredentialMethods::Helpers
23
-
24
- # Creates/overwrites pagerduty credentials for a contact
25
- app.post '/contacts/:contact_id/pagerduty_credentials' do
26
-
27
- pagerduty_credentials_data = params[:pagerduty_credentials]
28
-
29
- if pagerduty_credentials_data.nil? || !pagerduty_credentials_data.is_a?(Enumerable)
30
- halt err(422, "No valid pagerduty credentials were submitted")
31
- end
32
-
33
- fields = ['service_key', 'subdomain', 'token', 'username', 'password']
34
-
35
- pagerduty_credential = pagerduty_credentials_data.last
36
-
37
- if pagerduty_credential.nil? || !pagerduty_credential.is_a?(Hash)
38
- halt err(422, "No valid pagerduty credentials were submitted")
39
- end
40
-
41
- if (fields | pagerduty_credential.keys).size != fields.size
42
- halt err(422, "Pagerduty credential data has incorrect fields")
43
- end
44
-
45
- semaphore = obtain_semaphore(SEMAPHORE_CONTACT_MASS_UPDATE)
46
- contact = Flapjack::Data::Contact.find_by_id(params[:contact_id], :redis => redis)
47
- if contact.nil?
48
- semaphore.release
49
- halt err(422, "Contact id: '#{params[:contact_id]}' could not be loaded")
50
- end
51
-
52
- pagerduty_credential_data = fields.inject({}) do |memo, field|
53
- memo[field] = pagerduty_credential[field]
54
- memo
55
- end
56
-
57
- contact.set_pagerduty_credentials(pagerduty_credential_data)
58
- semaphore.release
59
-
60
- pagerduty_credential_data['links'] = {'contacts' => [contact.id]}
61
-
62
- status 201
63
- response.headers['Location'] = "#{base_url}/pagerduty_credentials/#{contact.id}"
64
- Flapjack.dump_json([contact.id])
65
- end
66
-
67
- app.get %r{^/pagerduty_credentials(?:/)?([^/]+)?$} do
68
- contacts = if params[:captures] && params[:captures][0]
69
- params[:captures][0].split(',').uniq.collect {|c_id| find_contact(c_id)}
70
- else
71
- Flapjack::Data::Contact.all(:redis => redis)
72
- end
73
-
74
- pagerduty_credentials_data = contacts.inject([]) do |memo, contact|
75
- pdc = contact.pagerduty_credentials
76
-
77
- unless pdc.nil?
78
- pd_data = pdc.clone
79
- pd_data['links'] = {'contacts' => [contact.id]}
80
- memo << pd_data
81
- end
82
-
83
- memo
84
- end
85
-
86
- '{"pagerduty_credentials":' + Flapjack.dump_json(pagerduty_credentials_data) + '}'
87
- end
88
-
89
- # update one or more sets of pagerduty credentials
90
- app.patch '/pagerduty_credentials/:contact_id' do
91
- params[:contact_id].split(',').uniq.collect {|c_id| find_contact(c_id)}.each do |contact|
92
- apply_json_patch('pagerduty_credentials') do |op, property, linked, value|
93
- if 'replace'.eql?(op)
94
-
95
- pdc = contact.pagerduty_credentials
96
- pd_data = pdc.nil? ? {} : pdc.clone
97
-
98
- case property
99
- when 'service_key'
100
- pd_data['service_key'] = value
101
- contact.set_pagerduty_credentials(pd_data)
102
- when 'subdomain'
103
- pd_data['subdomain'] = value
104
- contact.set_pagerduty_credentials(pd_data)
105
- when 'token'
106
- pd_data['token'] = value
107
- contact.set_pagerduty_credentials(pd_data)
108
- when 'username'
109
- pd_data['username'] = value
110
- contact.set_pagerduty_credentials(pd_data)
111
- when 'password'
112
- pd_data['password'] = value
113
- contact.set_pagerduty_credentials(pd_data)
114
- end
115
- end
116
- end
117
- end
118
-
119
- status 204
120
- end
121
-
122
- app.delete '/pagerduty_credentials/:contact_id' do
123
- params[:contact_id].split(',').uniq.collect {|c_id|
124
- find_contact(c_id)
125
- }.each {|contact|
126
- contact.delete_pagerduty_credentials
127
- }
128
- status 204
129
- end
130
-
131
- end
132
-
133
- end
134
-
135
- end
136
-
137
- end
138
-
139
- end
@@ -1,146 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'sinatra/base'
4
-
5
- require 'flapjack/data/entity'
6
- require 'flapjack/data/entity_check'
7
-
8
- require 'flapjack/gateways/jsonapi/check_presenter'
9
-
10
- module Flapjack
11
-
12
- module Gateways
13
-
14
- class JSONAPI < Sinatra::Base
15
-
16
- module ReportMethods
17
-
18
- module Helpers
19
-
20
- def load_api_data(entity_ids, event_ids, &block)
21
- entities = if entity_ids.nil?
22
- Flapjack::Data::Entity.all(:redis => redis)
23
- elsif !entity_ids.empty?
24
- entity_ids.collect {|entity_id| find_entity_by_id(entity_id) }
25
- else
26
- nil
27
- end
28
-
29
- checks = if event_ids.nil?
30
- Flapjack::Data::EntityCheck.find_current_names(:redis => redis).
31
- each_with_object([]) do |check_name, memo|
32
- en, cn = check_name.split(':', 2)
33
- halt(err(400, 'Malformed check ID')) if en.nil? || cn.nil?
34
- logger.debug("Flapjack::Gateways::JSONAPI::ReportMethods::Helpers#load_api_data entity: #{en}, check: #{cn}")
35
-
36
- memo << find_entity_check_by_name(en, cn)
37
- end
38
- elsif !event_ids.empty?
39
- event_ids.each_with_object([]) do |event_id, memo|
40
- en, cn = event_id.split(':', 2)
41
- halt(err(400, 'Malformed check ID')) if en.nil? || cn.nil?
42
- memo << find_entity_check_by_name(en, cn)
43
- end
44
- else
45
- nil
46
- end
47
-
48
- entities_by_id = {}
49
- entity_checks_by_entity_id = {}
50
-
51
- (entities || []).each do |entity|
52
- entities_by_id[entity.id] = entity
53
- entity_checks_by_entity_id[entity.id] = entity.check_list.collect {|check_name|
54
- find_entity_check(entity, check_name)
55
- }
56
- end
57
-
58
- (checks || []).each do |check|
59
- check_entity = check.entity
60
- check_entity_id = check_entity.id
61
- entities_by_id[check_entity_id] ||= check_entity
62
-
63
- entity_checks_by_entity_id[check_entity_id] ||= []
64
- entity_checks_by_entity_id[check_entity_id] << check
65
- end
66
-
67
- entity_data = entities_by_id.inject([]) do |memo, (entity_id, entity)|
68
- entity_name = entity.name
69
- memo << {
70
- 'id' => entity_id,
71
- 'name' => entity_name,
72
- 'links' => {
73
- 'checks' => entity_checks_by_entity_id[entity_id].collect {|entity_check|
74
- "#{entity_name}:#{entity_check.check}"
75
- },
76
- }
77
- }
78
- memo
79
- end
80
-
81
- report_data = []
82
- entity_check_data = []
83
-
84
- entity_checks_by_entity_id.each_pair do |entity_id, entity_checks|
85
- entity = entities_by_id[entity_id]
86
- entity_checks.each do |entity_check|
87
- entity_check_name = entity_check.check
88
- entity_check_id = "#{entity.name}:#{entity_check.check}"
89
- report_data << yield(Flapjack::Gateways::JSONAPI::CheckPresenter.new(entity_check)).
90
- merge('links' => {
91
- 'entity' => [entity_id],
92
- 'check' => [entity_check_id],
93
- })
94
- entity_check_data << {
95
- 'id' => entity_check_id,
96
- 'name' => entity_check_name
97
- }
98
- end
99
- end
100
-
101
- [report_data, entity_data, entity_check_data]
102
- end
103
-
104
- end
105
-
106
- def self.registered(app)
107
- app.helpers Flapjack::Gateways::JSONAPI::Helpers
108
- app.helpers Flapjack::Gateways::JSONAPI::ReportMethods::Helpers
109
-
110
- app.get %r{^/(status|outage|(?:un)?scheduled_maintenance|downtime)_report/(entities|checks)(?:/([^/]+))?$} do
111
- entities_or_checks = params[:captures][1]
112
- action = params[:captures][0]
113
-
114
- args = []
115
- unless 'status'.eql?(action)
116
- args += [validate_and_parsetime(params[:start_time]),
117
- validate_and_parsetime(params[:end_time])]
118
- end
119
-
120
- report_data, entity_data, check_data = case entities_or_checks
121
- when 'entities'
122
- entity_ids = params[:captures][2].nil? ? nil : params[:captures][2].split(',')
123
- load_api_data(entity_ids, []) {|presenter|
124
- presenter.send(action, *args)
125
- }
126
- when 'checks'
127
- entity_check_names = params[:captures][2].nil? ? nil : params[:captures][2].split(',')
128
- load_api_data([], entity_check_names) {|presenter|
129
- presenter.send(action, *args)
130
- }
131
- end
132
-
133
- "{\"#{action}_reports\":" + Flapjack.dump_json(report_data) + "," +
134
- "\"linked\":{\"entities\":" + Flapjack.dump_json(entity_data) + "," +
135
- "\"checks\":" + Flapjack.dump_json(check_data) + "}}"
136
- end
137
-
138
- end
139
-
140
- end
141
-
142
- end
143
-
144
- end
145
-
146
- end