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,19 @@
1
+ - @title = "##{@definition.id} #{@definition.name} « Jobs"
2
+ - @content_title = "Job Instance Details"
3
+
4
+ - content_for :breadcrumb do
5
+ ol.breadcrumb
6
+ li= link_to raw('<i class="fa fa-database"></i> Job Definitions'), job_definitions_path
7
+ li= link_to 'Definition Details', job_definition_path(@definition.id)
8
+ li.active Job Instance
9
+
10
+ .row
11
+ .col-md-6#instance-holder
12
+ = render 'instance'
13
+
14
+ .col-md-6#tokens-holder
15
+ = render template: 'kuroko2/tokens/index'
16
+
17
+ .row
18
+ .col-md-12#logs-holder
19
+ = render template: 'kuroko2/logs/index'
@@ -0,0 +1,37 @@
1
+ - @title = "Working Jobs"
2
+ - @content_title = '<i class="fa fa-spinner"></i> Working Jobs'
3
+
4
+ .box
5
+ .box-header
6
+ .row
7
+ .col-md-4
8
+ h3.box-title Working Jobs
9
+ - if @instances.empty?
10
+ .box-body
11
+ .text-muted.well.well-sm.no-shadow There are no working jobs.
12
+ - else
13
+ .box-body.table-responsive
14
+ table.table.table-hover
15
+ tbody
16
+ tr
17
+ th #
18
+ th Status
19
+ th Job Name
20
+ th Job Description
21
+ th Admins
22
+ th Started at
23
+ th &nbsp;
24
+ - for instance in @instances
25
+ - definition = instance.job_definition
26
+ tr
27
+ td= instance.id
28
+ td= labeled_status(instance)
29
+ td.no-decorate= link_to definition.name, job_definition_job_instance_path(instance.job_definition, instance)
30
+ td= first_line(definition.description)
31
+ td.no-decorate
32
+ - definition.admins.each do |user|
33
+ = link_to user.name, user_path(user)
34
+ br
35
+ td.nowrap= l(instance.created_at, format: :short)
36
+ td
37
+ = link_to raw('<i class="fa fa-chevron-right"></i>Details'), job_definition_job_instance_path(job_definition_id: instance.job_definition.id, id: instance.id), class: 'btn btn-default btn-xs'
@@ -0,0 +1,32 @@
1
+ .box#schedules data-schedules-path="#{job_definition_job_schedules_path(@definition)}"
2
+ .box-header
3
+ .row
4
+ .col-md-12
5
+ h3.box-title <i class="fa fa-calendar" aria-hidden="true"></i> Job&nbsp;Schedules
6
+
7
+ .box-body
8
+ - if @schedules.present?
9
+ .no-padding
10
+ table.table.table-condensed
11
+ tbody
12
+ tr
13
+ th CRON
14
+ th Next
15
+ th &nbsp;
16
+ - for schedule in @schedules
17
+ tr
18
+ td
19
+ .log= schedule.cron
20
+ td
21
+ - next_schedule = schedule.next
22
+ = next_schedule ? l(next_schedule, format: :short) : '-'
23
+ td= link_to 'Delete', job_definition_job_schedule_path(job_definition_id: @definition.id, id: schedule.id), class: 'btn btn-default btn-xs', method: :delete, remote: true
24
+ - else
25
+ .text-muted.well.well-sm.no-shadow There are no schedules.
26
+ = form_for([@definition, @schedule], remote: true) do |form|
27
+ .box-body
28
+ #cron-field.row.form-group
29
+ .col-md-8
30
+ = form.text_field :cron, class: 'form-control script-input', placeholder: '0 9 * * *'
31
+ .col-md-4
32
+ = form.submit 'Add Schedule', class: 'btn btn-default btn-block'
@@ -0,0 +1,27 @@
1
+ .box#suspend-schedules data-suspend-schedules-path="#{job_definition_job_suspend_schedules_path(@definition)}"
2
+ .box-header
3
+ .row
4
+ .col-md-12
5
+ h3.box-title <i class="fa fa-minus-square" aria-hidden="true"></i> Job&nbsp;Suspend Schedules
6
+ .box-body
7
+ - if @suspend_schedules.present?
8
+ .no-padding
9
+ table.table.table-condensed
10
+ tbody
11
+ tr
12
+ th CRON
13
+ th &nbsp;
14
+ - for schedule in @suspend_schedules
15
+ tr
16
+ td
17
+ .log= schedule.cron
18
+ td= link_to 'Delete', job_definition_job_suspend_schedule_path(job_definition_id: @definition.id, id: schedule.id), class: 'btn btn-default btn-xs', method: :delete, remote: true
19
+ - else
20
+ .text-muted.well.well-sm.no-shadow There are no suspend schedules.
21
+ = form_for([@definition, @suspend_schedule], remote: true) do |form|
22
+ .box-body
23
+ #suspend-cron-field.row.form-group
24
+ .col-md-8
25
+ = form.text_field :cron, class: 'form-control script-input', placeholder: '0 9 * * *'
26
+ .col-md-4
27
+ = form.submit 'Add Suspend Schedule', class: 'btn btn-default btn-block'
@@ -0,0 +1,11 @@
1
+ json.start @start_at.strftime('%Y-%m-%d %H:%M:%S')
2
+ json.end @end_at.strftime('%Y-%m-%d %H:%M:%S')
3
+ json.data do
4
+ json.array! @instances do |instance|
5
+ json.id instance.id
6
+ json.content "<a href='#{job_definition_job_instance_path(instance.job_definition, instance)}'>##{instance.job_definition.id} #{instance.job_definition.name}</a>"
7
+ json.start instance.created_at.strftime('%Y-%m-%d %H:%M:%S')
8
+ json.end (instance.error_at || instance.canceled_at || instance.finished_at).try!(:strftime, '%Y-%m-%d %H:%M:%S')
9
+ json.group instance.job_definition.id
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+ - @title = "Job Timelines"
2
+ - @content_title = "<i class=\"fa fa-clock-o\"></i> #{@user.name}'s Job Timelines"
3
+ - @content_title << " tagged by #{params[:tag].join(',')}" if params[:tag].present?
4
+
5
+ .row
6
+ .col-md-12
7
+ .box
8
+ .box-header
9
+ nav class="navbar navbar-default"
10
+ div class="container-fluid"
11
+ div class="navbar-header"
12
+ a class="navbar-brand" href="#" Period
13
+ div class="" id="period-nav"
14
+ ul class="nav navbar-nav"
15
+ li class="#{params[:period] == '1h' || !params[:period] ? 'active' : ''}"
16
+ = link_to '1 hour', job_timelines_path(params.permit(:user_id, tag: []).merge(period: '1h'))
17
+ li class="#{params[:period] == '3h' ? 'active' : ''}"
18
+ = link_to '3 hours', job_timelines_path(params.permit(:user_id, tag: []).merge(period: '3h'))
19
+ li class="#{params[:period] == '6h' ? 'active' : ''}"
20
+ = link_to '6 hours', job_timelines_path(params.permit(:user_id, tag: []).merge(period: '6h'))
21
+ li class="#{params[:period] == '12h' ? 'active' : ''}"
22
+ = link_to '12 hours', job_timelines_path(params.permit(:user_id, tag: []).merge(period: '12h'))
23
+ li class="#{params[:period] == '1d' ? 'active' : ''}"
24
+ = link_to '1 day', job_timelines_path(params.permit(:user_id, tag: []).merge(period: '1d'))
25
+ li class="#{params[:period] == '3d' ? 'active' : ''}"
26
+ = link_to '3 days', job_timelines_path(params.permit(:user_id, tag: []).merge(period: '3d'))
27
+ li class="#{params[:period] == '1w' ? 'active' : ''}"
28
+ = link_to '1 week', job_timelines_path(params.permit(:user_id, tag: []).merge(period: '1w'))
29
+
30
+ .box-body
31
+ div#timeline data-dataset-path="#{dataset_job_timelines_path(params.permit(:user_id, :period, tag: []))}"
@@ -0,0 +1,15 @@
1
+ .row
2
+ .col-xs-4
3
+ - unless current_page.first?
4
+ = link_to('« New',
5
+ paged_job_definition_job_instances_path(job_definition_id: @definition.id, page: current_page - 1),
6
+ class: 'btn btn-default btn-sm btn-block', role: 'button', remote: true)
7
+ - else
8
+ a.btn.btn-default.btn-sm.btn-block.disabled role='button' « New
9
+ .col-xs-4.col-xs-offset-4
10
+ - unless current_page.last?
11
+ = link_to('Old »',
12
+ paged_job_definition_job_instances_path(job_definition_id: @definition.id, page: current_page + 1),
13
+ class: 'btn btn-default btn-sm btn-block', role: 'button', remote: true)
14
+ - else
15
+ button.btn.btn-default.btn-sm.btn-block.disabled role='button' Old »
@@ -0,0 +1,17 @@
1
+ .row
2
+ .col-xs-4
3
+ - unless current_page.first?
4
+ - if params[:q].present? || params[:tag].present?
5
+ = link_to_previous_page(@scope, '« Prev', class: 'btn btn-default btn-sm btn-block', role: 'button', params: { q: params[:q], tag: params[:tag] }, remote: remote)
6
+ - else
7
+ = link_to_previous_page(@scope, '« Prev', class: 'btn btn-default btn-sm btn-block', role: 'button', remote: remote)
8
+ - else
9
+ a.btn.btn-default.btn-sm.btn-block.disabled role='button' « Prev
10
+ .col-xs-4.col-xs-offset-4
11
+ - unless current_page.last?
12
+ - if params[:q].present? || params[:tag].present?
13
+ = link_to_next_page(@scope, 'Next »', class: 'btn btn-default btn-sm btn-block', role: 'button', params: { q: params[:q], tag: params[:tag] }, remote: remote)
14
+ - else
15
+ = link_to_next_page(@scope, 'Next »', class: 'btn btn-default btn-sm btn-block', role: 'button', remote: remote)
16
+ - else
17
+ button.btn.btn-default.btn-sm.btn-block.disabled role='button' Next »
@@ -0,0 +1,68 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title #{@title} « Kuroko 2
5
+ meta charset='UTF-8'
6
+ meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'
7
+ link rel='icon' href='/favicon.ico'
8
+ link type='application/opensearchdescription+xml' rel='search' href='#{osd_path(format: 'xml')}' title='Kuroko2'
9
+ = csrf_meta_tag
10
+ = stylesheet_link_tag 'application'
11
+ = javascript_include_tag 'application'
12
+
13
+ body.skin-black
14
+ header.header
15
+ = link_to 'Kuroko 2', root_path, class: 'logo'
16
+ nav.navbar.navbar-static-top role='navigation'
17
+ a.navbar-btn.sidebar-toggle data-toggle='offcanvas' role='button' href='#'
18
+ span.sr-only Toggle navigation
19
+ span.icon-bar
20
+ span.icon-bar
21
+ span.icon-bar
22
+ .navbar-right
23
+ ul.nav.navbar-nav
24
+ li.dropdown
25
+ = link_to raw('<i class="fa fa-sign-out"></i> Sign out'), sign_out_path, method: :delete
26
+ .wrapper.row-offcanvas.row-offcanvas-left
27
+ aside.left-side.sidebar-offcanvas
28
+ section.sidebar
29
+ .user-panel
30
+ .pull-left.image
31
+ img.img-circle src='#{current_user.image}' alt="#{current_user.name}"
32
+ .pull-left.info
33
+ p Hello, #{current_user.name}
34
+ ul.sidebar-menu
35
+ li class=('active' if controller_name == 'dashboard')
36
+ = link_to raw('<i class="fa fa-dashboard"></i> Dashboard'), root_path
37
+ li
38
+ a name="#"
39
+ i.fa.fa-database
40
+ 'Job Definitions
41
+ ul.menu-child
42
+ li.menu-child-item class=('active' if controller_name == 'job_definitions' && action_name == 'index')
43
+ = link_to raw('<i class="fa fa-angle-double-right"></i> All Job Definitions'), job_definitions_path
44
+ li.menu-child-item class=('active' if controller_name == 'job_definitions' && action_name == 'new')
45
+ = link_to raw('<i class="fa fa-angle-double-right"></i> Create New'), new_job_definition_path
46
+ li class=('active' if controller_name == 'job_instances' && action_name == 'working')
47
+ = link_to raw('<i class="fa fa-spinner"></i> Working Jobs'), working_job_instances_path
48
+ li class=('active' if controller_name == 'workers')
49
+ = link_to raw('<i class="fa fa-rocket"></i> Kuroko Workers'), workers_path
50
+ li
51
+ a name="#"
52
+ i.fa.fa-users
53
+ 'Users
54
+ ul.menu-child
55
+ li.menu-child-item class=('active' if controller_name == 'users' && action_name == 'index' && !params[:target])
56
+ = link_to raw('<i class="fa fa-angle-double-right"></i> All '), users_path
57
+ li.menu-child-item class=('active' if controller_name == 'users' && params[:target] == 'group')
58
+ = link_to raw('<i class="fa fa-angle-double-right"></i> Groups'), users_path(target: 'group')
59
+
60
+ aside.right-side
61
+ section.content-header
62
+ h1= raw(@content_title || @title)
63
+ = yield :breadcrumb
64
+ section.content
65
+ .container-fluid
66
+ .row
67
+ .col-xs-12
68
+ = yield
@@ -0,0 +1,33 @@
1
+ ul class="nav nav-pills" role="tablist"
2
+ li role="presentation" class="active"
3
+ a href="#logs" aria-controls="logs" role="tab" data-toggle="tab"
4
+ 'Logs
5
+ li role="presentation"
6
+ a href="#execution_logs" aria-controls="execution_logs" role="tab" data-toggle="tab"
7
+ 'Execution Logs
8
+ .box
9
+ .box-header
10
+ .box-body.tab-content
11
+ div class="tab-pane active" role="tabpanel" id="logs" data-logs-path="#{job_definition_job_instance_logs_path(@definition, @instance)}"
12
+ table.table.table-condensed.table-hover data-reload="#{@instance.working? && !@instance.error?}"
13
+ thead
14
+ tr
15
+ th.col-md-1 &nbsp;
16
+ th.col-md-1 Time
17
+ th.col-md-10 Message
18
+ - for log in @logs
19
+ tr
20
+ td= labeled_log_level(log.level)
21
+ td.nowrap= l(log.created_at, format: :short)
22
+ td.log= rinku_auto_link(log.message, :urls)
23
+ = javascript_include_tag 'kuroko2/instance_linker'
24
+
25
+ div class="tab-pane" role="tabpanel" id="execution_logs" data-api-path="#{job_definition_job_instance_execution_logs_path(@definition, @instance)}" data-logger="#{Kuroko2.config.execution_logger.try!(:type)}"
26
+ table.table.table-condensed.table-hover
27
+ thead
28
+ tr
29
+ th.col-md-1 Time
30
+ th.col-md-1 PID
31
+ th.col-md-2 Token
32
+ th.col-md-8 Message
33
+ tbody#execution_log_body
@@ -0,0 +1,22 @@
1
+ The following process is not assigned to any executor on <%= @hostname %>.
2
+
3
+ - Name: <%= @definition.name %>
4
+ - URL: <%= job_instance_url %>
5
+ - Command: <%= @execution.shell %>
6
+ - Context: <%= @execution.context %>
7
+ - Created at: <%= @execution.created_at %>
8
+ - Started at: <%= @execution.started_at %>
9
+ <% if @instance.logs.any? %>
10
+
11
+ Logs
12
+ ```
13
+ <% for log in @instance.logs -%>
14
+ <%= "%s %-5s: %s" % [log.created_at.iso8601, log.level, log.message] %>
15
+ <% end -%>
16
+ ```
17
+ <% else -%>
18
+ <% end -%>
19
+
20
+ Thanks,
21
+ --
22
+ Kuroko
@@ -0,0 +1,21 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title Failed to execute "#{@definition.name}" on Kuroko
5
+ meta charset='UTF-8'
6
+ meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'
7
+ body
8
+ h1= image_tag attachments['kuroko-logo-horizontal.jpg'].url, width: 290, height: 100
9
+ p The following error has occurred while processing your job:​
10
+
11
+ ul
12
+ li
13
+ b> Name:
14
+ = @definition.name
15
+ li
16
+ b> URL:
17
+ = job_instance_url
18
+
19
+ h2 Logs
20
+ pre style="margin: 5px; padding: 10px; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; white-space: pre; overflow: scroll;"
21
+ code=@instance.logs.map { |log| "#{log.created_at.iso8601}: #{log.message}" }.join("\n")
@@ -0,0 +1,18 @@
1
+ The following error has occurred while processing your job:
2
+
3
+ - Name: <%= @definition.name %>
4
+ - URL: <%= job_instance_url %>
5
+ <% if @instance.logs.any? %>
6
+
7
+ Logs
8
+ ```
9
+ <% for log in @instance.logs -%>
10
+ <%= "%s %-5s: %s" % [log.created_at.iso8601, log.level, log.message] %>
11
+ <% end -%>
12
+ ```
13
+ <% else -%>
14
+ <% end -%>
15
+
16
+ Thanks,
17
+ --
18
+ Kuroko
@@ -0,0 +1,9 @@
1
+ The following job running time is longer than `EXPECTED_TIME`
2
+ (If you do not set `EXPECTED_TIME`, the default time is 24 hours.)
3
+
4
+ - Name: <%= @definition.name %>
5
+ - URL: <%= job_instance_url %>
6
+
7
+ Thanks,
8
+ --
9
+ Kuroko
@@ -0,0 +1,22 @@
1
+ The following process is not running on <%= @hostname %>.
2
+
3
+ - Name: <%= @definition.name %>
4
+ - URL: <%= job_instance_url %>
5
+ - Command: <%= @execution.shell %>
6
+ - Context: <%= @execution.context %>
7
+ - Created at: <%= @execution.created_at %>
8
+ - Started at: <%= @execution.started_at %>
9
+ <% if @instance.logs.any? %>
10
+
11
+ Logs
12
+ ```
13
+ <% for log in @instance.logs -%>
14
+ <%= "%s %-5s: %s" % [log.created_at.iso8601, log.level, log.message] %>
15
+ <% end -%>
16
+ ```
17
+ <% else -%>
18
+ <% end -%>
19
+
20
+ Thanks,
21
+ --
22
+ Kuroko
@@ -0,0 +1,21 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title Failed to execute "#{@definition.name}" on Kuroko
5
+ meta charset='UTF-8'
6
+ meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'
7
+ body
8
+ h1= image_tag attachments['kuroko-logo-horizontal.jpg'].url, width: 290, height: 100
9
+ p
10
+ ' This is a reminder mail. The following job is still in
11
+ span> style="color: #e75521; font-weight: bold;" ERROR
12
+ ' state.
13
+ ul
14
+ li
15
+ b> Name:
16
+ = @definition.name
17
+ li
18
+ b> URL:
19
+ = job_instance_url
20
+
21
+ p Please fix the error and retry or cancel the job.
@@ -0,0 +1,10 @@
1
+ The following job is still ERROR.
2
+
3
+ - Name: <%= @definition.name %>
4
+ - URL: <%= job_instance_url %>
5
+
6
+ Please fix the error and retry or cancel the job.
7
+
8
+ Thanks,
9
+ --
10
+ Kuroko
@@ -0,0 +1,20 @@
1
+ - @title = 'Sign in'
2
+
3
+ doctype html
4
+ html.bg-black
5
+ head
6
+ title #{@title} « Kuroko 2
7
+ meta charset='UTF-8'
8
+ meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'
9
+ = stylesheet_link_tag 'kuroko2/application'
10
+ = javascript_include_tag 'kuroko2/application'
11
+ body.bg-black
12
+ #login-box.form-box
13
+ .header Sign In
14
+ .body
15
+ p.lead Please sign in with Google account.
16
+ .text-center
17
+ a.btn.btn-social.btn-google-plus href=auth_path("google_oauth2", state: params[:return_to])
18
+ i.fa.fa-google-plus
19
+ span Sign in with Google
20
+ .footer
@@ -0,0 +1,42 @@
1
+ - @instance.tokens.any?
2
+ .box#tokens data-tokens-path="#{job_definition_job_instance_tokens_path(@definition, @instance)}"
3
+ .box-header
4
+ .row
5
+ .col-md-8
6
+ h3.box-title Working Tokens
7
+ .col-md-4.right-button
8
+ = link_to 'Cancel', job_definition_job_instance_path(@definition, @instance), class: 'btn btn-default btn-block btn-small pull-right', role: 'button', method: :delete, disabled: !@instance.cancelable?
9
+ .box-body.table-responsive
10
+ .row
11
+ .col-md-12
12
+ table.table.table-condensed.table-hover
13
+ - for token in @instance.tokens
14
+ tr
15
+ td.col-md-1= labeled_token_status(token.status_name)
16
+ td.col-md-2= truncate(token.uuid, length: 11)
17
+ td.col-md-3= token.path
18
+ td.col-md-3= button_to('Retry',
19
+ job_definition_job_instance_token_path(job_definition_id: @definition.id, job_instance_id: @instance.id, id: token.id),
20
+ method: :patch,
21
+ params: { invoke: 'retry' },
22
+ class: 'btn btn-default btn-block btn-xs',
23
+ role: 'button',
24
+ disabled: !token.failure?)
25
+ td.col-md-3= button_to('Skip',
26
+ job_definition_job_instance_token_path(job_definition_id: @definition.id, job_instance_id: @instance.id, id: token.id),
27
+ method: :patch,
28
+ params: { invoke: 'skip' },
29
+ class: 'btn btn-default btn-block btn-xs',
30
+ role: 'button',
31
+ disabled: !token.failure?,
32
+ data: { confirm: 'Continue executing job script? If not, use "Cancel" button.' })
33
+ - if (execution = token.execution)
34
+ tr
35
+ td &nbsp;
36
+ td colspan='3' = execution.shell
37
+ td colspan='2' = button_to('Terminate',
38
+ job_definition_job_instance_execution_path(job_definition_id: @definition.id, job_instance_id: @instance.id, id: execution.id),
39
+ method: :delete,
40
+ class: 'btn btn-default btn-block btn-xs',
41
+ role: 'button',
42
+ disabled: !execution.pid?)
@@ -0,0 +1,55 @@
1
+ - @title = 'Users' + (params[:target] == 'group' ? ' > Groups' : '')
2
+ - @content_title = "<i class=\"fa fa-users\"></i> Users#{params[:target] == 'group' ? ' <i class="fa fa-angle-double-right"></i> Groups' : ''}"
3
+ - @scope = @users
4
+
5
+ - if @user.errors.any?
6
+ .alert.alert-danger
7
+ i.fa.fa-ban
8
+ h4 #{pluralize(@user.errors.count, "error")} prohibited this employee from being saved:
9
+ ul
10
+ - @user.errors.full_messages.each do |message|
11
+ li= message
12
+
13
+ .row
14
+ .col-md-7
15
+ .box
16
+ .box-header
17
+ h3.box-title All Users
18
+ .box-body.table-responsive.no-padding
19
+ table#users.table.table-hover data-definitions-path="#{users_path}"
20
+ thead
21
+ tr
22
+ th #
23
+ th.col-md-5 Name
24
+ th.col-md-5 Email
25
+ th.col-md-1 &nbsp;
26
+ th.col-md-1 &nbsp;
27
+ tbody
28
+ - for user in @users do
29
+ tr
30
+ td= user.id
31
+ td.no-decorate= link_to user.name, user_path(user)
32
+ td= user.email
33
+ td
34
+ - unless user.google_account?
35
+ span.label.label-default Group
36
+ - if user.suspended_at?
37
+ span.label.label-warning Suspended
38
+ td= link_to raw('<i class="fa fa-chevron-right"></i> View Details'), user, class: 'btn btn-sm btn-default'
39
+ .box-footer
40
+ = paginate @users, theme: 'list'
41
+
42
+ .col-md-5
43
+ .box
44
+ .box-header
45
+ h3.box-title New Mail Address
46
+ .box-body
47
+ = form_for @user, url: users_path, role: 'form', method: :post do |form|
48
+ .form-group
49
+ = form.label :name
50
+ = form.text_field :name, class: 'form-control', placeholder: 'Group Name'
51
+ .form-group
52
+ = form.label :email
53
+ = form.text_field :email, class: 'form-control', placeholder: 'group@example.com'
54
+ .form-group
55
+ = form.submit 'Add mail address', class: 'btn btn-default'
@@ -0,0 +1,76 @@
1
+ - @title = "#{@user.name} « Users"
2
+ - @content_title = "<i class='fa fa-user'></i> User Details"
3
+
4
+ - content_for :breadcrumb do
5
+ ol.breadcrumb
6
+ li= link_to raw('<i class="fa fa-users"></i> Users'), users_path
7
+ li.active Details
8
+
9
+ .row
10
+ .col-md-12
11
+ .box
12
+ .box-header
13
+ h2.box-title ##{@user.id} #{@user.name}
14
+ .box-body.table-responsive
15
+ .row
16
+ .col-md-2.visible-lg-block.visible-md-block
17
+ img.img-circle src='#{@user.image}' alt="#{@user.name}"
18
+ .col-md-7
19
+ table.table
20
+ tr
21
+ th.col-md-2 Name
22
+ td= @user.name
23
+ tr
24
+ th.col-md-2 Email
25
+ td= @user.email
26
+ - unless @user.google_account?
27
+ th Note
28
+ td This account is group account.
29
+ .box-footer
30
+ .row
31
+ .col-md-3.col-md-offset-9
32
+ = link_to 'Destroy User', @user, method: :delete, class: 'btn btn-default btn-block', role: 'button', disabled: @user.google_account?, data: { confirm: 'Are you sure?' }
33
+ .col-md-7
34
+ .box#definitions
35
+ .box-header
36
+ .row
37
+ .col-md-9
38
+ h2.box-title
39
+ '#{@user.name}'s Job Definitions
40
+ - if @input_tags.present?
41
+ 'tagged by #{@input_tags.join(',')}
42
+ .col-md-3.right-button
43
+ = link_to raw('<i class="fa fa-clock-o"></i> Show Timeline'), job_timelines_path({ user_id: @user.id }.merge(params.permit(tag: []).to_h)), class: 'btn btn-default btn-small btn-block js-to-timeline'
44
+
45
+ .box-body.table-responsive#definitions_list
46
+ = render 'kuroko2/job_definitions/list', { definitions: @definitions }
47
+
48
+ .col-md-5
49
+ .box#tags
50
+ = render 'kuroko2/dashboard/taglist', { input_tags: @input_tags, related_tags: @related_tags }
51
+
52
+ .col-md-5
53
+ .box#instances
54
+ .box-header
55
+ h2.box-title Working Jobs
56
+ - if @instances.any?
57
+ .box-body.table-responsive
58
+ table.table.table-hover
59
+ tbody
60
+ tr
61
+ th #
62
+ th Status
63
+ th Job Definition Name
64
+ th Started at
65
+ th &nbsp;
66
+ - for instance in @instances
67
+ tr
68
+ td= instance.id
69
+ td= labeled_status(instance)
70
+ td.no-decorate= link_to instance.job_definition.name, job_definition_job_instance_path(instance.job_definition, instance)
71
+ td.nowrap= l(instance.created_at, format: :short)
72
+ td
73
+ = link_to raw('<i class="fa fa-chevron-right"></i>Details'), job_definition_job_instance_path(instance.job_definition, instance), class: 'btn btn-default btn-xs'
74
+ - else
75
+ .box-body
76
+ .text-muted.well.well-sm.no-shadow There are no working jobs.