flapjack 1.6.0 → 2.0.0b1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -6
  3. data/.gitmodules +1 -1
  4. data/.rspec +1 -1
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +12 -13
  7. data/CHANGELOG.md +2 -9
  8. data/CONTRIBUTING.md +7 -2
  9. data/Gemfile +4 -13
  10. data/LICENCE +1 -0
  11. data/README.md +8 -2
  12. data/Rakefile +2 -2
  13. data/bin/flapjack +3 -12
  14. data/build.sh +4 -2
  15. data/etc/flapjack_config.toml.example +273 -0
  16. data/features/ack_after_sched_maint.feature +18 -21
  17. data/features/cli.feature +11 -71
  18. data/features/cli_flapjack-feed-events.feature +14 -15
  19. data/features/cli_flapjack-nagios-receiver.feature +12 -41
  20. data/features/cli_flapper.feature +12 -41
  21. data/features/cli_purge.feature +5 -6
  22. data/features/cli_receive-events.feature +6 -7
  23. data/features/cli_simulate-failed-check.feature +5 -6
  24. data/features/events.feature +206 -181
  25. data/features/events_check_names.feature +4 -7
  26. data/features/notification_rules.feature +144 -223
  27. data/features/notifications.feature +65 -57
  28. data/features/rollup.feature +45 -47
  29. data/features/steps/cli_steps.rb +4 -5
  30. data/features/steps/events_steps.rb +163 -373
  31. data/features/steps/notifications_steps.rb +408 -264
  32. data/features/steps/packaging-lintian_steps.rb +0 -4
  33. data/features/steps/time_travel_steps.rb +0 -26
  34. data/features/support/daemons.rb +6 -31
  35. data/features/support/env.rb +65 -74
  36. data/flapjack.gemspec +22 -24
  37. data/lib/flapjack.rb +14 -7
  38. data/lib/flapjack/cli/flapper.rb +74 -173
  39. data/lib/flapjack/cli/maintenance.rb +278 -109
  40. data/lib/flapjack/cli/migrate.rb +950 -0
  41. data/lib/flapjack/cli/purge.rb +19 -22
  42. data/lib/flapjack/cli/receiver.rb +150 -326
  43. data/lib/flapjack/cli/server.rb +8 -235
  44. data/lib/flapjack/cli/simulate.rb +42 -57
  45. data/lib/flapjack/configuration.rb +51 -37
  46. data/lib/flapjack/coordinator.rb +138 -129
  47. data/lib/flapjack/data/acknowledgement.rb +177 -0
  48. data/lib/flapjack/data/alert.rb +97 -158
  49. data/lib/flapjack/data/check.rb +611 -0
  50. data/lib/flapjack/data/condition.rb +70 -0
  51. data/lib/flapjack/data/contact.rb +226 -456
  52. data/lib/flapjack/data/event.rb +96 -184
  53. data/lib/flapjack/data/extensions/associations.rb +59 -0
  54. data/lib/flapjack/data/extensions/short_name.rb +25 -0
  55. data/lib/flapjack/data/medium.rb +428 -0
  56. data/lib/flapjack/data/metrics.rb +194 -0
  57. data/lib/flapjack/data/notification.rb +22 -281
  58. data/lib/flapjack/data/rule.rb +473 -0
  59. data/lib/flapjack/data/scheduled_maintenance.rb +244 -0
  60. data/lib/flapjack/data/state.rb +221 -0
  61. data/lib/flapjack/data/statistic.rb +112 -0
  62. data/lib/flapjack/data/tag.rb +277 -0
  63. data/lib/flapjack/data/test_notification.rb +182 -0
  64. data/lib/flapjack/data/unscheduled_maintenance.rb +159 -0
  65. data/lib/flapjack/data/validators/id_validator.rb +20 -0
  66. data/lib/flapjack/exceptions.rb +6 -0
  67. data/lib/flapjack/filters/acknowledgement.rb +23 -16
  68. data/lib/flapjack/filters/base.rb +0 -5
  69. data/lib/flapjack/filters/delays.rb +53 -43
  70. data/lib/flapjack/filters/ok.rb +23 -14
  71. data/lib/flapjack/filters/scheduled_maintenance.rb +3 -3
  72. data/lib/flapjack/filters/unscheduled_maintenance.rb +12 -3
  73. data/lib/flapjack/gateways/aws_sns.rb +65 -49
  74. data/lib/flapjack/gateways/aws_sns/alert.text.erb +2 -2
  75. data/lib/flapjack/gateways/aws_sns/alert_subject.text.erb +2 -2
  76. data/lib/flapjack/gateways/aws_sns/rollup_subject.text.erb +1 -1
  77. data/lib/flapjack/gateways/email.rb +107 -90
  78. data/lib/flapjack/gateways/email/alert.html.erb +19 -18
  79. data/lib/flapjack/gateways/email/alert.text.erb +20 -14
  80. data/lib/flapjack/gateways/email/alert_subject.text.erb +2 -1
  81. data/lib/flapjack/gateways/email/rollup.html.erb +14 -13
  82. data/lib/flapjack/gateways/email/rollup.text.erb +13 -10
  83. data/lib/flapjack/gateways/jabber.rb +679 -671
  84. data/lib/flapjack/gateways/jabber/alert.text.erb +9 -6
  85. data/lib/flapjack/gateways/jsonapi.rb +164 -350
  86. data/lib/flapjack/gateways/jsonapi/data/join_descriptor.rb +44 -0
  87. data/lib/flapjack/gateways/jsonapi/data/method_descriptor.rb +21 -0
  88. data/lib/flapjack/gateways/jsonapi/helpers/headers.rb +63 -0
  89. data/lib/flapjack/gateways/jsonapi/helpers/miscellaneous.rb +136 -0
  90. data/lib/flapjack/gateways/jsonapi/helpers/resources.rb +227 -0
  91. data/lib/flapjack/gateways/jsonapi/helpers/serialiser.rb +313 -0
  92. data/lib/flapjack/gateways/jsonapi/helpers/swagger_docs.rb +322 -0
  93. data/lib/flapjack/gateways/jsonapi/methods/association_delete.rb +115 -0
  94. data/lib/flapjack/gateways/jsonapi/methods/association_get.rb +288 -0
  95. data/lib/flapjack/gateways/jsonapi/methods/association_patch.rb +178 -0
  96. data/lib/flapjack/gateways/jsonapi/methods/association_post.rb +116 -0
  97. data/lib/flapjack/gateways/jsonapi/methods/metrics.rb +71 -0
  98. data/lib/flapjack/gateways/jsonapi/methods/resource_delete.rb +119 -0
  99. data/lib/flapjack/gateways/jsonapi/methods/resource_get.rb +186 -0
  100. data/lib/flapjack/gateways/jsonapi/methods/resource_patch.rb +239 -0
  101. data/lib/flapjack/gateways/jsonapi/methods/resource_post.rb +197 -0
  102. data/lib/flapjack/gateways/jsonapi/middleware/array_param_fixer.rb +27 -0
  103. data/lib/flapjack/gateways/jsonapi/{rack → middleware}/json_params_parser.rb +7 -6
  104. data/lib/flapjack/gateways/jsonapi/middleware/request_timestamp.rb +18 -0
  105. data/lib/flapjack/gateways/oobetet.rb +222 -170
  106. data/lib/flapjack/gateways/pager_duty.rb +388 -0
  107. data/lib/flapjack/gateways/pager_duty/alert.text.erb +13 -0
  108. data/lib/flapjack/gateways/slack.rb +56 -48
  109. data/lib/flapjack/gateways/slack/alert.text.erb +1 -1
  110. data/lib/flapjack/gateways/slack/rollup.text.erb +1 -1
  111. data/lib/flapjack/gateways/sms_aspsms.rb +155 -0
  112. data/lib/flapjack/gateways/sms_aspsms/alert.text.erb +7 -0
  113. data/lib/flapjack/gateways/sms_aspsms/rollup.text.erb +2 -0
  114. data/lib/flapjack/gateways/sms_messagenet.rb +77 -57
  115. data/lib/flapjack/gateways/sms_messagenet/alert.text.erb +3 -2
  116. data/lib/flapjack/gateways/sms_nexmo.rb +53 -51
  117. data/lib/flapjack/gateways/sms_nexmo/alert.text.erb +2 -2
  118. data/lib/flapjack/gateways/sms_nexmo/rollup.text.erb +1 -1
  119. data/lib/flapjack/gateways/sms_twilio.rb +79 -62
  120. data/lib/flapjack/gateways/sms_twilio/alert.text.erb +3 -2
  121. data/lib/flapjack/gateways/web.rb +437 -345
  122. data/lib/flapjack/gateways/web/middleware/request_timestamp.rb +18 -0
  123. data/lib/flapjack/gateways/web/public/css/bootstrap.css +3793 -4340
  124. data/lib/flapjack/gateways/web/public/css/bootstrap.css.map +1 -0
  125. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.eot +0 -0
  126. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.svg +273 -214
  127. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  128. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff +0 -0
  129. data/lib/flapjack/gateways/web/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  130. data/lib/flapjack/gateways/web/public/js/bootstrap.js +1637 -1607
  131. data/lib/flapjack/gateways/web/public/js/self_stats.js +1 -2
  132. data/lib/flapjack/gateways/web/views/_pagination.html.erb +19 -0
  133. data/lib/flapjack/gateways/web/views/check.html.erb +159 -121
  134. data/lib/flapjack/gateways/web/views/checks.html.erb +82 -41
  135. data/lib/flapjack/gateways/web/views/contact.html.erb +59 -71
  136. data/lib/flapjack/gateways/web/views/contacts.html.erb +32 -8
  137. data/lib/flapjack/gateways/web/views/index.html.erb +2 -2
  138. data/lib/flapjack/gateways/web/views/{layout.erb → layout.html.erb} +7 -23
  139. data/lib/flapjack/gateways/web/views/self_stats.html.erb +32 -33
  140. data/lib/flapjack/gateways/web/views/tag.html.erb +32 -0
  141. data/lib/flapjack/gateways/web/views/tags.html.erb +51 -0
  142. data/lib/flapjack/logger.rb +34 -3
  143. data/lib/flapjack/notifier.rb +180 -112
  144. data/lib/flapjack/patches.rb +8 -63
  145. data/lib/flapjack/pikelet.rb +185 -143
  146. data/lib/flapjack/processor.rb +323 -191
  147. data/lib/flapjack/record_queue.rb +33 -0
  148. data/lib/flapjack/redis_proxy.rb +66 -0
  149. data/lib/flapjack/utility.rb +21 -15
  150. data/lib/flapjack/version.rb +2 -1
  151. data/libexec/httpbroker.go +218 -14
  152. data/libexec/oneoff.go +13 -10
  153. data/spec/lib/flapjack/configuration_spec.rb +286 -0
  154. data/spec/lib/flapjack/coordinator_spec.rb +103 -157
  155. data/spec/lib/flapjack/data/check_spec.rb +175 -0
  156. data/spec/lib/flapjack/data/contact_spec.rb +26 -349
  157. data/spec/lib/flapjack/data/event_spec.rb +76 -291
  158. data/spec/lib/flapjack/data/medium_spec.rb +19 -0
  159. data/spec/lib/flapjack/data/rule_spec.rb +43 -0
  160. data/spec/lib/flapjack/data/scheduled_maintenance_spec.rb +976 -0
  161. data/spec/lib/flapjack/data/unscheduled_maintenance_spec.rb +34 -0
  162. data/spec/lib/flapjack/gateways/aws_sns_spec.rb +111 -60
  163. data/spec/lib/flapjack/gateways/email_spec.rb +194 -161
  164. data/spec/lib/flapjack/gateways/jabber_spec.rb +961 -162
  165. data/spec/lib/flapjack/gateways/jsonapi/methods/check_links_spec.rb +155 -0
  166. data/spec/lib/flapjack/gateways/jsonapi/methods/checks_spec.rb +426 -0
  167. data/spec/lib/flapjack/gateways/jsonapi/methods/contact_links_spec.rb +217 -0
  168. data/spec/lib/flapjack/gateways/jsonapi/methods/contacts_spec.rb +425 -0
  169. data/spec/lib/flapjack/gateways/jsonapi/methods/events_spec.rb +271 -0
  170. data/spec/lib/flapjack/gateways/jsonapi/methods/media_spec.rb +257 -0
  171. data/spec/lib/flapjack/gateways/jsonapi/methods/medium_links_spec.rb +163 -0
  172. data/spec/lib/flapjack/gateways/jsonapi/methods/metrics_spec.rb +8 -0
  173. data/spec/lib/flapjack/gateways/jsonapi/methods/rule_links_spec.rb +212 -0
  174. data/spec/lib/flapjack/gateways/jsonapi/methods/rules_spec.rb +289 -0
  175. data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenance_links_spec.rb +49 -0
  176. data/spec/lib/flapjack/gateways/jsonapi/methods/scheduled_maintenances_spec.rb +242 -0
  177. data/spec/lib/flapjack/gateways/jsonapi/methods/tag_links_spec.rb +274 -0
  178. data/spec/lib/flapjack/gateways/jsonapi/methods/tags_spec.rb +302 -0
  179. data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenance_links_spec.rb +49 -0
  180. data/spec/lib/flapjack/gateways/jsonapi/methods/unscheduled_maintenances_spec.rb +339 -0
  181. data/spec/lib/flapjack/gateways/jsonapi_spec.rb +1 -1
  182. data/spec/lib/flapjack/gateways/oobetet_spec.rb +151 -79
  183. data/spec/lib/flapjack/gateways/pager_duty_spec.rb +353 -0
  184. data/spec/lib/flapjack/gateways/slack_spec.rb +53 -53
  185. data/spec/lib/flapjack/gateways/sms_aspsms_spec.rb +106 -0
  186. data/spec/lib/flapjack/gateways/sms_messagenet_spec.rb +111 -54
  187. data/spec/lib/flapjack/gateways/sms_nexmo_spec.rb +50 -51
  188. data/spec/lib/flapjack/gateways/sms_twilio_spec.rb +108 -48
  189. data/spec/lib/flapjack/gateways/web_spec.rb +144 -216
  190. data/spec/lib/flapjack/notifier_spec.rb +132 -1
  191. data/spec/lib/flapjack/pikelet_spec.rb +111 -50
  192. data/spec/lib/flapjack/processor_spec.rb +210 -40
  193. data/spec/lib/flapjack/redis_proxy_spec.rb +45 -0
  194. data/spec/lib/flapjack/utility_spec.rb +11 -15
  195. data/spec/service_consumers/fixture_data.rb +547 -0
  196. data/spec/service_consumers/pact_helper.rb +21 -32
  197. data/spec/service_consumers/pacts/flapjack-diner_v2.0.json +4652 -0
  198. data/spec/service_consumers/provider_states_for_flapjack-diner.rb +279 -322
  199. data/spec/service_consumers/provider_support.rb +8 -0
  200. data/spec/spec_helper.rb +34 -44
  201. data/spec/support/erb_view_helper.rb +1 -1
  202. data/spec/support/factories.rb +58 -0
  203. data/spec/support/jsonapi_helper.rb +15 -26
  204. data/spec/support/mock_logger.rb +43 -0
  205. data/spec/support/xmpp_comparable.rb +24 -0
  206. data/src/flapjack/transport_test.go +30 -1
  207. data/tasks/dump_keys.rake +82 -0
  208. data/tasks/events.rake +7 -7
  209. data/tasks/support/flapjack_config_benchmark.toml +28 -0
  210. data/tasks/support/flapjack_config_benchmark.yaml +0 -2
  211. metadata +175 -222
  212. data/Guardfile +0 -14
  213. data/etc/flapjack_config.yaml.example +0 -477
  214. data/features/cli_flapjack-populator.feature +0 -90
  215. data/features/support/silent_system.rb +0 -4
  216. data/lib/flapjack/cli/import.rb +0 -108
  217. data/lib/flapjack/data/entity.rb +0 -652
  218. data/lib/flapjack/data/entity_check.rb +0 -1044
  219. data/lib/flapjack/data/message.rb +0 -56
  220. data/lib/flapjack/data/migration.rb +0 -234
  221. data/lib/flapjack/data/notification_rule.rb +0 -425
  222. data/lib/flapjack/data/semaphore.rb +0 -44
  223. data/lib/flapjack/data/tagged.rb +0 -48
  224. data/lib/flapjack/gateways/jsonapi/check_methods.rb +0 -206
  225. data/lib/flapjack/gateways/jsonapi/check_presenter.rb +0 -221
  226. data/lib/flapjack/gateways/jsonapi/contact_methods.rb +0 -186
  227. data/lib/flapjack/gateways/jsonapi/entity_methods.rb +0 -223
  228. data/lib/flapjack/gateways/jsonapi/medium_methods.rb +0 -185
  229. data/lib/flapjack/gateways/jsonapi/metrics_methods.rb +0 -132
  230. data/lib/flapjack/gateways/jsonapi/notification_rule_methods.rb +0 -141
  231. data/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods.rb +0 -139
  232. data/lib/flapjack/gateways/jsonapi/report_methods.rb +0 -146
  233. data/lib/flapjack/gateways/pagerduty.rb +0 -318
  234. data/lib/flapjack/gateways/pagerduty/alert.text.erb +0 -10
  235. data/lib/flapjack/gateways/web/public/css/select2-bootstrap.css +0 -87
  236. data/lib/flapjack/gateways/web/public/css/select2.css +0 -615
  237. data/lib/flapjack/gateways/web/public/css/tablesort.css +0 -67
  238. data/lib/flapjack/gateways/web/public/img/select2-spinner.gif +0 -0
  239. data/lib/flapjack/gateways/web/public/img/select2.png +0 -0
  240. data/lib/flapjack/gateways/web/public/img/select2x2.png +0 -0
  241. data/lib/flapjack/gateways/web/public/js/backbone.js +0 -1581
  242. data/lib/flapjack/gateways/web/public/js/backbone.jsonapi.js +0 -322
  243. data/lib/flapjack/gateways/web/public/js/flapjack.js +0 -82
  244. data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.js +0 -1640
  245. data/lib/flapjack/gateways/web/public/js/jquery.tablesorter.widgets.js +0 -1390
  246. data/lib/flapjack/gateways/web/public/js/modules/contact.js +0 -520
  247. data/lib/flapjack/gateways/web/public/js/modules/entity.js +0 -28
  248. data/lib/flapjack/gateways/web/public/js/modules/medium.js +0 -40
  249. data/lib/flapjack/gateways/web/public/js/select2.js +0 -3397
  250. data/lib/flapjack/gateways/web/public/js/tablesort.js +0 -44
  251. data/lib/flapjack/gateways/web/public/js/underscore.js +0 -1276
  252. data/lib/flapjack/gateways/web/views/edit_contacts.html.erb +0 -173
  253. data/lib/flapjack/gateways/web/views/entities.html.erb +0 -30
  254. data/lib/flapjack/gateways/web/views/entity.html.erb +0 -51
  255. data/lib/flapjack/rack_logger.rb +0 -47
  256. data/lib/flapjack/redis_pool.rb +0 -42
  257. data/spec/lib/flapjack/data/entity_check_spec.rb +0 -1418
  258. data/spec/lib/flapjack/data/entity_spec.rb +0 -872
  259. data/spec/lib/flapjack/data/message_spec.rb +0 -30
  260. data/spec/lib/flapjack/data/migration_spec.rb +0 -104
  261. data/spec/lib/flapjack/data/notification_rule_spec.rb +0 -232
  262. data/spec/lib/flapjack/data/notification_spec.rb +0 -53
  263. data/spec/lib/flapjack/data/semaphore_spec.rb +0 -24
  264. data/spec/lib/flapjack/filters/acknowledgement_spec.rb +0 -6
  265. data/spec/lib/flapjack/filters/delays_spec.rb +0 -6
  266. data/spec/lib/flapjack/filters/ok_spec.rb +0 -6
  267. data/spec/lib/flapjack/filters/scheduled_maintenance_spec.rb +0 -6
  268. data/spec/lib/flapjack/filters/unscheduled_maintenance_spec.rb +0 -6
  269. data/spec/lib/flapjack/gateways/jsonapi/check_methods_spec.rb +0 -315
  270. data/spec/lib/flapjack/gateways/jsonapi/check_presenter_spec.rb +0 -223
  271. data/spec/lib/flapjack/gateways/jsonapi/contact_methods_spec.rb +0 -131
  272. data/spec/lib/flapjack/gateways/jsonapi/entity_methods_spec.rb +0 -389
  273. data/spec/lib/flapjack/gateways/jsonapi/medium_methods_spec.rb +0 -231
  274. data/spec/lib/flapjack/gateways/jsonapi/notification_rule_methods_spec.rb +0 -169
  275. data/spec/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods_spec.rb +0 -114
  276. data/spec/lib/flapjack/gateways/jsonapi/report_methods_spec.rb +0 -590
  277. data/spec/lib/flapjack/gateways/pagerduty_spec.rb +0 -249
  278. data/spec/lib/flapjack/gateways/web/views/check.html.erb_spec.rb +0 -21
  279. data/spec/lib/flapjack/gateways/web/views/contact.html.erb_spec.rb +0 -24
  280. data/spec/lib/flapjack/gateways/web/views/index.html.erb_spec.rb +0 -16
  281. data/spec/lib/flapjack/redis_pool_spec.rb +0 -29
  282. data/spec/service_consumers/pacts/flapjack-diner_v1.0.json +0 -4702
  283. data/tasks/entities.rake +0 -151
  284. data/tasks/profile.rake +0 -282
  285. data/tmp/acknowledge.rb +0 -13
  286. data/tmp/create_config_yaml.rb +0 -16
  287. data/tmp/create_event_ok.rb +0 -30
  288. data/tmp/create_event_unknown.rb +0 -30
  289. data/tmp/create_events_failure.rb +0 -34
  290. data/tmp/create_events_ok.rb +0 -32
  291. data/tmp/create_events_ok_fail_ack_ok.rb +0 -53
  292. data/tmp/create_events_ok_failure.rb +0 -41
  293. data/tmp/create_events_ok_failure_ack.rb +0 -53
  294. data/tmp/dummy_contacts.json +0 -43
  295. data/tmp/dummy_entities.json +0 -37
  296. data/tmp/generate_nagios_test_hosts.rb +0 -16
  297. data/tmp/notification_rules.rb +0 -73
  298. data/tmp/parse_config_yaml.rb +0 -7
  299. data/tmp/redis_find_spurious_unknown_states.rb +0 -52
  300. data/tmp/test_json_post.rb +0 -19
  301. data/tmp/test_notification_rules_api.rb +0 -171
@@ -1,334 +1,478 @@
1
-
2
- # copied from flapjack-populator
3
- # TODO use Flapjack::Data::Contact.add
4
- def add_contact(contact = {})
5
- @notifier_redis.multi do |multi|
6
- multi.del("contact:#{contact['id']}")
7
- multi.del("contact_media:#{contact['id']}")
8
- multi.hset("contact:#{contact['id']}", 'first_name', contact['first_name'])
9
- multi.hset("contact:#{contact['id']}", 'last_name', contact['last_name'])
10
- multi.hset("contact:#{contact['id']}", 'email', contact['email'])
11
- contact['media'].each_pair {|medium, address|
12
- multi.hset("contact_media:#{contact['id']}", medium, address)
13
- }
1
+ require 'flapjack/data/check'
2
+ require 'flapjack/data/contact'
3
+ require 'flapjack/data/medium'
4
+ require 'flapjack/data/rule'
5
+ require 'flapjack/data/tag'
6
+
7
+ require 'flapjack/gateways/aws_sns'
8
+ require 'flapjack/gateways/email'
9
+ require 'flapjack/gateways/sms_messagenet'
10
+ require 'flapjack/gateways/sms_nexmo'
11
+
12
+ def find_or_create_contact(contact_data)
13
+ contact = Flapjack::Data::Contact.intersect(:name => contact_data[:name]).all.first
14
+ if contact.nil?
15
+ contact = Flapjack::Data::Contact.new(:name => contact_data[:name])
16
+ expect(contact.save).to be true
14
17
  end
18
+
19
+ contact
15
20
  end
16
21
 
17
- Given /^the user wants to receive SMS notifications for entity '([\w\.\-]+)'$/ do |entity|
18
- add_contact( 'id' => '0999',
19
- 'first_name' => 'John',
20
- 'last_name' => 'Smith',
21
- 'email' => 'johns@example.dom',
22
- 'media' => {'sms' => '+61888888888'} )
23
- Flapjack::Data::Entity.add({'id' => '5000',
24
- 'name' => entity,
25
- 'contacts' => ["0999"]},
26
- :redis => @notifier_redis )
22
+ def find_or_create_check(check_data)
23
+ check = Flapjack::Data::Check.intersect(:name => check_data[:name]).all.first
24
+
25
+ if check.nil?
26
+ check = Flapjack::Data::Check.new(:name => check_data[:name], :enabled => true)
27
+ expect(check.save).to be true
28
+
29
+ entity_name, check_name = check_data[:name].split(':', 2)
30
+
31
+ tags = entity_name.split('.', 2).map(&:downcase) +
32
+ check_name.split(' ').map(&:downcase)
33
+
34
+ tags = tags.collect do |tag_name|
35
+ Flapjack::Data::Tag.lock do
36
+ tag = Flapjack::Data::Tag.intersect(:name => tag_name).all.first
37
+ if tag.nil?
38
+ tag = Flapjack::Data::Tag.new(:name => tag_name)
39
+ expect(tag.save).to be true
40
+ end
41
+ tag
42
+ end
43
+ end
44
+ check.tags.add(*tags) unless tags.empty?
45
+ end
46
+
47
+ check
27
48
  end
28
49
 
29
- Given /^the user wants to receive Nexmo SMS notifications for entity '([\w\.\-]+)'$/ do |entity|
30
- add_contact( 'id' => '0999',
31
- 'first_name' => 'John',
32
- 'last_name' => 'Smith',
33
- 'email' => 'johns@example.dom',
34
- 'media' => {'sms_nexmo' => '+61888888888'} )
35
- Flapjack::Data::Entity.add({'id' => '5000',
36
- 'name' => entity,
37
- 'contacts' => ["0999"]},
38
- :redis => @notifier_redis )
50
+ Given /^the following contacts exist:$/ do |contacts|
51
+ contacts.hashes.each do |contact_data|
52
+ contact = Flapjack::Data::Contact.find_by_id(contact_data['id'])
53
+ expect(contact).to be nil
54
+ contact = Flapjack::Data::Contact.new(
55
+ :id => contact_data['id'],
56
+ :name => contact_data['name'],
57
+ :timezone => contact_data['timezone']
58
+ )
59
+ expect(contact.save).to be true
60
+ end
39
61
  end
40
62
 
41
- Given /^the user wants to receive SNS notifications for entity '([\w\.\-]+)'$/ do |entity|
42
- add_contact( 'id' => '0999',
43
- 'first_name' => 'John',
44
- 'last_name' => 'Smith',
45
- 'email' => 'johns@example.dom',
46
- 'media' => {'sns' => 'arn:aws:sns:us-east-1:698519295917:My-Topic'} )
47
- Flapjack::Data::Entity.add({'id' => '5000',
48
- 'name' => entity,
49
- 'contacts' => ["0999"]},
50
- :redis => @notifier_redis )
63
+ Given /^the following checks exist:$/ do |checks|
64
+ checks.hashes.each do |check_data|
65
+ check = Flapjack::Data::Check.find_by_id(check_data['id'])
66
+ expect(check).to be nil
67
+
68
+ check = Flapjack::Data::Check.new(
69
+ :id => check_data['id'],
70
+ :name => check_data['name'],
71
+ :enabled => true
72
+ )
73
+ expect(check.save).to be true
74
+
75
+ unless check_data['tags'].nil? || check_data['tags'].strip.empty?
76
+ tags = check_data['tags'].split(',').map(&:strip).collect do |tag_name|
77
+ Flapjack::Data::Tag.lock do
78
+ tag = Flapjack::Data::Tag.intersect(:name => tag_name).all.first
79
+ if tag.nil?
80
+ tag = Flapjack::Data::Tag.new(:name => tag_name)
81
+ tag.save
82
+ end
83
+ tag
84
+ end
85
+ end
86
+ check.tags.add(*tags) unless tags.empty?
87
+ end
88
+ end
51
89
  end
52
90
 
53
- Given /^the user wants to receive email notifications for entity '([\w\.\-]+)'$/ do |entity|
54
- add_contact( 'id' => '0999',
55
- 'first_name' => 'John',
56
- 'last_name' => 'Smith',
57
- 'email' => 'johns@example.dom',
58
- 'media' => {'email' => 'johns@example.dom'} )
59
- Flapjack::Data::Entity.add({'id' => '5000',
60
- 'name' => entity,
61
- 'contacts' => ["0999"]},
62
- :redis => @notifier_redis )
91
+ Given /^the following media exist:$/ do |media|
92
+ media.hashes.each do |medium_data|
93
+ contact = Flapjack::Data::Contact.find_by_id(medium_data['contact_id'])
94
+ expect(contact).not_to be nil
95
+
96
+ medium = Flapjack::Data::Medium.find_by_id(medium_data['id'])
97
+ expect(medium).to be nil
98
+ medium = Flapjack::Data::Medium.new(
99
+ :id => medium_data['id'],
100
+ :transport => medium_data['transport'],
101
+ :address => medium_data['address'],
102
+ :interval => medium_data['interval'].to_i * 60,
103
+ :rollup_threshold => medium_data['rollup_threshold'].to_i
104
+ )
105
+ expect(medium.save).to be true
106
+ contact.media << medium
107
+ end
63
108
  end
64
109
 
65
- Given /^the user wants to receive SMS notifications for entity '([\w\.\-]+)' and email notifications for entity '([\w\.\-]+)'$/ do |entity1, entity2|
66
- add_contact( 'id' => '0998',
67
- 'first_name' => 'John',
68
- 'last_name' => 'Smith',
69
- 'email' => 'johns@example.dom',
70
- 'media' => {'sms' => '+61888888888'} )
71
- add_contact( 'id' => '0999',
72
- 'first_name' => 'John',
73
- 'last_name' => 'Smith',
74
- 'email' => 'johns@example.dom',
75
- 'media' => {'email' => 'johns@example.dom'} )
76
- Flapjack::Data::Entity.add({'id' => '5000',
77
- 'name' => entity1,
78
- 'contacts' => ["0998"]},
79
- :redis => @notifier_redis )
80
- Flapjack::Data::Entity.add({'id' => '5001',
81
- 'name' => entity2,
82
- 'contacts' => ["0999"]},
83
- :redis => @notifier_redis )
110
+ Given /^the following rules exist:$/ do |rules|
111
+ rules.hashes.each do |rule_data|
112
+ contact = Flapjack::Data::Contact.find_by_id(rule_data['contact_id'])
113
+ expect(contact).not_to be nil
114
+
115
+ time_zone = contact.time_zone
116
+ expect(time_zone).to be_an ActiveSupport::TimeZone
117
+
118
+ rule = Flapjack::Data::Rule.find_by_id(rule_data['id'])
119
+ expect(rule).to be nil
120
+
121
+ conditions = rule_data['condition'].split(',').map(&:strip).join(',')
122
+
123
+ rule = Flapjack::Data::Rule.new(
124
+ :id => rule_data['id'],
125
+ :name => rule_data['name'],
126
+ :enabled => true,
127
+ :blackhole => ['1', 't', 'true', 'y', 'yes'].include?((rule_data['blackhole'] || '').strip.downcase),
128
+ :strategy => rule_data['strategy'],
129
+ :conditions_list => conditions.empty? ? nil : conditions
130
+ )
131
+
132
+ unless rule_data['time_restriction'].nil?
133
+ tr = rule_data['time_restriction'].strip
134
+ unless tr.empty?
135
+ rule.time_restriction = case tr
136
+ when '8-18 weekdays'
137
+ weekdays_8_18 = IceCube::Schedule.new(time_zone.local(2013,2,1,8,0,0), :duration => 60 * 60 * 10)
138
+ weekdays_8_18.add_recurrence_rule(IceCube::Rule.weekly.day(:monday, :tuesday, :wednesday, :thursday, :friday))
139
+ weekdays_8_18
140
+ end
141
+ end
142
+ end
143
+ expect(rule.save).to be true
144
+
145
+ contact.rules << rule
146
+
147
+ unless rule_data['tags'].nil? || rule_data['tags'].strip.empty?
148
+ tags = rule_data['tags'].split(',').map(&:strip).collect do |tag_name|
149
+ Flapjack::Data::Tag.lock do
150
+ tag = Flapjack::Data::Tag.intersect(:name => tag_name).all.first
151
+ if tag.nil?
152
+ tag = Flapjack::Data::Tag.new(:name => tag_name)
153
+ expect(tag.save).to be true
154
+ end
155
+ tag
156
+ end
157
+ end
158
+ rule.tags.add(*tags) # unless tags.empty?
159
+ end
160
+
161
+ unless rule_data['media_ids'].nil? || rule_data['media_ids'].strip.empty?
162
+ media_ids = rule_data['media_ids'].split(',').map(&:strip)
163
+ media = Flapjack::Data::Medium.find_by_ids(*media_ids)
164
+ expect(media.map(&:id)).to match_array(media_ids)
165
+ rule.media.add(*media) # unless media.empty?
166
+ end
167
+ end
84
168
  end
85
169
 
86
- # TODO create the notification object in redis, flag the relevant operation as
87
- # only needing that part running, split up the before block that covers these
88
- When /^an event notification is generated for entity '([\w\.\-]+)'$/ do |entity|
89
- event = Flapjack::Data::Event.new('type' => 'service',
90
- 'state' => 'critical',
91
- 'summary' => '100% packet loss',
92
- 'entity' => entity,
93
- 'check' => 'ping')
170
+ Given /^(?:a|the) user wants to receive SMS alerts for check '(.+)'$/ do |check_name|
171
+ contact = find_or_create_contact(:name => 'John Smith')
94
172
 
95
- notification_type = Flapjack::Data::Notification.type_for_event(event)
173
+ sms = Flapjack::Data::Medium.new(:transport => 'sms',
174
+ :address => '+61888888888', :interval => 600)
175
+ expect(sms.save).to be true
176
+ contact.media << sms
96
177
 
97
- entity_check = Flapjack::Data::EntityCheck.for_entity_name(entity, 'ping', :redis => @redis)
98
- max_notified_severity = entity_check.max_notified_severity_of_current_failure
178
+ check = find_or_create_check(:name => check_name)
99
179
 
100
- severity = Flapjack::Data::Notification.severity_for_event(event, max_notified_severity)
101
- last_state = entity_check.historical_state_before(event.time)
180
+ acceptor = Flapjack::Data::Rule.new(:enabled => true, :blackhole => false,
181
+ :conditions_list => 'critical', :strategy => 'all_tags')
182
+ expect(acceptor.save).to be true
102
183
 
103
- Flapjack::Data::Notification.add('notifications', event,
104
- :type => notification_type, :severity => severity, :last_state => last_state,
105
- :redis => @notifier_redis)
106
- drain_notifications
107
- end
184
+ contact.rules << acceptor
108
185
 
109
- Then /^an SMS notification for entity '([\w\.\-]+)' should be queued for the user$/ do |entity|
110
- queue = redis_peek('sms_notifications')
111
- expect(queue.select {|n| n['event_id'] =~ /#{entity}:ping/ }).not_to be_empty
112
- end
186
+ Flapjack::Data::Tag.lock(Flapjack::Data::Check, Flapjack::Data::Rule) do
113
187
 
114
- Then /^a Nexmo SMS notification for entity '([\w\.\-]+)' should be queued for the user$/ do |entity|
115
- queue = redis_peek('sms_nexmo_notifications')
116
- expect(queue.select {|n| n['event_id'] =~ /#{entity}:ping/ }).not_to be_empty
117
- end
188
+ tags = check_name.gsub(/\./, '_').split(':', 2).collect do |tag_name|
189
+ Flapjack::Data::Tag.lock do
190
+ tag = Flapjack::Data::Tag.intersect(:name => tag_name).all.first
191
+ if tag.nil?
192
+ tag = Flapjack::Data::Tag.new(:name => tag_name)
193
+ expect(tag.save).to be true
194
+ end
195
+ tag
196
+ end
197
+ end
198
+ acceptor.tags.add(*tags) unless tags.empty?
199
+ check.tags.add(*tags) unless tags.empty?
200
+ end
118
201
 
119
- Then /^an SNS notification for entity '([\w\.\-]+)' should be queued for the user$/ do |entity|
120
- queue = redis_peek('sns_notifications')
121
- expect(queue.select {|n| n['event_id'] =~ /#{entity}:ping/ }).not_to be_empty
202
+ acceptor.media << sms
122
203
  end
123
204
 
124
- Then /^an email notification for entity '([\w\.\-]+)' should be queued for the user$/ do |entity|
125
- queue = redis_peek('email_notifications')
126
- expect(queue.select {|n| n['event_id'] =~ /#{entity}:ping/ }).not_to be_empty
127
- end
205
+ Given /^(?:a|the) user wants to receive Nexmo alerts for check '(.+)'$/ do |check_name|
206
+ contact = find_or_create_contact(:name => 'John Smith')
128
207
 
129
- Then /^an SMS notification for entity '([\w\.\-]+)' should not be queued for the user$/ do |entity|
130
- queue = redis_peek('sms_notifications')
131
- expect(queue.select {|n| n['event_id'] =~ /#{entity}:ping/ }).to be_empty
132
- end
208
+ nexmo = Flapjack::Data::Medium.new(:transport => 'sms_nexmo',
209
+ :address => '+61888888888', :interval => 600)
210
+ expect(nexmo.save).to be true
211
+ contact.media << nexmo
133
212
 
134
- Then /^an Nexmo SMS notification for entity '([\w\.\-]+)' should not be queued for the user$/ do |entity|
135
- queue = redis_peek('sms_nexmo_notifications')
136
- expect(queue.select {|n| n['event_id'] =~ /#{entity}:ping/ }).to be_empty
137
- end
213
+ check = find_or_create_check(:name => check_name)
138
214
 
139
- Then /^an email notification for entity '([\w\.\-]+)' should not be queued for the user$/ do |entity|
140
- queue = redis_peek('email_notifications')
141
- expect(queue.select {|n| n['event_id'] =~ /#{entity}:ping/ }).to be_empty
142
- end
215
+ acceptor = Flapjack::Data::Rule.new(:enabled => true, :blackhole => false,
216
+ :conditions_list => 'critical', :strategy => 'all_tags')
217
+ expect(acceptor.save).to be true
143
218
 
144
- Given /^a user SMS notification has been queued for entity '([\w\.\-]+)'$/ do |entity|
145
- Flapjack::Data::Entity.add({'id' => '5000',
146
- 'name' => entity},
147
- :redis => @redis )
148
- @sms_notification = {'notification_type' => 'problem',
149
- 'contact_first_name' => 'John',
150
- 'contact_last_name' => 'Smith',
151
- 'state' => 'critical',
152
- 'summary' => 'Socket timeout after 10 seconds',
153
- 'time' => Time.now.to_i,
154
- 'event_id' => "#{entity}:ping",
155
- 'address' => '+61412345678',
156
- 'id' => 1,
157
- 'state_duration' => 30,
158
- 'duration' => 45}
159
-
160
- Flapjack::Data::Alert.add('sms_notifications', @sms_notification,
161
- :redis => @notifier_redis)
162
- end
219
+ contact.rules << acceptor
163
220
 
164
- Given /^a user Nexmo SMS notification has been queued for entity '([\w\.\-]+)'$/ do |entity|
165
- Flapjack::Data::Entity.add({'id' => '5000',
166
- 'name' => entity},
167
- :redis => @redis )
168
- @sms_nexmo_notification = {'notification_type' => 'problem',
169
- 'contact_first_name' => 'John',
170
- 'contact_last_name' => 'Smith',
171
- 'state' => 'critical',
172
- 'summary' => 'Socket timeout after 10 seconds',
173
- 'time' => Time.now.to_i,
174
- 'event_id' => "#{entity}:ping",
175
- 'address' => '+61412345678',
176
- 'id' => 1,
177
- 'state_duration' => 30,
178
- 'duration' => 45}
179
-
180
- Flapjack::Data::Alert.add('sms_nexmo_notifications', @sms_nexmo_notification,
181
- :redis => @notifier_redis)
182
- end
221
+ Flapjack::Data::Tag.lock(Flapjack::Data::Check, Flapjack::Data::Rule) do
222
+ tags = check_name.gsub(/\./, '_').split(':', 2).collect do |tag_name|
223
+ tag = Flapjack::Data::Tag.intersect(:name => tag_name).all.first
224
+ if tag.nil?
225
+ tag = Flapjack::Data::Tag.new(:name => tag_name)
226
+ expect(tag.save).to be true
227
+ end
228
+ tag
229
+ end
230
+ acceptor.tags.add(*tags)
231
+ check.tags.add(*tags)
232
+ end
183
233
 
184
- Given /^a user SNS notification has been queued for entity '([\w\.\-]+)'$/ do |entity|
185
- Flapjack::Data::Entity.add({'id' => '5000',
186
- 'name' => entity},
187
- :redis => @redis )
188
- @sns_notification = {'notification_type' => 'problem',
189
- 'contact_first_name' => 'John',
190
- 'contact_last_name' => 'Smith',
191
- 'state' => 'critical',
192
- 'summary' => 'Socket timeout after 10 seconds',
193
- 'time' => Time.now.to_i,
194
- 'event_id' => "#{entity}:ping",
195
- 'address' => 'arn:aws:sns:us-east-1:698519295917:My-Topic',
196
- 'id' => 1,
197
- 'state_duration' => 30,
198
- 'duration' => 45}
199
-
200
- Flapjack::Data::Alert.add('sns_notifications', @sns_notification,
201
- :redis => @notifier_redis)
234
+ acceptor.media << nexmo
202
235
  end
203
236
 
204
- Given /^a user email notification has been queued for entity '([\w\.\-]+)'$/ do |entity|
205
- Flapjack::Data::Entity.add({'id' => '5001',
206
- 'name' => entity},
207
- :redis => @redis )
208
- @email_notification = {'notification_type' => 'problem',
209
- 'contact_first_name' => 'John',
210
- 'contact_last_name' => 'Smith',
211
- 'state' => 'critical',
212
- 'summary' => 'Socket timeout after 10 seconds',
213
- 'time' => Time.now.to_i,
214
- 'event_id' => "#{entity}:ping",
215
- 'address' => 'johns@example.dom',
216
- 'id' => 2,
217
- 'state_duration' => 30,
218
- 'duration' => 3600}
219
-
220
- Flapjack::Data::Alert.add('email_notifications', @email_notification,
221
- :redis => @notifier_redis)
222
- end
237
+ Given /^(?:a|the) user wants to receive email alerts for check '(.+)'$/ do |check_name|
238
+ contact = find_or_create_contact(:name => 'Jane Smith')
239
+
240
+ email = Flapjack::Data::Medium.new(:transport => 'email',
241
+ :address => 'janes@example.dom', :interval => 600)
242
+ expect(email.save).to be true
243
+ contact.media << email
244
+
245
+ check = find_or_create_check(:name => check_name)
223
246
 
224
- When /^the SMS notification handler runs successfully$/ do
225
- @request = stub_request(:get, /^#{Regexp.escape(Flapjack::Gateways::SmsMessagenet::MESSAGENET_DEFAULT_URL)}/)
247
+ acceptor = Flapjack::Data::Rule.new(:enabled => true, :blackhole => false,
248
+ :conditions_list => 'critical', :strategy => 'all_tags')
249
+ expect(acceptor.save).to be true
226
250
 
227
- @sms_messagenet = Flapjack::Gateways::SmsMessagenet.new(:config => {
228
- 'username' => 'abcd', 'password' => 'efgh'
229
- }, :redis_config => @redis_opts, :logger => @logger)
251
+ contact.rules << acceptor
252
+
253
+ Flapjack::Data::Tag.lock(Flapjack::Data::Check, Flapjack::Data::Rule) do
254
+ tags = check_name.gsub(/\./, '_').split(':', 2).collect do |tag_name|
255
+ Flapjack::Data::Tag.lock do
256
+ tag = Flapjack::Data::Tag.intersect(:name => tag_name).all.first
257
+ if tag.nil?
258
+ tag = Flapjack::Data::Tag.new(:name => tag_name)
259
+ expect(tag.save).to be true
260
+ end
261
+ tag
262
+ end
263
+ end
264
+ acceptor.tags.add(*tags) unless tags.empty?
265
+ check.tags.add(*tags) unless tags.empty?
266
+ end
230
267
 
231
- drain_alerts('sms_notifications', @sms_messagenet)
268
+ acceptor.media << email
232
269
  end
233
270
 
234
- When /^the Nexmo SMS notification handler runs successfully$/ do
235
- # poor man's stubbing
236
- Nexmo::Client.class_eval {
237
- def send_message(args = {})
271
+ Given /^(?:a|the) user wants to receive SNS alerts for check '(.+)'$/ do |check_name|
272
+ contact = find_or_create_contact(:name => 'James Smithson')
273
+
274
+ sns = Flapjack::Data::Medium.new(:transport => 'sns',
275
+ :address => 'arn:aws:sns:us-east-1:698519295917:My-Topic', :interval => 600)
276
+ expect(sns.save).to be true
277
+ contact.media << sns
278
+
279
+ check = find_or_create_check(:name => check_name)
280
+
281
+ acceptor = Flapjack::Data::Rule.new(:enabled => true, :blackhole => false,
282
+ :conditions_list => 'critical', :strategy => 'all_tags')
283
+ expect(acceptor.save).to be true
284
+
285
+ contact.rules << acceptor
286
+
287
+ Flapjack::Data::Tag.lock(Flapjack::Data::Check, Flapjack::Data::Rule) do
288
+ tags = check_name.gsub(/\./, '_').split(':', 2).collect do |tag_name|
289
+ Flapjack::Data::Tag.lock do
290
+ tag = Flapjack::Data::Tag.intersect(:name => tag_name).all.first
291
+ if tag.nil?
292
+ tag = Flapjack::Data::Tag.new(:name => tag_name)
293
+ expect(tag.save).to be true
294
+ end
295
+ tag
296
+ end
238
297
  end
239
- }
240
- @sms_nexmo = Flapjack::Gateways::SmsNexmo.new(:config => {
241
- 'api_key' => 'THEAPIKEY', 'secret' => 'secret', 'from' => 'someone',
242
- }, :redis_config => @redis_opts, :logger => @logger)
298
+ acceptor.tags.add(*tags) unless tags.empty?
299
+ check.tags.add(*tags) unless tags.empty?
300
+ end
243
301
 
244
- drain_alerts('sms_nexmo_notifications', @sms_nexmo)
302
+ acceptor.media << sns
245
303
  end
246
304
 
247
- When /^the SNS notification handler runs successfully$/ do
248
- @request = stub_request(:post, /amazonaws\.com/)
305
+ When /^an event notification is generated for check '(.+)'$/ do |check_name|
306
+ timestamp = Time.now
249
307
 
250
- @aws_sns = Flapjack::Gateways::AwsSns.new(:config => {
251
- 'access_key' => "AKIAIOSFODNN7EXAMPLE",
252
- 'secret_key' => "secret"
253
- }, :redis_config => @redis_opts, :logger => @logger)
308
+ event = Flapjack::Data::Event.new('state' => 'critical',
309
+ 'summary' => '100% packet loss',
310
+ 'entity' => check_name.split(':', 2).first,
311
+ 'check' => check_name.split(':', 2).last,
312
+ 'time' => timestamp)
313
+
314
+ Flapjack::Data::Check.lock(Flapjack::Data::State, Flapjack::Data::Notification) do
315
+
316
+ check = Flapjack::Data::Check.intersect(:name => check_name).all.first
317
+ expect(check).not_to be_nil
318
+
319
+ state = Flapjack::Data::State.new(:created_at => timestamp, :updated_at => timestamp,
320
+ :condition => 'critical')
321
+ state.save
322
+ check.states << state
323
+ check.most_severe = state
324
+
325
+ notification = Flapjack::Data::Notification.new(
326
+ :condition_duration => 0.0,
327
+ :severity => 'critical',
328
+ :duration => event.duration,
329
+ )
330
+
331
+ unless notification.save
332
+ raise "Couldn't save notification: #{notification.errors.full_messages.inspect}"
333
+ end
334
+
335
+ notification.state = state
336
+ check.notifications << notification
337
+ @notifier.instance_variable_get('@queue').push(notification)
338
+ end
339
+
340
+ drain_notifications
341
+ end
254
342
 
255
- drain_alerts('sns_notifications', @aws_sns)
343
+ Then /^an? (SMS|Nexmo|SNS|email) alert for check '(.+)' should( not)? be queued$/ do |medium, check_name, neg|
344
+ med = case medium
345
+ when 'Nexmo'
346
+ 'sms_nexmo'
347
+ else
348
+ medium.downcase
349
+ end
350
+ queue = redis_peek("#{med}_notifications", Flapjack::Data::Alert)
351
+ expect(queue.select {|n| n.check.name == check_name }).
352
+ send((neg ? :to : :not_to), be_empty)
256
353
  end
257
354
 
258
- When /^the SMS notification handler fails to send an SMS$/ do
259
- @request = stub_request(:get, /^#{Regexp.escape(Flapjack::Gateways::SmsMessagenet::MESSAGENET_DEFAULT_URL)}/).to_return(:status => [500, "Internal Server Error"])
355
+ Given /^an? (SMS|Nexmo|SNS|email) alert has been queued for check '(.+)'$/ do |media_transport, check_name|
356
+ check = Flapjack::Data::Check.intersect(:name => check_name).all.first
357
+ expect(check).not_to be_nil
260
358
 
261
- @sms_messagenet = Flapjack::Gateways::SmsMessagenet.new(:config => {
262
- 'username' => 'abcd', 'password' => 'efgh'
263
- }, :redis_config => @redis_opts, :logger => @logger)
359
+ @alert = Flapjack::Data::Alert.new(
360
+ :condition => 'critical',
361
+ :condition_duration => 15.0,
362
+ :time => Time.now)
264
363
 
265
- drain_alerts('sms_notifications', @sms_messagenet)
364
+ unless @alert.save
365
+ raise "Couldn't save alert: #{@alert.errors.full_messages.inspect}"
366
+ end
367
+
368
+ med = case media_transport
369
+ when 'Nexmo'
370
+ 'sms_nexmo'
371
+ else
372
+ media_transport.downcase
373
+ end
374
+
375
+ medium = Flapjack::Data::Medium.intersect(:transport => med).all.first
376
+ expect(medium).not_to be_nil
377
+
378
+ medium.alerts << @alert
379
+ check.alerts << @alert
266
380
  end
267
381
 
268
- When /^the SNS notification handler fails to send an SMS$/ do
269
- @request = stub_request(:post, /amazonaws\.com/).to_return(:status => [500, "Internal Server Error"])
382
+ # TODO may need to get more complex, depending which SMS provider is used
383
+ When /^the SMS alert handler runs successfully$/ do
384
+ @request = stub_request(:get, /^#{Regexp.escape('https://www.messagenet.com.au/dotnet/Lodge.asmx/LodgeSMSMessage')}/)
385
+ @sms = Flapjack::Gateways::SmsMessagenet.new(:config => {'username' => 'abcd', 'password' => 'efgh'})
386
+ @sms.send(:handle_alert, @alert)
387
+ end
270
388
 
271
- @aws_sns = Flapjack::Gateways::AwsSns.new(:config => {
272
- 'access_key' => "AKIAIOSFODNN7EXAMPLE",
273
- 'secret_key' => "secret"
274
- }, :redis_config => @redis_opts, :logger => @logger)
389
+ When /^the SMS alert handler fails to send an SMS$/ do
390
+ @request = stub_request(:get, /^#{Regexp.escape('https://www.messagenet.com.au/dotnet/Lodge.asmx/LodgeSMSMessage')}/).to_return(:status => [500, "Internal Server Error"])
391
+ @sms = Flapjack::Gateways::SmsMessagenet.new(:config => {'username' => 'abcd', 'password' => 'efgh'})
392
+ @sms.send(:handle_alert, @alert)
393
+ end
275
394
 
276
- drain_alerts('sns_notifications', @aws_sns)
395
+ When /^the Nexmo alert handler runs successfully$/ do
396
+ @request = stub_request(:post, /^#{Regexp.escape('https://rest.nexmo.com/sms/json')}/).
397
+ to_return(:headers => {'Content-type' => 'application/json'},
398
+ :body => Flapjack.dump_json(:messages => [{:status => '0', :'message-id' => 'abc'}]))
399
+ @sms_nexmo = Flapjack::Gateways::SmsNexmo.new(:config => {'api_key' => 'THEAPIKEY', 'secret' => 'secret', 'from' => 'someone'})
400
+ @sms_nexmo.send(:handle_alert, @alert)
277
401
  end
278
402
 
279
- When /^the email notification handler runs successfully$/ do
280
- # poor man's stubbing
281
- EM::P::SmtpClient.class_eval {
282
- def self.send(args = {})
283
- me = MockEmailer.new
284
- me.set_deferred_status :succeeded, OpenStruct.new(:code => 250)
285
- me
403
+ When /^the email alert handler runs successfully$/ do
404
+ @email = Flapjack::Gateways::Email.new(:config => {'smtp_config' => {'host' => '127.0.0.1', 'port' => 2525, 'from' => 'flapjack@example.com'}})
405
+ @email.send(:handle_alert, @alert)
406
+ end
407
+
408
+ When /^the email alert handler fails to send an email$/ do
409
+ module Mail
410
+ class TestMailer
411
+ alias_method :"orig_deliver!", :"deliver!"
412
+ def deliver!(mail); raise RuntimeError.new; end
286
413
  end
287
- }
414
+ end
288
415
 
289
- @email = Flapjack::Gateways::Email.new(:config => {
290
- 'smtp_config' => {'host' => '127.0.0.1',
291
- 'port' => 2525,
292
- 'from' => 'flapjack@example'}
293
- }, :redis_config => @redis_opts, :logger => @logger)
416
+ @email = Flapjack::Gateways::Email.new(:config => {'smtp_config' => {'host' => '127.0.0.1', 'port' => 2525, 'from' => 'flapjack@example.com'}})
417
+ begin
418
+ @email.send(:handle_alert, @alert)
419
+ rescue RuntimeError
420
+ end
294
421
 
295
- drain_alerts('email_notifications', @email)
422
+ module Mail
423
+ class TestMailer
424
+ alias_method :"deliver!", :"orig_deliver!"
425
+ end
426
+ end
296
427
  end
297
428
 
298
- When /^the email notification handler fails to send an email$/ do
299
- # poor man's stubbing
300
- EM::P::SmtpClient.class_eval {
301
- def self.send(args = {})
302
- me = MockEmailer.new
303
- me.set_deferred_status :failed, OpenStruct.new(:code => 500)
304
- me
305
- end
306
- }
429
+ When /^the SNS alert handler runs successfully$/ do
430
+ @request = stub_request(:post, /amazonaws\.com/)
431
+ @sns = Flapjack::Gateways::AwsSns.new(:config => {
432
+ 'access_key' => "AKIAIOSFODNN7EXAMPLE",
433
+ 'secret_key' => "secret"})
434
+ @sns.send(:handle_alert, @alert)
435
+ end
307
436
 
308
- @email = Flapjack::Gateways::Email.new(:config => {
309
- 'smtp_config' => {'host' => '127.0.0.1',
310
- 'port' => 2525,
311
- 'from' => 'flapjack@example'}
312
- }, :redis_config => @redis_opts, :logger => @logger)
437
+ When /^the SNS alert handler fails to send an SMS$/ do
438
+ @request = stub_request(:post, /amazonaws\.com/).to_return(:status => [500, "Internal Server Error"])
439
+ @sns = Flapjack::Gateways::AwsSns.new(:config => {
440
+ 'access_key' => "AKIAIOSFODNN7EXAMPLE",
441
+ 'secret_key' => "secret"})
442
+ @sns.send(:handle_alert, @alert)
443
+ end
313
444
 
314
- drain_alerts('email_notifications', @email)
445
+ Then /^the user should receive an SMS alert$/ do
446
+ expect(@request).to have_been_requested
447
+ expect(@sms.sent).to eq(1)
315
448
  end
316
449
 
317
- Then /^the user should( not)? receive an SMS notification$/ do |negativity|
450
+ Then /^the user should receive an SNS alert$/ do
318
451
  expect(@request).to have_been_requested
319
- expect(@sms_messagenet.instance_variable_get('@sent')).to eq(negativity.nil? ? 1 : 0)
452
+ expect(@sns.sent).to eq(1)
320
453
  end
321
454
 
322
- Then /^the user should( not)? receive an Nexmo SMS notification$/ do |negativity|
323
- expect(@sms_nexmo.instance_variable_get('@sent')).to eq(negativity.nil? ? 1 : 0)
455
+ Then /^the user should receive a Nexmo alert$/ do
456
+ expect(@request).to have_been_requested
457
+ expect(@sms_nexmo.sent).to eq(1)
458
+ end
459
+
460
+ Then /^the user should receive an email alert$/ do
461
+ expect(Mail::TestMailer.deliveries.length).to eq(1)
462
+ expect(@email.sent).to eq(1)
324
463
  end
325
464
 
326
- Then /^the user should( not)? receive an SNS notification$/ do |negativity|
465
+ Then /^the user should not receive an SMS alert$/ do
327
466
  expect(@request).to have_been_requested
328
- expect(@aws_sns.instance_variable_get('@sent')).to eq(negativity.nil? ? 1 : 0)
467
+ expect(@sms.sent).to eq(0)
329
468
  end
330
469
 
331
- Then /^the user should( not)? receive an email notification$/ do |negativity|
332
- expect(@email.instance_variable_get('@sent')).to eq(negativity.nil? ? 1 : 0)
470
+ Then /^the user should not receive an SNS alert$/ do
471
+ expect(@request).to have_been_requested
472
+ expect(@sns.sent).to eq(0)
333
473
  end
334
474
 
475
+ Then /^the user should not receive an email alert$/ do
476
+ expect(Mail::TestMailer.deliveries).to be_empty
477
+ expect(@email.sent).to eq(0)
478
+ end