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,151 +0,0 @@
1
- require 'csv'
2
- require 'securerandom'
3
-
4
- require 'redis'
5
-
6
- require 'flapjack/configuration'
7
- require 'flapjack/data/entity'
8
-
9
- FLAPJACK_ENV = ENV['FLAPJACK_ENV'] || 'production'
10
-
11
- namespace :entities do
12
-
13
- def redis
14
- return @redis unless @redis.nil?
15
- @redis = Redis.new(@redis_config.merge(:driver => :hiredis))
16
- Flapjack::Data::Migration.migrate_entity_check_data_if_required(:redis => @redis)
17
- @redis
18
- end
19
-
20
- def orphaned_entity_names
21
- current_names = Flapjack::Data::Entity.all(:redis => redis).map(&:name)
22
-
23
- all_entity_names = redis.keys("check:*:*").inject([]) do |memo, ck|
24
- if ck =~ /^check:([^:]+):.+$/
25
- memo << $1
26
- end
27
-
28
- memo
29
- end
30
-
31
- all_entity_names - current_names
32
- end
33
-
34
- task :setup do
35
- config_file = File.join('etc', 'flapjack_config.yaml')
36
-
37
- config = Flapjack::Configuration.new
38
- config.load( config_file )
39
-
40
- @config_env = config.all
41
- @redis_config = config.for_redis
42
-
43
- if @config_env.nil? || @config_env.empty?
44
- puts "No config data for environment '#{FLAPJACK_ENV}' found in '#{config_file}'"
45
- exit(false)
46
- end
47
- end
48
-
49
- desc "lists current entity names and their ids"
50
- task :current => [:setup] do
51
- puts CSV.generate(:headers => :first_row, :write_headers => true, :row_sep => "\r\n") {|csv|
52
- csv << ['id', 'name']
53
- Flapjack::Data::Entity.all(:redis => redis).each do |entity|
54
- csv << [entity.id, entity.name]
55
- end
56
- }
57
- end
58
-
59
- desc "lists entities with data orphaned by entity renames, or created without ids, prior to v1.0"
60
- task :orphaned => [:setup] do
61
- orph = orphaned_entity_names
62
-
63
- puts CSV.generate(:headers => :first_row, :write_headers => true, :row_sep => "\r\n") {|csv|
64
- csv << ['name']
65
- orph.each {|orp| csv << [orp]}
66
- }
67
- end
68
-
69
- desc "reparent entity names from a CSV file on input"
70
- task :reparent => [:setup] do
71
-
72
- # The CSV should be in the form 'id', 'name', 'old_name'
73
- # If more than one old name exists, another row should be used with
74
- # the first two values repeated. The id is there as a sanity check
75
- # against current data.
76
-
77
- entities = {}
78
- old_entities = {}
79
-
80
- CSV.new($stdin, :headers => :first_row, :return_headers => false) {|csv|
81
- csv.each {|row|
82
-
83
- id = row['id']
84
- name = row['name']
85
- old_name = row['old_name']
86
-
87
- if entities.has_key?(id)
88
- unless entities[id].eql?(name)
89
- raise "Different names for entity id 'id': '#{name}', '#{old_name}'"
90
- end
91
- else
92
- entities[id] = name
93
- end
94
-
95
- old_entities[id] ||= []
96
- old_entities[id] << old_name
97
- }
98
-
99
- old_entities.each_pair do |id, old_entities_for_id|
100
- old_entities_for_id.each do |old_entity|
101
- puts "Re-parenting '#{old_entity}' data to '#{entities[id]}'"
102
- Flapjack::Data::Entity.merge(old_entity, entities[id], :redis => redis)
103
- end
104
- end
105
- }
106
-
107
- end
108
-
109
- # Checks sent by monitoring data before the related entity had been imported,
110
- # before 1.0, had autogenerated entities saved without ids, and these entities
111
- # were not re-integrated later. This task will detect and fix any such data.
112
- desc "give an identity to entities that never had one"
113
- task :repatriate => [:setup] do
114
-
115
- orph = orphaned_entity_names
116
-
117
- CSV.new($stdin, :headers => :first_row, :return_headers => false) {|csv|
118
- csv.each {|row|
119
-
120
- name = row['name']
121
- id = row['id']
122
-
123
- if !orph.include?(name)
124
- puts "'#{name}' is not an orphaned entity."
125
- next
126
- end
127
-
128
- entity = id.nil? ? nil : Flapjack::Data::Entity.find_by_id(id)
129
-
130
- if id.nil? || entity.nil?
131
- id ||= SecureRandom.uuid
132
- redis.multi do
133
- multi.hset('all_entity_ids_by_name', name, id)
134
- multi.hset('all_entity_names_by_id', id, name)
135
- end
136
- puts "Set id '#{id}' for entity #{name}'"
137
- elsif entity.name.eql?(name)
138
- puts "'#{name}' entity already exists with the provided id"
139
- else
140
- # entity exists, name doesn't match -- merge old data
141
- Flapjack::Data::Entity.merge(name, entity.name, :redis => redis)
142
- puts "Merged data for entity '#{name}' into entity #{entity.name}' with id '#{id}'"
143
- end
144
-
145
- }
146
-
147
- }
148
-
149
- end
150
-
151
- end
@@ -1,282 +0,0 @@
1
- namespace :profile do
2
-
3
- require 'fileutils'
4
- require 'flapjack/configuration'
5
-
6
- FLAPJACK_ROOT = File.join(File.dirname(__FILE__), '..')
7
- FLAPJACK_CONFIG = File.join(FLAPJACK_ROOT, 'etc', 'flapjack_config.yaml')
8
-
9
- FLAPJACK_PROFILER = ENV['FLAPJACK_PROFILER'] || 'rubyprof'
10
- port = ENV['FLAPJACK_PROFILER'].to_i
11
- FLAPJACK_PORT = ((port > 1024) && (port <= 65535)) ? port : 8075
12
-
13
- REPETITIONS = 10
14
-
15
- require 'ruby-prof'
16
-
17
- def profile_pikelet(klass, name, config, redis_options, &block)
18
- redis = Redis.new(redis_options.merge(:driver => 'ruby'))
19
- check_db_empty(:redis => redis, :redis_options => redis_options)
20
- setup_baseline_data(:redis => redis)
21
-
22
- EM.synchrony do
23
- RubyProf.start
24
- pikelet = klass.new
25
- pikelet.bootstrap(:config => config,
26
- :redis_config => redis_options)
27
-
28
- EM.defer(block, proc {
29
- pikelet.stop
30
- pikelet.add_shutdown_event(:redis => redis)
31
- })
32
-
33
- pikelet.main
34
- pikelet.cleanup
35
- result = RubyProf.stop
36
- result.eliminate_methods!([/Class::Thread/, /Deferrable/])
37
- printer = RubyProf::MultiPrinter.new(result)
38
- output_dir = File.join('tmp', 'profiles')
39
- FileUtils.mkdir_p(output_dir)
40
- printer.print(:path => output_dir, :profile => name)
41
- EM.stop
42
- end
43
-
44
- empty_db(:redis => redis)
45
- redis.quit
46
- end
47
-
48
- def profile_thin(klass, name, config, redis_options, &block)
49
- redis = Redis.new(redis_options.merge(:driver => 'ruby'))
50
- check_db_empty(:redis => redis, :redis_options => redis_options)
51
- setup_baseline_data(:redis => redis)
52
-
53
- Thin::Logging.silent = true
54
-
55
- EM.synchrony do
56
- output_dir = File.join('tmp', 'profiles')
57
- FileUtils.mkdir_p(output_dir)
58
-
59
- profile_klass = Class.new(klass)
60
- profile_klass.instance_eval {
61
- before do
62
- RubyProf.send( (profile_klass.class_variable_defined?('@@profiling') ? :resume : :start) )
63
- profile_klass.class_variable_set('@@profiling', true)
64
- end
65
- after { RubyProf.pause }
66
- }
67
-
68
- profile_klass.bootstrap(:config => config, :redis_config => redis_options)
69
-
70
- server = Thin::Server.new('0.0.0.0', FLAPJACK_PORT,
71
- profile_klass, :signals => false)
72
-
73
- server.start
74
-
75
- EM.defer(block, proc {
76
- result = RubyProf.stop
77
- server.stop!
78
- Fiber.new {
79
- profile_klass.cleanup
80
- }
81
- printer = RubyProf::MultiPrinter.new(result)
82
- printer.print(:path => output_dir, :profile => name)
83
- EM.stop
84
- })
85
- end
86
-
87
- empty_db(:redis => redis)
88
- redis.quit
89
- end
90
-
91
- ### utility methods
92
-
93
- def load_config
94
- config_env, redis_options = Flapjack::Configuration.new.
95
- load(FLAPJACK_CONFIG)
96
- if config_env.nil? || config_env.empty?
97
- puts "No config data for environment '#{FLAPJACK_ENV}' " +
98
- "found in '#{FLAPJACK_CONFIG}'"
99
- exit(false)
100
- end
101
-
102
- return config_env, redis_options
103
- end
104
-
105
- def check_db_empty(options = {})
106
- redis = options[:redis]
107
- redis_options = options[:redis_options]
108
-
109
- # DBSIZE can return > 0 with expired keys -- but that's fine, we only
110
- # want to run against an explicitly empty DB. If this fails against the
111
- # intended Redis DB, the user can FLUSHDB it manually
112
- db_size = redis.dbsize.to_i
113
- if db_size > 0
114
- db = redis_options['db']
115
- puts "The Redis database has a non-zero DBSIZE (#{db_size}) -- "
116
- "profiling will destroy data. Use 'SELECT #{db}; FLUSHDB' in " +
117
- 'redis-cli if you want to profile using this database.'
118
- puts "[redis options] #{options[:redis].inspect}\nExiting..."
119
- exit(false)
120
- end
121
- end
122
-
123
- # this adds a default entity and contact, so that the profiling methods
124
- # will actually trigger enough code to be useful
125
- def setup_baseline_data(options = {})
126
- entity = {"id" => "2000",
127
- "name" => "clientx-app-01",
128
- "contacts" => ["1000"]}
129
-
130
- Flapjack::Data::Entity.add(entity, :redis => options[:redis])
131
-
132
- contact = {'id' => '1000',
133
- 'first_name' => 'John',
134
- 'last_name' => 'Smith',
135
- 'email' => 'jsmith@example.com',
136
- 'media' => {
137
- 'email' => 'jsmith@example.com'
138
- }}
139
-
140
- Flapjack::Data::Contact.add(contact, :redis => options[:redis])
141
- end
142
-
143
- def empty_db(options = {})
144
- redis = options[:redis]
145
- redis.flushdb
146
- end
147
-
148
- ## end utility methods
149
-
150
- desc "profile executive with rubyprof"
151
- task :executive do
152
-
153
- require 'flapjack/executive'
154
- require 'flapjack/data/event'
155
-
156
- FLAPJACK_ENV = ENV['FLAPJACK_ENV'] || 'profile'
157
- config_env, redis_options = load_config
158
- profile_pikelet(Flapjack::Executive, 'executive', config_env['executive'],
159
- redis_options) {
160
-
161
- # this executes in a separate thread, so no Fibery stuff is allowed
162
- redis = Redis.new(redis_options.merge(:driver => 'ruby'))
163
-
164
- REPETITIONS.times do |n|
165
- Flapjack::Data::Event.add({'entity' => 'clientx-app-01',
166
- 'check' => 'ping',
167
- 'type' => 'service',
168
- 'state' => (n ? 'ok' : 'critical'),
169
- 'summary' => 'testing'},
170
- :redis => redis)
171
- end
172
- redis.quit
173
- }
174
- end
175
-
176
- # NB: you'll need to access a real jabber server for this; if external events
177
- # come in from that then runs will not be comparable
178
- desc "profile jabber gateway with rubyprof"
179
- task :jabber do
180
-
181
- require 'flapjack/jabber'
182
- require 'flapjack/data/alert'
183
- require 'flapjack/data/contact'
184
- require 'flapjack/data/event'
185
- require 'flapjack/data/notification'
186
-
187
- FLAPJACK_ENV = ENV['FLAPJACK_ENV'] || 'profile'
188
- config_env, redis_options = load_config
189
- profile_pikelet(Flapjack::Gateways::Jabber, 'jabber', config_env['jabber_gateway'],
190
- redis_options) {
191
-
192
- # this executes in a separate thread, so no Fibery stuff is allowed
193
- redis = Redis.new(redis_options.merge(:driver => 'ruby'))
194
-
195
- event = Flapjack::Data::Event.new('type' => 'service',
196
- 'state' => 'critical',
197
- 'summary' => '100% packet loss',
198
- 'entity' => 'clientx-app-01',
199
- 'check' => 'ping')
200
- notification = Flapjack::Data::Notification.for_event(event)
201
-
202
- contact = Flapjack::Data::Contact.find_by_id('1000', :redis => redis)
203
-
204
- REPETITIONS.times do |n|
205
- notification.messages(:contacts => [contact]).each do |msg|
206
- contents = msg.contents
207
- contents['event_count'] = n
208
- Flapjack::Data::Alert.add(config_env['jabber_gateway']['queue'],
209
- contents)
210
- end
211
- end
212
-
213
- redis.quit
214
- }
215
- end
216
-
217
- # NB: you'll need an external email server set up for this (whether it's
218
- # mailtrap or a real server)
219
- desc "profile email notifier with rubyprof"
220
- task :email do
221
-
222
- require 'flapjack/email'
223
- require 'flapjack/data/alert'
224
- require 'flapjack/data/contact'
225
- require 'flapjack/data/event'
226
- require 'flapjack/data/notification'
227
-
228
- FLAPJACK_ENV = ENV['FLAPJACK_ENV'] || 'profile'
229
- config_env, redis_options = load_config
230
- profile_pikelet(Flapjack::Gateways::Email, 'jabber', config_env['jabber_gateway'],
231
- redis_options) {
232
-
233
- # this executes in a separate thread, so no Fibery stuff is allowed
234
- redis = Redis.new(redis_options.merge(:driver => 'ruby'))
235
-
236
- event = Flapjack::Data::Event.new('type' => 'service',
237
- 'state' => 'critical',
238
- 'summary' => '100% packet loss',
239
- 'entity' => 'clientx-app-01',
240
- 'check' => 'ping')
241
- notification = Flapjack::Data::Notification.for_event(event)
242
-
243
- contact = Flapjack::Data::Contact.find_by_id('1000', :redis => redis)
244
-
245
- REPETITIONS.times do |n|
246
- notification.messages(:contacts => [contact]).each do |msg|
247
- contents = msg.contents
248
- contents['event_count'] = n
249
- Flapjack::Data::Alert.add(config_env['email_gateway']['queue'],
250
- contents)
251
- end
252
- end
253
-
254
- redis.quit
255
- }
256
- end
257
-
258
- # Of course, if external requests come to this server then different runs will
259
- # not be comparable
260
- desc "profile web server with rubyprof"
261
- task :web do
262
-
263
- require 'net/http'
264
- require 'uri'
265
-
266
- require 'flapjack/web'
267
-
268
- FLAPJACK_ENV = ENV['FLAPJACK_ENV'] || 'profile'
269
- config_env, redis_options = load_config
270
- profile_thin(Flapjack::Web, 'web', config_env['web'], redis_options) {
271
- uri = URI.parse("http://127.0.0.1:#{FLAPJACK_PORT}/")
272
-
273
- http = Net::HTTP.new(uri.host, uri.port)
274
-
275
- REPETITIONS.times do |n|
276
- request = Net::HTTP::Get.new(uri.request_uri)
277
- response = http.request(request)
278
- end
279
- }
280
- end
281
-
282
- end
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'redis'
4
-
5
- if not id = ARGV.first then
6
- puts "Usage: acknowledge.rb <id>"
7
- exit 1
8
- end
9
-
10
-
11
- redis = Redis.new
12
-
13
- redis.hset 'acknowledged', id, 'true'
@@ -1,16 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
-
4
- require 'yaml'
5
-
6
- config = { 'sausage' => true,
7
- 'sauce' => 'tomato sauce',
8
- 'count' => 23,
9
- 'foobar' => 'jkfldjsk',
10
- 'zero_s' => '0',
11
- 'true_s' => 'true',
12
- }
13
-
14
-
15
- puts config.to_yaml
16
-