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,7 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'dante'
4
-
5
3
  require 'flapjack/coordinator'
6
4
 
7
5
  module Flapjack
@@ -22,171 +20,16 @@ module Flapjack
22
20
  @config_env = @config.all
23
21
 
24
22
  if @config_env.nil? || @config_env.empty?
25
- exit_now! "No config data for environment '#{FLAPJACK_ENV}' found in '#{global_options[:config]}'"
26
- end
27
-
28
- @pidfile = case
29
- when !@options[:pidfile].nil?
30
- @options[:pidfile]
31
- when !@config_env['pid_dir'].nil?
32
- File.join(@config_env['pid_dir'], 'flapjack.pid')
33
- else
34
- "/var/run/flapjack/flapjack.pid"
35
- end
36
-
37
- @logfile = case
38
- when !@options[:logfile].nil?
39
- @options[:logfile]
40
- when !@config_env['log_dir'].nil?
41
- File.join(@config_env['log_dir'], 'flapjack.log')
42
- else
43
- "/var/run/flapjack/flapjack.log"
44
- end
45
-
46
- if options[:rbtrace]
47
- require 'rbtrace'
23
+ exit_now! "No config data found in '#{global_options[:config]}'"
48
24
  end
49
25
  end
50
26
 
51
27
  def start
52
- if runner.daemon_running?
53
- puts "Flapjack is already running."
54
- else
55
- print "Flapjack starting..."
56
- main_umask = nil
57
- if @options[:daemonize]
58
- main_umask = File.umask
59
- else
60
- print "\n"
61
- end
62
- return_value = nil
63
- runner.execute(:daemonize => @options[:daemonize]) {
64
- File.umask(main_umask) if @options[:daemonize]
65
- return_value = start_server
66
- }
67
- puts " done."
68
- unless return_value.nil? || [Signal.list['INT'] + 128,
69
- Signal.list['TERM'] + 128].include?(return_value)
70
- exit_now!(return_value)
71
- end
72
- end
73
- end
74
-
75
- def stop
76
- pid = get_pid
77
- if runner.daemon_running?
78
- print "Flapjack stopping..."
79
- runner.execute(:kill => true)
80
- puts " done."
81
- else
82
- puts "Flapjack is not running."
83
- end
84
- exit_now! "Failed to stop Flapjack #{pid}" unless wait_pid_gone(pid)
85
- end
86
-
87
- def restart
88
- pid = get_pid
89
- if runner.daemon_running?
90
- print "Flapjack stopping..."
91
- runner.execute(:kill => true)
92
- puts " done."
93
- end
94
- exit_now! "Failed to stop Flapjack #{pid}" unless wait_pid_gone(pid)
95
-
96
- @runner = nil
97
-
98
- print "Flapjack starting..."
99
-
100
- main_umask = File.umask
101
- runner.execute(:daemonize => true) {
102
- File.umask(main_umask)
103
- start_server
104
- }
105
- puts " done."
106
- end
107
-
108
- def reload
109
- if runner.daemon_running?
110
- pid = get_pid
111
- print "Reloading Flapjack configuration..."
112
- begin
113
- Process.kill('HUP', pid)
114
- puts " sent HUP to pid #{pid}."
115
- rescue => e
116
- puts " couldn't send HUP to pid '#{pid}'."
117
- end
118
- else
119
- exit_now! "Flapjack is not running daemonized."
120
- end
121
- end
122
-
123
- def status
124
- if runner.daemon_running?
125
- pid = get_pid
126
- uptime = Time.now - File.stat(@pidfile).ctime
127
- puts "Flapjack is running: pid #{pid}, uptime #{uptime}"
128
- else
129
- exit_now! "Flapjack is not running"
130
- end
131
- end
132
-
133
- private
134
-
135
- def runner
136
- return @runner if @runner
137
-
138
- self.class.skip_dante_traps
139
-
140
- @runner = Dante::Runner.new('flapjack', :pid_path => @pidfile,
141
- :log_path => @logfile)
142
- @runner
143
- end
144
-
145
- def self.skip_dante_traps
146
- return if Dante::Runner.respond_to?(:orig_start)
147
- Dante::Runner.send(:alias_method, :orig_start, :start)
148
- Dante::Runner.send(:define_method, :start) do
149
- if log_path = options[:log_path] && options[:daemonize].nil?
150
- redirect_output!
151
- end
152
-
153
- # skip signal traps
154
- @startup_command.call(self.options) if @startup_command
155
- end
156
- end
157
-
158
- def start_server
28
+ puts "Flapjack starting..."
159
29
  @coordinator = Flapjack::Coordinator.new(@config)
160
- @coordinator.start(:signals => true)
161
- end
162
-
163
- def process_exists(pid)
164
- return unless pid
165
- begin
166
- Process.kill(0, pid)
167
- return true
168
- rescue Errno::ESRCH
169
- return false
170
- end
171
- end
172
-
173
- # wait until the specified pid no longer exists, or until a timeout is reached
174
- def wait_pid_gone(pid, timeout = 30)
175
- print "waiting for a max of #{timeout} seconds for process #{pid} to exit" if process_exists(pid)
176
- started_at = Time.now.to_i
177
- while process_exists(pid)
178
- break unless (Time.now.to_i - started_at < timeout)
179
- print '.'
180
- sleep 1
181
- end
182
- puts ''
183
- !process_exists(pid)
184
- end
185
-
186
- def get_pid
187
- IO.read(@pidfile).chomp.to_i
188
- rescue StandardError
189
- pid = nil
30
+ return_value = @coordinator.start(:signals => true)
31
+ puts " done."
32
+ exit_now!(return_value) unless return_value.nil?
190
33
  end
191
34
 
192
35
  end
@@ -195,78 +38,8 @@ end
195
38
 
196
39
  desc 'Server for running components (e.g. processor, notifier, gateways)'
197
40
  command :server do |server|
198
-
199
- server.desc 'Start the server'
200
-
201
- server.command :start do |start|
202
-
203
- start.switch [:d, 'daemonize'], :desc => 'Daemonize',
204
- :default_value => true
205
-
206
- start.flag [:p, 'pidfile'], :desc => 'PATH of the pidfile to write to'
207
-
208
- start.flag [:l, 'logfile'], :desc => 'PATH of the logfile to write to'
209
-
210
- start.flag [:r, 'rbtrace'], :desc => 'Enable rbtrace profiling'
211
-
212
- start.action do |global_options,options,args|
213
- server = Flapjack::CLI::Server.new(global_options, options)
214
- server.start
215
- end
216
- end
217
-
218
- server.desc 'Stop the server'
219
- server.command :stop do |stop|
220
-
221
- stop.flag [:p, 'pidfile'], :desc => 'PATH of the pidfile to write to'
222
-
223
- stop.flag [:l, 'logfile'], :desc => 'PATH of the logfile to write to'
224
-
225
- stop.action do |global_options,options,args|
226
- server = Flapjack::CLI::Server.new(global_options, options)
227
- server.stop
228
- end
41
+ server.action do |global_options,options,args|
42
+ cli_server = Flapjack::CLI::Server.new(global_options, options)
43
+ cli_server.start
229
44
  end
230
-
231
- server.desc 'Restart the server'
232
- server.command :restart do |restart|
233
-
234
- restart.flag [:p, 'pidfile'], :desc => 'PATH of the pidfile to write to'
235
-
236
- restart.flag [:l, 'logfile'], :desc => 'PATH of the logfile to write to'
237
-
238
- restart.flag [:r, 'rbtrace'], :desc => 'Enable rbtrace profiling'
239
-
240
- restart.action do |global_options,options,args|
241
- server = Flapjack::CLI::Server.new(global_options, options)
242
- server.restart
243
- end
244
- end
245
-
246
- server.desc 'Reload the server configuration'
247
- server.command :reload do |reload|
248
-
249
- reload.flag [:p, 'pidfile'], :desc => 'PATH of the pidfile to write to'
250
-
251
- reload.flag [:l, 'logfile'], :desc => 'PATH of the logfile to write to'
252
-
253
- reload.action do |global_options,options,args|
254
- server = Flapjack::CLI::Server.new(global_options, options)
255
- server.reload
256
- end
257
- end
258
-
259
- server.desc 'Get server status'
260
- server.command :status do |status|
261
-
262
- status.flag [:p, 'pidfile'], :desc => 'PATH of the pidfile to write to'
263
-
264
- status.flag [:l, 'logfile'], :desc => 'PATH of the logfile to write to'
265
-
266
- status.action do |global_options,options,args|
267
- server = Flapjack::CLI::Server.new(global_options, options)
268
- server.status
269
- end
270
- end
271
-
272
45
  end
@@ -1,13 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'eventmachine'
4
- require 'em-synchrony'
5
3
  require 'redis'
6
- require 'redis/connection/synchrony'
7
4
 
8
5
  require 'flapjack/configuration'
9
6
  require 'flapjack/data/event'
10
- require 'flapjack/data/migration'
11
7
 
12
8
  module Flapjack
13
9
  module CLI
@@ -27,83 +23,81 @@ module Flapjack
27
23
  @config_env = config.all
28
24
 
29
25
  if @config_env.nil? || @config_env.empty?
30
- exit_now! "No config data for environment '#{FLAPJACK_ENV}' found in '#{global_options[:config]}'"
26
+ exit_now! "No config data found in '#{global_options[:config]}'"
31
27
  end
32
28
 
33
- @redis_options = config.for_redis
29
+ Flapjack::RedisProxy.config = config.for_redis
30
+ Zermelo.redis = Flapjack.redis
34
31
  end
35
32
 
36
33
  def _fail
37
34
  events(:state => @options[:state], :recover => false,
38
- :entity => @options[:entity], :check => @options[:check],
39
- :tags => @options[:tags],
40
- :minutes => @options[:time].to_f, :interval => @options[:interval].to_f)
35
+ :check => @options[:check], :minutes => @options[:time].to_f,
36
+ :interval => @options[:interval].to_f)
41
37
  end
42
38
 
43
39
  def fail_and_recover
44
40
  events(:state => @options[:state], :recover => true,
45
- :entity => @options[:entity], :check => @options[:check],
46
- :tags => @options[:tags],
47
- :minutes => @options[:time].to_f, :interval => @options[:interval].to_f)
41
+ :check => @options[:check], :minutes => @options[:time].to_f,
42
+ :interval => @options[:interval].to_f)
48
43
  end
49
44
 
50
45
  def ok
51
46
  events(:state => 'ok', :recover => false,
52
- :entity => @options[:entity], :check => @options[:check],
53
- :tags => @options[:tags],
54
- :minutes => @options[:time].to_f, :interval => @options[:interval].to_f)
47
+ :check => @options[:check], :minutes => @options[:time].to_f,
48
+ :interval => @options[:interval].to_f)
55
49
  end
56
50
 
57
51
  private
58
52
 
59
- def redis
60
- return @redis unless @redis.nil?
61
- @redis = Redis.new(@redis_options)
62
- Flapjack::Data::Migration.migrate_entity_check_data_if_required(:redis => @redis)
63
- Flapjack::Data::Migration.clear_orphaned_entity_ids(:redis => @redis)
64
- @redis
65
- end
66
-
67
53
  def events(opts = {})
68
54
  stop_after = (opts[:minutes] * 60).to_i
69
55
  recover = opts[:recover]
70
56
  state = opts[:state] || 'critical'
71
57
  event = {
72
- 'entity' => opts[:entity] || 'foo-app-01',
73
- 'check' => opts[:check] || 'HTTP',
74
- 'tags' => opts[:tags] || [],
58
+ 'check' => opts[:check] || 'HTTP',
75
59
  'type' => 'service'
76
60
  }
77
61
  failure = event.merge('state' => state, 'summary' => 'Simulated check output (test by operator)')
78
- recovery = event.merge('state' => 'ok', 'summary' => 'Simulated check output (test by operator)')
79
- key = "#{event['entity']}:#{event['check']}"
80
-
81
- EM.synchrony do
82
-
83
- puts "#{Time.now}: sending failure event (#{state}) for #{key}"
84
- Flapjack::Data::Event.add(failure, :redis => redis)
85
-
86
- EM.add_timer(stop_after) do
87
- puts "#{Time.now}: stopping"
88
- if recover
89
- EM.synchrony do
90
- puts "#{Time.now}: sending recovery event for #{key}"
91
- Flapjack::Data::Event.add(recovery.merge('time' => Time.now.to_i),
92
- :redis => redis)
62
+ recovery = event.merge('state' => 'ok', 'summary' => 'Simulated check output (test by operator)')
63
+ key = event['check']
64
+
65
+ lock = Monitor.new
66
+ stop_cond = lock.new_cond
67
+ @finish = false
68
+
69
+ failer = Thread.new do
70
+ fin = nil
71
+
72
+ loop do
73
+ lock.synchronize do
74
+ unless fin = @finish
75
+ puts "#{Time.now}: sending failure event (#{state}) for #{key}"
76
+ Flapjack::Data::Event.push('events', failure.merge('time' => Time.now.to_i))
77
+ stop_cond.wait(opts[:interval])
93
78
  end
94
79
  end
95
- EM.stop
80
+ break if fin
96
81
  end
82
+ end
97
83
 
98
- EM.add_periodic_timer(opts[:interval]) do
99
- EM.synchrony do
100
- puts "#{Time.now}: sending failure event (#{state}) for #{key}"
101
- Flapjack::Data::Event.add(failure.merge('time' => Time.now.to_i),
102
- :redis => redis)
84
+ stopper = Thread.new do
85
+ sleep stop_after
86
+ lock.synchronize do
87
+ puts "#{Time.now}: stopping"
88
+ if recover
89
+ puts "#{Time.now}: sending recovery event for #{key}"
90
+ Flapjack::Data::Event.push('events', recovery.merge('time' => Time.now.to_i))
103
91
  end
92
+ @finish = true
93
+ stop_cond.signal
104
94
  end
105
-
106
95
  end
96
+
97
+ stopper.join
98
+ failer.join
99
+
100
+ Flapjack.redis.quit
107
101
  end
108
102
 
109
103
  end
@@ -124,9 +118,6 @@ command :simulate do |simulate|
124
118
  _fail.flag [:i, 'interval'], :desc => "SECONDS between events, can be decimal eg 0.1 (10)",
125
119
  :default_value => 10
126
120
 
127
- _fail.flag [:e, 'entity'], :desc => "ENTITY to generate failure events for ('foo-app-01')",
128
- :default_value => 'foo-app-01'
129
-
130
121
  _fail.flag [:k, 'check'], :desc => "CHECK to generate failure events for ('HTTP')",
131
122
  :default_value => 'HTTP'
132
123
 
@@ -151,9 +142,6 @@ command :simulate do |simulate|
151
142
  fail_and_recover.flag [:i, 'interval'], :desc => "SECONDS between events, can be decimal eg 0.1 (10)",
152
143
  :default_value => 10
153
144
 
154
- fail_and_recover.flag [:e, 'entity'], :desc => "ENTITY to generate failure events for ('foo-app-01')",
155
- :default_value => 'foo-app-01'
156
-
157
145
  fail_and_recover.flag [:k, 'check'], :desc => "CHECK to generate failure events for ('HTTP')",
158
146
  :default_value => 'HTTP'
159
147
 
@@ -178,9 +166,6 @@ command :simulate do |simulate|
178
166
  ok.flag [:i, 'interval'], :desc => "SECONDS between events, can be decimal eg 0.1 (10)",
179
167
  :default_value => 10
180
168
 
181
- ok.flag [:e, 'entity'], :desc => "ENTITY to generate ok events for ('foo-app-01')",
182
- :default_value => 'foo-app-01'
183
-
184
169
  ok.flag [:k, 'check'], :desc => "CHECK to generate ok events for ('HTTP')",
185
170
  :default_value => 'HTTP'
186
171
 
@@ -1,44 +1,37 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'yaml'
4
- require 'logger'
3
+ require 'toml'
4
+ require 'active_support/core_ext/hash/indifferent_access'
5
5
 
6
6
  module Flapjack
7
-
8
7
  class Configuration
9
8
 
10
- DEFAULT_CONFIG_PATH = '/etc/flapjack/flapjack_config.yaml'
11
-
12
9
  attr_reader :filename
13
10
 
14
- def initialize(opts = {})
15
- @logger = opts[:logger]
16
- end
17
-
18
11
  def all
19
- @config_env
12
+ @config
20
13
  end
21
14
 
22
15
  def for_redis
23
- return unless @config_env
16
+ return unless @config
24
17
 
25
- redis_defaults = {'host' => 'localhost',
26
- 'port' => 6379,
27
- 'path' => nil,
28
- 'db' => 0}
18
+ redis_defaults = {'host' => '127.0.0.1',
19
+ 'port' => 6379,
20
+ 'path' => nil,
21
+ 'db' => 0}
29
22
 
30
- @config_env['redis'] = {} unless @config_env.has_key?('redis')
23
+ @config['redis'] = {} unless @config.has_key?('redis')
31
24
 
32
- redis = @config_env['redis']
25
+ redis = @config['redis']
33
26
  redis_defaults.each_pair do |k,v|
34
- next if redis.has_key?(k) && redis[k] &&
27
+ next if redis.has_key?(k) && !redis[k].nil? &&
35
28
  !(redis[k].is_a?(String) && redis[k].empty?)
36
29
  redis[k] = v
37
30
  end
38
31
 
39
32
  redis_path = (redis['path'] || nil)
40
- base_opts = {:db => (redis['db'] || 0)}
41
- base_opts[:driver] = redis['driver'] if redis['driver']
33
+ base_opts = HashWithIndifferentAccess.new({ :db => (redis['db'] || 0) })
34
+ base_opts[:driver] = redis['driver'] unless redis['driver'].nil?
42
35
  redis_config = base_opts.merge(
43
36
  (redis_path ? { :path => redis_path } :
44
37
  { :host => (redis['host'] || '127.0.0.1'),
@@ -50,37 +43,58 @@ module Flapjack
50
43
  redis_config
51
44
  end
52
45
 
53
- def load(filename)
54
- @filename = nil
55
- @config_env = nil
46
+ def load(file_pattern)
47
+ @file_pattern = nil
48
+ @config = nil
49
+
50
+ config_file_names = Dir.glob(file_pattern)
56
51
 
57
- unless File.file?(filename)
58
- @logger.error "Could not find file '#{filename}'" if @logger
52
+ if config_file_names.nil?
53
+ Flapjack.logger.error {
54
+ "Could not load config files using file_pattern '#{file_pattern}'"
55
+ }
59
56
  return
60
57
  end
61
58
 
62
- unless defined?(FLAPJACK_ENV)
63
- @logger.error "Environment variable 'FLAPJACK_ENV' is not set" if @logger
64
- return
59
+ yaml_file = config_file_names.detect {|f| f.end_with?('.yaml') }
60
+
61
+ unless yaml_file.nil?
62
+ raise "#{yaml_file} looks like a YAML file. Flapjack v2 config files are now in TOML, " +
63
+ "see flapjack.io/docs/2.x/configuration"
65
64
  end
66
65
 
67
- config = YAML::load_file(filename)
66
+ config = config_file_names.inject({}) do |config, file_name|
67
+ config.merge!(TOML.load_file(file_name)) do |key, old_val, new_val|
68
+ if old_val != new_val
69
+ Flapjack.logger.error {
70
+ "Duplicate configuration setting #{key} in #{file_name}"
71
+ }
72
+ break
73
+ else
74
+ new_val
75
+ end
76
+ end
77
+ end
68
78
 
69
- if config.nil?
70
- @logger.error "Could not load config file '#{filename}'" if @logger
79
+ if config.nil? || config.empty?
80
+ Flapjack.logger.error {
81
+ "Could not load config files using file_pattern '#{file_pattern}'"
82
+ }
71
83
  return
72
84
  end
73
85
 
74
- @config_env = config[FLAPJACK_ENV]
86
+ @config = HashWithIndifferentAccess.new(config)
87
+
88
+ @file_pattern = file_pattern
89
+ end
75
90
 
76
- if @config_env.nil?
77
- @logger.error "No config data for environment '#{FLAPJACK_ENV}' found in '#{filename}'" if @logger
91
+ def reload
92
+ if @file_pattern.nil?
93
+ Flapjack.logger.error "Cannot reload, config file_pattern not set."
78
94
  return
79
95
  end
80
96
 
81
- @filename = filename
97
+ load(@file_pattern)
82
98
  end
83
-
84
99
  end
85
-
86
100
  end