kuroko2 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (338) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +15 -0
  4. data/Rakefile +26 -0
  5. data/app/assets/images/kuroko2/avatar.png +0 -0
  6. data/app/assets/images/kuroko2/kuroko-logo-horizontal.png +0 -0
  7. data/app/assets/javascripts/kuroko2/application.js +28 -0
  8. data/app/assets/javascripts/kuroko2/bootstrap.js +2363 -0
  9. data/app/assets/javascripts/kuroko2/definition_linker.js +20 -0
  10. data/app/assets/javascripts/kuroko2/instance_linker.js +10 -0
  11. data/app/assets/javascripts/kuroko2/job_definition_stats.js +67 -0
  12. data/app/assets/javascripts/kuroko2/job_definitions.js +79 -0
  13. data/app/assets/javascripts/kuroko2/job_instances.js +88 -0
  14. data/app/assets/javascripts/kuroko2/job_timelines.js.coffee +24 -0
  15. data/app/assets/javascripts/kuroko2/narrow_job_definitions.js +30 -0
  16. data/app/assets/stylesheets/kuroko2/admin-lte.css +3402 -0
  17. data/app/assets/stylesheets/kuroko2/application.scss +86 -0
  18. data/app/assets/stylesheets/kuroko2/bootstrap.css +6799 -0
  19. data/app/assets/stylesheets/kuroko2/fonts.scss +1 -0
  20. data/app/assets/stylesheets/kuroko2/job_definitions.scss +19 -0
  21. data/app/assets/stylesheets/kuroko2/users.scss +7 -0
  22. data/app/controllers/kuroko2/api/application_controller.rb +49 -0
  23. data/app/controllers/kuroko2/api/job_instances_controller.rb +46 -0
  24. data/app/controllers/kuroko2/api/stats_controller.rb +28 -0
  25. data/app/controllers/kuroko2/application_controller.rb +43 -0
  26. data/app/controllers/kuroko2/dashboard_controller.rb +27 -0
  27. data/app/controllers/kuroko2/execution_logs_controller.rb +19 -0
  28. data/app/controllers/kuroko2/executions_controller.rb +28 -0
  29. data/app/controllers/kuroko2/job_definition_stats_controller.rb +54 -0
  30. data/app/controllers/kuroko2/job_definitions_controller.rb +100 -0
  31. data/app/controllers/kuroko2/job_instances_controller.rb +87 -0
  32. data/app/controllers/kuroko2/job_schedules_controller.rb +39 -0
  33. data/app/controllers/kuroko2/job_suspend_schedules_controller.rb +38 -0
  34. data/app/controllers/kuroko2/job_timelines_controller.rb +56 -0
  35. data/app/controllers/kuroko2/logs_controller.rb +15 -0
  36. data/app/controllers/kuroko2/sessions_controller.rb +32 -0
  37. data/app/controllers/kuroko2/stars_controller.rb +30 -0
  38. data/app/controllers/kuroko2/tokens_controller.rb +47 -0
  39. data/app/controllers/kuroko2/users_controller.rb +62 -0
  40. data/app/controllers/kuroko2/workers_controller.rb +5 -0
  41. data/app/errors/http/bad_request.rb +4 -0
  42. data/app/errors/http/forbidden.rb +4 -0
  43. data/app/errors/http/unauthorized.rb +4 -0
  44. data/app/helpers/kuroko2/application_helper.rb +8 -0
  45. data/app/helpers/kuroko2/dashboard_helper.rb +4 -0
  46. data/app/helpers/kuroko2/executions_helper.rb +4 -0
  47. data/app/helpers/kuroko2/job_definitions_helper.rb +38 -0
  48. data/app/helpers/kuroko2/job_instances_helper.rb +71 -0
  49. data/app/helpers/kuroko2/job_schedules_helper.rb +4 -0
  50. data/app/helpers/kuroko2/logs_helper.rb +4 -0
  51. data/app/helpers/kuroko2/sessions_helper.rb +4 -0
  52. data/app/helpers/kuroko2/stars_helper.rb +4 -0
  53. data/app/helpers/kuroko2/tokens_helper.rb +4 -0
  54. data/app/helpers/kuroko2/users_helper.rb +4 -0
  55. data/app/helpers/kuroko2/workers_helper.rb +4 -0
  56. data/app/jobs/kuroko2/application_job.rb +4 -0
  57. data/app/mailers/kuroko2/application_mailer.rb +6 -0
  58. data/app/mailers/kuroko2/notifications.rb +63 -0
  59. data/app/models/concerns/kuroko2/table_name_customizable.rb +16 -0
  60. data/app/models/kuroko2/admin_assignment.rb +6 -0
  61. data/app/models/kuroko2/api/application_resource.rb +10 -0
  62. data/app/models/kuroko2/api/job_instance_resource.rb +7 -0
  63. data/app/models/kuroko2/application_record.rb +5 -0
  64. data/app/models/kuroko2/execution.rb +55 -0
  65. data/app/models/kuroko2/job_definition.rb +147 -0
  66. data/app/models/kuroko2/job_definition_tag.rb +6 -0
  67. data/app/models/kuroko2/job_instance.rb +118 -0
  68. data/app/models/kuroko2/job_schedule.rb +93 -0
  69. data/app/models/kuroko2/job_suspend_schedule.rb +35 -0
  70. data/app/models/kuroko2/log.rb +3 -0
  71. data/app/models/kuroko2/memory_consumption_log.rb +49 -0
  72. data/app/models/kuroko2/memory_expectancy.rb +21 -0
  73. data/app/models/kuroko2/process_signal.rb +14 -0
  74. data/app/models/kuroko2/star.rb +6 -0
  75. data/app/models/kuroko2/tag.rb +8 -0
  76. data/app/models/kuroko2/tick.rb +12 -0
  77. data/app/models/kuroko2/token.rb +101 -0
  78. data/app/models/kuroko2/user.rb +48 -0
  79. data/app/models/kuroko2/worker.rb +12 -0
  80. data/app/views/kaminari/history/_paginator.html.slim +15 -0
  81. data/app/views/kaminari/list/_paginator.html.slim +17 -0
  82. data/app/views/kuroko2/dashboard/_taglist.html.slim +13 -0
  83. data/app/views/kuroko2/dashboard/index.html.slim +49 -0
  84. data/app/views/kuroko2/execution_logs/index.json.jbuilder +16 -0
  85. data/app/views/kuroko2/executions/index.html.slim +35 -0
  86. data/app/views/kuroko2/job_definition_stats/execution_time.json.jbuilder +13 -0
  87. data/app/views/kuroko2/job_definition_stats/index.html.slim +48 -0
  88. data/app/views/kuroko2/job_definition_stats/memory.json.jbuilder +10 -0
  89. data/app/views/kuroko2/job_definitions/_alert.html.slim +7 -0
  90. data/app/views/kuroko2/job_definitions/_form.html.slim +93 -0
  91. data/app/views/kuroko2/job_definitions/_list.html.slim +26 -0
  92. data/app/views/kuroko2/job_definitions/_search_results.html.slim +51 -0
  93. data/app/views/kuroko2/job_definitions/_taglist.html.slim +13 -0
  94. data/app/views/kuroko2/job_definitions/edit.html.slim +15 -0
  95. data/app/views/kuroko2/job_definitions/index.html.slim +11 -0
  96. data/app/views/kuroko2/job_definitions/new.html.slim +12 -0
  97. data/app/views/kuroko2/job_definitions/show.html.slim +90 -0
  98. data/app/views/kuroko2/job_instances/_instance.html.slim +42 -0
  99. data/app/views/kuroko2/job_instances/index.html.slim +58 -0
  100. data/app/views/kuroko2/job_instances/show.html.slim +19 -0
  101. data/app/views/kuroko2/job_instances/working.html.slim +37 -0
  102. data/app/views/kuroko2/job_schedules/index.html.slim +32 -0
  103. data/app/views/kuroko2/job_suspend_schedules/index.html.slim +27 -0
  104. data/app/views/kuroko2/job_timelines/dataset.json.jbuilder +11 -0
  105. data/app/views/kuroko2/job_timelines/index.html.slim +31 -0
  106. data/app/views/kuroko2/kaminari/history/_paginator.html.slim +15 -0
  107. data/app/views/kuroko2/kaminari/list/_paginator.html.slim +17 -0
  108. data/app/views/kuroko2/layouts/application.html.slim +68 -0
  109. data/app/views/kuroko2/logs/index.html.slim +33 -0
  110. data/app/views/kuroko2/notifications/executor_not_assigned.text.erb +22 -0
  111. data/app/views/kuroko2/notifications/job_failure.html.slim +21 -0
  112. data/app/views/kuroko2/notifications/job_failure.text.erb +18 -0
  113. data/app/views/kuroko2/notifications/notify_long_elapsed_time.text.erb +9 -0
  114. data/app/views/kuroko2/notifications/process_absence.text.erb +22 -0
  115. data/app/views/kuroko2/notifications/remind_failure.html.slim +21 -0
  116. data/app/views/kuroko2/notifications/remind_failure.text.erb +10 -0
  117. data/app/views/kuroko2/sessions/new.html.slim +20 -0
  118. data/app/views/kuroko2/tokens/index.html.slim +42 -0
  119. data/app/views/kuroko2/users/index.html.slim +55 -0
  120. data/app/views/kuroko2/users/show.html.slim +76 -0
  121. data/app/views/kuroko2/workers/index.html.slim +40 -0
  122. data/app/views/layouts/kuroko2/application.html.slim +72 -0
  123. data/app/views/layouts/mailer.html.erb +13 -0
  124. data/app/views/layouts/mailer.text.erb +1 -0
  125. data/bin/cleanup_old_instances.rb +9 -0
  126. data/bin/remind_failure.rb +5 -0
  127. data/config/initializers/000_kuroko2.rb +16 -0
  128. data/config/initializers/assets.rb +9 -0
  129. data/config/initializers/garage.rb +2 -0
  130. data/config/initializers/kaminari_config.rb +3 -0
  131. data/config/initializers/omniauth.rb +5 -0
  132. data/config/locales/en.yml +28 -0
  133. data/config/routes.rb +54 -0
  134. data/db/migrate/001_create_job_definitions.rb +22 -0
  135. data/db/migrate/002_create_job_instances.rb +17 -0
  136. data/db/migrate/003_create_job_schedules.rb +14 -0
  137. data/db/migrate/004_create_ticks.rb +7 -0
  138. data/db/migrate/005_create_logs.rb +13 -0
  139. data/db/migrate/006_create_tokens.rb +21 -0
  140. data/db/migrate/007_create_executions.rb +26 -0
  141. data/db/migrate/008_create_process_signals.rb +15 -0
  142. data/db/migrate/009_create_users.rb +20 -0
  143. data/db/migrate/010_create_admin_assignments.rb +12 -0
  144. data/db/migrate/011_create_stars.rb +12 -0
  145. data/db/migrate/012_create_workers.rb +15 -0
  146. data/db/migrate/018_create_job_definition_tags.rb +13 -0
  147. data/db/migrate/019_create_tags.rb +11 -0
  148. data/db/migrate/021_create_memory_expectancies.rb +17 -0
  149. data/db/migrate/025_create_job_suspend_schedules.rb +12 -0
  150. data/lib/kuroko2/command/executor.rb +62 -0
  151. data/lib/kuroko2/command/kill.rb +24 -0
  152. data/lib/kuroko2/command/monitor.rb +109 -0
  153. data/lib/kuroko2/command/shell.rb +163 -0
  154. data/lib/kuroko2/configuration.rb +19 -0
  155. data/lib/kuroko2/engine.rb +59 -0
  156. data/lib/kuroko2/execution_logger/cloud_watch_logs.rb +92 -0
  157. data/lib/kuroko2/execution_logger/void.rb +13 -0
  158. data/lib/kuroko2/execution_logger.rb +20 -0
  159. data/lib/kuroko2/memory_sampler.rb +50 -0
  160. data/lib/kuroko2/return_to_validator.rb +14 -0
  161. data/lib/kuroko2/servers/base.rb +30 -0
  162. data/lib/kuroko2/servers/command_executor.rb +27 -0
  163. data/lib/kuroko2/servers/job_scheduler.rb +25 -0
  164. data/lib/kuroko2/servers/workflow_processor.rb +25 -0
  165. data/lib/kuroko2/util/logger.rb +19 -0
  166. data/lib/kuroko2/util/rails_logger_formatter.rb +9 -0
  167. data/lib/kuroko2/version.rb +3 -0
  168. data/lib/kuroko2/workflow/assertion_error.rb +6 -0
  169. data/lib/kuroko2/workflow/engine.rb +141 -0
  170. data/lib/kuroko2/workflow/engine_error.rb +6 -0
  171. data/lib/kuroko2/workflow/node.rb +124 -0
  172. data/lib/kuroko2/workflow/notifier/concerns/chat_message_builder.rb +39 -0
  173. data/lib/kuroko2/workflow/notifier/hipchat.rb +88 -0
  174. data/lib/kuroko2/workflow/notifier/mail.rb +44 -0
  175. data/lib/kuroko2/workflow/notifier/slack.rb +121 -0
  176. data/lib/kuroko2/workflow/notifier.rb +31 -0
  177. data/lib/kuroko2/workflow/processor.rb +40 -0
  178. data/lib/kuroko2/workflow/scheduler.rb +42 -0
  179. data/lib/kuroko2/workflow/script_parser.rb +66 -0
  180. data/lib/kuroko2/workflow/shell_scanner.rb +34 -0
  181. data/lib/kuroko2/workflow/syntax_error.rb +6 -0
  182. data/lib/kuroko2/workflow/task/auto_skip_error.rb +20 -0
  183. data/lib/kuroko2/workflow/task/base.rb +32 -0
  184. data/lib/kuroko2/workflow/task/env.rb +45 -0
  185. data/lib/kuroko2/workflow/task/execute.rb +128 -0
  186. data/lib/kuroko2/workflow/task/expected_time.rb +9 -0
  187. data/lib/kuroko2/workflow/task/fork.rb +45 -0
  188. data/lib/kuroko2/workflow/task/kuroko_runner.rb +24 -0
  189. data/lib/kuroko2/workflow/task/noop.rb +13 -0
  190. data/lib/kuroko2/workflow/task/queue.rb +27 -0
  191. data/lib/kuroko2/workflow/task/rails_env.rb +24 -0
  192. data/lib/kuroko2/workflow/task/sequence.rb +13 -0
  193. data/lib/kuroko2/workflow/task/sleep.rb +29 -0
  194. data/lib/kuroko2/workflow/task/sub_process.rb +53 -0
  195. data/lib/kuroko2/workflow/task/time_base.rb +44 -0
  196. data/lib/kuroko2/workflow/task/timeout.rb +9 -0
  197. data/lib/kuroko2/workflow/task/wait.rb +143 -0
  198. data/lib/kuroko2.rb +26 -0
  199. data/lib/tasks/kuroko2_tasks.rake +4 -0
  200. data/spec/command/kill_spec.rb +20 -0
  201. data/spec/command/monitor_spec.rb +68 -0
  202. data/spec/command/shell_spec.rb +87 -0
  203. data/spec/controllers/dashboard_controller_spec.rb +5 -0
  204. data/spec/controllers/executions_controller_spec.rb +23 -0
  205. data/spec/controllers/job_definition_stats_controller_spec.rb +95 -0
  206. data/spec/controllers/job_definitions_controller_spec.rb +89 -0
  207. data/spec/controllers/job_instances_controller_spec.rb +62 -0
  208. data/spec/controllers/job_schedules_controller_spec.rb +39 -0
  209. data/spec/controllers/job_suspend_schedules_controller_spec.rb +39 -0
  210. data/spec/controllers/job_timelines_controller_spec.rb +114 -0
  211. data/spec/controllers/logs_controller_spec.rb +5 -0
  212. data/spec/controllers/sessions_controller_spec.rb +58 -0
  213. data/spec/controllers/stars_controller_spec.rb +28 -0
  214. data/spec/controllers/tokens_controller_spec.rb +5 -0
  215. data/spec/controllers/users_controller_spec.rb +51 -0
  216. data/spec/controllers/workers_controller_spec.rb +5 -0
  217. data/spec/dummy/Rakefile +6 -0
  218. data/spec/dummy/app/assets/config/manifest.js +5 -0
  219. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  220. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  221. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  222. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  223. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  224. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  225. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  226. data/spec/dummy/app/jobs/application_job.rb +2 -0
  227. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  228. data/spec/dummy/app/models/application_record.rb +3 -0
  229. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  230. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  231. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  232. data/spec/dummy/bin/bundle +3 -0
  233. data/spec/dummy/bin/rails +4 -0
  234. data/spec/dummy/bin/rake +4 -0
  235. data/spec/dummy/bin/setup +34 -0
  236. data/spec/dummy/bin/update +29 -0
  237. data/spec/dummy/config/application.rb +25 -0
  238. data/spec/dummy/config/boot.rb +3 -0
  239. data/spec/dummy/config/cable.yml +9 -0
  240. data/spec/dummy/config/database.yml +29 -0
  241. data/spec/dummy/config/environment.rb +5 -0
  242. data/spec/dummy/config/environments/development.rb +54 -0
  243. data/spec/dummy/config/environments/production.rb +86 -0
  244. data/spec/dummy/config/environments/test.rb +42 -0
  245. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  246. data/spec/dummy/config/initializers/assets.rb +11 -0
  247. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  248. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  249. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  250. data/spec/dummy/config/initializers/inflections.rb +16 -0
  251. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  252. data/spec/dummy/config/initializers/new_framework_defaults.rb +23 -0
  253. data/spec/dummy/config/initializers/session_store.rb +3 -0
  254. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  255. data/spec/dummy/config/kuroko2.yml +35 -0
  256. data/spec/dummy/config/locales/en.yml +23 -0
  257. data/spec/dummy/config/puma.rb +47 -0
  258. data/spec/dummy/config/routes.rb +3 -0
  259. data/spec/dummy/config/secrets.yml +22 -0
  260. data/spec/dummy/config/spring.rb +6 -0
  261. data/spec/dummy/config.ru +5 -0
  262. data/spec/dummy/db/schema.rb +217 -0
  263. data/spec/dummy/lib/dummy_extention.rb +14 -0
  264. data/spec/dummy/lib/kuroko2/workflow/task/custom_task1.rb +13 -0
  265. data/spec/dummy/public/404.html +67 -0
  266. data/spec/dummy/public/422.html +67 -0
  267. data/spec/dummy/public/500.html +66 -0
  268. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  269. data/spec/dummy/public/apple-touch-icon.png +0 -0
  270. data/spec/dummy/public/favicon.ico +0 -0
  271. data/spec/execution_logger/cloud_watch_logs_spec.rb +95 -0
  272. data/spec/factories/execution_factory.rb +13 -0
  273. data/spec/factories/job_definition_factory.rb +21 -0
  274. data/spec/factories/job_instance_factory.rb +4 -0
  275. data/spec/factories/job_schedule_factory.rb +10 -0
  276. data/spec/factories/job_suspend_schedule_factory.rb +8 -0
  277. data/spec/factories/memory_expectancy_factory.rb +5 -0
  278. data/spec/factories/process_signal_factory.rb +4 -0
  279. data/spec/factories/star_factory.rb +4 -0
  280. data/spec/factories/tick_factory.rb +4 -0
  281. data/spec/factories/token_factory.rb +10 -0
  282. data/spec/factories/user_factory.rb +11 -0
  283. data/spec/factories/worker_factory.rb +8 -0
  284. data/spec/features/dashborad_spec.rb +82 -0
  285. data/spec/features/job_definition_spec.rb +74 -0
  286. data/spec/features/job_instance_spec.rb +94 -0
  287. data/spec/features/sign_in_and_out_spec.rb +17 -0
  288. data/spec/features/users_spec.rb +90 -0
  289. data/spec/features/workers_spec.rb +44 -0
  290. data/spec/helpers/executions_helper_spec.rb +4 -0
  291. data/spec/helpers/job_definition_helper_spec.rb +42 -0
  292. data/spec/helpers/job_schedules_helper_spec.rb +4 -0
  293. data/spec/helpers/logs_helper_spec.rb +4 -0
  294. data/spec/helpers/tokens_helper_spec.rb +4 -0
  295. data/spec/helpers/users_helper_spec.rb +4 -0
  296. data/spec/helpers/workers_helper_spec.rb +4 -0
  297. data/spec/mailers/notifications_spec.rb +54 -0
  298. data/spec/memory_sampler_spec.rb +11 -0
  299. data/spec/models/admin_assignment_spec.rb +4 -0
  300. data/spec/models/execution_spec.rb +26 -0
  301. data/spec/models/job_definition_spec.rb +163 -0
  302. data/spec/models/job_instance_spec.rb +115 -0
  303. data/spec/models/job_schedule_spec.rb +121 -0
  304. data/spec/models/job_suspend_schedule_spec.rb +32 -0
  305. data/spec/models/memory_consumption_log_spec.rb +50 -0
  306. data/spec/models/memory_expectancy_spec.rb +26 -0
  307. data/spec/models/star_spec.rb +4 -0
  308. data/spec/models/tick_spec.rb +23 -0
  309. data/spec/models/token_spec.rb +54 -0
  310. data/spec/models/user_spec.rb +17 -0
  311. data/spec/models/worker_spec.rb +5 -0
  312. data/spec/rails_helper.rb +81 -0
  313. data/spec/requests/api/job_instances_spec.rb +96 -0
  314. data/spec/requests/api/stats_spec.rb +45 -0
  315. data/spec/return_to_validator_spec.rb +28 -0
  316. data/spec/settings_spec.rb +10 -0
  317. data/spec/spec_helper.rb +49 -0
  318. data/spec/support/feature_sign_in_helper.rb +31 -0
  319. data/spec/support/sign_in_helper.rb +5 -0
  320. data/spec/support/wait_for_ajax.rb +11 -0
  321. data/spec/workflow/engine_spec.rb +241 -0
  322. data/spec/workflow/node_spec.rb +62 -0
  323. data/spec/workflow/notifier/hipchat_spec.rb +117 -0
  324. data/spec/workflow/notifier/mail_spec.rb +86 -0
  325. data/spec/workflow/notifier/slack_spec.rb +110 -0
  326. data/spec/workflow/script_parser_spec.rb +119 -0
  327. data/spec/workflow/shell_scanner_spec.rb +47 -0
  328. data/spec/workflow/task/auto_skip_error_spec.rb +35 -0
  329. data/spec/workflow/task/env_spec.rb +47 -0
  330. data/spec/workflow/task/execute_spec.rb +127 -0
  331. data/spec/workflow/task/expected_time_spec.rb +52 -0
  332. data/spec/workflow/task/fork_spec.rb +30 -0
  333. data/spec/workflow/task/queue_spec.rb +45 -0
  334. data/spec/workflow/task/rails_env_spec.rb +30 -0
  335. data/spec/workflow/task/sleep_spec.rb +22 -0
  336. data/spec/workflow/task/sub_process_spec.rb +32 -0
  337. data/spec/workflow/task/wait_spec.rb +162 -0
  338. metadata +1038 -0
@@ -0,0 +1,31 @@
1
+ module FeatureSignInHelper
2
+ def sign_in(user = create(:user))
3
+ mock_omni_auth_google_oauth2(
4
+ uid: user.uid,
5
+ name: user.name,
6
+ first_name: user.first_name,
7
+ last_name: user.last_name,
8
+ email: user.email,
9
+ image: user.image,
10
+ )
11
+
12
+ visit kuroko2_path
13
+ click_on('Sign in with Google')
14
+ end
15
+
16
+ def mock_omni_auth_google_oauth2(options = {})
17
+ OmniAuth.config.mock_auth[:google_oauth2] = OmniAuth::AuthHash.new(
18
+ uid: options[:uid] || 'john@example.org',
19
+ info: {
20
+ name: options[:name] || "John Doe",
21
+ first_name: options[:first_name] || "John",
22
+ last_name: options[:last_name] || "Doe",
23
+ email: options[:email] || "john@example.org",
24
+ image: options[:image] || "https://img.example.org/john.doe.png",
25
+ },
26
+ credentials: {
27
+ expires_at: options[:expires_at] || 1.month.since.to_i,
28
+ }
29
+ )
30
+ end
31
+ end
@@ -0,0 +1,5 @@
1
+ module SignInHelper
2
+ def sign_in(user = create(:user))
3
+ controller.instance_variable_set(:@_current_user, user)
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ module WaitForAjax
2
+ def wait_for_ajax
3
+ Timeout.timeout(Capybara.default_max_wait_time) do
4
+ loop until finished_all_ajax_requests?
5
+ end
6
+ end
7
+
8
+ def finished_all_ajax_requests?
9
+ page.evaluate_script('jQuery.active').zero?
10
+ end
11
+ end
@@ -0,0 +1,241 @@
1
+ require 'rails_helper'
2
+
3
+ module Kuroko2::Workflow
4
+ describe Engine do
5
+ describe '#process' do
6
+
7
+ let(:shell) { Kuroko2::Command::Shell.new(hostname: 'rspec', worker_id: 1, worker: worker) }
8
+ let(:token) { definition.job_instances.first.tokens.first }
9
+ let(:worker) { create(:worker) }
10
+
11
+ context 'with simple sequence' do
12
+ let!(:definition) do
13
+ create(:job_definition_with_instances, script: <<-EOF.strip_heredoc)
14
+ noop: noop0
15
+ noop: noop1
16
+ EOF
17
+ end
18
+
19
+ specify do
20
+ subject.process(token)
21
+ expect(token.path).to eq '/0-noop'
22
+
23
+ subject.process(token)
24
+ expect(token.path).to eq '/1-noop'
25
+
26
+ subject.process(token)
27
+
28
+ expect(token).to be_finished
29
+ expect(Kuroko2::Token.all.count).to eq 0
30
+ end
31
+ end
32
+
33
+ context 'with simple execution' do
34
+ let!(:definition) do
35
+ create(:job_definition_with_instances, script: <<-EOF.strip_heredoc)
36
+ env: NAME=kuroko
37
+ execute: echo Hello, $NAME!
38
+ EOF
39
+ end
40
+
41
+ specify do
42
+ subject.process(token)
43
+ subject.process(token)
44
+ subject.process(token)
45
+ shell.execute
46
+ subject.process(token)
47
+
48
+ expect(token).to be_finished
49
+ expect(Kuroko2::Token.all.count).to eq 0
50
+ end
51
+ end
52
+
53
+ context 'with fork' do
54
+ let!(:definition) do
55
+ create(:job_definition_with_instances, script: <<-EOF.strip_heredoc)
56
+ fork:
57
+ noop: noop1
58
+ noop: noop2
59
+ sequence:
60
+ noop: noop3
61
+ noop: noop4
62
+ noop: noop5
63
+ EOF
64
+ end
65
+
66
+ specify do
67
+ subject.process(token)
68
+ expect(token.path).to eq '/0-fork'
69
+
70
+ subject.process(token)
71
+ expect(token.children.size).to eq 3
72
+
73
+ noop1, noop2, sequence = token.children
74
+
75
+ subject.process_all
76
+ [token, noop1, noop2, sequence].each(&:reload)
77
+ expect(token.path).to eq '/0-fork'
78
+ expect(noop1.path).to eq '/0-noop'
79
+ expect(noop2.path).to eq '/0-noop'
80
+ expect(sequence.path).to eq '/0-sequence'
81
+
82
+ subject.process_all
83
+ [token, noop1, noop2, sequence].each(&:reload)
84
+ expect(token.path).to eq '/0-fork'
85
+ expect(noop1.path).to eq '/0-noop'
86
+ expect(noop2.path).to eq '/0-noop'
87
+ expect(sequence.path).to eq '/0-sequence/0-noop'
88
+ expect(noop1.status_name).to eq 'finished'
89
+ expect(noop2.status_name).to eq 'finished'
90
+ expect(sequence.status_name).to eq 'working'
91
+
92
+ subject.process_all
93
+ [token, noop1, noop2, sequence].each(&:reload)
94
+ expect(token.path).to eq '/0-fork'
95
+ expect(noop1.path).to eq '/0-noop'
96
+ expect(noop2.path).to eq '/0-noop'
97
+ expect(sequence.path).to eq '/0-sequence/1-noop'
98
+ expect(noop1.status_name).to eq 'finished'
99
+ expect(noop2.status_name).to eq 'finished'
100
+ expect(sequence.status_name).to eq 'working'
101
+
102
+ subject.process_all
103
+ [token, noop1, noop2, sequence].each(&:reload)
104
+ expect(token.path).to eq '/0-fork'
105
+ expect(noop1.path).to eq '/0-noop'
106
+ expect(noop2.path).to eq '/0-noop'
107
+ expect(sequence.path).to eq '/0-sequence/1-noop'
108
+ expect(noop1.status_name).to eq 'finished'
109
+ expect(noop2.status_name).to eq 'finished'
110
+ expect(sequence.status_name).to eq 'finished'
111
+
112
+ subject.process_all
113
+ token.reload
114
+ expect(token.path).to eq '/1-noop'
115
+ expect(token.status_name).to eq 'working'
116
+
117
+ subject.process_all
118
+ expect(Kuroko2::Token.all.count).to eq 0
119
+ end
120
+ end
121
+
122
+ context 'retry' do
123
+ let!(:definition) do
124
+ create(:job_definition_with_instances, script: <<-EOF.strip_heredoc)
125
+ execute: test -e #{tmpfile}
126
+ noop:
127
+ EOF
128
+ end
129
+
130
+ let!(:tmpfile) do
131
+ "/tmp/tmp_workflow_spec_skip.#{Process.pid}"
132
+ end
133
+
134
+ after do
135
+ FileUtils.safe_unlink(tmpfile)
136
+ end
137
+
138
+ specify do
139
+ subject.process(token)
140
+ subject.process(token)
141
+ shell.execute
142
+ subject.process(token)
143
+ expect(token.status_name).to eq 'failure'
144
+
145
+ FileUtils.touch(tmpfile)
146
+
147
+ subject.retry(token)
148
+
149
+ subject.process(token)
150
+ shell.execute
151
+ subject.process(token)
152
+ subject.process(token)
153
+
154
+ expect(token.status_name).to eq 'finished'
155
+ expect(Kuroko2::Token.all.count).to eq 0
156
+ end
157
+ end
158
+
159
+ context 'skip' do
160
+ let!(:definition) do
161
+ create(:job_definition_with_instances, script: <<-EOF.strip_heredoc)
162
+ execute: false
163
+ noop:
164
+ EOF
165
+ end
166
+
167
+ specify do
168
+ subject.process(token)
169
+ subject.process(token)
170
+ shell.execute
171
+ subject.process(token)
172
+
173
+ expect(token.status_name).to eq 'failure'
174
+
175
+ subject.skip(token)
176
+ subject.process(token)
177
+
178
+ expect(token.status_name).to eq 'finished'
179
+ expect(Kuroko2::Token.all.count).to eq 0
180
+ end
181
+ end
182
+
183
+ context 'with auto_skip_error' do
184
+ let!(:definition) do
185
+ create(:job_definition_with_instances, script: <<-EOF.strip_heredoc)
186
+ auto_skip_error: true
187
+ execute: false
188
+ noop:
189
+ EOF
190
+ end
191
+
192
+ specify do
193
+ subject.process(token)
194
+ subject.process(token)
195
+ shell.execute
196
+ subject.process(token)
197
+ subject.process(token)
198
+ shell.execute
199
+ subject.process(token)
200
+ subject.process(token)
201
+
202
+ expect(token.status_name).to eq 'finished'
203
+ expect(Kuroko2::Token.all.count).to eq 0
204
+ end
205
+ end
206
+
207
+ context 'with wait' do
208
+ let(:wait_definition) do
209
+ create(:job_definition_with_instances, script: 'noop:')
210
+ end
211
+
212
+ let!(:definition) do
213
+ create(:job_definition_with_instances, script: <<-EOF.strip_heredoc)
214
+ wait: #{wait_definition.id}/hourly
215
+ noop:
216
+ EOF
217
+ end
218
+
219
+ specify do
220
+ subject.process(token)
221
+ expect(token.status_name).to eq 'working'
222
+ subject.process(token)
223
+ expect(token.status_name).to eq 'waiting'
224
+ subject.process(token)
225
+ expect(token.status_name).to eq 'waiting'
226
+ subject.process(token)
227
+ expect(token.status_name).to eq 'waiting'
228
+ subject.process(token)
229
+ expect(token.status_name).to eq 'waiting'
230
+
231
+ wait_definition.job_instances.first.touch(:finished_at)
232
+
233
+ subject.process(token)
234
+ expect(token.status_name).to eq 'working'
235
+ subject.process(token)
236
+ expect(token.status_name).to eq 'finished'
237
+ end
238
+ end
239
+ end
240
+ end
241
+ end
@@ -0,0 +1,62 @@
1
+ require 'rails_helper'
2
+
3
+ module Kuroko2::Workflow
4
+ describe Node do
5
+ around do |example|
6
+ Node.register(key: :node1, klass: Task::Base)
7
+ Node.register(key: :node1_1, klass: Task::Base)
8
+ Node.register(key: :node1_2, klass: Task::Base)
9
+ Node.register(key: :node2, klass: Task::Base)
10
+
11
+ example.run
12
+
13
+ Node.deregister(:node1)
14
+ Node.deregister(:node1_1)
15
+ Node.deregister(:node1_2)
16
+ Node.deregister(:node2)
17
+ end
18
+
19
+ let!(:root) do
20
+ Node.new(:root).tap do |root|
21
+ root.append_child(node1)
22
+ root.append_child(node2)
23
+
24
+ node1.append_child(node1_1)
25
+ node1.append_child(node1_2)
26
+ end
27
+ end
28
+ let(:node1) { Node.new(:node1) }
29
+ let(:node1_1) { Node.new(:node1_1) }
30
+ let(:node1_2) { Node.new(:node1_2) }
31
+ let(:node2) { Node.new(:node2) }
32
+
33
+ describe '#find' do
34
+ it { expect(root.find('/0-node1')).to eq node1 }
35
+ it { expect(root.find('/0-node1/0-node1_1')).to eq node1_1 }
36
+ it { expect(root.find('/0-node1/1-node1_2')).to eq node1_2 }
37
+ it { expect(root.find('/1-node2')).to eq node2 }
38
+
39
+ it { expect { root.find('invalid query') }.to raise_error(AssertionError) }
40
+ end
41
+
42
+ describe '#next' do
43
+ it { expect(root.next).to eq node1 }
44
+ it { expect(node1.next).to eq node1_1 }
45
+ it { expect(node1_1.next).to eq node1_2 }
46
+ it { expect(node1_2.next).to eq node2 }
47
+ it { expect(node2.next).to be_nil }
48
+ end
49
+
50
+ describe '#path' do
51
+ it { expect(root.path).to eq '' }
52
+ it { expect(node1.path).to eq '/0-node1' }
53
+ it { expect(node1_1.path).to eq '/0-node1/0-node1_1' }
54
+ it { expect(node1_2.path).to eq '/0-node1/1-node1_2' }
55
+ it { expect(node2.path).to eq '/1-node2' }
56
+ end
57
+
58
+ describe '#to_script' do
59
+ it { expect(node1.to_script).to eq "node1: \n node1_1: \n node1_2: \n" }
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,117 @@
1
+ require 'rails_helper'
2
+
3
+ module Kuroko2::Workflow
4
+ describe Notifier::Hipchat do
5
+ let(:job_name) { 'My Job' }
6
+ let(:hipchat_room) { 'dummy' }
7
+ let(:instance) do
8
+ create(:job_definition_with_instances, name: job_name, hipchat_room: hipchat_room).
9
+ job_instances.first
10
+ end
11
+
12
+ let(:notifier) { Notifier::Hipchat.new(instance) }
13
+ let(:hipchat_room_object) { double('Hipchat::Room', send: true) }
14
+
15
+ before do
16
+ allow(Kuroko2.config.notifiers.hipchat).to receive(:api_token).and_return('token')
17
+
18
+ instance.logs.info('start!')
19
+ allow(notifier.hipchat).to receive(:[]).with(hipchat_room).
20
+ and_return(hipchat_room_object)
21
+ end
22
+
23
+ describe '#notify_failure' do
24
+ it 'sends failure mesasge' do
25
+ expect(hipchat_room_object).to receive(:send) do |_, message, option|
26
+ expect(message).to include('FAILURE')
27
+ expect(option[:color]).to eq('red')
28
+ end
29
+
30
+ notifier.notify_failure
31
+ end
32
+
33
+ context 'with additional_text' do
34
+ let(:additional_text) { '@EisukeOishi' }
35
+ before do
36
+ instance.job_definition.hipchat_additional_text = additional_text
37
+ instance.save!
38
+ end
39
+
40
+ it 'sends additional message' do
41
+ expect(hipchat_room_object).to receive(:send) do |_, message, option|
42
+ expect(message).to include('Failed to execute')
43
+ expect(option[:color]).to eq('red')
44
+ end
45
+
46
+ notifier.notify_failure
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#notify_cancellation' do
52
+ before do
53
+ instance.job_definition.notify_cancellation = true
54
+ instance.save!
55
+ end
56
+
57
+ it 'sends cancellation mesasge' do
58
+ expect(hipchat_room_object).to receive(:send) do |_, message, option|
59
+ expect(message).to include('WARNING')
60
+ expect(option[:color]).to eq('yellow')
61
+ end
62
+
63
+ notifier.notify_cancellation
64
+ end
65
+ end
66
+
67
+ describe '#notify_critical' do
68
+ it 'sends critical mesasge' do
69
+ expect(hipchat_room_object).to receive(:send) do |_, message, option|
70
+ expect(message).to include('CRITICAL')
71
+ expect(option[:color]).to eq('red')
72
+ end
73
+
74
+ notifier.notify_critical
75
+ end
76
+
77
+ context 'with additional_text' do
78
+ let(:additional_text) { '@EisukeOishi' }
79
+ before do
80
+ instance.job_definition.hipchat_additional_text = additional_text
81
+ instance.save!
82
+ end
83
+
84
+ it 'sends additional message' do
85
+ expect(hipchat_room_object).to receive(:send) do |_, message, option|
86
+ expect(message).to include('Failed to execute')
87
+ expect(option[:color]).to eq('red')
88
+ end
89
+
90
+ notifier.notify_failure
91
+ end
92
+ end
93
+ end
94
+
95
+ describe '#notify_finished' do
96
+ it 'sends finished mesasge' do
97
+ expect(hipchat_room_object).to receive(:send) do |_, message, option|
98
+ expect(message).to include('SUCCESS')
99
+ expect(option[:color]).to eq('green')
100
+ end
101
+
102
+ notifier.notify_finished
103
+ end
104
+ end
105
+
106
+ describe '#notify_long_elapsed_time' do
107
+ it 'sends warning mesasge' do
108
+ expect(hipchat_room_object).to receive(:send) do |_, message, option|
109
+ expect(message).to include('WARNING')
110
+ expect(option[:color]).to eq('red')
111
+ end
112
+
113
+ notifier.notify_long_elapsed_time
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,86 @@
1
+ require 'rails_helper'
2
+
3
+ module Kuroko2::Workflow
4
+ describe Notifier::Mail do
5
+ let(:job_name) { 'MyJob' }
6
+
7
+ let(:instance) do
8
+ create(:job_definition_with_instances, name: job_name).job_instances.first
9
+ end
10
+
11
+ let(:notifier) { Notifier::Mail.new(instance) }
12
+
13
+ before do
14
+ instance.logs.info('start!')
15
+ ActionMailer::Base.deliveries.clear
16
+ end
17
+
18
+ describe '#notify_cancellation' do
19
+ context 'with notify_cancellation is true' do
20
+ before do
21
+ instance.job_definition.notify_cancellation = true
22
+ instance.save!
23
+ end
24
+
25
+ it 'sends cancellation mesasge' do
26
+ expect { notifier.notify_cancellation }.to change {
27
+ ActionMailer::Base.deliveries.size
28
+ }.from(0).to(1)
29
+ end
30
+ end
31
+
32
+ context 'with notify_cancellation is false' do
33
+ before do
34
+ instance.job_definition.notify_cancellation = false
35
+ instance.save!
36
+ end
37
+
38
+ it 'sends cancellation mesasge' do
39
+ expect { notifier.notify_cancellation }.not_to change {
40
+ ActionMailer::Base.deliveries.size
41
+ }
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '#notify_failure' do
47
+ it 'sends failure mesasge' do
48
+ expect { notifier.notify_failure }.to change {
49
+ ActionMailer::Base.deliveries.size
50
+ }.from(0).to(1)
51
+ end
52
+ end
53
+
54
+ describe '#notify_critical' do
55
+ it 'sends critical mesasge' do
56
+ expect { notifier.notify_critical }.to change {
57
+ ActionMailer::Base.deliveries.size
58
+ }.from(0).to(1)
59
+ end
60
+ end
61
+
62
+ describe '#notify_finished' do
63
+ it 'does not send mail' do
64
+ expect { notifier.notify_finished }.not_to change {
65
+ ActionMailer::Base.deliveries.size
66
+ }
67
+ end
68
+ end
69
+
70
+ describe '#notify_long_elapsed_time' do
71
+ it 'sends warning mesasge' do
72
+ expect { notifier.notify_long_elapsed_time }.to change {
73
+ ActionMailer::Base.deliveries.size
74
+ }.from(0).to(1)
75
+ end
76
+ end
77
+
78
+ describe '#notify_working' do
79
+ it 'does not send mail' do
80
+ expect { notifier.notify_working }.not_to change {
81
+ ActionMailer::Base.deliveries.size
82
+ }
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,110 @@
1
+ require 'rails_helper'
2
+
3
+ module Kuroko2::Workflow
4
+ describe Notifier::Slack do
5
+ let(:job_name) { 'My Job' }
6
+ let(:slack_channel) { '#dummy' }
7
+ let(:instance) do
8
+ create(:job_definition_with_instances, name: job_name, slack_channel: slack_channel).
9
+ job_instances.first
10
+ end
11
+
12
+ let(:notifier) { Notifier::Slack.new(instance) }
13
+ let(:endpoint) { Kuroko2.config.notifiers.slack.webhook_url }
14
+ let(:response) { { body: 'ok' } }
15
+
16
+ before do
17
+ instance.logs.info('start!')
18
+
19
+ stub_request(:post, endpoint).with(
20
+ headers: { "Content-Type" => 'application/json' },
21
+ ).and_return(response)
22
+ end
23
+
24
+ describe '#notify_failure' do
25
+ it 'sends failure mesasge' do
26
+ expect(notifier).to receive(:send_to_slack).
27
+ with(hash_including(channel: slack_channel)).and_call_original
28
+
29
+ notifier.notify_failure
30
+ end
31
+
32
+ context 'with additional_text' do
33
+ let(:additional_text) { '@eisuke-oishi' }
34
+ before do
35
+ instance.job_definition.hipchat_additional_text = additional_text
36
+ instance.save!
37
+ end
38
+
39
+ it 'sends additional message' do
40
+ expect(notifier).to receive(:send_additional_text_to_slack).once.and_call_original
41
+ notifier.notify_failure
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '#notify_cancellation' do
47
+ before do
48
+ instance.job_definition.notify_cancellation = true
49
+ instance.save!
50
+ end
51
+
52
+ it 'sends cancellation mesasge' do
53
+ expect(notifier).to receive(:send_to_slack).
54
+ with(hash_including(channel: slack_channel)).and_call_original
55
+
56
+ notifier.notify_cancellation
57
+ end
58
+ end
59
+
60
+ describe '#notify_critical' do
61
+ it 'sends critical mesasge' do
62
+ expect(notifier).to receive(:send_to_slack).
63
+ with(hash_including(channel: slack_channel)).and_call_original
64
+
65
+ notifier.notify_critical
66
+ end
67
+
68
+ context 'with additional_text' do
69
+ let(:additional_text) { '@eisuke-oishi' }
70
+
71
+ before do
72
+ instance.job_definition.hipchat_additional_text = additional_text
73
+ instance.save!
74
+ end
75
+
76
+ it 'sends additional message' do
77
+ expect(notifier).to receive(:send_additional_text_to_slack).and_call_original
78
+ notifier.notify_failure
79
+ end
80
+ end
81
+ end
82
+
83
+ describe '#notify_finished' do
84
+ it 'sends finished mesasge' do
85
+ expect(notifier).to receive(:send_to_slack).
86
+ with(hash_including(channel: slack_channel)).and_call_original
87
+
88
+ notifier.notify_finished
89
+ end
90
+ end
91
+
92
+ describe '#notify_long_elapsed_time' do
93
+ it 'sends warning mesasge' do
94
+ expect(notifier).to receive(:send_to_slack).
95
+ with(hash_including(channel: slack_channel)).and_call_original
96
+
97
+ notifier.notify_long_elapsed_time
98
+ end
99
+ end
100
+
101
+ context 'with invalid response' do
102
+ let(:response) { { status: 500 } }
103
+
104
+ it 'logs to response' do
105
+ expect(Kuroko2.logger).to receive(:fatal).with(/Failure sending message/)
106
+ notifier.notify_failure
107
+ end
108
+ end
109
+ end
110
+ end