flapjack 1.6.0 → 2.0.0b1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -6
  3. data/.gitmodules +1 -1
  4. data/.rspec +1 -1
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +12 -13
  7. data/CHANGELOG.md +2 -9
  8. data/CONTRIBUTING.md +7 -2
  9. data/Gemfile +4 -13
  10. data/LICENCE +1 -0
  11. data/README.md +8 -2
  12. data/Rakefile +2 -2
  13. data/bin/flapjack +3 -12
  14. data/build.sh +4 -2
  15. data/etc/flapjack_config.toml.example +273 -0
  16. data/features/ack_after_sched_maint.feature +18 -21
  17. data/features/cli.feature +11 -71
  18. data/features/cli_flapjack-feed-events.feature +14 -15
  19. data/features/cli_flapjack-nagios-receiver.feature +12 -41
  20. data/features/cli_flapper.feature +12 -41
  21. data/features/cli_purge.feature +5 -6
  22. data/features/cli_receive-events.feature +6 -7
  23. data/features/cli_simulate-failed-check.feature +5 -6
  24. data/features/events.feature +206 -181
  25. data/features/events_check_names.feature +4 -7
  26. data/features/notification_rules.feature +144 -223
  27. data/features/notifications.feature +65 -57
  28. data/features/rollup.feature +45 -47
  29. data/features/steps/cli_steps.rb +4 -5
  30. data/features/steps/events_steps.rb +163 -373
  31. data/features/steps/notifications_steps.rb +408 -264
  32. data/features/steps/packaging-lintian_steps.rb +0 -4
  33. data/features/steps/time_travel_steps.rb +0 -26
  34. data/features/support/daemons.rb +6 -31
  35. data/features/support/env.rb +65 -74
  36. data/flapjack.gemspec +22 -24
  37. data/lib/flapjack.rb +14 -7
  38. data/lib/flapjack/cli/flapper.rb +74 -173
  39. data/lib/flapjack/cli/maintenance.rb +278 -109
  40. data/lib/flapjack/cli/migrate.rb +950 -0
  41. data/lib/flapjack/cli/purge.rb +19 -22
  42. data/lib/flapjack/cli/receiver.rb +150 -326
  43. data/lib/flapjack/cli/server.rb +8 -235
  44. data/lib/flapjack/cli/simulate.rb +42 -57
  45. data/lib/flapjack/configuration.rb +51 -37
  46. data/lib/flapjack/coordinator.rb +138 -129
  47. data/lib/flapjack/data/acknowledgement.rb +177 -0
  48. data/lib/flapjack/data/alert.rb +97 -158
  49. data/lib/flapjack/data/check.rb +611 -0
  50. data/lib/flapjack/data/condition.rb +70 -0
  51. data/lib/flapjack/data/contact.rb +226 -456
  52. data/lib/flapjack/data/event.rb +96 -184
  53. data/lib/flapjack/data/extensions/associations.rb +59 -0
  54. data/lib/flapjack/data/extensions/short_name.rb +25 -0
  55. data/lib/flapjack/data/medium.rb +428 -0
  56. data/lib/flapjack/data/metrics.rb +194 -0
  57. data/lib/flapjack/data/notification.rb +22 -281
  58. data/lib/flapjack/data/rule.rb +473 -0
  59. data/lib/flapjack/data/scheduled_maintenance.rb +244 -0
  60. data/lib/flapjack/data/state.rb +221 -0
  61. data/lib/flapjack/data/statistic.rb +112 -0
  62. data/lib/flapjack/data/tag.rb +277 -0
  63. data/lib/flapjack/data/test_notification.rb +182 -0
  64. data/lib/flapjack/data/unscheduled_maintenance.rb +159 -0
  65. data/lib/flapjack/data/validators/id_validator.rb +20 -0
  66. data/lib/flapjack/exceptions.rb +6 -0
  67. data/lib/flapjack/filters/acknowledgement.rb +23 -16
  68. data/lib/flapjack/filters/base.rb +0 -5
  69. data/lib/flapjack/filters/delays.rb +53 -43
  70. data/lib/flapjack/filters/ok.rb +23 -14
  71. data/lib/flapjack/filters/scheduled_maintenance.rb +3 -3
  72. data/lib/flapjack/filters/unscheduled_maintenance.rb +12 -3
  73. data/lib/flapjack/gateways/aws_sns.rb +65 -49
  74. data/lib/flapjack/gateways/aws_sns/alert.text.erb +2 -2
  75. data/lib/flapjack/gateways/aws_sns/alert_subject.text.erb +2 -2
  76. data/lib/flapjack/gateways/aws_sns/rollup_subject.text.erb +1 -1
  77. data/lib/flapjack/gateways/email.rb +107 -90
  78. data/lib/flapjack/gateways/email/alert.html.erb +19 -18
  79. data/lib/flapjack/gateways/email/alert.text.erb +20 -14
  80. data/lib/flapjack/gateways/email/alert_subject.text.erb +2 -1
  81. data/lib/flapjack/gateways/email/rollup.html.erb +14 -13
  82. data/lib/flapjack/gateways/email/rollup.text.erb +13 -10
  83. data/lib/flapjack/gateways/jabber.rb +679 -671
  84. data/lib/flapjack/gateways/jabber/alert.text.erb +9 -6
  85. data/lib/flapjack/gateways/jsonapi.rb +164 -350
  86. data/lib/flapjack/gateways/jsonapi/data/join_descriptor.rb +44 -0
  87. data/lib/flapjack/gateways/jsonapi/data/method_descriptor.rb +21 -0
  88. data/lib/flapjack/gateways/jsonapi/helpers/headers.rb +63 -0
  89. data/lib/flapjack/gateways/jsonapi/helpers/miscellaneous.rb +136 -0
  90. data/lib/flapjack/gateways/jsonapi/helpers/resources.rb +227 -0
  91. data/lib/flapjack/gateways/jsonapi/helpers/serialiser.rb +313 -0
  92. data/lib/flapjack/gateways/jsonapi/helpers/swagger_docs.rb +322 -0
  93. data/lib/flapjack/gateways/jsonapi/methods/association_delete.rb +115 -0
  94. data/lib/flapjack/gateways/jsonapi/methods/association_get.rb +288 -0
  95. data/lib/flapjack/gateways/jsonapi/methods/association_patch.rb +178 -0
  96. data/lib/flapjack/gateways/jsonapi/methods/association_post.rb +116 -0
  97. data/lib/flapjack/gateways/jsonapi/methods/metrics.rb +71 -0
  98. data/lib/flapjack/gateways/jsonapi/methods/resource_delete.rb +119 -0
  99. data/lib/flapjack/gateways/jsonapi/methods/resource_get.rb +186 -0
  100. data/lib/flapjack/gateways/jsonapi/methods/resource_patch.rb +239 -0
  101. data/lib/flapjack/gateways/jsonapi/methods/resource_post.rb +197 -0
  102. data/lib/flapjack/gateways/jsonapi/middleware/array_param_fixer.rb +27 -0
  103. data/lib/flapjack/gateways/jsonapi/{rack → middleware}/json_params_parser.rb +7 -6
  104. data/lib/flapjack/gateways/jsonapi/middleware/request_timestamp.rb +18 -0
  105. data/lib/flapjack/gateways/oobetet.rb +222 -170
  106. data/lib/flapjack/gateways/pager_duty.rb +388 -0
  107. data/lib/flapjack/gateways/pager_duty/alert.text.erb +13 -0
  108. data/lib/flapjack/gateways/slack.rb +56 -48
  109. data/lib/flapjack/gateways/slack/alert.text.erb +1 -1
  110. data/lib/flapjack/gateways/slack/rollup.text.erb +1 -1
  111. data/lib/flapjack/gateways/sms_aspsms.rb +155 -0
  112. data/lib/flapjack/gateways/sms_aspsms/alert.text.erb +7 -0
  113. data/lib/flapjack/gateways/sms_aspsms/rollup.text.erb +2 -0
  114. data/lib/flapjack/gateways/sms_messagenet.rb +77 -57
  115. data/lib/flapjack/gateways/sms_messagenet/alert.text.erb +3 -2
  116. data/lib/flapjack/gateways/sms_nexmo.rb +53 -51
  117. data/lib/flapjack/gateways/sms_nexmo/alert.text.erb +2 -2
  118. data/lib/flapjack/gateways/sms_nexmo/rollup.text.erb +1 -1
  119. data/lib/flapjack/gateways/sms_twilio.rb +79 -62
  120. data/lib/flapjack/gateways/sms_twilio/alert.text.erb +3 -2
  121. data/lib/flapjack/gateways/web.rb +437 -345
  122. data/lib/flapjack/gateways/web/middleware/request_timestamp.rb +18 -0
  123. data/lib/flapjack/gateways/web/public/css/bootstrap.css +3793 -4340
  124. data/lib/flapjack/gateways/web/public/css/bootstrap.css.map +1 -0
  125. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.eot +0 -0
  126. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.svg +273 -214
  127. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  128. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff +0 -0
  129. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  130. data/lib/flapjack/gateways/web/public/js/bootstrap.js +1637 -1607
  131. data/lib/flapjack/gateways/web/public/js/self_stats.js +1 -2
  132. data/lib/flapjack/gateways/web/views/_pagination.html.erb +19 -0
  133. data/lib/flapjack/gateways/web/views/check.html.erb +159 -121
  134. data/lib/flapjack/gateways/web/views/checks.html.erb +82 -41
  135. data/lib/flapjack/gateways/web/views/contact.html.erb +59 -71
  136. data/lib/flapjack/gateways/web/views/contacts.html.erb +32 -8
  137. data/lib/flapjack/gateways/web/views/index.html.erb +2 -2
  138. data/lib/flapjack/gateways/web/views/{layout.erb → layout.html.erb} +7 -23
  139. data/lib/flapjack/gateways/web/views/self_stats.html.erb +32 -33
  140. data/lib/flapjack/gateways/web/views/tag.html.erb +32 -0
  141. data/lib/flapjack/gateways/web/views/tags.html.erb +51 -0
  142. data/lib/flapjack/logger.rb +34 -3
  143. data/lib/flapjack/notifier.rb +180 -112
  144. data/lib/flapjack/patches.rb +8 -63
  145. data/lib/flapjack/pikelet.rb +185 -143
  146. data/lib/flapjack/processor.rb +323 -191
  147. data/lib/flapjack/record_queue.rb +33 -0
  148. data/lib/flapjack/redis_proxy.rb +66 -0
  149. data/lib/flapjack/utility.rb +21 -15
  150. data/lib/flapjack/version.rb +2 -1
  151. data/libexec/httpbroker.go +218 -14
  152. data/libexec/oneoff.go +13 -10
  153. data/spec/lib/flapjack/configuration_spec.rb +286 -0
  154. data/spec/lib/flapjack/coordinator_spec.rb +103 -157
  155. data/spec/lib/flapjack/data/check_spec.rb +175 -0
  156. data/spec/lib/flapjack/data/contact_spec.rb +26 -349
  157. data/spec/lib/flapjack/data/event_spec.rb +76 -291
  158. data/spec/lib/flapjack/data/medium_spec.rb +19 -0
  159. data/spec/lib/flapjack/data/rule_spec.rb +43 -0
  160. data/spec/lib/flapjack/data/scheduled_maintenance_spec.rb +976 -0
  161. data/spec/lib/flapjack/data/unscheduled_maintenance_spec.rb +34 -0
  162. data/spec/lib/flapjack/gateways/aws_sns_spec.rb +111 -60
  163. data/spec/lib/flapjack/gateways/email_spec.rb +194 -161
  164. data/spec/lib/flapjack/gateways/jabber_spec.rb +961 -162
  165. data/spec/lib/flapjack/gateways/jsonapi/methods/check_links_spec.rb +155 -0
  166. data/spec/lib/flapjack/gateways/jsonapi/methods/checks_spec.rb +426 -0
  167. data/spec/lib/flapjack/gateways/jsonapi/methods/contact_links_spec.rb +217 -0
  168. data/spec/lib/flapjack/gateways/jsonapi/methods/contacts_spec.rb +425 -0
  169. data/spec/lib/flapjack/gateways/jsonapi/methods/events_spec.rb +271 -0
  170. data/spec/lib/flapjack/gateways/jsonapi/methods/media_spec.rb +257 -0
  171. data/spec/lib/flapjack/gateways/jsonapi/methods/medium_links_spec.rb +163 -0
  172. data/spec/lib/flapjack/gateways/jsonapi/methods/metrics_spec.rb +8 -0
  173. data/spec/lib/flapjack/gateways/jsonapi/methods/rule_links_spec.rb +212 -0
  174. data/spec/lib/flapjack/gateways/jsonapi/methods/rules_spec.rb +289 -0
  175. data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenance_links_spec.rb +49 -0
  176. data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenances_spec.rb +242 -0
  177. data/spec/lib/flapjack/gateways/jsonapi/methods/tag_links_spec.rb +274 -0
  178. data/spec/lib/flapjack/gateways/jsonapi/methods/tags_spec.rb +302 -0
  179. data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenance_links_spec.rb +49 -0
  180. data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenances_spec.rb +339 -0
  181. data/spec/lib/flapjack/gateways/jsonapi_spec.rb +1 -1
  182. data/spec/lib/flapjack/gateways/oobetet_spec.rb +151 -79
  183. data/spec/lib/flapjack/gateways/pager_duty_spec.rb +353 -0
  184. data/spec/lib/flapjack/gateways/slack_spec.rb +53 -53
  185. data/spec/lib/flapjack/gateways/sms_aspsms_spec.rb +106 -0
  186. data/spec/lib/flapjack/gateways/sms_messagenet_spec.rb +111 -54
  187. data/spec/lib/flapjack/gateways/sms_nexmo_spec.rb +50 -51
  188. data/spec/lib/flapjack/gateways/sms_twilio_spec.rb +108 -48
  189. data/spec/lib/flapjack/gateways/web_spec.rb +144 -216
  190. data/spec/lib/flapjack/notifier_spec.rb +132 -1
  191. data/spec/lib/flapjack/pikelet_spec.rb +111 -50
  192. data/spec/lib/flapjack/processor_spec.rb +210 -40
  193. data/spec/lib/flapjack/redis_proxy_spec.rb +45 -0
  194. data/spec/lib/flapjack/utility_spec.rb +11 -15
  195. data/spec/service_consumers/fixture_data.rb +547 -0
  196. data/spec/service_consumers/pact_helper.rb +21 -32
  197. data/spec/service_consumers/pacts/flapjack-diner_v2.0.json +4652 -0
  198. data/spec/service_consumers/provider_states_for_flapjack-diner.rb +279 -322
  199. data/spec/service_consumers/provider_support.rb +8 -0
  200. data/spec/spec_helper.rb +34 -44
  201. data/spec/support/erb_view_helper.rb +1 -1
  202. data/spec/support/factories.rb +58 -0
  203. data/spec/support/jsonapi_helper.rb +15 -26
  204. data/spec/support/mock_logger.rb +43 -0
  205. data/spec/support/xmpp_comparable.rb +24 -0
  206. data/src/flapjack/transport_test.go +30 -1
  207. data/tasks/dump_keys.rake +82 -0
  208. data/tasks/events.rake +7 -7
  209. data/tasks/support/flapjack_config_benchmark.toml +28 -0
  210. data/tasks/support/flapjack_config_benchmark.yaml +0 -2
  211. metadata +175 -222
  212. data/Guardfile +0 -14
  213. data/etc/flapjack_config.yaml.example +0 -477
  214. data/features/cli_flapjack-populator.feature +0 -90
  215. data/features/support/silent_system.rb +0 -4
  216. data/lib/flapjack/cli/import.rb +0 -108
  217. data/lib/flapjack/data/entity.rb +0 -652
  218. data/lib/flapjack/data/entity_check.rb +0 -1044
  219. data/lib/flapjack/data/message.rb +0 -56
  220. data/lib/flapjack/data/migration.rb +0 -234
  221. data/lib/flapjack/data/notification_rule.rb +0 -425
  222. data/lib/flapjack/data/semaphore.rb +0 -44
  223. data/lib/flapjack/data/tagged.rb +0 -48
  224. data/lib/flapjack/gateways/jsonapi/check_methods.rb +0 -206
  225. data/lib/flapjack/gateways/jsonapi/check_presenter.rb +0 -221
  226. data/lib/flapjack/gateways/jsonapi/contact_methods.rb +0 -186
  227. data/lib/flapjack/gateways/jsonapi/entity_methods.rb +0 -223
  228. data/lib/flapjack/gateways/jsonapi/medium_methods.rb +0 -185
  229. data/lib/flapjack/gateways/jsonapi/metrics_methods.rb +0 -132
  230. data/lib/flapjack/gateways/jsonapi/notification_rule_methods.rb +0 -141
  231. data/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods.rb +0 -139
  232. data/lib/flapjack/gateways/jsonapi/report_methods.rb +0 -146
  233. data/lib/flapjack/gateways/pagerduty.rb +0 -318
  234. data/lib/flapjack/gateways/pagerduty/alert.text.erb +0 -10
  235. data/lib/flapjack/gateways/web/public/css/select2-bootstrap.css +0 -87
  236. data/lib/flapjack/gateways/web/public/css/select2.css +0 -615
  237. data/lib/flapjack/gateways/web/public/css/tablesort.css +0 -67
  238. data/lib/flapjack/gateways/web/public/img/select2-spinner.gif +0 -0
  239. data/lib/flapjack/gateways/web/public/img/select2.png +0 -0
  240. data/lib/flapjack/gateways/web/public/img/select2x2.png +0 -0
  241. data/lib/flapjack/gateways/web/public/js/backbone.js +0 -1581
  242. data/lib/flapjack/gateways/web/public/js/backbone.jsonapi.js +0 -322
  243. data/lib/flapjack/gateways/web/public/js/flapjack.js +0 -82
  244. data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.js +0 -1640
  245. data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.widgets.js +0 -1390
  246. data/lib/flapjack/gateways/web/public/js/modules/contact.js +0 -520
  247. data/lib/flapjack/gateways/web/public/js/modules/entity.js +0 -28
  248. data/lib/flapjack/gateways/web/public/js/modules/medium.js +0 -40
  249. data/lib/flapjack/gateways/web/public/js/select2.js +0 -3397
  250. data/lib/flapjack/gateways/web/public/js/tablesort.js +0 -44
  251. data/lib/flapjack/gateways/web/public/js/underscore.js +0 -1276
  252. data/lib/flapjack/gateways/web/views/edit_contacts.html.erb +0 -173
  253. data/lib/flapjack/gateways/web/views/entities.html.erb +0 -30
  254. data/lib/flapjack/gateways/web/views/entity.html.erb +0 -51
  255. data/lib/flapjack/rack_logger.rb +0 -47
  256. data/lib/flapjack/redis_pool.rb +0 -42
  257. data/spec/lib/flapjack/data/entity_check_spec.rb +0 -1418
  258. data/spec/lib/flapjack/data/entity_spec.rb +0 -872
  259. data/spec/lib/flapjack/data/message_spec.rb +0 -30
  260. data/spec/lib/flapjack/data/migration_spec.rb +0 -104
  261. data/spec/lib/flapjack/data/notification_rule_spec.rb +0 -232
  262. data/spec/lib/flapjack/data/notification_spec.rb +0 -53
  263. data/spec/lib/flapjack/data/semaphore_spec.rb +0 -24
  264. data/spec/lib/flapjack/filters/acknowledgement_spec.rb +0 -6
  265. data/spec/lib/flapjack/filters/delays_spec.rb +0 -6
  266. data/spec/lib/flapjack/filters/ok_spec.rb +0 -6
  267. data/spec/lib/flapjack/filters/scheduled_maintenance_spec.rb +0 -6
  268. data/spec/lib/flapjack/filters/unscheduled_maintenance_spec.rb +0 -6
  269. data/spec/lib/flapjack/gateways/jsonapi/check_methods_spec.rb +0 -315
  270. data/spec/lib/flapjack/gateways/jsonapi/check_presenter_spec.rb +0 -223
  271. data/spec/lib/flapjack/gateways/jsonapi/contact_methods_spec.rb +0 -131
  272. data/spec/lib/flapjack/gateways/jsonapi/entity_methods_spec.rb +0 -389
  273. data/spec/lib/flapjack/gateways/jsonapi/medium_methods_spec.rb +0 -231
  274. data/spec/lib/flapjack/gateways/jsonapi/notification_rule_methods_spec.rb +0 -169
  275. data/spec/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods_spec.rb +0 -114
  276. data/spec/lib/flapjack/gateways/jsonapi/report_methods_spec.rb +0 -590
  277. data/spec/lib/flapjack/gateways/pagerduty_spec.rb +0 -249
  278. data/spec/lib/flapjack/gateways/web/views/check.html.erb_spec.rb +0 -21
  279. data/spec/lib/flapjack/gateways/web/views/contact.html.erb_spec.rb +0 -24
  280. data/spec/lib/flapjack/gateways/web/views/index.html.erb_spec.rb +0 -16
  281. data/spec/lib/flapjack/redis_pool_spec.rb +0 -29
  282. data/spec/service_consumers/pacts/flapjack-diner_v1.0.json +0 -4702
  283. data/tasks/entities.rake +0 -151
  284. data/tasks/profile.rake +0 -282
  285. data/tmp/acknowledge.rb +0 -13
  286. data/tmp/create_config_yaml.rb +0 -16
  287. data/tmp/create_event_ok.rb +0 -30
  288. data/tmp/create_event_unknown.rb +0 -30
  289. data/tmp/create_events_failure.rb +0 -34
  290. data/tmp/create_events_ok.rb +0 -32
  291. data/tmp/create_events_ok_fail_ack_ok.rb +0 -53
  292. data/tmp/create_events_ok_failure.rb +0 -41
  293. data/tmp/create_events_ok_failure_ack.rb +0 -53
  294. data/tmp/dummy_contacts.json +0 -43
  295. data/tmp/dummy_entities.json +0 -37
  296. data/tmp/generate_nagios_test_hosts.rb +0 -16
  297. data/tmp/notification_rules.rb +0 -73
  298. data/tmp/parse_config_yaml.rb +0 -7
  299. data/tmp/redis_find_spurious_unknown_states.rb +0 -52
  300. data/tmp/test_json_post.rb +0 -19
  301. data/tmp/test_notification_rules_api.rb +0 -171
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+
3
+ require 'flapjack/data/check'
4
+
5
+ describe Flapjack::Data::Check, :redis => true do
6
+
7
+ let(:half_an_hour) { 30 * 60 }
8
+
9
+ let(:check_name) { 'foo.example.com:PING' }
10
+
11
+ let(:redis) { Flapjack.redis }
12
+
13
+ it "allows an id that is a UUID" do
14
+ check = Flapjack::Data::Check.new(:id => '20f182fc-6e32-4794-9007-97366d162c51')
15
+ check.valid?
16
+ expect(check.errors).not_to be_nil
17
+ expect(check.errors[:id]).to be_an(Array)
18
+ expect(check.errors[:id]).to be_empty
19
+ end
20
+
21
+ it "does not allow an id that is not a UUID" do
22
+ check = Flapjack::Data::Check.new(:id => 'hello')
23
+ check.valid?
24
+ expect(check.errors).not_to be_nil
25
+ expect(check.errors[:id]).to be_an(Array)
26
+ expect(check.errors[:id]).to include('is not a UUID')
27
+ end
28
+
29
+ context "maintenance" do
30
+
31
+ it "returns that it is not in unscheduled maintenance" do
32
+ Factory.check(:name => check_name)
33
+
34
+ check = Flapjack::Data::Check.intersect(:name => check_name).all.first
35
+ expect(check).not_to be_in_unscheduled_maintenance
36
+ end
37
+
38
+ it "returns that it is not in scheduled maintenance" do
39
+ Factory.check(:name => check_name)
40
+
41
+ check = Flapjack::Data::Check.intersect(:name => check_name).all.first
42
+ expect(check).not_to be_in_scheduled_maintenance
43
+ end
44
+
45
+ it "adds an unscheduled maintenance period and ends the current one early", :time => true do
46
+ Factory.check(:name => check_name)
47
+
48
+ check = Flapjack::Data::Check.intersect(:name => check_name).all.first
49
+
50
+ t = Time.now
51
+ later_t = t.to_i + (15 * 60)
52
+ usm_a = Flapjack::Data::UnscheduledMaintenance.new(:start_time => t,
53
+ :end_time => t.to_i + half_an_hour, :summary => 'scooby')
54
+ usm_a.save
55
+
56
+ check.set_unscheduled_maintenance(usm_a)
57
+
58
+ Delorean.time_travel_to( Time.at(later_t) )
59
+
60
+ usm_b = Flapjack::Data::UnscheduledMaintenance.new(:start_time => later_t,
61
+ :end_time => later_t + half_an_hour, :summary => 'shaggy')
62
+ usm_b.save
63
+ check.set_unscheduled_maintenance(usm_b)
64
+
65
+ expect(check).to be_in_unscheduled_maintenance
66
+
67
+ usms = check.unscheduled_maintenances.all
68
+ expect(usms).to be_a(Set)
69
+ expect(usms.size).to eq(2)
70
+ expect(usms.map(&:summary)).to match_array(['scooby', 'shaggy'])
71
+
72
+ expect(usms.map(&:end_time).map(&:to_i)).
73
+ to match_array([later_t + half_an_hour, later_t])
74
+ end
75
+
76
+ it "ends an unscheduled maintenance period", :time => true do
77
+ Factory.check(:name => check_name)
78
+
79
+ check = Flapjack::Data::Check.intersect(:name => check_name).all.first
80
+
81
+ t = Time.now
82
+ later_t = Time.at(t.to_i + (15 * 60))
83
+ usm_a = Flapjack::Data::UnscheduledMaintenance.new(:start_time => t,
84
+ :end_time => Time.at(t.to_i + half_an_hour), :summary => 'scooby')
85
+ usm_a.save
86
+ check.set_unscheduled_maintenance(usm_a)
87
+
88
+ Delorean.time_travel_to( later_t )
89
+ expect(check).to be_in_unscheduled_maintenance
90
+ check.clear_unscheduled_maintenance(later_t)
91
+
92
+ Delorean.time_travel_to( Time.at(later_t.to_i + 10) )
93
+
94
+ expect(check).not_to be_in_unscheduled_maintenance
95
+
96
+ usms = check.unscheduled_maintenances.all
97
+ expect(usms).to be_a(Set)
98
+ expect(usms.size).to eq(1)
99
+ expect(usms.first.end_time.to_i).to eq(later_t.to_i)
100
+ end
101
+
102
+ it "ends a scheduled maintenance period for a future time" do
103
+ Factory.check(:name => check_name)
104
+
105
+ check = Flapjack::Data::Check.intersect(:name => check_name).all.first
106
+
107
+ t = Time.now
108
+
109
+ sm = Flapjack::Data::ScheduledMaintenance.new(:start_time => t.to_i + (60 * 60),
110
+ :end_time => t.to_i + (3 * 60 * 60), :summary => '2 hours')
111
+ sm.save
112
+ check.scheduled_maintenances << sm
113
+
114
+ sms = check.scheduled_maintenances.all
115
+ expect(sms).to be_a(Set)
116
+ expect(sms.size).to eq(1)
117
+ expect(sms.first.summary).to eq('2 hours')
118
+
119
+ check.end_scheduled_maintenance(sm, t)
120
+ sms = check.scheduled_maintenances.all
121
+ expect(sms).to be_a(Set)
122
+ expect(sms).to be_empty
123
+ end
124
+
125
+ # maint period starts an hour from now, goes for two hours -- at 30 minutes into
126
+ # it we stop it, and its duration should be 30 minutes
127
+ it "shortens a scheduled maintenance period covering a current time", :time => true do
128
+ Factory.check(:name => check_name)
129
+
130
+ check = Flapjack::Data::Check.intersect(:name => check_name).all.first
131
+
132
+ t = Time.now
133
+ sm = Flapjack::Data::ScheduledMaintenance.new(:start_time => t.to_i + (60 * 60),
134
+ :end_time => t.to_i + (3 * 60 * 60), :summary => '1 hour')
135
+ sm.save
136
+ check.scheduled_maintenances << sm
137
+
138
+ future = Time.at(t.to_i + (90 * 60))
139
+
140
+ Delorean.time_travel_to(future)
141
+
142
+ check.end_scheduled_maintenance(sm, future)
143
+
144
+ sms = check.scheduled_maintenances.all
145
+ expect(sms).to be_a(Set)
146
+ expect(sms.size).to eq(1)
147
+ expect(sms.first.end_time.to_i).to eq(future.to_i)
148
+ end
149
+
150
+ it "does not alter or remove a scheduled maintenance period covering a past time", :time => true do
151
+ Factory.check(:name => check_name)
152
+
153
+ check = Flapjack::Data::Check.intersect(:name => check_name).all.first
154
+
155
+ t = Time.now
156
+ sm = Flapjack::Data::ScheduledMaintenance.new(:start_time => t.to_i + (60 * 60),
157
+ :end_time => t.to_i + (3 * 60 * 60), :summary => '1 hour')
158
+ sm.save
159
+ check.scheduled_maintenances << sm
160
+
161
+ future = Time.at(t.to_i + (6 * (60 * 60)) )
162
+
163
+ Delorean.time_travel_to(future)
164
+
165
+ check.end_scheduled_maintenance(sm, future)
166
+
167
+ sms = check.scheduled_maintenances.all
168
+ expect(sms).to be_a(Set)
169
+ expect(sms.size).to eq(1)
170
+ expect(sms.first.end_time.to_i).to eq(t.to_i + (3 * 60 * 60))
171
+ end
172
+
173
+ end
174
+
175
+ end
@@ -1,369 +1,46 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  require 'flapjack/data/contact'
4
+ require 'securerandom'
4
5
 
5
6
  describe Flapjack::Data::Contact, :redis => true do
6
7
 
7
- let(:notification_rule_data) {
8
- {:tags => ["database","physical"],
9
- :entities => ["foo-app-01.example.com"],
10
- :time_restrictions => [],
11
- :unknown_media => [],
12
- :warning_media => ["email"],
13
- :critical_media => ["sms", "email"],
14
- :unknown_blackhole => false,
15
- :warning_blackhole => false,
16
- :critical_blackhole => false
17
- }
18
- }
8
+ let(:redis) { Flapjack.redis }
19
9
 
20
- let(:general_notification_rule_data) {
21
- {:entities => [],
22
- :tags => Set.new([]),
23
- :time_restrictions => [],
24
- :unknown_media => [],
25
- :warning_media => ['email', 'sms', 'slack', 'sms_twilio', 'sms_nexmo', 'jabber', 'pagerduty', 'sns'],
26
- :critical_media => ['email', 'sms', 'slack', 'sms_twilio', 'sms_nexmo', 'jabber', 'pagerduty', 'sns'],
27
- :unknown_blackhole => false,
28
- :warning_blackhole => false,
29
- :critical_blackhole => false}
10
+ let(:contact) {
11
+ Factory.contact(:name => 'John Smith')
12
+ Flapjack::Data::Contact.intersect(:name => 'John Smith').all.first
30
13
  }
31
14
 
32
- before(:each) do
33
- Flapjack::Data::Contact.add( {
34
- 'id' => 'c362',
35
- 'first_name' => 'John',
36
- 'last_name' => 'Johnson',
37
- 'email' => 'johnj@example.com',
38
- 'media' => {
39
- 'pagerduty' => {
40
- 'service_key' => '123456789012345678901234',
41
- 'subdomain' => 'flpjck',
42
- 'token' => 'token123',
43
- 'username' => nil,
44
- 'password' => nil
45
- },
46
- },
47
- },
48
- :redis => @redis)
49
-
50
- Flapjack::Data::Contact.add( {
51
- 'id' => 'c363_a-f@42%*',
52
- 'first_name' => 'Jane',
53
- 'last_name' => 'Janeley',
54
- 'email' => 'janej@example.com',
55
- 'media' => {
56
- 'email' => {
57
- 'address' => 'janej@example.com',
58
- 'interval' => 60,
59
- 'rollup_threshold' => 5,
60
- },
61
- },
62
- },
63
- :redis => @redis)
64
- end
65
-
66
- it "returns a list of all contacts" do
67
- contacts = Flapjack::Data::Contact.all(:redis => @redis)
68
- expect(contacts).not_to be_nil
69
- expect(contacts).to be_an(Array)
70
- expect(contacts.size).to eq(2)
71
- expect(contacts[0].name).to eq('Jane Janeley')
72
- expect(contacts[1].name).to eq('John Johnson')
73
- end
74
-
75
- it "finds a contact by id" do
76
- contact = Flapjack::Data::Contact.find_by_id('c362', :redis => @redis)
77
- expect(contact).not_to be_nil
78
- expect(contact.name).to eq("John Johnson")
79
- end
80
-
81
- it "finds contacts by ids" do
82
- contacts = Flapjack::Data::Contact.find_by_ids(['c362','c363_a-f@42%*'], :redis => @redis)
83
- expect(contacts).not_to be_nil
84
- expect(contacts.length).to eq(2)
85
- contact = contacts.first
86
- expect(contact.name).to eq("John Johnson")
87
- end
88
-
89
- it "adds a contact with the same id as an existing one, clears notification rules" do
90
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
91
- expect(contact).not_to be_nil
15
+ context 'timezone' do
92
16
 
93
- contact.add_notification_rule(notification_rule_data)
94
-
95
- nr = contact.notification_rules
96
- expect(nr).not_to be_nil
97
- expect(nr.size).to eq(2)
98
-
99
- Flapjack::Data::Contact.add({'id' => 'c363_a-f@42%*',
100
- 'first_name' => 'Smithy',
101
- 'last_name' => 'Smith',
102
- 'email' => 'smithys@example.com'},
103
- :redis => @redis)
104
-
105
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
106
- expect(contact).not_to be_nil
107
- expect(contact.name).to eq('Smithy Smith')
108
- rules = contact.notification_rules
109
- expect(rules.size).to eq(1)
110
- expect(nr.map(&:id)).not_to include(rules.first.id)
111
- end
112
-
113
- it "updates a contact and clears their media settings" do
114
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
115
-
116
- contact.update('media' => {})
117
- expect(contact.media).to be_empty
118
- end
119
-
120
- it "updates a contact's timezone" do
121
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
122
-
123
- expect(contact.time_zone).to eq(nil)
124
- contact.update('timezone' => 'Asia/Shanghai')
125
- expect(contact.time_zone).to eq(ActiveSupport::TimeZone['Asia/Shanghai'])
126
- end
17
+ it "sets a timezone from a time zone string" do
18
+ expect(contact.timezone).to be_nil
19
+ expect(contact.time_zone).to be_nil
127
20
 
128
- it "clears a contact's timezone with a nil value" do
129
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
130
-
131
- expect(contact.time_zone).to eq(nil)
132
- contact.update('timezone' => 'Asia/Shanghai')
133
- expect(contact.time_zone).to eq(ActiveSupport::TimeZone['Asia/Shanghai'])
134
- contact.update('timezone' => nil)
135
- expect(contact.time_zone).to eq(nil)
136
- end
137
-
138
- it "does not update a contact's timezone with an invalid string" do
139
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
140
-
141
- expect(contact.time_zone).to eq(nil)
142
- contact.update('timezone' => 'Asia/Shanghai')
143
- expect(contact.time_zone).to eq(ActiveSupport::TimeZone['Asia/Shanghai'])
144
- contact.update('timezone' => '')
145
- expect(contact.time_zone).to eq(ActiveSupport::TimeZone['Asia/Shanghai'])
146
- end
147
-
148
- it "updates a contact, does not clear notification rules" do
149
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
150
- expect(contact).not_to be_nil
151
-
152
- contact.add_notification_rule(notification_rule_data)
153
-
154
- nr1 = contact.notification_rules
155
- expect(nr1).not_to be_nil
156
- expect(nr1.size).to eq(2)
157
-
158
- contact.update('first_name' => 'John',
159
- 'last_name' => 'Smith',
160
- 'email' => 'johns@example.com')
161
- expect(contact.name).to eq('John Smith')
162
-
163
- nr2 = contact.notification_rules
164
- expect(nr2).not_to be_nil
165
- expect(nr2.size).to eq(2)
166
- expect(nr1.map(&:id)).to eq(nr2.map(&:id))
167
- end
168
-
169
- it "adds a notification rule for a contact" do
170
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
171
- expect(contact).not_to be_nil
172
-
173
- expect {
174
- contact.add_notification_rule(notification_rule_data)
175
- }.to change { contact.notification_rules.size }.from(1).to(2)
176
- end
177
-
178
- it "removes a notification rule from a contact" do
179
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
180
- expect(contact).not_to be_nil
181
-
182
- rule = contact.add_notification_rule(notification_rule_data)
183
-
184
- expect {
185
- contact.delete_notification_rule(rule)
186
- }.to change { contact.notification_rules.size }.from(2).to(1)
187
- end
21
+ contact.timezone = 'Australia/Adelaide'
22
+ expect(contact.save).to be_truthy
23
+ expect(contact.timezone).to eq('Australia/Adelaide')
24
+ expect(contact.time_zone).to respond_to(:name)
25
+ expect(contact.time_zone.name).to eq('Australia/Adelaide')
26
+ end
188
27
 
189
- it "creates a general notification rule for a pre-existing contact if none exists" do
190
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
28
+ it "clears timezone when time zone string set to nil" do
29
+ contact.timezone = 'Australia/Adelaide'
30
+ expect(contact.save).to be_truthy
191
31
 
192
- @redis.smembers("contact_notification_rules:c363_a-f@42%*").each do |rule_id|
193
- @redis.srem("contact_notification_rules:c363_a-f@42%*", rule_id)
32
+ contact.timezone = nil
33
+ expect(contact.save).to be_truthy
34
+ expect(contact.timezone).to be_nil
35
+ expect(contact.time_zone).to be_nil
194
36
  end
195
- expect(@redis.smembers("contact_notification_rules:c363_a-f@42%*")).to be_empty
196
37
 
197
- rules = contact.notification_rules
198
- expect(rules.size).to eq(1)
199
- rule = rules.first
200
- [:entities, :tags, :time_restrictions,
201
- :warning_media, :critical_media,
202
- :warning_blackhole, :critical_blackhole].each do |k|
203
- expect(rule.send(k)).to eq(general_notification_rule_data[k])
38
+ it "handles an invalid time zone string" do
39
+ contact.timezone = ''
40
+ expect(contact.save).to be_falsey
41
+ expect(contact.errors.full_messages).to eq(['Timezone must be a valid time zone string'])
204
42
  end
205
- end
206
-
207
- it "creates a general notification rule for a pre-existing contact if the existing general one was changed" do
208
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
209
- rules = contact.notification_rules
210
- expect(rules.size).to eq(1)
211
- rule = rules.first
212
-
213
- rule.update(notification_rule_data)
214
-
215
- rules = contact.notification_rules
216
- expect(rules.size).to eq(2)
217
- expect(rules.select {|r| r.is_specific? }.size).to eq(1)
218
- end
219
-
220
- it "deletes a contact by id, including linked entities, checks and notification rules" do
221
- contact = Flapjack::Data::Contact.find_by_id('c362', :redis => @redis)
222
-
223
- entity_name = 'abc-123'
224
-
225
- entity = Flapjack::Data::Entity.add({'id' => '5000',
226
- 'name' => entity_name,
227
- 'contacts' => ['c362']},
228
- :redis => @redis)
229
-
230
- expect {
231
- expect {
232
- contact.delete!
233
- }.to change { Flapjack::Data::Contact.all(:redis => @redis).size }.by(-1)
234
- }.to change { entity.contacts.size }.by(-1)
235
- end
236
-
237
- it "deletes all contacts"
238
-
239
- it "returns a list of entities and their checks for a contact" do
240
- entity_name = 'abc-123'
241
-
242
- Flapjack::Data::Entity.add({'id' => '5000',
243
- 'name' => entity_name,
244
- 'contacts' => ['c362']},
245
- :redis => @redis)
246
-
247
- ec = Flapjack::Data::EntityCheck.for_entity_name(entity_name, 'PING', :redis => @redis)
248
- t = Time.now.to_i
249
- ec.update_state('ok', :timestamp => t, :summary => 'a')
250
- # was check.last_update=
251
- @redis.hset("check:#{entity_name}:PING", 'last_update', t)
252
- @redis.zadd("all_checks", t, @key)
253
- @redis.zadd("all_checks:#{entity_name}", t, 'PING')
254
- @redis.zadd("current_checks:#{entity_name}", t, 'PING')
255
- @redis.zadd('current_entities', t, entity_name)
256
-
257
- contact = Flapjack::Data::Contact.find_by_id('c362', :redis => @redis)
258
- eandcs = contact.entities(:checks => true)
259
- expect(eandcs).not_to be_nil
260
- expect(eandcs).to be_an(Array)
261
- expect(eandcs.size).to eq(1)
262
-
263
- eandc = eandcs.first
264
- expect(eandc).to be_a(Hash)
265
-
266
- entity = eandc[:entity]
267
- expect(entity.name).to eq(entity_name)
268
- checks = eandc[:checks]
269
- expect(checks).to be_a(Set)
270
- expect(checks.size).to eq(1)
271
- expect(checks).to include('PING')
272
- end
273
-
274
- it "returns pagerduty credentials for a contact" do
275
- contact = Flapjack::Data::Contact.find_by_id('c362', :redis => @redis)
276
- credentials = contact.pagerduty_credentials
277
- expect(credentials).not_to be_nil
278
- expect(credentials).to be_a(Hash)
279
- expect(credentials).to eq({'service_key' => '123456789012345678901234',
280
- 'subdomain' => 'flpjck',
281
- 'token' => 'token123',
282
- 'username' => '',
283
- 'password' => ''})
284
- end
285
-
286
- it "sets pagerduty credentials for a contact" do
287
- contact = Flapjack::Data::Contact.find_by_id('c362', :redis => @redis)
288
- contact.set_pagerduty_credentials('service_key' => '567890123456789012345678',
289
- 'subdomain' => 'eggs',
290
- 'token' => 'token123',
291
- 'username' => 'mary',
292
- 'password' => 'mary_password')
293
-
294
- expect(@redis.hget('contact_media:c362', 'pagerduty')).to eq('567890123456789012345678')
295
- expect(@redis.hgetall('contact_pagerduty:c362')).to eq({
296
- 'subdomain' => 'eggs',
297
- 'token' => 'token123',
298
- 'username' => 'mary',
299
- 'password' => 'mary_password'
300
- })
301
- end
302
-
303
- it "sets the interval for a contact's media" do
304
- contact = Flapjack::Data::Contact.find_by_id('c362', :redis => @redis)
305
- contact.set_interval_for_media('email', 42)
306
- email_interval_raw = @redis.hget("contact_media_intervals:#{contact.id}", 'email')
307
- expect(email_interval_raw).to eq('42')
308
- end
309
-
310
- it "returns the interval for a contact's media" do
311
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
312
- email_interval = contact.interval_for_media('email')
313
- expect(email_interval).to eq(60)
314
- end
315
-
316
- it "returns default 15 mins for interval for a contact's media that has no set interval" do
317
- contact = Flapjack::Data::Contact.find_by_id('c362', :redis => @redis)
318
- email_interval = contact.interval_for_media('email')
319
- expect(email_interval).to eq(900)
320
- end
321
-
322
- it "removes the interval for a contact's media" do
323
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
324
- contact.set_interval_for_media('email', nil)
325
- email_interval_raw = @redis.hget("contact_media_intervals:#{contact.id}", 'email')
326
- expect(email_interval_raw).to be_nil
327
- end
328
-
329
- it "sets the rollup threshold for a contact's media" do
330
- contact = Flapjack::Data::Contact.find_by_id('c362', :redis => @redis)
331
- email_rollup_threshold = contact.set_rollup_threshold_for_media('email', 3)
332
- email_rollup_threshold_raw = @redis.hget("contact_media_rollup_thresholds:#{contact.id}", 'email')
333
- expect(email_rollup_threshold_raw).to eq('3')
334
- end
335
-
336
- it "returns the rollup threshold for a contact's media" do
337
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
338
- email_rollup_threshold = contact.rollup_threshold_for_media('email')
339
- expect(email_rollup_threshold).not_to be_nil
340
- expect(email_rollup_threshold).to be_a(Integer)
341
- expect(email_rollup_threshold).to eq(5)
342
- end
343
-
344
- it "removes the rollup threshold for a contact's media" do
345
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
346
- email_rollup_threshold = contact.set_rollup_threshold_for_media('email', nil)
347
- email_rollup_threshold_raw = @redis.hget("contact_media_rollup_thresholds:#{contact.id}", 'email')
348
- expect(email_rollup_threshold_raw).to be_nil
349
- end
350
-
351
- it "sets the address for a contact's media" do
352
- contact = Flapjack::Data::Contact.find_by_id('c362', :redis => @redis)
353
- contact.set_address_for_media('email', 'spongebob@example.com')
354
- email_address_raw = @redis.hget("contact_media:#{contact.id}", 'email')
355
- expect(email_address_raw).to eq('spongebob@example.com')
356
- end
357
43
 
358
- it "removes a contact's media" do
359
- contact = Flapjack::Data::Contact.find_by_id('c363_a-f@42%*', :redis => @redis)
360
- contact.remove_media('email')
361
- email_address_raw = @redis.hget("contac_media:#{contact.id}", 'email')
362
- expect(email_address_raw).to be_nil
363
- email_rollup_threshold_raw = @redis.hget("contact_media_rollup_thresholds:#{contact.id}", 'email')
364
- expect(email_rollup_threshold_raw).to be_nil
365
- email_interval_raw = @redis.hget("contact_media_intervals:#{contact.id}", 'email')
366
- expect(email_interval_raw).to be_nil
367
44
  end
368
45
 
369
46
  end