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,112 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'swagger/blocks'
4
+
5
+ require 'zermelo/records/redis'
6
+
7
+ require 'flapjack/data/extensions/associations'
8
+ require 'flapjack/data/extensions/short_name'
9
+ require 'flapjack/data/validators/id_validator'
10
+
11
+ require 'flapjack/gateways/jsonapi/data/method_descriptor'
12
+
13
+ module Flapjack
14
+ module Data
15
+ class Statistic
16
+
17
+ # FIXME: add an administrative function to reset global or
18
+ # instance Statistic objects
19
+
20
+ include Zermelo::Records::RedisSet
21
+ include ActiveModel::Serializers::JSON
22
+ self.include_root_in_json = false
23
+ include Swagger::Blocks
24
+
25
+ include Flapjack::Data::Extensions::Associations
26
+ include Flapjack::Data::Extensions::ShortName
27
+
28
+ define_attributes :instance_name => :string,
29
+ :created_at => :timestamp,
30
+ :all_events => :integer,
31
+ :ok_events => :integer,
32
+ :failure_events => :integer,
33
+ :action_events => :integer,
34
+ :invalid_events => :integer
35
+
36
+ index_by :instance_name
37
+
38
+ validates :instance_name, :presence => true
39
+ validates :created_at, :presence => true
40
+
41
+ [:all_events, :ok_events, :failure_events, :action_events,
42
+ :invalid_events].each do |evt|
43
+
44
+ validates evt, :presence => true,
45
+ :numericality => {:greater_than_or_equal_to => 0, :only_integer => true}
46
+ end
47
+
48
+ swagger_schema :Statistic do
49
+ key :required, [:id, :type, :instance_name, :created_at, :all_events,
50
+ :ok_events, :failure_events, :action_events]
51
+ property :id do
52
+ key :type, :string
53
+ key :format, :uuid
54
+ end
55
+ property :type do
56
+ key :type, :string
57
+ key :enum, [Flapjack::Data::Statistic.short_model_name.singular]
58
+ end
59
+ property :instance_name do
60
+ key :type, :string
61
+ end
62
+ property :created_at do
63
+ key :type, :string
64
+ key :format, :'date-time'
65
+ end
66
+ property :all_events do
67
+ key :type, :integer
68
+ key :minimum, 0
69
+ end
70
+ property :ok_events do
71
+ key :type, :integer
72
+ key :minimum, 0
73
+ end
74
+ property :failure_events do
75
+ key :type, :integer
76
+ key :minimum, 0
77
+ end
78
+ property :action_events do
79
+ key :type, :integer
80
+ key :minimum, 0
81
+ end
82
+ property :invalid_events do
83
+ key :type, :integer
84
+ key :minimum, 0
85
+ end
86
+ end
87
+
88
+ def self.swagger_included_classes
89
+ # hack -- hardcoding for now
90
+ []
91
+ end
92
+
93
+ def self.jsonapi_methods
94
+ @jsonapi_methods ||= {
95
+ :get => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
96
+ :attributes => [:instance_name, :created_at, :all_events,
97
+ :ok_events, :failure_events, :action_events,
98
+ :invalid_events],
99
+ :descriptions => {
100
+ :multiple => "Returns global or per-instance event statistics.",
101
+ :singular => "Returns a single event statistics data object."
102
+ }
103
+ )
104
+ }
105
+ end
106
+
107
+ def self.jsonapi_associations
108
+ @jsonapi_associations ||= {}
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,277 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'swagger/blocks'
4
+
5
+ require 'zermelo/records/redis'
6
+
7
+ require 'flapjack/data/extensions/short_name'
8
+ require 'flapjack/data/validators/id_validator'
9
+
10
+ require 'flapjack/data/extensions/associations'
11
+ require 'flapjack/gateways/jsonapi/data/join_descriptor'
12
+ require 'flapjack/gateways/jsonapi/data/method_descriptor'
13
+
14
+ module Flapjack
15
+ module Data
16
+ class Tag
17
+
18
+ include Zermelo::Records::RedisSet
19
+ include ActiveModel::Serializers::JSON
20
+ self.include_root_in_json = false
21
+ include Swagger::Blocks
22
+
23
+ include Flapjack::Data::Extensions::Associations
24
+ include Flapjack::Data::Extensions::ShortName
25
+
26
+ define_attributes :name => :string
27
+
28
+ has_and_belongs_to_many :checks,
29
+ :class_name => 'Flapjack::Data::Check', :inverse_of => :tags
30
+
31
+ has_and_belongs_to_many :contacts,
32
+ :class_name => 'Flapjack::Data::Contact', :inverse_of => :tags
33
+
34
+ has_and_belongs_to_many :rules,
35
+ :class_name => 'Flapjack::Data::Rule', :inverse_of => :tags
36
+
37
+ unique_index_by :name
38
+
39
+ validates_with Flapjack::Data::Validators::IdValidator
40
+
41
+ validates :name, :presence => true,
42
+ :format => /\A[a-z0-9\-_\.\|]+\z/i
43
+
44
+ def scheduled_maintenances
45
+ sm_assocs = self.checks.associations_for(:scheduled_maintenances).
46
+ values
47
+
48
+ Flapjack::Data::ScheduledMaintenance.intersect(:id => sm_assocs)
49
+ end
50
+
51
+ def states
52
+ st_assocs = self.checks.associations_for(:states).
53
+ values
54
+
55
+ Flapjack::Data::State.intersect(:id => st_assocs)
56
+ end
57
+
58
+ def unscheduled_maintenances
59
+ usm_assocs = self.checks.associations_for(:unscheduled_maintenances).
60
+ values
61
+
62
+ Flapjack::Data::UnscheduledMaintenance.intersect(:id => usm_assocs)
63
+ end
64
+
65
+ swagger_schema :Tag do
66
+ key :required, [:id, :type, :name]
67
+ property :id do
68
+ key :type, :string
69
+ end
70
+ property :type do
71
+ key :type, :string
72
+ key :enum, [Flapjack::Data::Tag.short_model_name.singular]
73
+ end
74
+ property :name do
75
+ key :type, :string
76
+ end
77
+ property :relationships do
78
+ key :"$ref", :TagLinks
79
+ end
80
+ end
81
+
82
+ swagger_schema :TagLinks do
83
+ property :checks do
84
+ key :"$ref", :ChecksLinkage
85
+ end
86
+ property :contacts do
87
+ key :"$ref", :ContactsLinkage
88
+ end
89
+ property :rules do
90
+ key :"$ref", :RulesLinkage
91
+ end
92
+ property :scheduled_maintenances do
93
+ key :"$ref", :ScheduledMaintenancesLinkage
94
+ end
95
+ property :states do
96
+ key :"$ref", :StatesLinkage
97
+ end
98
+ property :unscheduled_maintenances do
99
+ key :"$ref", :UnscheduledMaintenancesLinkage
100
+ end
101
+ end
102
+
103
+ swagger_schema :TagCreate do
104
+ key :required, [:type, :name]
105
+ property :type do
106
+ key :type, :string
107
+ key :enum, [Flapjack::Data::Tag.short_model_name.singular]
108
+ end
109
+ property :name do
110
+ key :type, :string
111
+ end
112
+ property :relationships do
113
+ key :"$ref", :TagCreateLinks
114
+ end
115
+ end
116
+
117
+ swagger_schema :TagCreateLinks do
118
+ property :checks do
119
+ key :"$ref", :data_ChecksReference
120
+ end
121
+ property :contacts do
122
+ key :"$ref", :data_ContactsReference
123
+ end
124
+ property :rules do
125
+ key :"$ref", :data_RulesReference
126
+ end
127
+ end
128
+
129
+ swagger_schema :TagUpdate do
130
+ key :required, [:id, :type]
131
+ property :id do
132
+ key :type, :string
133
+ key :format, :uuid
134
+ end
135
+ property :type do
136
+ key :type, :string
137
+ key :enum, [Flapjack::Data::Tag.short_model_name.singular]
138
+ end
139
+ property :name do
140
+ key :type, :string
141
+ end
142
+ property :relationships do
143
+ key :"$ref", :TagUpdateLinks
144
+ end
145
+ end
146
+
147
+ swagger_schema :TagUpdateLinks do
148
+ property :checks do
149
+ key :"$ref", :data_ChecksReference
150
+ end
151
+ property :contacts do
152
+ key :"$ref", :data_ContactsReference
153
+ end
154
+ property :rules do
155
+ key :"$ref", :data_RulesReference
156
+ end
157
+ end
158
+
159
+ def self.swagger_included_classes
160
+ # hack -- hardcoding for now
161
+ [
162
+ Flapjack::Data::Check,
163
+ Flapjack::Data::Contact,
164
+ Flapjack::Data::Medium,
165
+ Flapjack::Data::Rule,
166
+ Flapjack::Data::ScheduledMaintenance,
167
+ Flapjack::Data::State,
168
+ Flapjack::Data::Tag,
169
+ Flapjack::Data::UnscheduledMaintenance
170
+ ]
171
+ end
172
+
173
+ def self.jsonapi_methods
174
+ @jsonapi_methods ||= {
175
+ :post => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
176
+ :attributes => [:name],
177
+ :descriptions => {
178
+ :singular => "Create a tag.",
179
+ :multiple => "Create tags."
180
+ }
181
+ ),
182
+ :get => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
183
+ :attributes => [:name],
184
+ :descriptions => {
185
+ :singular => "Returns data for a tag.",
186
+ :multiple => "Returns data for tags."
187
+ }
188
+ ),
189
+ :patch => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
190
+ :attributes => [:name],
191
+ :descriptions => {
192
+ :singular => "Update a tag.",
193
+ :multiple => "Update tags."
194
+ }
195
+ ),
196
+ :delete => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
197
+ :descriptions => {
198
+ :singular => "Delete a tag.",
199
+ :multiple => "Delete tags."
200
+ }
201
+ )
202
+ }
203
+ end
204
+
205
+ def self.jsonapi_associations
206
+ unless instance_variable_defined?('@jsonapi_associations')
207
+ @jsonapi_associations = {
208
+ :checks => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
209
+ :post => true, :get => true, :patch => true, :delete => true,
210
+ :number => :multiple, :link => true, :includable => true,
211
+ :descriptions => {
212
+ :post => "Associate checks with this tag.",
213
+ :get => "Returns all checks linked to this tag.",
214
+ :patch => "Update the checks associated with this tag.",
215
+ :delete => "Delete associations between checks and this tag."
216
+ }
217
+ ),
218
+ :contacts => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
219
+ :post => true, :get => true, :patch => true, :delete => true,
220
+ :number => :multiple, :link => true, :includable => true,
221
+ :descriptions => {
222
+ :post => "Associate contacts with this tag.",
223
+ :get => "Returns all contacts linked to this tag.",
224
+ :patch => "Update the contacts associated with this tag.",
225
+ :delete => "Delete associations between contacts and this tag."
226
+ }
227
+ ),
228
+ :rules => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
229
+ :post => true, :get => true, :patch => true, :delete => true,
230
+ :number => :multiple, :link => true, :includable => true,
231
+ :descriptions => {
232
+ :post => "Associate rules with this tag.",
233
+ :get => "Returns all rules linked to this tag.",
234
+ :patch => "Update the rules associated with this tag.",
235
+ :delete => "Delete associations between rules and this tag."
236
+ }
237
+ ),
238
+ :scheduled_maintenances => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
239
+ :get => true,
240
+ :number => :multiple, :link => true, :includable => false,
241
+ :type => 'scheduled_maintenance',
242
+ :klass => Flapjack::Data::ScheduledMaintenance,
243
+ :descriptions => {
244
+ :get => "Returns all scheduled maintenance periods for " \
245
+ "checks linked to this tag; default sort order is " \
246
+ "newest first."
247
+ }
248
+ ),
249
+ :states => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
250
+ :get => true,
251
+ :number => :multiple, :link => true, :includable => false,
252
+ :type => 'state',
253
+ :klass => Flapjack::Data::State,
254
+ :descriptions => {
255
+ :get => "Returns all state records for all checks linked to " \
256
+ "this tag; default sort order is newest first."
257
+ }
258
+ ),
259
+ :unscheduled_maintenances => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
260
+ :get => true,
261
+ :number => :multiple, :link => true, :includable => false,
262
+ :type => 'unscheduled_maintenance',
263
+ :klass => Flapjack::Data::UnscheduledMaintenance,
264
+ :descriptions => {
265
+ :get => "Returns all unscheduled maintenance periods for " \
266
+ "checks linked to this tag; default sort order is " \
267
+ "newest first."
268
+ }
269
+ )
270
+ }
271
+ populate_association_data(@jsonapi_associations)
272
+ end
273
+ @jsonapi_associations
274
+ end
275
+ end
276
+ end
277
+ end
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'active_model'
4
+ require 'swagger/blocks'
5
+
6
+ require 'zermelo/records/stub'
7
+
8
+ require 'flapjack/data/extensions/associations'
9
+ require 'flapjack/data/extensions/short_name'
10
+
11
+ require 'flapjack/data/event'
12
+
13
+ module Flapjack
14
+ module Data
15
+ class TestNotification
16
+
17
+ include Swagger::Blocks
18
+
19
+ include Zermelo::Records::Stub
20
+ include ActiveModel::Serializers::JSON
21
+ self.include_root_in_json = false
22
+
23
+ include Flapjack::Data::Extensions::Associations
24
+ include Flapjack::Data::Extensions::ShortName
25
+
26
+ define_attributes :condition => :string,
27
+ :summary => :string
28
+
29
+ attr_accessor :queue
30
+
31
+ validates :condition, :allow_nil => true,
32
+ :inclusion => { :in => Flapjack::Data::Condition.unhealthy.keys }
33
+
34
+ def save!
35
+ @id ||= SecureRandom.uuid
36
+ @saved = true
37
+ end
38
+
39
+ def persisted?
40
+ !@id.nil? && @saved.is_a?(TrueClass)
41
+ end
42
+
43
+ def check=(c)
44
+ raise "Test notification not saved" unless persisted?
45
+ raise "Test notification queue not set" if @queue.nil? || @queue.empty?
46
+ raise "Test notification already sent" if @sent
47
+
48
+ Flapjack::Data::Event.test_notifications(
49
+ @queue, [c], :condition => self.condition, :summary => self.summary
50
+ )
51
+
52
+ @sent = true
53
+ end
54
+
55
+ def tag=(t)
56
+ raise "Test notification not saved" unless persisted?
57
+ raise "Test notification queue not set" if @queue.nil? || @queue.empty?
58
+ raise "Test notification already sent" if @sent
59
+
60
+ checks = t.checks
61
+
62
+ unless checks.empty?
63
+ Flapjack::Data::Event.test_notifications(
64
+ @queue, checks.all, :condition => self.condition,
65
+ :summary => self.summary
66
+ )
67
+ end
68
+
69
+ @sent = true
70
+ end
71
+
72
+ swagger_schema :TestNotification do
73
+ key :required, [:id, :type]
74
+ property :id do
75
+ key :type, :string
76
+ key :format, :uuid
77
+ end
78
+ property :type do
79
+ key :type, :string
80
+ key :enum, [Flapjack::Data::TestNotification.short_model_name.singular]
81
+ end
82
+ property :condition do
83
+ key :type, :string
84
+ key :enum, Flapjack::Data::Condition.unhealthy.keys
85
+ end
86
+ property :summary do
87
+ key :type, :string
88
+ end
89
+ property :relationships do
90
+ key :"$ref", :TestNotificationLinks
91
+ end
92
+ end
93
+
94
+ swagger_schema :TestNotificationLinks do
95
+ # create (and response) can only have one of these set
96
+ property :check do
97
+ key :"$ref", :CheckLinkage
98
+ end
99
+ property :tag do
100
+ key :"$ref", :TagLinkage
101
+ end
102
+ end
103
+
104
+ swagger_schema :TestNotificationCreate do
105
+ key :required, [:type, :summary]
106
+ property :id do
107
+ key :type, :string
108
+ key :format, :uuid
109
+ end
110
+ property :type do
111
+ key :type, :string
112
+ key :enum, [Flapjack::Data::TestNotification.short_model_name.singular]
113
+ end
114
+ property :condition do
115
+ key :type, :string
116
+ key :enum, Flapjack::Data::Condition.unhealthy.keys
117
+ end
118
+ property :summary do
119
+ key :type, :string
120
+ end
121
+ property :relationships do
122
+ key :"$ref", :TestNotificationCreateLinks
123
+ end
124
+ end
125
+
126
+ swagger_schema :TestNotificationCreateLinks do
127
+ # create (and response) can only have one of these set
128
+ property :check do
129
+ key :"$ref", :data_CheckReference
130
+ end
131
+ property :tag do
132
+ key :"$ref", :data_TagReference
133
+ end
134
+ end
135
+
136
+ def self.swagger_included_classes
137
+ # hack -- hardcoding for now
138
+ []
139
+ end
140
+
141
+ def self.jsonapi_methods
142
+ @jsonapi_methods ||= {
143
+ :post => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
144
+ :attributes => [:condition, :summary],
145
+ :descriptions => {
146
+ :singular => "Create a simulated event for a check, or checks linked to a tag.",
147
+ :multiple => "Create simulated events for a check, or checks linked to a tag.",
148
+ }
149
+
150
+ )
151
+ }
152
+ end
153
+
154
+ def self.jsonapi_associations
155
+ unless instance_variable_defined?('@jsonapi_associations')
156
+ @jsonapi_associations = {
157
+ :check => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
158
+ :post => true,
159
+ :number => :singular, :link => false, :includable => false,
160
+ :type => 'check',
161
+ :klass => Flapjack::Data::Check,
162
+ :descriptions => {
163
+ :post => "Creates a simulated event for this check."
164
+ }
165
+ ),
166
+ :tag => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
167
+ :post => true,
168
+ :number => :singular, :link => false, :includable => false,
169
+ :type => 'tag',
170
+ :klass => Flapjack::Data::Tag,
171
+ :descriptions => {
172
+ :post => "Creates a simulated event for all checks associated with this tag."
173
+ }
174
+ )
175
+ }
176
+ populate_association_data(@jsonapi_associations)
177
+ end
178
+ @jsonapi_associations
179
+ end
180
+ end
181
+ end
182
+ end