kuroko2 0.2.0

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 (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,32 @@
1
+ class Kuroko2::SessionsController < Kuroko2::ApplicationController
2
+ skip_before_action :require_sign_in
3
+
4
+ def new
5
+ render layout: false
6
+ end
7
+
8
+ def create
9
+ return_to = params[:state]
10
+ reset_session
11
+
12
+ self.current_user = Kuroko2::User.find_or_create_user(auth_hash[:uid], auth_hash[:info])
13
+
14
+ unless Kuroko2::ReturnToValidator.valid?(return_to)
15
+ return_to = root_path
16
+ end
17
+ redirect_to return_to
18
+ end
19
+
20
+ def destroy
21
+ reset_session
22
+
23
+ redirect_to sign_in_path
24
+ end
25
+
26
+ private
27
+
28
+ def auth_hash
29
+ request.env['omniauth.auth']
30
+ end
31
+
32
+ end
@@ -0,0 +1,30 @@
1
+ class Kuroko2::StarsController < Kuroko2::ApplicationController
2
+ def create
3
+ star = Kuroko2::Star.new do |star|
4
+ star.job_definition = Kuroko2::JobDefinition.find(star_params[:job_definition_id])
5
+ star.user = current_user
6
+ end
7
+
8
+ if (star.save)
9
+ render json: star, status: :created
10
+ else
11
+ raise HTTP::BadRequest
12
+ end
13
+ end
14
+
15
+ def destroy
16
+ star = Kuroko2::Star.find(params[:id])
17
+
18
+ if (star.destroy)
19
+ render json: star, status: :ok
20
+ else
21
+ raise HTTP::BadRequest
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def star_params
28
+ params.permit(:job_definition_id)
29
+ end
30
+ end
@@ -0,0 +1,47 @@
1
+ class Kuroko2::TokensController < Kuroko2::ApplicationController
2
+
3
+ before_action :set_token, only: %i(update)
4
+ before_action :set_engine, only: %i(update)
5
+
6
+ def index
7
+ @definition = Kuroko2::JobDefinition.find(tokens_params[:job_definition_id])
8
+ @instance = Kuroko2::JobInstance.find(tokens_params[:job_instance_id])
9
+ @tokens = @instance.tokens
10
+
11
+ render layout: false
12
+ end
13
+
14
+ def update
15
+ @instance = @token.job_instance
16
+
17
+ case params[:invoke]
18
+ when 'skip'
19
+ @instance.logs.info("Skipped by #{current_user.name}.")
20
+
21
+ @engine.skip(@token)
22
+ when 'retry'
23
+ @instance.logs.info("Retry by #{current_user.name}.")
24
+
25
+ @engine.retry(@token)
26
+ else
27
+ raise HTTP::BadRequest
28
+ end
29
+
30
+ redirect_to job_definition_job_instance_path(job_definition_id: @token.job_definition_id, id: @token.job_instance.id)
31
+ end
32
+
33
+ private
34
+
35
+ def set_engine
36
+ @engine = Kuroko2::Workflow::Engine.new
37
+ end
38
+
39
+ def set_token
40
+ @token = Kuroko2::Token.where(job_definition_id: params[:job_definition_id], job_instance_id: params[:job_instance_id]).find(params[:id])
41
+ end
42
+
43
+ def tokens_params
44
+ params.permit(:job_definition_id, :job_instance_id)
45
+ end
46
+
47
+ end
@@ -0,0 +1,62 @@
1
+ class Kuroko2::UsersController < Kuroko2::ApplicationController
2
+ before_action :set_user, only: [:destroy]
3
+
4
+ def index
5
+ @user = Kuroko2::User.new
6
+ if params[:target] == 'group'
7
+ @users = Kuroko2::User.group_user.all.page(page_params[:page])
8
+ else
9
+ @users = Kuroko2::User.all.page(page_params[:page])
10
+ end
11
+ end
12
+
13
+ def show
14
+ @user = Kuroko2::User.find(params[:id])
15
+ @input_tags = params[:tag] || []
16
+
17
+ @definitions = @user.assigned_job_definitions
18
+ if @input_tags.present?
19
+ @definitions = @definitions.tagged_by(@input_tags)
20
+ end
21
+
22
+ @instances = Kuroko2::JobInstance.working.where(job_definition: @definitions)
23
+ @related_tags = @definitions.includes(:tags).map(&:tags).flatten.uniq
24
+ end
25
+
26
+ def create
27
+ @user = Kuroko2::User.new(user_params)
28
+ @user.provider = Kuroko2::User::GROUP_PROVIDER
29
+ @user.uid = @user.email
30
+
31
+ if @user.save
32
+ redirect_to users_path
33
+ else
34
+ @users = Kuroko2::User.all
35
+
36
+ render action: :index
37
+ end
38
+ end
39
+
40
+ def destroy
41
+ if @user.destroy
42
+ redirect_to users_url
43
+ else
44
+ @users = Kuroko2::User.all
45
+
46
+ render :index
47
+ end
48
+ end
49
+
50
+ private
51
+ def set_user
52
+ @user = Kuroko2::User.find(params[:id])
53
+ end
54
+
55
+ def user_params
56
+ params.require(:user).permit(:name, :email)
57
+ end
58
+
59
+ def page_params
60
+ params.permit(:page)
61
+ end
62
+ end
@@ -0,0 +1,5 @@
1
+ class Kuroko2::WorkersController < Kuroko2::ApplicationController
2
+ def index
3
+ @workers = Kuroko2::Worker.ordered.all
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ module HTTP
2
+ class BadRequest < StandardError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module HTTP
2
+ class Forbidden < StandardError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module HTTP
2
+ class Unauthorized < StandardError
3
+ end
4
+ end
@@ -0,0 +1,8 @@
1
+ require 'rails_rinku'
2
+
3
+ module Kuroko2
4
+ module ApplicationHelper
5
+ include RailsRinku
6
+ alias_method :auto_link, :rinku_auto_link
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ module DashboardHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ module ExecutionsHelper
3
+ end
4
+ end
@@ -0,0 +1,38 @@
1
+ module Kuroko2
2
+ module JobDefinitionsHelper
3
+ def first_line(text)
4
+ truncate(text.split("\n").first, length: 140)
5
+ end
6
+
7
+ def markdown_format(text)
8
+ pipeline = HTML::Pipeline.new([HTML::Pipeline::MarkdownFilter])
9
+ raw(pipeline.call(text)[:output].to_s)
10
+ end
11
+
12
+ def stared_with(definition)
13
+ current_user.stars.find {|star| star.job_definition_id == definition.id }
14
+ end
15
+
16
+ def star_link_for(definition)
17
+ if stared_with(definition)
18
+ link_to(
19
+ raw('<i class="fa fa-star"></i>'),
20
+ job_definition_star_path(id: stared_with(definition), job_definition_id: definition),
21
+ remote: true,
22
+ method: :delete,
23
+ class: 'star',
24
+ data: { definition_id: definition.id, star_id: stared_with(definition).id, definitions_path: job_definitions_path }
25
+ )
26
+ else
27
+ link_to(
28
+ raw('<i class="fa fa-star-o"></i>'),
29
+ job_definition_stars_path(definition.id),
30
+ remote: true,
31
+ method: :post,
32
+ class: 'star',
33
+ data: { definition_id: definition.id, definitions_path: job_definitions_path }
34
+ )
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,71 @@
1
+ module Kuroko2
2
+ module JobInstancesHelper
3
+ def labeled_log_level(level)
4
+ modifier = case level
5
+ when 'INFO'
6
+ 'info'
7
+ when 'ERROR'
8
+ 'danger'
9
+ when 'WARN'
10
+ 'warning'
11
+ else
12
+ 'default'
13
+ end
14
+ content_tag(:span, level, class: "label label-#{modifier}")
15
+ end
16
+
17
+ def labeled_token_status(status)
18
+ modifier = case status
19
+ when 'working'
20
+ 'primary'
21
+ when 'finished'
22
+ 'success'
23
+ when 'waiting'
24
+ 'warning'
25
+ when 'failure'
26
+ 'danger'
27
+ when 'critical'
28
+ 'warning'
29
+ else
30
+ 'default'
31
+ end
32
+ content_tag(:span, status.upcase, class: "label label-#{modifier}")
33
+ end
34
+
35
+ def labeled_status(instance)
36
+ return '--' if instance.nil?
37
+ modifier = case instance.status
38
+ when 'success'
39
+ 'success'
40
+ when 'canceled'
41
+ 'warning'
42
+ when 'error'
43
+ 'danger'
44
+ when 'working'
45
+ 'primary'
46
+ else
47
+ 'default'
48
+ end
49
+ content_tag(:span, instance.status.upcase, class: "label label-#{modifier}")
50
+ end
51
+
52
+ def first_line(lines)
53
+ lines.split("\n").first
54
+ end
55
+
56
+ def distance_of_time(from, to)
57
+ secs = (to - from).to_i
58
+ mins = secs / 60
59
+ hours = mins / 60
60
+ days = hours / 24
61
+
62
+ text = ''
63
+ if days > 0
64
+ text << "#{days}days "
65
+ end
66
+
67
+ text << "#{sprintf('%02d', hours % 24)}:#{sprintf('%02d', mins % 60)}:#{sprintf('%02d', secs % 60)}"
68
+ text
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ module JobSchedulesHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ module LogsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ module SessionsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ module StarsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ module TokensHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ module UsersHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ module WorkersHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kuroko2
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Kuroko2
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: 'from@example.com'
4
+ layout 'mailer'
5
+ end
6
+ end
@@ -0,0 +1,63 @@
1
+ module Kuroko2
2
+ class Notifications < ApplicationMailer
3
+ default(
4
+ from: Kuroko2.config.notifiers.mail.mail_from,
5
+ to: Kuroko2.config.notifiers.mail.mail_to,
6
+ )
7
+ helper_method :job_instance_url
8
+
9
+ def job_failure(job_instance)
10
+ @definition = job_instance.job_definition
11
+ @instance = job_instance
12
+
13
+ attachments.inline['kuroko-logo-horizontal.jpg'] = Kuroko2::Engine.root.join('app/assets/images/kuroko2/kuroko-logo-horizontal.png').read
14
+
15
+ mail(subject: "[CRITICAL] Failed to execute '#{@definition.name}' on kuroko",
16
+ to: @definition.admins.map(&:email),
17
+ cc: Kuroko2.config.notifiers.mail.mail_to)
18
+ end
19
+
20
+ def remind_failure(job_instance)
21
+ @definition = job_instance.job_definition
22
+ @instance = job_instance
23
+
24
+ attachments.inline['kuroko-logo-horizontal.jpg'] = Kuroko2::Engine.root.join('app/assets/images/kuroko2/kuroko-logo-horizontal.png').read
25
+
26
+ mail(subject: "[WARN] '#{@definition.name}' is still in ERROR state",
27
+ to: @definition.admins.map(&:email),
28
+ cc: Kuroko2.config.notifiers.mail.mail_to)
29
+ end
30
+
31
+ def process_absence(execution, hostname)
32
+ @execution = execution
33
+ @definition = execution.job_definition
34
+ @instance = execution.job_instance
35
+ @hostname = hostname
36
+
37
+ mail(subject: '[CRITICAL] Process is not running on kuroko')
38
+ end
39
+
40
+ def executor_not_assigned(execution, hostname)
41
+ @execution = execution
42
+ @definition = execution.job_definition
43
+ @instance = execution.job_instance
44
+
45
+ mail(subject: '[CRITICAL] Process is not assigned to any job-executor')
46
+ end
47
+
48
+ def notify_long_elapsed_time(job_instance)
49
+ @definition = job_instance.job_definition
50
+ @instance = job_instance
51
+
52
+ mail(subject: "[WARN] The running time is longer than expected '#{@definition.name}' on kuroko",
53
+ to: @definition.admins.map(&:email),
54
+ cc: Kuroko2.config.notifiers.mail.mail_to)
55
+ end
56
+
57
+ private
58
+
59
+ def job_instance_url
60
+ job_definition_job_instance_url(@definition, @instance)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,16 @@
1
+ module Kuroko2
2
+ module TableNameCustomizable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ self.table_name = self.kuroko2_table_name
7
+ end
8
+
9
+ module ClassMethods
10
+ def kuroko2_table_name
11
+ Kuroko2.config.table_name_prefix +
12
+ self.name.gsub(/^Kuroko2::/, '').underscore.pluralize
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ class Kuroko2::AdminAssignment < Kuroko2::ApplicationRecord
2
+ include Kuroko2::TableNameCustomizable
3
+
4
+ belongs_to :job_definition
5
+ belongs_to :user
6
+ end
@@ -0,0 +1,10 @@
1
+ class Kuroko2::Api::ApplicationResource
2
+ include Garage::Representer
3
+ include Garage::Authorizable
4
+
5
+ attr_reader :model
6
+
7
+ def initialize(model = nil)
8
+ @model = model
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ class Kuroko2::Api::JobInstanceResource < Kuroko2::Api::ApplicationResource
2
+ property :id
3
+
4
+ property :status
5
+
6
+ delegate :id, :status, to: :model
7
+ end
@@ -0,0 +1,5 @@
1
+ module Kuroko2
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,55 @@
1
+ class Kuroko2::Execution < Kuroko2::ApplicationRecord
2
+ include Kuroko2::TableNameCustomizable
3
+
4
+ DEFAULT_QUEUE = '@default'
5
+
6
+ scope :of, ->(token) { where(token: token) }
7
+ scope :with, ->(queue) { where(queue: queue) }
8
+ scope :unstarted, -> { where(started_at: nil) }
9
+ scope :started, -> { where.not(started_at: nil) }
10
+
11
+ serialize :context, JSON
12
+
13
+ belongs_to :job_definition
14
+ belongs_to :job_instance
15
+ belongs_to :token, optional: true
16
+
17
+ has_one :worker
18
+
19
+ before_create :set_default_values
20
+
21
+ delegate :log_memory_consumption, to: :job_instance
22
+
23
+ def completed?
24
+ started_at? && finished_at?
25
+ end
26
+
27
+ def success?
28
+ exit_status == 0
29
+ end
30
+
31
+ def self.poll(queue = DEFAULT_QUEUE)
32
+ self.transaction do
33
+ unstarted.with(queue).lock.take.tap do |execution|
34
+ execution.touch(:started_at) if execution
35
+ end
36
+ end
37
+ end
38
+
39
+ def finish(output:, exit_status:)
40
+ update!(output: output, exit_status: exit_status, finished_at: Time.now)
41
+ job_definition.memory_expectancy.calculate!
42
+ end
43
+
44
+ def finish_by_signal(output:, term_signal:)
45
+ update!(output: output, term_signal: term_signal, finished_at: Time.now)
46
+ job_definition.memory_expectancy.calculate!
47
+ end
48
+
49
+ private
50
+
51
+ def set_default_values
52
+ self.uuid ||= SecureRandom.uuid
53
+ self.context ||= {}
54
+ end
55
+ end