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,244 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'zermelo/records/redis'
4
+
5
+ require 'flapjack/data/extensions/short_name'
6
+ require 'flapjack/data/validators/id_validator'
7
+
8
+ require 'flapjack/data/extensions/associations'
9
+ require 'flapjack/gateways/jsonapi/data/join_descriptor'
10
+ require 'flapjack/gateways/jsonapi/data/method_descriptor'
11
+
12
+ module Flapjack
13
+ module Data
14
+ class ScheduledMaintenance
15
+ include Zermelo::Records::RedisSortedSet
16
+ include ActiveModel::Serializers::JSON
17
+ self.include_root_in_json = false
18
+ include Swagger::Blocks
19
+
20
+ include Flapjack::Data::Extensions::Associations
21
+ include Flapjack::Data::Extensions::ShortName
22
+
23
+ define_attributes :start_time => :timestamp,
24
+ :end_time => :timestamp,
25
+ :summary => :string
26
+
27
+ define_sort_attribute :start_time
28
+
29
+ belongs_to :check, :class_name => 'Flapjack::Data::Check',
30
+ :inverse_of => :scheduled_maintenances
31
+
32
+ def tag=(t)
33
+ raise "Scheduled maintenance not saved" unless persisted?
34
+ raise "Scheduled maintenance already associated" unless check.nil?
35
+
36
+ checks = t.checks
37
+
38
+ unless checks.empty?
39
+ tag_checks = checks.all
40
+ self.check = tag_checks.shift
41
+
42
+ tag_checks.each do |ch|
43
+ sm = Flapjack::Data::ScheduledMaintenance.new(:start_time => self.start_time,
44
+ :end_time => end_time, :summary => summary)
45
+ sm.save
46
+ sm.check = ch
47
+ end
48
+ end
49
+ end
50
+
51
+ range_index_by :start_time, :end_time
52
+
53
+ validates :start_time, :presence => true
54
+ validates :end_time, :presence => true
55
+
56
+ validate :positive_duration
57
+ def positive_duration
58
+ return if self.start_time.nil? || self.end_time.nil? ||
59
+ (self.start_time < self.end_time)
60
+ errors.add(:end_time, "must be greater than start time")
61
+ end
62
+
63
+ # # FIXME discuss whether we should let people change history
64
+ # # I'm in favour of leaving things as flexible as possible (@ali-graham)
65
+ # validate :times_in_future_if_changed, :on => :update
66
+ # def times_in_future_if_changed
67
+ # t = Time.now.to_i
68
+ # [:start_time, :end_time].each do |tf|
69
+ # if self.send("#{tf}_changed?".to_sym)
70
+ # tv = self.send(tf)
71
+ # if !tv.nil? && (tv < t)
72
+ # errors.add(tf, "cannot be changed to a time in the past")
73
+ # end
74
+ # end
75
+ # end
76
+ # end
77
+
78
+ validates_with Flapjack::Data::Validators::IdValidator
79
+
80
+ # # FIXME discuss whether we should let people change history
81
+ # # I'm in favour of leaving things as flexible as possible (@ali-graham)
82
+ # before_destroy :only_destroy_future
83
+ # def only_destroy_future
84
+ # (self.start_time.to_i - Time.now.to_i) > 0
85
+ # end
86
+
87
+ def duration
88
+ self.end_time - self.start_time
89
+ end
90
+
91
+ swagger_schema :ScheduledMaintenance do
92
+ key :required, [:id, :type, :start_time, :end_time]
93
+ property :id do
94
+ key :type, :string
95
+ key :format, :uuid
96
+ end
97
+ property :type do
98
+ key :type, :string
99
+ key :enum, [Flapjack::Data::ScheduledMaintenance.short_model_name.singular]
100
+ end
101
+ property :start_time do
102
+ key :type, :string
103
+ key :format, :"date-time"
104
+ end
105
+ property :end_time do
106
+ key :type, :string
107
+ key :format, :"date-time"
108
+ end
109
+ property :relationships do
110
+ key :"$ref", :ScheduledMaintenanceLinks
111
+ end
112
+ end
113
+
114
+ swagger_schema :ScheduledMaintenanceLinks do
115
+ key :required, [:check]
116
+ property :check do
117
+ key :"$ref", :CheckLinkage
118
+ end
119
+ end
120
+
121
+ swagger_schema :ScheduledMaintenanceCreate do
122
+ key :required, [:type, :start_time, :end_time]
123
+ property :id do
124
+ key :type, :string
125
+ key :format, :uuid
126
+ end
127
+ property :type do
128
+ key :type, :string
129
+ key :enum, [Flapjack::Data::ScheduledMaintenance.short_model_name.singular]
130
+ end
131
+ property :start_time do
132
+ key :type, :string
133
+ key :format, :"date-time"
134
+ end
135
+ property :end_time do
136
+ key :type, :string
137
+ key :format, :"date-time"
138
+ end
139
+ property :relationships do
140
+ key :"$ref", :ScheduledMaintenanceCreateLinks
141
+ end
142
+ end
143
+
144
+ swagger_schema :ScheduledMaintenanceCreateLinks do
145
+ key :required, [:check]
146
+ property :check do
147
+ key :"$ref", :data_CheckReference
148
+ end
149
+ end
150
+
151
+ swagger_schema :ScheduledMaintenanceUpdate do
152
+ key :required, [:id, :type, :start_time, :end_time]
153
+ property :id do
154
+ key :type, :string
155
+ key :format, :uuid
156
+ end
157
+ property :type do
158
+ key :type, :string
159
+ key :enum, [Flapjack::Data::ScheduledMaintenance.short_model_name.singular]
160
+ end
161
+ property :start_time do
162
+ key :type, :string
163
+ key :format, :"date-time"
164
+ end
165
+ property :end_time do
166
+ key :type, :string
167
+ key :format, :"date-time"
168
+ end
169
+ end
170
+
171
+ def self.swagger_included_classes
172
+ # hack -- hardcoding for now
173
+ [
174
+ Flapjack::Data::Check,
175
+ Flapjack::Data::Contact,
176
+ Flapjack::Data::Medium,
177
+ Flapjack::Data::Rule,
178
+ Flapjack::Data::ScheduledMaintenance,
179
+ Flapjack::Data::State,
180
+ Flapjack::Data::Tag,
181
+ Flapjack::Data::UnscheduledMaintenance
182
+ ]
183
+ end
184
+
185
+ def self.jsonapi_methods
186
+ @jsonapi_methods ||= {
187
+ :post => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
188
+ :attributes => [:start_time, :end_time, :summary],
189
+ :descriptions => {
190
+ :singular => "Create a scheduled maintenance period for a check, or checks associated with a tag.",
191
+ :multiple => "Create scheduled maintenance periods for a check, or checks associated with a tag."
192
+ }
193
+ ),
194
+ :get => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
195
+ :attributes => [:start_time, :end_time, :summary],
196
+ :descriptions => {
197
+ :singular => "Get data for a scheduled maintenance period.",
198
+ :multiple => "Get data for multiple scheduled maintenance periods."
199
+ }
200
+ ),
201
+ :patch => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
202
+ :attributes => [:start_time, :end_time, :summary],
203
+ :descriptions => {
204
+ :singular => "Update data for a scheduled maintenance period.",
205
+ :multiple => "Update data for scheduled maintenance periods.",
206
+ }
207
+ ),
208
+ :delete => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
209
+ :descriptions => {
210
+ :singular => "Delete a scheduled maintenance period.",
211
+ :multiple => "Delete scheduled maintenance periods."
212
+ }
213
+ )
214
+ }
215
+ end
216
+
217
+ def self.jsonapi_associations
218
+ unless instance_variable_defined?('@jsonapi_associations')
219
+ @jsonapi_associations = {
220
+ :check => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
221
+ :post => true, :get => true,
222
+ :number => :singular, :link => true, :includable => true,
223
+ :descriptions => {
224
+ :post => "Set a check for scheduled maintenance on creation.",
225
+ :get => "Returns the check a scheduled maintenance period applies to."
226
+ }
227
+ ),
228
+ :tag => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
229
+ :post => true,
230
+ :number => :singular, :link => false, :includable => false,
231
+ :type => 'tag',
232
+ :klass => Flapjack::Data::Tag,
233
+ :descriptions => {
234
+ :post => "Set scheduled maintenance on multiple checks on creation."
235
+ }
236
+ )
237
+ }
238
+ populate_association_data(@jsonapi_associations)
239
+ end
240
+ @jsonapi_associations
241
+ end
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,221 @@
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/condition'
11
+
12
+ require 'flapjack/data/extensions/associations'
13
+ require 'flapjack/gateways/jsonapi/data/join_descriptor'
14
+ require 'flapjack/gateways/jsonapi/data/method_descriptor'
15
+
16
+ module Flapjack
17
+ module Data
18
+ class State
19
+
20
+ include Zermelo::Records::RedisSortedSet
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 :created_at => :timestamp,
29
+ :updated_at => :timestamp,
30
+ :condition => :string,
31
+ :action => :string,
32
+ :summary => :string,
33
+ :details => :string,
34
+ :perfdata_json => :string
35
+
36
+ define_sort_attribute :created_at
37
+
38
+ index_by :condition, :action
39
+ range_index_by :created_at
40
+
41
+ # public
42
+ belongs_to :check, :class_name => 'Flapjack::Data::Check',
43
+ :inverse_of => :states
44
+
45
+ # private
46
+
47
+ # these 'Check' values will be the same as the above, but zermelo
48
+ # requires that the inverse of the association be stored as well
49
+ belongs_to :current_check, :class_name => 'Flapjack::Data::Check',
50
+ :inverse_of => :current_state
51
+
52
+ belongs_to :latest_notifications_check, :class_name => 'Flapjack::Data::Check',
53
+ :inverse_of => :latest_notifications
54
+
55
+ belongs_to :most_severe_check, :class_name => 'Flapjack::Data::Check',
56
+ :inverse_of => :most_severe
57
+
58
+ belongs_to :notification, :class_name => 'Flapjack::Data::Notification',
59
+ :inverse_of => :state
60
+
61
+ has_many :latest_media, :class_name => 'Flapjack::Data::Medium',
62
+ :inverse_of => :last_state
63
+
64
+ validates :created_at, :presence => true
65
+ validates :updated_at, :presence => true
66
+
67
+ # condition should only be blank if no previous entry with condition for check
68
+ validates :condition, :allow_blank => true,
69
+ :inclusion => { :in => Flapjack::Data::Condition.healthy.keys +
70
+ Flapjack::Data::Condition.unhealthy.keys }
71
+
72
+ ACTIONS = %w(acknowledgement test_notifications)
73
+ validates :action, :allow_nil => true,
74
+ :format => {:with => /\A(?:acknowledgement|test_notifications(\s+#{Flapjack::Data::Condition.unhealthy.keys.join('|')})?)\z/,
75
+ :message => 'must either be an acknowledgement or a notification test'}
76
+
77
+ # TODO handle JSON exception
78
+ def perfdata
79
+ if self.perfdata_json.nil?
80
+ @perfdata = nil
81
+ return
82
+ end
83
+ @perfdata ||= Flapjack.load_json(self.perfdata_json)
84
+ end
85
+
86
+ # example perfdata: time=0.486630s;;;0.000000 size=909B;;;0
87
+ def perfdata=(data)
88
+ if data.nil?
89
+ self.perfdata_json = nil
90
+ return
91
+ end
92
+
93
+ data = data.strip
94
+ if data.length == 0
95
+ self.perfdata_json = nil
96
+ return
97
+ end
98
+ # Could maybe be replaced by a fancy regex
99
+ @perfdata = data.split(' ').inject([]) do |item|
100
+ parts = item.split('=')
101
+ memo << {"key" => parts[0].to_s,
102
+ "value" => parts[1].nil? ? '' : parts[1].split(';')[0].to_s}
103
+ memo
104
+ end
105
+ self.perfdata_json = @perfdata.nil? ? nil : Flapjack.dump_json(@perfdata)
106
+ end
107
+
108
+ def self.swagger_included_classes
109
+ # hack -- hardcoding for now
110
+ [
111
+ Flapjack::Data::Check,
112
+ Flapjack::Data::Contact,
113
+ Flapjack::Data::Medium,
114
+ Flapjack::Data::Rule,
115
+ Flapjack::Data::ScheduledMaintenance,
116
+ Flapjack::Data::State,
117
+ Flapjack::Data::Tag,
118
+ Flapjack::Data::UnscheduledMaintenance
119
+ ]
120
+ end
121
+
122
+ swagger_schema :State do
123
+ key :required, [:id, :created_at, :updated_at, :condition, :action,
124
+ :summary, :details, :perfdata]
125
+ property :id do
126
+ key :type, :string
127
+ key :format, :uuid
128
+ end
129
+ property :type do
130
+ key :type, :string
131
+ key :enum, [Flapjack::Data::State.short_model_name.singular]
132
+ end
133
+ property :created_at do
134
+ key :type, :string
135
+ key :format, :"date-time"
136
+ end
137
+ property :updated_at do
138
+ key :type, :string
139
+ key :format, :"date-time"
140
+ end
141
+ property :condition do
142
+ key :type, :string
143
+ key :enum, Flapjack::Data::Condition.healthy.keys +
144
+ Flapjack::Data::Condition.unhealthy.keys
145
+ end
146
+ property :action do
147
+ key :type, :string
148
+ key :enum, Flapjack::Data::State::ACTIONS
149
+ end
150
+ property :summary do
151
+ key :type, :string
152
+ end
153
+ property :details do
154
+ key :type, :string
155
+ end
156
+ property :perfdata do
157
+ key :type, :string
158
+ end
159
+ property :relationships do
160
+ key :"$ref", :StateLinks
161
+ end
162
+ end
163
+
164
+ swagger_schema :StateLinks do
165
+ key :required, [:check]
166
+ property :check do
167
+ key :"$ref", :CheckLinkage
168
+ end
169
+ end
170
+
171
+ def self.jsonapi_methods
172
+ @jsonapi_methods ||= {
173
+ :get => Flapjack::Gateways::JSONAPI::Data::MethodDescriptor.new(
174
+ :attributes => [:created_at, :updated_at, :condition, :action,
175
+ :summary, :details, :perfdata],
176
+ :descriptions => {
177
+ :singular => "Get data for a single check state record.",
178
+ :multiple => "Get data for check state records."
179
+ }
180
+ )
181
+ }
182
+ end
183
+
184
+ def self.jsonapi_associations
185
+ unless instance_variable_defined?('@jsonapi_associations')
186
+ @jsonapi_associations = {
187
+ :check => Flapjack::Gateways::JSONAPI::Data::JoinDescriptor.new(
188
+ :get => true,
189
+ :number => :singular, :link => true, :includable => true,
190
+ :descriptions => {
191
+ :get => "Returns the check the state data describes."
192
+ }
193
+ )
194
+ }
195
+ populate_association_data(@jsonapi_associations)
196
+ end
197
+ @jsonapi_associations
198
+ end
199
+
200
+ before_destroy :is_unlinked
201
+
202
+ def is_unlinked
203
+ Flapjack.logger.debug "checking deletion of #{self.instance_variable_get('@attributes').inspect}"
204
+ Flapjack.logger.debug "check #{self.check.nil?}"
205
+ Flapjack.logger.debug "latest_notifications_check nil #{self.latest_notifications_check.nil?}"
206
+ Flapjack.logger.debug "most_severe_check nil #{self.most_severe_check.nil?}"
207
+ Flapjack.logger.debug "notification nil #{self.notification.nil?}"
208
+ Flapjack.logger.debug "latest media empty #{self.latest_media.empty?}"
209
+
210
+ return false unless self.check.nil? &&
211
+ self.latest_notifications_check.nil? && self.most_severe_check.nil? &&
212
+ self.notification.nil? && self.latest_media.empty?
213
+
214
+ Flapjack.logger.debug "deleting"
215
+
216
+ true
217
+ end
218
+ end
219
+ end
220
+ end
221
+