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,8 @@
1
+ module ProviderSupport
2
+
3
+ def default_tear_down
4
+ Flapjack.logger.messages.clear
5
+ Flapjack.redis.flushdb
6
+ end
7
+
8
+ end
@@ -10,60 +10,40 @@ if ENV['COVERAGE']
10
10
  end
11
11
  end
12
12
 
13
+ require 'i18n'
14
+ I18n.config.enforce_available_locales = true
15
+
13
16
  FLAPJACK_ENV = ENV["FLAPJACK_ENV"] || 'test'
14
17
  FLAPJACK_ROOT = File.join(File.dirname(__FILE__), '..')
15
- FLAPJACK_CONFIG = File.join(FLAPJACK_ROOT, 'etc', 'flapjack_config.yaml')
18
+ FLAPJACK_CONFIG = File.join(FLAPJACK_ROOT, 'etc', 'flapjack_test_config.toml')
16
19
  ENV['RACK_ENV'] = ENV["FLAPJACK_ENV"]
17
20
 
18
21
  require 'bundler'
19
22
  Bundler.require(:default, :test)
20
23
 
24
+ ActiveSupport.use_standard_json_time_format = true
25
+ ActiveSupport.time_precision = 0
26
+
21
27
  require 'webmock/rspec'
22
28
  WebMock.disable_net_connect!
23
29
 
24
30
  $:.unshift(File.dirname(__FILE__) + '/../lib')
25
-
26
- require 'redis'
31
+ require 'flapjack'
32
+ require 'flapjack/patches'
27
33
  require 'flapjack/configuration'
28
34
 
29
35
  # Requires supporting files with custom matchers and macros, etc,
30
36
  # in ./support/ and its subdirectories.
31
37
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
32
38
 
33
- class MockLogger
34
- attr_accessor :messages, :errors
35
-
36
- def initialize
37
- @messages = []
38
- @errors = []
39
- end
40
-
41
- %w(debug info warn).each do |level|
42
- class_eval <<-RUBY
43
- def #{level}(msg)
44
- @messages << '#{level.upcase}' + ': ' + msg
45
- end
46
- RUBY
47
- end
48
-
49
- %w(error fatal).each do |level|
50
- class_eval <<-ERRORS
51
- def #{level}(msg)
52
- @messages << '#{level.upcase}' + ': ' + msg
53
- @errors << '#{level.upcase}' + ': ' + msg
54
- end
55
- ERRORS
56
- end
39
+ require 'mail'
40
+ ::Mail.defaults do
41
+ delivery_method :test
42
+ end
57
43
 
58
- %w(debug info warn error fatal).each do |level|
59
- class_eval <<-LEVELS
60
- def #{level}?
61
- true
62
- end
63
- LEVELS
64
- end
44
+ require 'flapjack/redis_proxy'
65
45
 
66
- end
46
+ require './spec/service_consumers/fixture_data.rb'
67
47
 
68
48
  # This file was generated by the `rspec --init` command. Conventionally, all
69
49
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
@@ -72,7 +52,6 @@ end
72
52
  #
73
53
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
74
54
  RSpec.configure do |config|
75
- # config.treat_symbols_as_metadata_keys_with_true_values = true
76
55
  config.run_all_when_everything_filtered = true
77
56
  config.filter_run :focus
78
57
 
@@ -82,6 +61,9 @@ RSpec.configure do |config|
82
61
  # --seed 1234
83
62
  config.order = 'random'
84
63
 
64
+ # # TODO clear these up, where possible
65
+ # config.warnings = true
66
+
85
67
  unless (ENV.keys & ['SHOW_LOGGER_ALL', 'SHOW_LOGGER_ERRORS']).empty?
86
68
  config.instance_variable_set('@formatters', [])
87
69
  config.add_formatter(:documentation)
@@ -95,32 +77,40 @@ RSpec.configure do |config|
95
77
  end
96
78
 
97
79
  config.around(:each, :redis => true) do |example|
98
- @redis = ::Redis.new($redis_options)
99
- @redis.flushdb
80
+ Flapjack::RedisProxy.config = $redis_options
81
+ Zermelo.redis = Flapjack.redis
82
+ Flapjack.redis.flushdb
100
83
  example.run
101
- @redis.quit
84
+ Flapjack.redis.quit
102
85
  end
103
86
 
104
87
  config.around(:each, :logger => true) do |example|
105
- @logger = MockLogger.new
88
+ MockLogger.configure_log('flapjack')
89
+ Flapjack.logger = MockLogger.new
106
90
  example.run
107
91
 
108
92
  if ENV['SHOW_LOGGER_ALL']
109
- puts @logger.messages.compact.join("\n")
93
+ puts Flapjack.logger.messages.compact.join("\n")
110
94
  end
111
95
 
112
96
  if ENV['SHOW_LOGGER_ERRORS']
113
- puts @logger.errors.compact.join("\n")
97
+ puts Flapjack.logger.errors.compact.join("\n")
114
98
  end
115
99
 
116
- @logger.errors.clear
100
+ Flapjack.logger.errors.clear
117
101
  end
118
102
 
119
103
  config.after(:each, :time => true) do
120
104
  Delorean.back_to_the_present
121
105
  end
122
106
 
107
+ config.after(:each) do
108
+ WebMock.reset!
109
+ end
110
+
111
+ config.include JsonSpec::Helpers, :sinatra => true
112
+ config.include Factory, :redis => true
123
113
  config.include ErbViewHelper, :erb_view => true
124
114
  config.include Rack::Test::Methods, :sinatra => true
125
- config.include AsyncRackTest::Methods, :sinatra => true
115
+ config.include FixtureData, :pact_fixture => true
126
116
  end
@@ -8,7 +8,7 @@ module ErbViewHelper
8
8
  include Flapjack::Utility
9
9
 
10
10
  def render_erb(file, bind)
11
- erb = ERB.new(File.read(TEMPLATE_PATH + file))
11
+ erb = ERB.new(File.read(TEMPLATE_PATH + file), nil, '-')
12
12
  erb.result(bind)
13
13
  end
14
14
 
@@ -0,0 +1,58 @@
1
+ require 'securerandom'
2
+
3
+ module Factory
4
+
5
+ def self.redis
6
+ Zermelo.redis
7
+ end
8
+
9
+ def self.contact(attrs = {})
10
+ redis.multi do |r|
11
+ attrs[:id] ||= SecureRandom.uuid
12
+ r.hmset("contact:#{attrs[:id]}:attrs", {'name' => attrs[:name]}.flatten)
13
+ r.sadd('contact::attrs:ids', attrs[:id])
14
+ name = attrs[:name].gsub(/%/, '%%').gsub(/ /, '%20').gsub(/:/, '%3A')
15
+ r.sadd("contact::indices:by_name:string:#{name}", attrs[:id])
16
+ end
17
+ end
18
+
19
+ def self.medium(contact, attrs = {})
20
+ redis.multi do |r|
21
+ attrs[:id] ||= SecureRandom.uuid
22
+ r.hmset("medium:#{attrs[:id]}:attrs", {'transport' => attrs[:transport],
23
+ 'address' => attrs[:address], 'interval' => attrs[:interval],
24
+ 'rollup_threshold' => attrs[:rollup_threshold]}.flatten)
25
+ r.sadd('medium::attrs:ids', attrs[:id].to_s)
26
+ # transport is known not to contain unsafe chars
27
+ r.sadd("medium::indices:by_transport:string:#{attrs[:transport]}", attrs[:id])
28
+
29
+ r.sadd("contact:#{contact.id}:assocs:medium_ids", attrs[:id].to_s)
30
+ end
31
+ end
32
+
33
+ def self.tag(attrs = {})
34
+ redis.multi do |r|
35
+ attrs[:id] ||= SecureRandom.uuid
36
+ r.hmset("tag:#{attrs[:id]}:attrs", {'name' => attrs[:name]}.flatten)
37
+ r.sadd('tag::attrs:ids', attrs[:id])
38
+ name = attrs[:name].gsub(/%/, '%%').gsub(/ /, '%20').gsub(/:/, '%3A')
39
+ r.hset("tag::indices:by_name", "string:#{name}", attrs[:id])
40
+ end
41
+ end
42
+
43
+ def self.check(attrs = {})
44
+ attrs[:state] ||= 'ok'
45
+ redis.multi do |r|
46
+ attrs[:id] ||= SecureRandom.uuid
47
+ r.hmset("check:#{attrs[:id]}:attrs", {'name' => attrs[:name],
48
+ 'state' => attrs[:state], 'enabled' => (!!attrs[:enabled]).to_s}.flatten)
49
+ r.sadd('check::attrs:ids', attrs[:id])
50
+ name = attrs[:name].gsub(/%/, '%%').gsub(/ /, '%20').gsub(/:/, '%3A')
51
+ r.hset("check::indices:by_name", "string:#{name}", attrs[:id])
52
+ # state is known not to contain unsafe chars
53
+ r.sadd("check::indices:by_state:string:#{attrs[:state]}", attrs[:id])
54
+ r.sadd("check::indices:by_enabled:boolean:#{!!attrs[:enabled]}", attrs[:id])
55
+ end
56
+ end
57
+
58
+ end
@@ -6,31 +6,16 @@ module JsonapiHelper
6
6
  Flapjack::Gateways::JSONAPI
7
7
  end
8
8
 
9
- let(:contact) { double(Flapjack::Data::Contact, :id => '21') }
10
- let(:contact_core) {
11
- {'id' => contact.id,
12
- 'first_name' => "Ada",
13
- 'last_name' => "Lovelace",
14
- 'email' => "ada@example.com",
15
- 'tags' => ["legend", "first computer programmer"]
16
- }
17
- }
18
-
19
9
  let(:redis) { double(::Redis) }
20
10
 
21
- let(:semaphore) {
22
- double(Flapjack::Data::Semaphore, :resource => 'folly',
23
- :key => 'semaphores:folly', :expiry => 30, :token => 'spatulas-R-us')
11
+ let(:jsonapi_env) {
12
+ {'CONTENT_TYPE' => 'application/vnd.api+json; charset=utf-8',
13
+ 'HTTP_ACCEPT' => 'application/vnd.api+json'}
24
14
  }
25
15
 
26
- let(:jsonapi_post_env) {
27
- {'CONTENT_TYPE' => 'application/json',
28
- 'HTTP_ACCEPT' => 'application/json; q=0.8, application/vnd.api+json'}
29
- }
30
-
31
- let(:jsonapi_patch_env) {
32
- {'CONTENT_TYPE' => 'application/json-patch+json',
33
- 'HTTP_ACCEPT' => 'application/json; q=0.8, application/vnd.api+json'}
16
+ let(:jsonapi_bulk_env) {
17
+ {'CONTENT_TYPE' => 'application/vnd.api+json; ext=bulk; charset=utf-8',
18
+ 'HTTP_ACCEPT' => 'application/vnd.api+json'}
34
19
  }
35
20
 
36
21
  before(:all) do
@@ -40,20 +25,24 @@ module JsonapiHelper
40
25
  end
41
26
 
42
27
  before(:each) do
43
- expect(Flapjack::RedisPool).to receive(:new).and_return(redis)
28
+ allow(Flapjack).to receive(:redis).and_return(redis)
44
29
  Flapjack::Gateways::JSONAPI.instance_variable_set('@config', {})
45
- Flapjack::Gateways::JSONAPI.instance_variable_set('@logger', @logger)
46
30
  Flapjack::Gateways::JSONAPI.start
47
31
  end
48
32
 
49
33
  after(:each) do
50
- if last_response.status >= 200 && last_response.status < 300
34
+ lr = nil
35
+ begin
36
+ lr = last_response
37
+ rescue Rack::Test::Error
38
+ lr = nil
39
+ end
40
+ if !lr.nil? && (last_response.status >= 200) && (last_response.status < 300)
51
41
  expect(last_response.headers.keys).to include('Access-Control-Allow-Methods')
52
42
  expect(last_response.headers['Access-Control-Allow-Origin']).to eq("*")
53
43
  unless last_response.status == 204
54
44
  expect(Flapjack.load_json(last_response.body)).to be_a(Enumerable)
55
- ct = "#{Flapjack::Gateways::JSONAPI::JSONAPI_MEDIA_TYPE}; charset=UTF-8"
56
- expect(last_response.headers['Content-Type']).to eq(ct)
45
+ expect(last_response.headers['Content-Type']).to eq( 'application/vnd.api+json; supported-ext=bulk; charset=utf-8')
57
46
  end
58
47
  end
59
48
  end
@@ -0,0 +1,43 @@
1
+ class MockLogger
2
+ attr_accessor :messages, :errors
3
+
4
+ def self.configure_log(name, config = {})
5
+ @name = name
6
+ end
7
+
8
+ def initialize
9
+ @messages = []
10
+ @errors = []
11
+ end
12
+
13
+ %w(debug info warn).each do |level|
14
+ class_eval <<-RUBY
15
+ def #{level}(msg = nil, &block)
16
+ msg = yield if msg.nil? && block_given?
17
+ @messages << '[#{level.upcase}] :: ' +
18
+ (self.class.instance_variable_get('@name') || 'flapjack') + ' :: ' + msg
19
+ end
20
+ RUBY
21
+ end
22
+
23
+ %w(error fatal).each do |level|
24
+ class_eval <<-ERRORS
25
+ def #{level}(msg = nil, &block)
26
+ msg = yield if msg.nil? && block_given?
27
+ @messages << '[#{level.upcase}] :: ' +
28
+ (self.class.instance_variable_get('@name') || 'flapjack') + ' :: ' + msg
29
+ @errors << '[#{level.upcase}] :: ' +
30
+ (self.class.instance_variable_get('@name') || 'flapjack') + ' :: ' + msg
31
+ end
32
+ ERRORS
33
+ end
34
+
35
+ %w(debug info warn error fatal).each do |level|
36
+ class_eval <<-LEVELS
37
+ def #{level}?
38
+ true
39
+ end
40
+ LEVELS
41
+ end
42
+
43
+ end
@@ -0,0 +1,24 @@
1
+ # fix for deprecation warning introduced by
2
+ # https://bugs.ruby-lang.org/issues/7688 ; remove when fixed in xmpp4r
3
+ if (RUBY_VERSION.split('.') <=> ['2', '2', '0']) >= 0
4
+ require 'xmpp4r'
5
+ require 'xmpp4r/jid'
6
+ require 'xmpp4r/xmppstanza'
7
+
8
+ module ::Jabber
9
+ class JID
10
+ alias :orig_cmp :"<=>"
11
+ def <=>(o)
12
+ return nil unless o.kind_of?(::Jabber::JID)
13
+ orig_cmp(o)
14
+ end
15
+ end
16
+ class Presence < XMPPStanza
17
+ alias :orig_cmp :"<=>"
18
+ def <=>(o)
19
+ return nil unless o.kind_of?(::Jabber::Presence)
20
+ orig_cmp(o)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -12,4 +12,33 @@ func TestDialFails(t *testing.T) {
12
12
  }
13
13
  }
14
14
 
15
- // TODO(auxesis): add test for sending and receiving Events
15
+ func TestSendSucceeds(t *testing.T) {
16
+ transport, err := Dial("localhost:6379", 9)
17
+ if err != nil {
18
+ t.Fatalf("Couldn't establish connection to testing Redis: %s", err)
19
+ }
20
+ event := Event{
21
+ Entity: "hello",
22
+ Check: "world",
23
+ State: "ok",
24
+ Summary: "hello world",
25
+ }
26
+
27
+ _, err = transport.Send(event)
28
+ if err != nil {
29
+ t.Fatalf("Error when sending event: %s", err)
30
+ }
31
+ }
32
+
33
+ func TestSendFails(t *testing.T) {
34
+ transport, err := Dial("localhost:0", 9)
35
+ if err == nil {
36
+ t.Fatal("Expected error when connecting to testing Redis, got none.")
37
+ }
38
+ event := Event{}
39
+
40
+ _, err = transport.Send(event)
41
+ if err == nil {
42
+ t.Fatal("Expected error when sending event, got none.")
43
+ }
44
+ }
@@ -0,0 +1,82 @@
1
+ require 'redis'
2
+ require 'securerandom'
3
+
4
+ namespace :documentation do
5
+
6
+ require 'flapjack'
7
+ require 'flapjack/configuration'
8
+
9
+ require 'flapjack/data/check'
10
+ require 'flapjack/data/contact'
11
+ require 'flapjack/data/medium'
12
+ require 'flapjack/data/notification'
13
+ require 'flapjack/data/rule'
14
+ require 'flapjack/data/scheduled_maintenance'
15
+ require 'flapjack/data/state'
16
+ require 'flapjack/data/statistic'
17
+ require 'flapjack/data/tag'
18
+ require 'flapjack/data/unscheduled_maintenance'
19
+
20
+ task :dump_keys do
21
+
22
+ puts "Generated using `rake documentation:dump_keys` in the Flapjack codebase.\n\n---\n\n\n"
23
+
24
+ redis_klasses = [
25
+ Flapjack::Data::Check,
26
+ Flapjack::Data::Contact,
27
+ Flapjack::Data::Medium,
28
+ Flapjack::Data::Notification,
29
+ Flapjack::Data::Rule,
30
+ Flapjack::Data::ScheduledMaintenance,
31
+ Flapjack::Data::State,
32
+ Flapjack::Data::Statistic,
33
+ Flapjack::Data::Tag,
34
+ Flapjack::Data::UnscheduledMaintenance
35
+ ]
36
+
37
+ redis_klasses.each do |rk|
38
+ uuid = SecureRandom.uuid
39
+ klass_keys = rk.key_dump
40
+ instance_keys = rk.new(:id => uuid).key_dump
41
+
42
+ puts "# #{rk.short_model_name.human}\n\n"
43
+
44
+ unless klass_keys.empty?
45
+ puts "## global\n\n```"
46
+ klass_keys.keys.sort.each do |kk|
47
+ puts "#{kk} (#{klass_keys[kk].type})"
48
+ end
49
+ end
50
+
51
+ puts "```\n\n"
52
+
53
+ unless instance_keys.empty?
54
+ puts "## instance\n\n```"
55
+ attr_types = rk.attribute_types
56
+ unless attr_types.empty?
57
+ attrs_key = instance_keys.keys.detect {|ik| ik =~ /#{uuid}:attrs\z/}
58
+ attr_out = attrs_key.sub(/#{uuid}/, '[UUID]')
59
+ puts "#{attr_out} (hash)"
60
+ puts " {\n"
61
+ complex_attrs = {}
62
+ attr_types.each_pair do |name, type|
63
+ if Zermelo::COLLECTION_TYPES.keys.include?(type)
64
+ complex_attrs[name] = type
65
+ next
66
+ end
67
+ puts " :#{name} => :#{type}"
68
+ end
69
+ puts " }\n"
70
+ end
71
+ complex_attrs.each_pair do |name, type|
72
+ puts "#{attr_out}:#{name} (:#{type})"
73
+ end
74
+ instance_keys.keys.reject {|ik| ik.eql?(attrs_key)}.sort.each do |k|
75
+ puts "#{k.sub(/#{uuid}/, '[UUID]')} (#{instance_keys[k].type}) "
76
+ end
77
+ end
78
+
79
+ puts "```\n\n"
80
+ end
81
+ end
82
+ end