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
@@ -62,11 +62,10 @@ $(document).ready(function() {
62
62
 
63
63
  function updateData() {
64
64
  var api_url = $('div#data-api-url').data('api-url');
65
- $.get(api_url + 'metrics?filter=event_queue_length', function(json) {
65
+ $.get(api_url + 'metrics?fields=event_queue_length', function(json) {
66
66
  var d = new Date().getTime();
67
67
  var value = {x: d, y: json.event_queue_length}
68
68
  data[0].values.push(value);
69
- // console.log(data[0].values.length);
70
69
 
71
70
  // Remove old data, to keep the graph performant
72
71
  if (data[0].values.length > 100) {
@@ -0,0 +1,19 @@
1
+ <% if instance_variable_defined?('@pagination') && !@pagination.nil? %>
2
+ <ul class="pagination">
3
+ <% if @pagination[:page] == 1 %>
4
+ <li class="disabled"><span>&laquo;</span></li>
5
+ <li class="disabled"><span>&lt;</span></li>
6
+ <% else %>
7
+ <li><a href="<%= @links[:first] %>">&laquo;</a></li>
8
+ <li><a href="<%= @links[:prev] %>">&lt;</a></li>
9
+ <% end %>
10
+
11
+ <% if @pagination[:page] >= @pagination[:total_pages] %>
12
+ <li class="disabled"><span>&gt;</span></li>
13
+ <li class="disabled"><span>&raquo;</span></li>
14
+ <% else %>
15
+ <li><a href="<%= @links[:next] %>">&gt;</a></li>
16
+ <li><a href="<%= @links[:last] %>">&raquo;</a></li>
17
+ <% end %>
18
+ </ul>
19
+ <% end %>
@@ -1,18 +1,19 @@
1
- <% page_title "#{h(@check)} on #{h(@entity)}" %>
2
- <%
3
- check_path_escaped = u(@entity) << '/' << u(@check)
4
- current_time = Time.now
5
- %>
1
+ <% unless @error.nil? %>
2
+ <div class="alert alert-danger" role="alert">
3
+ <%= h @error %>
4
+ </div>
5
+ <% end %>
6
+
7
+ <% page_title "#{h(@check[:name])}" %>
6
8
  <div class="page-header">
7
- <% entity_link = @base_url + "entity/" << u(@entity) %>
8
- <h2><%= h @check %> on <a href="<%= entity_link %>" title="entity summary"><%= h @entity %></a></h2>
9
+ <h2><%= h @check[:name] %></h2>
9
10
  </div>
10
11
 
11
12
  <div class="row">
12
13
  <div id="state" class="col-md-6">
13
14
  <%
14
- state_qualifier = @check_enabled ? '' : "DISABLED. Last "
15
- state_class = case @check_state
15
+ state_qualifier = @check[:enabled] ? '' : "DISABLED. Last "
16
+ state_class = case @check[:condition]
16
17
  when 'ok'
17
18
  'success'
18
19
  when 'warning'
@@ -20,22 +21,25 @@
20
21
  when 'critical'
21
22
  'danger'
22
23
  else
23
- "info #{@check_state}"
24
+ "info #{@check[:condition]}"
24
25
  end
25
-
26
26
  %>
27
27
 
28
28
  <div class="alert alert-<%= state_class %>">
29
29
  <%= state_qualifier %>State:
30
- <span class="alert-link"><%= @check_state ? h(@check_state.upcase) : '' %></span>
30
+ <span class="alert-link"><%= @check[:condition] ? h(@check[:condition].upcase) : '' %></span>
31
31
  </div>
32
32
  </div><!-- col-md-6 -->
33
33
 
34
34
  <div class="col-md-6">
35
35
  <%
36
- if !@current_scheduled_maintenance and
37
- !@current_unscheduled_maintenance and
38
- !(['warning', 'critical', 'unknown'].include?(@check_state))
36
+ current_scheduled_maintenance = @state.nil? ? nil : @state[:current_scheduled_maintenance]
37
+ current_unscheduled_maintenance = @state.nil? ? nil : @state[:current_unscheduled_maintenance]
38
+ latest_notifications = @state.nil? ? nil : @state[:latest_notifications]
39
+
40
+ if current_scheduled_maintenance.nil? &&
41
+ current_unscheduled_maintenance.nil? &&
42
+ !@check[:failing]
39
43
  %>
40
44
  <div id="no-maintenance-summary" class="alert alert-info">
41
45
  <form class="form-horizontal" role="form">
@@ -59,10 +63,11 @@
59
63
  </div>
60
64
  <% end %>
61
65
 
62
- <% if @current_unscheduled_maintenance %>
66
+ <% if current_unscheduled_maintenance %>
63
67
  <div id="unscheduled-maintenance-summary" class="alert alert-warning">
64
68
 
65
- <form action="<%= @base_url %>end_unscheduled_maintenance/<%= check_path_escaped %>" method="post" class="form-horizontal" role="form">
69
+ <form action="<%= @base_url %>unscheduled_maintenances/<%= u(current_unscheduled_maintenance[:id]) %>" method="post" class="form-horizontal" role="form">
70
+ <input type="hidden" name="_method" value="patch">
66
71
 
67
72
  <div class="form-group">
68
73
  <label class="col-md-3 control-label">State</label>
@@ -78,7 +83,7 @@
78
83
  <div class="col-md-9">
79
84
  <p class="form-control-static">
80
85
  <%
81
- ack_msg = @current_unscheduled_maintenance[:summary]
86
+ ack_msg = current_unscheduled_maintenance[:summary]
82
87
  ack_msg ||= 'No summary given'
83
88
  %>
84
89
  <%= h(ack_msg) %>
@@ -90,7 +95,7 @@
90
95
  <label class="col-md-3 control-label">Started</label>
91
96
  <div class="col-md-9">
92
97
  <p class="form-control-static">
93
- <% start = Time.at(@current_unscheduled_maintenance[:start_time]).to_s %>
98
+ <% start = current_unscheduled_maintenance[:start_time] %>
94
99
  <%= h(start) %>
95
100
  </p>
96
101
  </div>
@@ -100,8 +105,8 @@
100
105
  <label class="col-md-3 control-label">Finishing</label>
101
106
  <div class="col-md-9">
102
107
  <p class="form-control-static">
103
- <% finish = Time.at(@current_unscheduled_maintenance[:start_time] + @current_unscheduled_maintenance[:duration]) %>
104
- <%= h(finish) %>
108
+ <% current_unscheduled_maintenance[:end_time] %>
109
+ <%= h(current_unscheduled_maintenance[:end_time]) %>
105
110
  </p>
106
111
  </div>
107
112
  </div>
@@ -110,8 +115,15 @@
110
115
  <label class="col-md-3 control-label">Remaining</label>
111
116
  <div class="col-md-9">
112
117
  <p class="form-control-static">
113
- <% remaining = time_period_in_words( (finish - current_time).ceil ) %>
114
- <%= h(remaining) %>
118
+ <%
119
+ remaining = begin
120
+ finish = DateTime.parse(current_unscheduled_maintenance[:end_time])
121
+ time_period_in_words(finish.to_i - @current_time.to_i)
122
+ rescue ArgumentError
123
+ nil
124
+ end
125
+ %>
126
+ <%= remaining.nil? ? "???" : h(remaining) %>
115
127
  </p>
116
128
  </div>
117
129
  </div>
@@ -119,7 +131,7 @@
119
131
  <div class="row">
120
132
  <div class="col-md-offset-3 col-md-9">
121
133
  <p class="form-control-static">
122
- <button id="end-unscheduled-maintenance" type="submit" class="btn btn-danger">End Unscheduled Maintenance (Unacknowledge)</button>
134
+ <button id="end-unscheduled-maintenance" type="submit" class="btn btn-danger">End Unscheduled Maintenance</button>
123
135
  </p>
124
136
  </div>
125
137
  </div>
@@ -128,16 +140,16 @@
128
140
  </div>
129
141
  <% end %>
130
142
 
131
- <% if (['warning', 'critical', 'unknown'].include?(@check_state) and !@current_scheduled_maintenance) %>
143
+ <% if (@check[:failing] and current_scheduled_maintenance.nil?) %>
132
144
  <div id="add-unscheduled-maintenance" class="alert alert-warning">
133
- <% action = @current_unscheduled_maintenance ? "Re-acknowledge" : "Acknowledge" %>
145
+ <% action = current_unscheduled_maintenance.nil? ? "Acknowledge" : "Re-acknowledge" %>
134
146
  <h4><%= action %> alert</h4>
135
- <form action="<%= @base_url %>acknowledgements/<%= check_path_escaped %>" method="post" class="form-horizontal">
147
+ <form action="<%= @base_url %>acknowledgements" method="post" class="form-horizontal">
148
+ <input type="hidden" name="check_id" value="<%= u(@check[:id]) %>">
136
149
  <div class="form-group">
137
150
  <div class="col-sm-12 text-left">
138
151
  <label class="col-sm-3 control-label" for="summary">Summary</label>
139
152
  <div class="col-sm-9">
140
- <input type="hidden" name="acknowledgement_id" value="<%= @acknowledgement_id %>">
141
153
  <input type="text" class="form-control" name="summary" value=""/>
142
154
  </div>
143
155
  </div>
@@ -159,7 +171,7 @@
159
171
  <div class="col-sm-12">
160
172
  <div class="col-sm-offset-3 col-sm-9">
161
173
  <button type="submit" class="btn btn-warning">
162
- <%= @current_unscheduled_maintenance ? 'Replace acknowledgment' : 'Acknowledge' %>
174
+ <%= current_unscheduled_maintenance.nil? ? 'Acknowledge' : 'Replace acknowledgment' %>
163
175
  </button>
164
176
  </div>
165
177
  </div>
@@ -168,7 +180,7 @@
168
180
  </div>
169
181
  <% end %>
170
182
 
171
- <% if @current_scheduled_maintenance %>
183
+ <% unless current_scheduled_maintenance.nil? %>
172
184
  <div id="scheduled-maintenance-summary" class="alert alert-warning">
173
185
  <div class="row">
174
186
  <div class="col-md-3 text-right">State</div>
@@ -181,7 +193,7 @@
181
193
  <div class="col-md-3 text-right">Reason</div>
182
194
  <div class="col-md-9">
183
195
  <%
184
- maint_msg = "#{@current_scheduled_maintenance[:summary]}"
196
+ maint_msg = "#{current_scheduled_maintenance[:summary]}"
185
197
  maint_msg = maint_msg.length > 0 ? maint_msg : 'No summary given'
186
198
  %>
187
199
  <%= h maint_msg %>
@@ -191,7 +203,7 @@
191
203
  <div class="row">
192
204
  <div class="col-md-3 text-right">Started</div>
193
205
  <div class="col-md-9">
194
- <% start = Time.at(@current_scheduled_maintenance[:start_time]).to_s %>
206
+ <% start = current_scheduled_maintenance[:start_time] %>
195
207
  <%= h(start) %>
196
208
  </div>
197
209
  </div>
@@ -199,7 +211,7 @@
199
211
  <div class="row">
200
212
  <div class="col-md-3 text-right">Finishing</div>
201
213
  <div class="col-md-9">
202
- <% finish = Time.at(@current_scheduled_maintenance[:start_time] + @current_scheduled_maintenance[:duration]) %>
214
+ <% finish = current_scheduled_maintenance[:end_time] %>
203
215
  <%= h(finish) %>
204
216
  </div>
205
217
  </div>
@@ -207,8 +219,15 @@
207
219
  <div class="row">
208
220
  <div class="col-md-3 text-right">Remaining</div>
209
221
  <div class="col-md-9">
210
- <% remaining = time_period_in_words( (finish - current_time).ceil ) %>
211
- <%= h(remaining) %>
222
+ <%
223
+ remaining = begin
224
+ finish = DateTime.parse(current_scheduled_maintenance[:end_time])
225
+ time_period_in_words(finish.to_i - @current_time.to_i)
226
+ rescue ArgumentError
227
+ nil
228
+ end
229
+ %>
230
+ <%= remaining.nil? ? "???" : h(remaining) %>
212
231
  </div>
213
232
  </div>
214
233
  </div>
@@ -218,41 +237,70 @@
218
237
 
219
238
  <div class="row">
220
239
  <div id="output" class="col-md-6">
221
- <h3>Output: <%= h @check_summary %></h3>
222
- <p><%= h @check_details %></p>
223
- <% if @check_perfdata && @check_perfdata.is_a?(Array) %>
224
- <h3>Performance Data:</h3>
225
- <table>
226
- <% @check_perfdata.each do |perfdata| %>
227
- <tr>
228
- <td><%= perfdata["key"] %></td>
229
- <td><%= perfdata["value"] %></td>
230
- </tr>
231
- <% end %>
232
- </table>
233
- <% end %>
234
- <table class="table table-hover table-condensed">
235
- <tr>
236
- <td>Last state change:</td>
237
- <td><%= h relative_time_ago(Time.at(@check_last_change.to_i)) %> ago</td>
238
- <td><%= h Time.at(@check_last_change.to_i).to_s %></td>
239
- <td>&nbsp;</td>
240
- </tr>
241
- <tr>
242
- <td>Last update:</td>
243
- <td><%= h relative_time_ago(Time.at(@check_last_update.to_i)) %> ago</td>
244
- <td><%= h Time.at(@check_last_update.to_i).to_s %></td>
245
- <td>&nbsp;</td>
246
- </tr>
247
- <% [:critical, :warning, :unknown, :recovery, :acknowledgement].each do |type| %>
240
+ <% if @state.nil? %>
241
+ <p>No events received for this check.</p>
242
+ <% else %>
243
+ <h3>Output</h3>
244
+ <p><%= h @state[:details] %></p>
245
+ <% if @state[:perfdata] && @state[:perfdata].is_a?(Array) %>
246
+ <h3>Performance Data:</h3>
247
+ <table>
248
+ <% @state[:perfdata].each do |perfdata| %>
248
249
  <tr>
249
- <td>Last <%= h type.to_s %> notification:</td>
250
- <td><%= @last_notifications[type] ? h(@last_notifications[type][:relative]) : 'never' %></td>
251
- <td><%= @last_notifications[type] ? h(@last_notifications[type][:time].to_s) : '&nbsp;' %></td>
252
- <td><%= @last_notifications[type] ? h(@last_notifications[type][:summary]) : '&nbsp;' %></td>
250
+ <td><%= perfdata["key"] %></td>
251
+ <td><%= perfdata["value"] %></td>
253
252
  </tr>
253
+ <% end %>
254
+ </table>
254
255
  <% end %>
255
- </table>
256
+ <table class="table table-hover table-condensed">
257
+ <tr>
258
+ <td>Last state change:</td>
259
+ <% if @state[:last_changed].nil? %>
260
+ <td>-</td>
261
+ <td>-</td>
262
+ <% else %>
263
+ <td><%= h relative_time_ago(@state[:last_changed], @current_time) %> ago</td>
264
+ <td><%= h @state[:last_changed].to_s %></td>
265
+ <% end %>
266
+ <td>&nbsp;</td>
267
+ </tr>
268
+ <tr>
269
+ <td>Last update:</td>
270
+ <% if @state[:last_updated].nil? %>
271
+ <td>-</td>
272
+ <td>-</td>
273
+ <% else %>
274
+ <td><%= h relative_time_ago(@state[:last_updated], @current_time) %> ago</td>
275
+ <td><%= h @state[:last_updated].to_s %></td>
276
+ <% end %>
277
+ <td>&nbsp;</td>
278
+ </tr>
279
+ <% [:critical, :warning, :unknown, :ok, :acknowledgement].each do |type| %>
280
+ <tr>
281
+ <td>Last <%= h type.to_s %> notification:</td>
282
+ <% notif = latest_notifications.detect {|ln| ln[:condition].eql?(type.to_s) || ln[:action].eql?(type.to_s) } %>
283
+ <% if notif.nil? %>
284
+ <td>never</td>
285
+ <td>&nbsp;</td>
286
+ <td>&nbsp;</td>
287
+ <% else %>
288
+ <%
289
+ notif_relative = begin
290
+ notif_created = DateTime.parse(notif[:created_at])
291
+ relative_time_ago(@current_time, notif_created) + " ago"
292
+ rescue ArgumentError
293
+ nil
294
+ end
295
+ %>
296
+ <td><%= h(notif_relative) %></td>
297
+ <td><%= h(notif[:created_at]) %></td>
298
+ <td><%= h(notif[:summary]) %></td>
299
+ <% end %>
300
+ </tr>
301
+ <% end %>
302
+ </table>
303
+ <% end %>
256
304
  </div><!-- col-md-6 -->
257
305
 
258
306
  <div id="recent-state-changes" class="col-md-6">
@@ -266,8 +314,8 @@
266
314
  </tr>
267
315
  <% @state_changes.each do |state_change| %>
268
316
  <tr>
269
- <td><%= h Time.at(state_change[:timestamp]).to_s %></td>
270
- <td><%= h state_change[:state] %></td>
317
+ <td><%= h state_change[:created_at] %></td>
318
+ <td><%= h state_change[:condition] %></td>
271
319
  <td><%= h state_change[:summary] %></td>
272
320
  </tr>
273
321
  <% end %>
@@ -278,37 +326,11 @@
278
326
  </div><!-- col-md-6 -->
279
327
  </div><!-- row -->
280
328
 
281
- <div class="row">
282
- <div id="failure-delays" class="col-md-6">
283
- <a name="failure_delays"></a>
284
- <h3>Failure Delays</h3>
285
- <table class="table table-hover table-condensed">
286
-
287
- <tr>
288
- <td>Initial failure delay:</td>
289
- <td><%= h(ChronicDuration.output(@check_initial_failure_delay, :keep_zero => true)) %>
290
- <% if @check_initial_failure_delay_is_default %>
291
- (default)
292
- <% end %>
293
- </td>
294
- </tr>
295
- <tr>
296
- <td>Repeat failure delay:</td>
297
- <td><%= h(ChronicDuration.output(@check_repeat_failure_delay, :keep_zero => true)) %>
298
- <% if @check_repeat_failure_delay_is_default %>
299
- (default)
300
- <% end %>
301
- </td>
302
- </tr>
303
- </table>
304
- </div>
305
- </div>
306
-
307
329
  <div class="row">
308
330
  <div id="scheduled-maintenance-periods" class="col-md-12">
309
331
  <a name="scheduled_maintenance_periods"></a>
310
332
  <h3>Scheduled Maintenance Periods</h3>
311
- <% if @scheduled_maintenances && !@scheduled_maintenances.empty? %>
333
+ <% unless @scheduled_maintenances.empty? %>
312
334
  <table class="table table-bordered table-hover table-condensed">
313
335
  <tr>
314
336
  <th>Start</th>
@@ -318,29 +340,43 @@
318
340
  <th>Actions</th>
319
341
  </tr>
320
342
 
321
- <% @scheduled_maintenances.sort_by {|s| s[:start_time]}.each do |scheduled_maintenance| %>
343
+ <% @scheduled_maintenances.each do |scheduled_maintenance| %>
322
344
  <%
323
- start_time = scheduled_maintenance[:start_time]
324
- end_time = scheduled_maintenance[:end_time]
325
- duration = scheduled_maintenance[:duration]
326
- summary = scheduled_maintenance[:summary]
345
+ start_time = begin
346
+ DateTime.parse(scheduled_maintenance[:start_time])
347
+ rescue ArgumentError
348
+ nil
349
+ end
350
+ end_time = begin
351
+ DateTime.parse(scheduled_maintenance[:end_time])
352
+ rescue ArgumentError
353
+ nil
354
+ end
355
+ duration = (start_time.nil? || end_time.nil?) ? nil : (end_time.to_i - start_time.to_i)
356
+ summary = scheduled_maintenance[:summary]
327
357
  %>
328
358
  <tr>
329
- <td><%= h Time.at(start_time).to_s %></td>
330
- <td><%= h Time.at(end_time).to_s %></td>
331
- <td><%= h(ChronicDuration.output(duration, :keep_zero => true) || '0 secs') %></td>
359
+ <td><%= h start_time.to_s %></td>
360
+ <td><%= h end_time.to_s %></td>
361
+ <td><%= h(ChronicDuration.output(duration.to_i.round, :keep_zero => true) || '0 secs') %></td>
332
362
  <td><%= h summary %></td>
333
363
  <td>
334
- <% if end_time > current_time.to_i %>
335
- <% label = (start_time > current_time.to_i) ? 'Delete' : 'End Now' %>
336
- <form action="<%= @base_url %>scheduled_maintenances/<%= check_path_escaped %>" method="post">
364
+ <% if end_time > @current_time %>
365
+ <% if start_time > @current_time %>
366
+ <form action="<%= @base_url %>scheduled_maintenances/<%= u(scheduled_maintenance[:id]) %>" method="post">
337
367
  <input type="hidden" name="_method" value="delete">
338
- <input type="hidden" name="start_time" value="<%= start_time %>">
339
- <button type="submit" class="btn btn-danger"><%= label %></button>
368
+ <button type="submit" class="btn btn-danger">Delete</button>
340
369
  </form>
341
370
  <% else %>
342
- &nbsp;
371
+ <form action="<%= @base_url %>scheduled_maintenances/<%= u(scheduled_maintenance[:id]) %>" method="post">
372
+ <input type="hidden" name="_method" value="patch">
373
+ <input type="hidden" name="end_time" value="<% h end_time.iso8601 %>">
374
+ <button type="submit" class="btn btn-danger">End Now</button>
375
+ </form>
343
376
  <% end %>
377
+ <% else %>
378
+ &nbsp;
379
+ <% end %>
344
380
  </td>
345
381
  </tr>
346
382
  <% end %>
@@ -359,7 +395,8 @@
359
395
  <h3 class="panel-title">Add Scheduled Maintenance</h4>
360
396
  </div>
361
397
  <div class="panel-body">
362
- <form action="<%= @base_url %>scheduled_maintenances/<%= check_path_escaped %>" method="post" role="form" class="form-horizontal">
398
+ <form action="<%= @base_url %>scheduled_maintenances" method="post" role="form" class="form-horizontal">
399
+ <input type="hidden" name="check_id" value="<%= u(@check[:id]) %>">
363
400
 
364
401
  <div class="form-group">
365
402
  <label class="col-sm-2 control-label" for="start_time">Start time:</label>
@@ -412,27 +449,28 @@
412
449
  <div class="row">
413
450
  <div id="contacts" class="col-md-8">
414
451
  <h3>Contacts</h3>
415
- <% if @contacts && !@contacts.empty? %>
452
+ <% if @contacts.nil? || @contacts.empty? %>
453
+ <p>There are <strong>no contacts</strong> associated with this check.</p>
454
+ <% else %>
416
455
  <table class="table table-bordered table-hover table-condensed">
417
456
  <tr>
418
457
  <th>Name</th>
419
458
  <th>Media</th>
420
459
  </tr>
421
- <% @contacts.sort_by {|c| [c.first_name, c.last_name] }.each do |contact| %>
460
+ <% @contacts.each do |contact| %>
422
461
  <tr>
423
- <td><a href="<%= @base_url %>contacts/<%= contact.id %>" title="contact details"><%= h contact.name %></a></td>
462
+ <td><a href="<%= @base_url %>contacts/<%= u(contact[:id]) %>" title="contact details"><%= h contact[:name] %></a></td>
424
463
  <td>
425
- <% if contact.media && !contact.media.empty? %>
426
- <p><%= h contact.media.keys.collect(&:capitalize).join(", ") %></p>
427
- <% else %>
464
+ <% contact_media = @media_by_contact_id[contact[:id]] %>
465
+ <% if contact_media.nil? || contact_media.empty? %>
428
466
  <p>No media</p>
467
+ <% else %>
468
+ <p><%= h contact_media.map {|m| m[:transport] }.collect(&:capitalize).join(", ") %></p>
429
469
  <% end %>
430
470
  </td>
431
471
  </tr>
432
472
  <% end %>
433
473
  </table>
434
- <% else %>
435
- <p>There are <strong>no contacts</strong> associated with this check.</p>
436
474
  <% end %>
437
475
  </div><!-- col-md-8 -->
438
476
  </div><!-- row -->
@@ -447,9 +485,9 @@
447
485
  </h3>
448
486
  </div>
449
487
  <div class="panel-body">
450
- <% if @check_enabled %>
488
+ <% if @check[:enabled] %>
451
489
  <h4>Decommission check</h4>
452
- <form action="<%= @base_url %>checks/<%= check_path_escaped %>" method="post" style="display:inline-block" class="pull-right">
490
+ <form action="<%= @base_url %>checks/<%= u(@check[:id]) %>" method="post" style="display:inline-block" class="pull-right">
453
491
  <input type='hidden' name='_method' value='delete'>
454
492
  <button type='submit' class="btn btn-danger decommission-check">Decommission Check</button>
455
493
  </form>