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,286 @@
1
+ require 'spec_helper'
2
+
3
+ require 'flapjack/configuration'
4
+
5
+ describe Flapjack::Configuration, :logger => true do
6
+
7
+ let(:configuration) { Flapjack::Configuration.new }
8
+
9
+ # NOTE For readability, config files are defined at the bottom of this spec
10
+
11
+ context "single config file" do
12
+
13
+ before(:each) do
14
+ allow(Dir).to receive(:glob).and_return(%w(dummy_file))
15
+ expect(File).to receive(:read).and_return(toml_data)
16
+ configuration.load('dummy_path')
17
+ end
18
+
19
+ describe "redis configuration data" do
20
+ it "loads data accessible by symbol" do
21
+ expect(configuration.for_redis[:host]).to eq('192.168.0.1')
22
+ expect(configuration.for_redis[:port]).to eq(9999)
23
+ expect(configuration.for_redis[:db]).to eq(11)
24
+ end
25
+
26
+ it "loads data accessible by string" do
27
+ expect(configuration.for_redis['host']).to eq('192.168.0.1')
28
+ expect(configuration.for_redis['port']).to eq(9999)
29
+ expect(configuration.for_redis['db']).to eq(11)
30
+ end
31
+ end
32
+
33
+ describe "all configuration data" do
34
+ it "loads data accessible by symbol" do
35
+ expect(configuration.all[:processor][:enabled]).to be_a(TrueClass)
36
+ end
37
+
38
+ it "loads data accessible by string" do
39
+ expect(configuration.all['processor']['enabled']).to be_a(TrueClass)
40
+ end
41
+
42
+ it "loads nested data" do
43
+ expect(
44
+ configuration.all[:gateways][:sms_twilio][:logger][:syslog_errors]
45
+ ).to be_a(TrueClass)
46
+ end
47
+ end
48
+
49
+ describe "reload configuration data" do
50
+
51
+ it "reloads config data" do
52
+ allow(File).to receive(:read).and_return(reloaded_toml_data)
53
+
54
+ expect(configuration.for_redis[:host]).to eq('192.168.0.1')
55
+ expect(configuration.for_redis[:port]).to eq(9999)
56
+ expect(configuration.for_redis[:db]).to eq(11)
57
+
58
+ configuration.reload
59
+
60
+ expect(configuration.for_redis['host']).to eq('192.168.0.2')
61
+ expect(configuration.for_redis['port']).to eq(8888)
62
+ expect(configuration.for_redis['db']).to eq(12)
63
+
64
+ expect(configuration.all['processor']).to be_nil
65
+ end
66
+ end
67
+ end
68
+
69
+ context "multiple config files" do
70
+
71
+ it "loads config data from files" do
72
+ expect(Dir).to receive(:glob).and_return(%w(1 2 3))
73
+ expect(File).to receive(:read).thrice.and_return(
74
+ base_toml_data,
75
+ redis_toml_data,
76
+ gateways_sms_toml_data
77
+ )
78
+
79
+ configuration.load('dummy_pattern')
80
+
81
+ expect(configuration.all[:gateways][:sms][:enabled]).to be_a(FalseClass)
82
+ expect(configuration.for_redis[:host]).to eq('192.168.0.1')
83
+ end
84
+
85
+ it "fails to load config from clashing files" do
86
+ expect(Dir).to receive(:glob).and_return(%w(1 2 3))
87
+ expect(File).to receive(:read).thrice.and_return(
88
+ base_toml_data,
89
+ redis_toml_data,
90
+ clashing_redis_toml_data
91
+ )
92
+
93
+ configuration.load('dummy_pattern')
94
+
95
+ expect(configuration.all).to be_nil
96
+ end
97
+ end
98
+
99
+ let(:toml_data) {
100
+ <<-TOML_DATA
101
+ [logger]
102
+ level = "INFO"
103
+ syslog_errors = true
104
+ [redis]
105
+ host = "192.168.0.1"
106
+ port = 9999
107
+ db = 11
108
+ [processor]
109
+ enabled = true
110
+ queue = "events"
111
+ notifier_queue = "notifications"
112
+ archive_events = true
113
+ events_archive_maxage = 10800
114
+ new_check_scheduled_maintenance_duration = "100 years"
115
+ new_check_scheduled_maintenance_ignore_regex = "bypass_ncsm$"
116
+ [processor.logger]
117
+ level = "INFO"
118
+ syslog_errors = true
119
+ [notifier]
120
+ enabled = true
121
+ queue = "notifications"
122
+ email_queue = "email_notifications"
123
+ sms_queue = "sms_notifications"
124
+ sms_twilio_queue = "sms_twilio_notifications"
125
+ sns_queue = "sns_notifications"
126
+ jabber_queue = "jabber_notifications"
127
+ pagerduty_queue = "pagerduty_notifications"
128
+ default_contact_timezone = "UTC"
129
+ [notifier.logger]
130
+ level = "INFO"
131
+ syslog_errors = true
132
+ [nagios-receiver]
133
+ fifo = "/var/cache/nagios3/event_stream.fifo"
134
+ [nsca-receiver]
135
+ fifo = "/var/lib/nagios3/rw/nagios.cmd"
136
+ [gateways]
137
+ # Generates email notifications
138
+ [gateways.email]
139
+ enabled = false
140
+ queue = "email_notifications"
141
+ [gateways.email.logger]
142
+ level = "INFO"
143
+ syslog_errors = true
144
+ [gateways.email.smtp_config]
145
+ host = "127.0.0.1"
146
+ port = 1025
147
+ starttls = false
148
+ [gateways.sms]
149
+ enabled = false
150
+ queue = "sms_notifications"
151
+ endpoint = "https://www.messagenet.com.au/dotnet/Lodge.asmx/LodgeSMSMessage"
152
+ username = "ermahgerd"
153
+ password = "xxxx"
154
+ [gateways.sms.logger]
155
+ level = "INFO"
156
+ syslog_errors = true
157
+ [gateways.sms_twilio]
158
+ enabled = false
159
+ queue = "sms_twilio_notifications"
160
+ account_sid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
161
+ auth_token = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
162
+ from = "+1xxxxxxxxxx"
163
+ [gateways.sms_twilio.logger]
164
+ level = "INFO"
165
+ syslog_errors = true
166
+ [gateways.sns]
167
+ enabled = false
168
+ queue = "sns_notifications"
169
+ access_key = "AKIAIOSFODNN7EXAMPLE"
170
+ secret_key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
171
+ [gateways.jabber]
172
+ enabled = false
173
+ queue = "jabber_notifications"
174
+ server = "jabber.example.com"
175
+ port = 5222
176
+ jabberid = "flapjack@jabber.example.com"
177
+ password = "good-password"
178
+ alias = "flapjack"
179
+ identifiers = ["@flapjack"]
180
+ rooms = [
181
+ "gimp@conference.jabber.example.com",
182
+ "log@conference.jabber.example.com"
183
+ ]
184
+ [gateways.jabber.logger]
185
+ level = "INFO"
186
+ syslog_errors = true
187
+ [gateways.pagerduty]
188
+ enabled = false
189
+ # the redis queue this pikelet will look for notifications on
190
+ queue = "pagerduty_notifications"
191
+ [gateways.pagerduty.logger]
192
+ level = "INFO"
193
+ syslog_errors = true
194
+ [gateways.web]
195
+ enabled = true
196
+ port = 3080
197
+ timeout = 300
198
+ # Seconds between auto_refresh of entities/checks pages. Set to 0 to disable
199
+ auto_refresh = 120
200
+ access_log = "/var/log/flapjack/web_access.log"
201
+ [gateways.web.logger]
202
+ level = "INFO"
203
+ syslog_errors = true
204
+ [gateways.jsonapi]
205
+ enabled = true
206
+ port = 3081
207
+ timeout = 300
208
+ access_log = "/var/log/flapjack/jsonapi_access.log"
209
+ base_url = "http://localhost:3081/"
210
+ [gateways.jsonapi.logger]
211
+ level = "INFO"
212
+ syslog_errors = true
213
+ [gateways.oobetet]
214
+ enabled = false
215
+ server = "jabber.example.com"
216
+ port = 5222
217
+ jabberid = "flapjacktest@jabber.example.com"
218
+ password = "nuther-good-password"
219
+ alias = "flapjacktest"
220
+ watched_check = "PING"
221
+ pagerduty_contact = 11111111111111111111111111111111
222
+ rooms = [
223
+ "flapjacktest@conference.jabber.example.com",
224
+ "gimp@conference.jabber.example.com",
225
+ "log@conference.jabber.example.com"
226
+ ]
227
+ [gateways.oobetet.logger]
228
+ level = "INFO"
229
+ syslog_errors = true
230
+ TOML_DATA
231
+ }
232
+
233
+ let(:reloaded_toml_data) {
234
+ <<-NEW_TOML_DATA
235
+ daemonize = false
236
+ [logger]
237
+ level = "DEBUG"
238
+ syslog_errors = false
239
+ [redis]
240
+ host = "192.168.0.2"
241
+ port = 8888
242
+ db = 12
243
+ NEW_TOML_DATA
244
+ }
245
+
246
+ let(:base_toml_data) {
247
+ <<-BASE_TOML_DATA
248
+ daemonize = true
249
+ [logger]
250
+ level = "INFO"
251
+ syslog_errors = true
252
+ BASE_TOML_DATA
253
+ }
254
+
255
+ let(:redis_toml_data) {
256
+ <<-REDIS_TOML_DATA
257
+ [redis]
258
+ host = "192.168.0.1"
259
+ port = 9999
260
+ db = 11
261
+ REDIS_TOML_DATA
262
+ }
263
+
264
+ let(:clashing_redis_toml_data) {
265
+ <<-REDIS_TOML_DATA
266
+ [redis]
267
+ host = "192.168.0.2"
268
+ port = 8888
269
+ db = 22
270
+ REDIS_TOML_DATA
271
+ }
272
+
273
+ let(:gateways_sms_toml_data) {
274
+ <<-GATEWAYS_SMS_TOML_DATA
275
+ [gateways.sms]
276
+ enabled = false
277
+ queue = "sms_notifications"
278
+ endpoint = "https://www.messagenet.com.au/dotnet/Lodge.asmx/LodgeSMSMessage"
279
+ username = "ermahgerd"
280
+ password = "xxxx"
281
+ [gateways.sms.logger]
282
+ level = "INFO"
283
+ syslog_errors = true
284
+ GATEWAYS_SMS_TOML_DATA
285
+ }
286
+ end
@@ -1,127 +1,88 @@
1
1
  require 'spec_helper'
2
-
3
2
  require 'flapjack/coordinator'
4
3
 
5
4
  describe Flapjack::Coordinator do
6
5
 
7
- let(:fiber) { double(Fiber) }
8
- let(:config) { double(Flapjack::Configuration) }
9
-
10
- let(:logger) { double(Flapjack::Logger) }
11
-
12
- let(:redis) { double(::Redis) }
6
+ let(:config) { double(Flapjack::Configuration) }
7
+ let(:redis_config) { double('redis_config')}
13
8
 
14
9
  let!(:time) { Time.now }
15
10
 
16
11
  it "starts and stops a pikelet" do
17
- expect(Flapjack::Logger).to receive(:new).and_return(logger)
18
-
19
12
  cfg = {'processor' => {'enabled' => true}}
20
- expect(EM).to receive(:synchrony).and_yield
21
- expect(config).to receive(:for_redis).and_return({})
13
+
22
14
  expect(config).to receive(:all).twice.and_return(cfg)
23
15
 
24
- expect(redis).to receive(:keys).with('entity_tag:*').and_return([])
25
- expect(redis).to receive(:keys).with('check_tag:*').and_return([])
26
- expect(Flapjack::RedisPool).to receive(:new).and_return(redis)
16
+ expect(config).to receive(:for_redis).and_return(redis_config)
17
+ expect(Flapjack::RedisProxy).to receive(:config=).with(redis_config)
27
18
 
28
19
  processor = double('processor')
29
20
  expect(processor).to receive(:start)
30
21
  expect(processor).to receive(:stop)
31
- expect(processor).to receive(:update_status)
32
- expect(processor).to receive(:status).exactly(3).times.and_return('stopped')
33
-
34
- expect(Time).to receive(:now).and_return(time)
35
-
36
- fc = Flapjack::Coordinator.new(config)
37
- expect(Flapjack::Pikelet).to receive(:create).with('processor',
38
- :config => cfg['processor'], :redis_config => {}, :boot_time => time).
39
- and_return(processor)
40
-
41
- expect(EM).to receive(:stop)
42
- expect(EM::Synchrony).to receive(:sleep) {
43
- fc.instance_variable_set('@received_signals', ['INT'])
44
- }
45
22
 
46
- expect(Syslog).to receive(:opened?).and_return(true)
47
- expect(Syslog).to receive(:close)
23
+ running_cond = double(MonitorMixin::ConditionVariable)
24
+ expect(running_cond).to receive(:signal)
48
25
 
49
- fc.start(:signals => false)
50
- end
51
-
52
- it "handles an exception raised by a pikelet and shuts down" do
53
- expect(Flapjack::Logger).to receive(:new).and_return(logger)
54
- expect(logger).to receive(:fatal)
55
-
56
- cfg = {'processor' => {'enabled' => true}}
57
- expect(EM).to receive(:synchrony).and_yield
58
- expect(config).to receive(:for_redis).and_return({})
59
- expect(config).to receive(:all).twice.and_return(cfg)
60
-
61
- expect(redis).to receive(:keys).with('entity_tag:*').and_return([])
62
- expect(redis).to receive(:keys).with('check_tag:*').and_return([])
63
- expect(Flapjack::RedisPool).to receive(:new).and_return(redis)
64
-
65
- processor = double('processor')
66
- expect(processor).to receive(:start).and_raise(RuntimeError)
67
- expect(processor).to receive(:stop)
68
- expect(processor).to receive(:update_status)
69
- expect(processor).to receive(:status).exactly(3).times.and_return('stopped')
26
+ monitor = double(Monitor)
27
+ expect(monitor).to receive(:synchronize).and_yield
28
+ expect(monitor).to receive(:new_cond).and_return(running_cond)
29
+ expect(Monitor).to receive(:new).and_return(monitor)
70
30
 
71
31
  expect(Time).to receive(:now).and_return(time)
72
32
 
73
33
  fc = Flapjack::Coordinator.new(config)
74
- expect(Flapjack::Pikelet).to receive(:create).with('processor',
75
- :config => cfg['processor'], :redis_config => {}, :boot_time => time)
76
- .and_return(processor)
77
-
78
- expect(EM).to receive(:stop)
34
+ expect(running_cond).to receive(:wait_until) {
35
+ fc.instance_variable_set('@state', :stopping)
36
+ }
79
37
 
80
- expect(Syslog).to receive(:opened?).and_return(true)
81
- expect(Syslog).to receive(:close)
38
+ expect(Flapjack::Pikelet).to receive(:create).with('processor',
39
+ an_instance_of(Proc), :config => cfg['processor'],
40
+ :boot_time => time).
41
+ and_return([processor])
82
42
 
83
43
  fc.start(:signals => false)
84
44
  end
85
45
 
86
46
  it "loads an old executive pikelet config block with no new data" do
87
47
  cfg = {'executive' => {'enabled' => true}}
88
- expect(EM).to receive(:synchrony).and_yield
89
- expect(config).to receive(:for_redis).and_return({})
48
+
90
49
  expect(config).to receive(:all).twice.and_return(cfg)
91
50
 
92
- expect(redis).to receive(:keys).with('entity_tag:*').and_return([])
93
- expect(redis).to receive(:keys).with('check_tag:*').and_return([])
94
- expect(Flapjack::RedisPool).to receive(:new).and_return(redis)
51
+ expect(config).to receive(:for_redis).and_return(redis_config)
52
+ expect(Flapjack::RedisProxy).to receive(:config=).with(redis_config)
95
53
 
96
54
  processor = double('processor')
97
55
  expect(processor).to receive(:start)
98
56
  expect(processor).to receive(:stop)
99
- expect(processor).to receive(:update_status)
100
- expect(processor).to receive(:status).exactly(3).times.and_return('stopped')
101
57
 
102
- notifier = double('processor')
58
+ notifier = double('notifier')
103
59
  expect(notifier).to receive(:start)
104
60
  expect(notifier).to receive(:stop)
105
- expect(notifier).to receive(:update_status)
106
- expect(notifier).to receive(:status).exactly(3).times.and_return('stopped')
61
+
62
+ running_cond = double(MonitorMixin::ConditionVariable)
63
+ expect(running_cond).to receive(:signal)
64
+
65
+ monitor = double(Monitor)
66
+ expect(monitor).to receive(:synchronize).and_yield
67
+ expect(monitor).to receive(:new_cond).and_return(running_cond)
68
+ expect(Monitor).to receive(:new).and_return(monitor)
107
69
 
108
70
  expect(Time).to receive(:now).and_return(time)
109
71
 
110
- fc = Flapjack::Coordinator.new(config)
111
- expect(Flapjack::Pikelet).to receive(:create).with('processor',
112
- :config => cfg['executive'], :redis_config => {}, :boot_time => time).
113
- and_return(processor)
114
- expect(Flapjack::Pikelet).to receive(:create).with('notifier',
115
- :config => cfg['executive'], :redis_config => {}, :boot_time => time).
116
- and_return(notifier)
117
72
 
118
- expect(EM).to receive(:stop)
119
- expect(EM::Synchrony).to receive(:sleep) {
120
- fc.instance_variable_set('@received_signals', ['INT'])
73
+ fc = Flapjack::Coordinator.new(config)
74
+ expect(running_cond).to receive(:wait_until) {
75
+ fc.instance_variable_set('@state', :stopping)
121
76
  }
122
77
 
123
- expect(Syslog).to receive(:opened?).and_return(true)
124
- expect(Syslog).to receive(:close)
78
+ expect(Flapjack::Pikelet).to receive(:create).with('processor',
79
+ an_instance_of(Proc), :config => cfg['executive'],
80
+ :boot_time => time).
81
+ and_return([processor])
82
+ expect(Flapjack::Pikelet).to receive(:create).with('notifier',
83
+ an_instance_of(Proc), :config => cfg['executive'],
84
+ :boot_time => time).
85
+ and_return([notifier])
125
86
 
126
87
  fc.start(:signals => false)
127
88
  end
@@ -131,105 +92,111 @@ describe Flapjack::Coordinator do
131
92
  'processor' => {'foo' => 'bar'},
132
93
  'notifier' => {'enabled' => false}
133
94
  }
134
- expect(EM).to receive(:synchrony).and_yield
135
- expect(config).to receive(:for_redis).and_return({})
95
+
136
96
  expect(config).to receive(:all).twice.and_return(cfg)
137
97
 
138
- expect(redis).to receive(:keys).with('entity_tag:*').and_return([])
139
- expect(redis).to receive(:keys).with('check_tag:*').and_return([])
140
- expect(Flapjack::RedisPool).to receive(:new).and_return(redis)
98
+ expect(config).to receive(:for_redis).and_return(redis_config)
99
+ expect(Flapjack::RedisProxy).to receive(:config=).with(redis_config)
141
100
 
142
101
  processor = double('processor')
143
102
  expect(processor).to receive(:start)
144
103
  expect(processor).to receive(:stop)
145
- expect(processor).to receive(:update_status)
146
- expect(processor).to receive(:status).exactly(3).times.and_return('stopped')
104
+
105
+ running_cond = double(MonitorMixin::ConditionVariable)
106
+ expect(running_cond).to receive(:signal)
107
+
108
+ monitor = double(Monitor)
109
+ expect(monitor).to receive(:synchronize).and_yield
110
+ expect(monitor).to receive(:new_cond).and_return(running_cond)
111
+ expect(Monitor).to receive(:new).and_return(monitor)
147
112
 
148
113
  expect(Time).to receive(:now).and_return(time)
149
114
 
150
115
  fc = Flapjack::Coordinator.new(config)
151
- expect(Flapjack::Pikelet).to receive(:create).with('processor',
152
- :config => cfg['executive'].merge(cfg['processor']),
153
- :redis_config => {}, :boot_time => time).
154
- and_return(processor)
155
-
156
- expect(EM).to receive(:stop)
157
- expect(EM::Synchrony).to receive(:sleep) {
158
- fc.instance_variable_set('@received_signals', ['INT'])
116
+ expect(running_cond).to receive(:wait_until) {
117
+ fc.instance_variable_set('@state', :stopping)
159
118
  }
160
119
 
161
- expect(Syslog).to receive(:opened?).and_return(true)
162
- expect(Syslog).to receive(:close)
120
+ expect(Flapjack::Pikelet).to receive(:create).with('processor',
121
+ an_instance_of(Proc), :config => cfg['processor'].merge('enabled' => true),
122
+ :boot_time => time).
123
+ and_return([processor])
163
124
 
164
125
  fc.start(:signals => false)
165
126
  end
166
127
 
167
128
  it "traps system signals and shuts down" do
168
- expect(Flapjack::Logger).to receive(:new).and_return(logger)
169
-
170
129
  expect(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return('darwin12.0.0')
171
130
 
131
+ expect(config).to receive(:all).and_return({})
132
+
133
+ thread = double(Thread)
134
+ expect(thread).to receive(:join).exactly(3).times
135
+ expect(Thread).to receive(:new).exactly(3).times.and_yield.and_return(thread)
136
+
172
137
  expect(Kernel).to receive(:trap).with('INT').and_yield
173
138
  expect(Kernel).to receive(:trap).with('TERM').and_yield
174
139
  expect(Kernel).to receive(:trap).with('HUP').and_yield
175
140
 
176
- expect(config).to receive(:all).and_return({})
177
- expect(config).to receive(:for_redis).and_return({})
141
+ shutdown = double('shutdown')
142
+ expect(shutdown).to receive(:call).with(2).once
143
+ expect(shutdown).to receive(:call).with(15).once
144
+ reload = double('reload')
145
+ expect(reload).to receive(:call).once
146
+
178
147
  fc = Flapjack::Coordinator.new(config)
148
+ fc.instance_variable_set('@shutdown', shutdown)
149
+ fc.instance_variable_set('@reload', reload)
179
150
 
180
151
  fc.send(:setup_signals)
181
- expect(fc.instance_variable_get('@received_signals')).to eq(['INT', 'TERM', 'HUP'])
182
152
  end
183
153
 
184
154
  it "only traps two system signals on Windows" do
185
- expect(Flapjack::Logger).to receive(:new).and_return(logger)
186
-
187
155
  expect(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return('mswin')
188
156
 
157
+ expect(config).to receive(:all).and_return({})
158
+
159
+ thread = double(Thread)
160
+ expect(thread).to receive(:join).twice
161
+ expect(Thread).to receive(:new).twice.and_yield.and_return(thread)
162
+
189
163
  expect(Kernel).to receive(:trap).with('INT').and_yield
190
164
  expect(Kernel).to receive(:trap).with('TERM').and_yield
191
165
  expect(Kernel).not_to receive(:trap).with('HUP')
192
166
 
193
- expect(config).to receive(:all).and_return({})
194
- expect(config).to receive(:for_redis).and_return({})
167
+ shutdown = double('shutdown')
168
+ expect(shutdown).to receive(:call).with(2).once
169
+ expect(shutdown).to receive(:call).with(15).once
170
+ reload = double('reload')
171
+
195
172
  fc = Flapjack::Coordinator.new(config)
173
+ fc.instance_variable_set('@shutdown', shutdown)
174
+ fc.instance_variable_set('@reload', reload)
196
175
 
197
176
  fc.send(:setup_signals)
198
- expect(fc.instance_variable_get('@received_signals')).to eq(['INT', 'TERM'])
199
177
  end
200
178
 
201
179
  it "stops one pikelet and starts another on reload" do
202
- expect(Flapjack::Logger).to receive(:new).and_return(logger)
203
-
204
180
  old_cfg = {'processor' => {'enabled' => true}}
205
181
  new_cfg = {'gateways' => {'jabber' => {'enabled' => true}}}
206
182
 
207
- new_config = double('new_config')
208
- filename = double('filename')
209
-
210
- expect(config).to receive(:all).twice.and_return(old_cfg)
211
- expect(config).to receive(:filename).and_return(filename)
212
-
213
- expect(Flapjack::Configuration).to receive(:new).and_return(new_config)
214
- expect(new_config).to receive(:load).with(filename)
215
- expect(new_config).to receive(:all).and_return(new_cfg)
183
+ expect(config).to receive(:all).exactly(3).times.and_return(old_cfg, old_cfg, new_cfg)
184
+ expect(config).to receive(:reload)
216
185
 
217
186
  processor = double('processor')
218
- expect(processor).to receive(:type).twice.and_return('processor')
187
+ expect(processor).to receive(:type).and_return('processor')
219
188
  expect(processor).to receive(:stop)
220
- expect(processor).to receive(:update_status)
221
- expect(processor).to receive(:status).exactly(3).times.and_return('stopped')
222
-
223
- expect(config).to receive(:for_redis).and_return({})
224
- fc = Flapjack::Coordinator.new(config)
225
189
 
226
190
  jabber = double('jabber')
227
191
  expect(Flapjack::Pikelet).to receive(:create).
228
- with('jabber', :config => {"enabled" => true}, :redis_config => {},
192
+ with('jabber', an_instance_of(Proc),
193
+ :config => {"enabled" => true},
229
194
  :boot_time => time).
230
- and_return(jabber)
195
+ and_return([jabber])
231
196
  expect(jabber).to receive(:start)
232
197
 
198
+ fc = Flapjack::Coordinator.new(config)
199
+
233
200
  fc.instance_variable_set('@boot_time', time)
234
201
  fc.instance_variable_set('@pikelets', [processor])
235
202
  fc.send(:reload)
@@ -237,20 +204,11 @@ describe Flapjack::Coordinator do
237
204
  end
238
205
 
239
206
  it "reloads a pikelet config without restarting it" do
240
- expect(Flapjack::Logger).to receive(:new).and_return(logger)
241
-
242
207
  old_cfg = {'processor' => {'enabled' => true, 'foo' => 'bar'}}
243
208
  new_cfg = {'processor' => {'enabled' => true, 'foo' => 'baz'}}
244
209
 
245
- new_config = double('new_config')
246
- filename = double('filename')
247
-
248
- expect(config).to receive(:all).twice.and_return(old_cfg)
249
- expect(config).to receive(:filename).and_return(filename)
250
-
251
- expect(Flapjack::Configuration).to receive(:new).and_return(new_config)
252
- expect(new_config).to receive(:load).with(filename)
253
- expect(new_config).to receive(:all).and_return(new_cfg)
210
+ expect(config).to receive(:all).exactly(3).times.and_return(old_cfg, old_cfg, new_cfg)
211
+ expect(config).to receive(:reload)
254
212
 
255
213
  processor = double('processor')
256
214
  expect(processor).not_to receive(:start)
@@ -258,7 +216,6 @@ describe Flapjack::Coordinator do
258
216
  expect(processor).to receive(:reload).with(new_cfg['processor']).and_return(true)
259
217
  expect(processor).not_to receive(:stop)
260
218
 
261
- expect(config).to receive(:for_redis).and_return({})
262
219
  fc = Flapjack::Coordinator.new(config)
263
220
  fc.instance_variable_set('@boot_time', time)
264
221
  fc.instance_variable_set('@pikelets', [processor])
@@ -267,43 +224,32 @@ describe Flapjack::Coordinator do
267
224
  end
268
225
 
269
226
  it "reloads a pikelet config while restarting it" do
270
- expect(Flapjack::Logger).to receive(:new).and_return(logger)
271
-
272
227
  old_cfg = {'processor' => {'enabled' => true, 'foo' => 'bar'}}
273
228
  new_cfg = {'processor' => {'enabled' => true, 'baz' => 'qux'}}
274
229
 
275
- new_config = double('new_config')
276
- filename = double('filename')
277
-
278
- expect(config).to receive(:all).twice.and_return(old_cfg)
279
- expect(config).to receive(:filename).and_return(filename)
280
-
281
- expect(Flapjack::Configuration).to receive(:new).and_return(new_config)
282
- expect(new_config).to receive(:load).with(filename)
283
- expect(new_config).to receive(:all).and_return(new_cfg)
230
+ expect(config).to receive(:all).exactly(3).times.and_return(old_cfg, old_cfg, new_cfg)
231
+ expect(config).to receive(:reload)
284
232
 
285
233
  processor = double('processor')
286
234
  expect(processor).to receive(:type).exactly(5).times.and_return('processor')
287
235
  expect(processor).to receive(:reload).with(new_cfg['processor']).and_return(false)
288
236
  expect(processor).to receive(:stop)
289
- expect(processor).to receive(:update_status)
290
- expect(processor).to receive(:status).exactly(3).times.and_return('stopped')
291
237
 
292
- new_exec = double('new_executive')
293
- expect(new_exec).to receive(:start)
238
+ new_processor = double('new_processor')
239
+ expect(new_processor).to receive(:start)
294
240
 
295
- expect(config).to receive(:for_redis).and_return({})
296
241
  fc = Flapjack::Coordinator.new(config)
297
242
 
298
243
  expect(Flapjack::Pikelet).to receive(:create).
299
- with('processor', :config => new_cfg['processor'], :redis_config => {},
244
+ with('processor', an_instance_of(Proc),
245
+ :config => new_cfg['processor'],
300
246
  :boot_time => time).
301
- and_return(new_exec)
247
+ and_return([new_processor])
302
248
 
303
249
  fc.instance_variable_set('@boot_time', time)
304
250
  fc.instance_variable_set('@pikelets', [processor])
305
251
  fc.send(:reload)
306
- expect(fc.instance_variable_get('@pikelets')).to eq([new_exec])
252
+ expect(fc.instance_variable_get('@pikelets')).to eq([new_processor])
307
253
  end
308
254
 
309
255
  end