flapjack 1.6.0 → 2.0.0b1

Sign up to get free protection for your applications and to get access to all the features.
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>