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,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,13 @@
1
+ - add_params = {} if add_params.nil?
2
+ .box-header
3
+ h2.box-title
4
+ i.fa.fa-tags
5
+ ' Tags
6
+ .box-body.table-responsive
7
+ ul.list-inline
8
+ - for tag in related_tags
9
+ li
10
+ - if input_tags.include?(tag.name)
11
+ =link_to tag.name, add_params.to_h.merge({ tag: input_tags - [tag.name] }), class: 'label label-primary js-narrow-tag', data: { remote: "true" }
12
+ - else
13
+ =link_to tag.name, add_params.to_h.merge({ tag: [tag.name] | input_tags }), class: 'label label-default js-narrow-tag', data: { remote: "true" }
@@ -0,0 +1,49 @@
1
+ - @title = 'Dashboard'
2
+ - @content_title = '<i class="fa fa-dashboard"></i> Dashboard'
3
+
4
+ .row
5
+ .col-md-7
6
+ .box#definitions
7
+ .box-header
8
+ .row
9
+ .col-md-9
10
+ h2.box-title
11
+ i.fa.fa-star
12
+ ' Favorite Job Definitions
13
+ - if @input_tags.present?
14
+ 'tagged by #{@input_tags.join(',')}
15
+ .col-md-3.right-button
16
+ = link_to raw('<i class="fa fa-clock-o"></i> Show Timeline'), job_timelines_path(params.permit(tag: [])), class: 'btn btn-default btn-small btn-block js-to-timeline'
17
+
18
+ .box-body.table-responsive#definitions_list
19
+ = render 'kuroko2/job_definitions/list', { definitions: @definitions }
20
+ .col-md-5
21
+ .box#tags
22
+ = render 'taglist', { input_tags: @input_tags, related_tags: @related_tags }
23
+ .col-md-5
24
+ .box#instances
25
+ .box-header
26
+ h2.box-title
27
+ i.fa.fa-star
28
+ ' Working Jobs of Your Favorites
29
+ - if @instances.any?
30
+ .box-body.table-responsive
31
+ table.table.table-hover
32
+ tbody
33
+ tr
34
+ th #
35
+ th Status
36
+ th Job Definition Name
37
+ th Started at
38
+ th &nbsp;
39
+ - for instance in @instances
40
+ tr
41
+ td= instance.id
42
+ td= labeled_status(instance)
43
+ td.no-decorate= link_to instance.job_definition.name, job_definition_job_instance_path(instance.job_definition, instance)
44
+ td.nowrap= l(instance.created_at, format: :short)
45
+ td
46
+ = 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'
47
+ - else
48
+ .box-body
49
+ .text-muted.well.well-sm.no-shadow There are no working jobs.
@@ -0,0 +1,16 @@
1
+ json.token @response.next_forward_token
2
+ json.events do
3
+ json.array! @response.events do |event|
4
+ json.timestamp l(Time.at(event.timestamp/1000), format: :short)
5
+ begin
6
+ log = JSON.parse(event.message)
7
+ json.message rinku_auto_link(html_escape(log['message']), :urls)
8
+ json.pid log['pid']
9
+ json.uuid log['uuid']
10
+ rescue JSON::ParserError
11
+ json.message rinku_auto_link(html_escape(event.message), :urls)
12
+ end
13
+ end
14
+ end
15
+
16
+ # vim: set ft=ruby:
@@ -0,0 +1,35 @@
1
+ - @title = 'Executions'
2
+ - @content_title = '<i class="fa fa-tasks"></i> Executions'
3
+
4
+ .box
5
+ .box-header
6
+ .row
7
+ .col-md-4
8
+ h3.box-title Executions
9
+ - if @executions.empty?
10
+ .box-body
11
+ .text-muted.well.well-sm.no-shadow There are no working executions.
12
+ - else
13
+ .box-body.table-responsive
14
+ table.table.table-hover
15
+ thead
16
+ tr
17
+ th Status
18
+ th Queue
19
+ th Job Name
20
+ th Job Description
21
+ th Created at
22
+ th Started at
23
+ th
24
+ tbody
25
+ - @executions.each do |execution|
26
+ tr
27
+ td= content_tag(:span, execution.started_at? ? 'running' : 'waiting', class: "label label-#{execution.started_at? ? 'info' : 'warning'}")
28
+ td= execution.queue
29
+ td= execution.job_instance.job_definition.name
30
+ td= first_line(execution.job_definition.description)
31
+ td= l(execution.created_at, format: :short)
32
+ td= execution.started_at.try! { |at| l(at, format: :short) }
33
+ td= link_to(job_definition_job_instance_path(job_definition_id: execution.job_instance.job_definition.id, id: execution.job_instance.id), class: 'btn btn-default btn-xs') do
34
+ i.fa.fa-chevron-right
35
+ |Details
@@ -0,0 +1,13 @@
1
+ json.start @start_at.try!(: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! @logs do |log|
5
+ json.x log.created_at.strftime('%Y-%m-%d %H:%M:%S')
6
+ json.y log.execution_minutes
7
+ json.label do
8
+ json.content log.execution_minutes
9
+ json.className 'vis-graph-label'
10
+ end
11
+ json.group 'execution-time'
12
+ end
13
+ end
@@ -0,0 +1,48 @@
1
+ - @title = 'Job Definition Stats'
2
+ - @content_title = '<i class="fa fa-bar-chart"></i> Job Definition Stats'
3
+
4
+ - content_for :breadcrumb do
5
+ ol.breadcrumb
6
+ li= link_to job_definitions_path do
7
+ i class="fa fa-database"
8
+ Job Definitions
9
+ li= link_to 'Details', job_definition_path(@definition)
10
+ li.active Stats
11
+
12
+ .row
13
+ .col-md-12
14
+ h3 ##{@definition.id} #{@definition.name}
15
+
16
+ .box
17
+ nav class="navbar navbar-default"
18
+ div class="container-fluid"
19
+ div class="navbar-header"
20
+ a class="navbar-brand" href="#" Period
21
+ div class="" id="period-nav"
22
+ ul class="nav navbar-nav"
23
+ li class="#{params[:period] == '1d' ? 'active' : ''}"
24
+ = link_to '1 day', job_definition_job_definition_stats_path(@definition, period: '1d')
25
+ li class="#{params[:period] == '3d' ? 'active' : ''}"
26
+ = link_to '3 days', job_definition_job_definition_stats_path(@definition, period: '3d')
27
+ li class="#{params[:period] == '1w' ? 'active' : ''}"
28
+ = link_to '1 week', job_definition_job_definition_stats_path(@definition, period: '1w')
29
+ li class="#{params[:period] == '2w' ? 'active' : ''}"
30
+ = link_to '2 weeks', job_definition_job_definition_stats_path(@definition, period: '2w')
31
+
32
+ li class="#{params[:period] == '1m' ? 'active' : ''}"
33
+ = link_to '1 month', job_definition_job_definition_stats_path(@definition, period: '1m')
34
+ li class="#{params[:period] == '2m' ? 'active' : ''}"
35
+ = link_to '2 months', job_definition_job_definition_stats_path(@definition, period: '2m')
36
+ li class="#{params[:period] == '3m' ? 'active' : ''}"
37
+ = link_to '3 months', job_definition_job_definition_stats_path(@definition, period: '3m')
38
+
39
+ .box
40
+ .box-header
41
+ h3.box-title Execution Time
42
+ .box-body
43
+ div#execution-time data-execution-time-path="#{execution_time_job_definition_job_definition_stats_path(@definition, period: params[:period])}"
44
+ .box
45
+ .box-header
46
+ h3.box-title Memory Usage
47
+ .box-body
48
+ div#memory data-memory-path="#{memory_job_definition_job_definition_stats_path(@definition, period: params[:period])}"
@@ -0,0 +1,10 @@
1
+ json.start @start_at.try!(: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! @logs do |log|
5
+ json.x log.job_instance.created_at.strftime('%Y-%m-%d %H:%M:%S')
6
+ json.y log.value
7
+ json.label "##{log.job_instance.id}"
8
+ json.group 'memory'
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ - if @definition.errors.any?
2
+ .alert.alert-danger
3
+ i.fa.fa-ban
4
+ h4 #{pluralize(@definition.errors.count, "error")} prohibited this employee from being saved:
5
+ ul
6
+ - @definition.errors.full_messages.each do |message|
7
+ li= message
@@ -0,0 +1,93 @@
1
+ .box-body
2
+ = form_for @definition, html: { role: 'form' } do |form|
3
+ .row.form-group
4
+ .col-md-4
5
+ = form.label :name
6
+ = form.text_field :name, class: 'form-control'
7
+ .form-group
8
+ = form.label :description
9
+ = form.text_area :description, class: 'form-control', rows: 10
10
+ .form-group
11
+ label Administrators
12
+ - if @definition.new_record?
13
+ ul.media-list
14
+ li.media
15
+ span.pull-left
16
+ img.img-rounded src="#{current_user.image}" height='20' width='20'
17
+ .media-body
18
+ = current_user.name
19
+ - else
20
+ = collection_select(:admin_assignments, :user_id, Kuroko2::User.active.order(:name).all, :id, :name,
21
+ { selected: @definition.admins.map(&:id), include_blank: false },
22
+ { multiple: true, class: 'form-control' })
23
+
24
+ .form-group
25
+ = form.label :script
26
+ = form.text_area :script, class: 'form-control script-input', rows: 6
27
+
28
+ .checkbox
29
+ label
30
+ = form.check_box :api_allowed
31
+ ' Allow API execution of this job
32
+
33
+ label Notification
34
+ .form-group
35
+ = form.text_field :hipchat_room, class: 'form-control', placeholder: 'Hipchat Room name'
36
+ .form-group
37
+ = form.text_field :slack_channel, class: 'form-control', placeholder: '#slack-channel'
38
+
39
+ .checkbox
40
+ label
41
+ = form.check_box :hipchat_notify_finished
42
+ ' Notify success event to Slack/Hipchat
43
+
44
+ .checkbox
45
+ label
46
+ = form.check_box :notify_cancellation
47
+ ' Notify administrators when the job is cancelled by system.
48
+
49
+ .form-group
50
+ label for='hipchat_additional_text'
51
+ 'Failure notification text
52
+ = form.text_field :hipchat_additional_text, class: 'form-control', placeholder: '@YourName @your-name'
53
+
54
+ .form-group
55
+ label Next Job Execution
56
+ .radio
57
+ label
58
+ = form.radio_button :prevent_multi, 0
59
+ ' Always launch next job (allow parallel execution)
60
+ .radio
61
+ label
62
+ = form.radio_button :prevent_multi, 1
63
+ ' Prevent if current job is WORKING or ERROR
64
+ .radio
65
+ label
66
+ = form.radio_button :prevent_multi, 2
67
+ ' Prevent if current job is WORKING
68
+ .radio
69
+ label
70
+ = form.radio_button :prevent_multi, 3
71
+ ' Prevent if current job is ERROR
72
+ .form-group
73
+ label Job Scheduling
74
+ .radio
75
+ label
76
+ = form.radio_button :suspended, false
77
+ b> Active:
78
+ ' the job will be scheduled to run.
79
+ .radio
80
+ label
81
+ = form.radio_button :suspended, true
82
+ b> Suspend:
83
+ ' the job will NOT be scheduled to run.
84
+
85
+ .form-group
86
+ label Tags
87
+ .form-group
88
+ = form.text_field :text_tags, class: 'form-control', placeholder: 'Tag1,Tag2,Tag3'
89
+
90
+ .box-footer
91
+ .row
92
+ .col-md-3.col-md-offset-9
93
+ = form.submit class: 'btn btn-default btn-block'
@@ -0,0 +1,26 @@
1
+ - if definitions.any?
2
+ table.table.table-hover.sortable
3
+ thead
4
+ tr
5
+ th #
6
+ th.col-md-3 Name
7
+ th.col-md-3 Next Job
8
+ th.col-md-2 Latest Status
9
+ th.col-md-8 data-defaultsort='disabled' Description
10
+ th.col-md-1 data-defaultsort='disabled' &nbsp;
11
+ tbody
12
+ - for definition in definitions
13
+ tr
14
+ td= definition.id
15
+ td.no-decorate= link_to definition.name, definition
16
+ - if !definition.suspended? && definition.job_schedules.present?
17
+ - next_job_schedule = definition.job_schedules.map(&:next).min
18
+ td data-value=next_job_schedule.to_i = l(next_job_schedule, format: :short)
19
+ - else
20
+ td data-value="9999999999" --
21
+ td= labeled_status(definition.job_instances.take)
22
+ td= first_line(definition.description)
23
+ td
24
+ = link_to raw('<i class="fa fa-chevron-right"></i> View Details'), definition, class: 'btn btn-sm btn-default'
25
+ - else
26
+ .text-muted.well.well-sm.no-shadow There are no favorite job definitions.
@@ -0,0 +1,51 @@
1
+ - @scope = definitions
2
+
3
+ .box-header
4
+ - if input_tags.present?
5
+ h3.box-title All Job Definitions tagged by #{input_tags.join(', ')}
6
+ - else
7
+ h3.box-title All Job Definitions
8
+
9
+ .row
10
+ #job_search.col-md-4.col-md-offset-8
11
+ = form_tag job_definitions_path, method: :get, role: 'form', remote: true do
12
+ .form-group
13
+ .input-group
14
+ = search_field_tag :q, params[:q], class: 'form-control', placeholder: 'Search'
15
+ - for tag in input_tags
16
+ = hidden_field_tag 'tag[]', tag
17
+ span.input-group-btn
18
+ button.btn.btn-flat
19
+ i.fa.fa-search
20
+ #definitions.box-body
21
+ - if definitions.present?
22
+ table.table.table-hover
23
+ tbody
24
+ tr
25
+ th &nbsp;
26
+ th #
27
+ th.col-md-3 Name
28
+ th.col-md-3 Administrators
29
+ th.col-md-5 Description
30
+ th.col-md-1 &nbsp;
31
+ - for definition in definitions
32
+ tr
33
+ td
34
+ span.star-holder
35
+ = star_link_for(definition)
36
+ td= definition.id
37
+ td.no-decorate= link_to definition.name, definition
38
+ td.no-decorate
39
+ - definition.admins.each do |user|
40
+ = link_to user.name, user_path(user)
41
+ br
42
+ td= first_line(definition.description)
43
+ td
44
+ = link_to raw('<i class="fa fa-chevron-right"></i> View Details'), definition, class: 'btn btn-sm btn-default'
45
+ - else
46
+ - if params[:q].present?
47
+ .text-muted.well.well-sm.no-shadow No results found for the query.
48
+ - else
49
+ .text-muted.well.well-sm.no-shadow There are no job definitions yet.
50
+ .box-footer#pagination
51
+ = paginate definitions, theme: 'list', remote: true
@@ -0,0 +1,13 @@
1
+ - add_params = {} if add_params.nil?
2
+ .box-header
3
+ h2.box-title
4
+ i.fa.fa-tags
5
+ ' Tags
6
+ .box-body.table-responsive
7
+ ul.list-inline
8
+ - for tag in related_tags
9
+ li
10
+ - if input_tags.include?(tag.name)
11
+ =link_to tag.name, job_definitions_path(add_params.to_h.merge({ tag: input_tags - [tag.name] })), class: 'label label-primary js-narrow-tag', data: { remote: "true" }
12
+ - else
13
+ =link_to tag.name, job_definitions_path(add_params.to_h.merge({ tag: [tag.name] | input_tags })), class: 'label label-default js-narrow-tag', data: { remote: "true" }
@@ -0,0 +1,15 @@
1
+ - @title = "##{@definition.id} #{@definition.name} « Job Definitions"
2
+ - @content_title = "##{@definition.id} #{@definition.name}"
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 'Details', @definition
8
+ li.active Edit
9
+
10
+ = render 'alert'
11
+
12
+ .box.box-solid
13
+ .box-body
14
+ h3.box-title Edit Job Definition
15
+ = render 'form'
@@ -0,0 +1,11 @@
1
+ - @title = 'Job Definitions'
2
+ - @content_title = '<i class="fa fa-database"></i> Job Definitions'
3
+
4
+ .row
5
+ .col-md-9
6
+ .box#search_results
7
+ = render 'search_results', { definitions: @definitions, input_tags: @input_tags, params: params }
8
+
9
+ .col-md-3
10
+ .box#tags
11
+ = render 'taglist', { input_tags: @input_tags, related_tags: @related_tags, add_params: { q: params[:q] } }
@@ -0,0 +1,12 @@
1
+ - @title = 'New Job Definition'
2
+ - @content_title = '<i class="fa fa-database"></i> New Job Definition'
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.active New Job Definition
8
+
9
+ = render 'alert'
10
+
11
+ .box.box-solid
12
+ = render 'form'
@@ -0,0 +1,90 @@
1
+ - @title = "##{@definition.id} #{@definition.name} « Job Definitions"
2
+ - @content_title = "Job Definition 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.active Details
8
+
9
+ .row
10
+ .col-md-7
11
+ .box
12
+ .box-header
13
+ h2.box-title.star-holder #{star_link_for(@definition)} ##{@definition.id} #{@definition.name}
14
+ - if @definition.suspended?
15
+ .box-tools.pull-right
16
+ span.label.label-warning SUSPENDED
17
+ .box-body
18
+ .description= markdown_format @definition.description
19
+
20
+ h4= 'Tags'
21
+ - for tag in @definition.tags
22
+ =link_to tag.name, job_definitions_path(tag: [tag.name]), class: 'badge'
23
+
24
+ h3= 'Administrator'.pluralize(@definition.admins.count)
25
+ ul.media-list
26
+ - for admin in @definition.admins
27
+ li.media
28
+ span.pull-left
29
+ img.img-rounded src="#{admin.image}" height='20' width='20'
30
+ .media-body.no-decorate= link_to admin.name, user_path(admin)
31
+ h3 Script
32
+ pre.kuroko-script #{@definition.script}
33
+
34
+ 'API execution allowed: #{@definition.api_allowed ? 'Yes' : 'No'}
35
+
36
+ h4 Estimated Memory Consumption
37
+ p
38
+ strong #{number_with_delimiter(@definition.memory_expectancy.expected_value)} Kbytes
39
+
40
+ h3 Options
41
+ h4 Notification
42
+ ul
43
+ - if @definition.hipchat_room.present? || @definition.slack_channel.present?
44
+ - if @definition.hipchat_notify_finished?
45
+ li
46
+ 'Notify all event to Slack/Hipchat
47
+ ul
48
+ li hipchat room: #{@definition.hipchat_room}
49
+ li slack channel: #{@definition.slack_channel}
50
+ - if @definition.hipchat_additional_text
51
+ li Failure notification text: #{@definition.hipchat_additional_text}
52
+ - else
53
+ li
54
+ 'Notify failure event to Slack/Hipchat
55
+ ul
56
+ li hipchat room: #{@definition.hipchat_room}
57
+ li slack channel: #{@definition.slack_channel}
58
+ - if @definition.hipchat_additional_text
59
+ li Failure notification text: #{@definition.hipchat_additional_text}
60
+
61
+ - if @definition.notify_cancellation
62
+ li Notify administrators when the job is cancelled by system.
63
+
64
+ - if !@definition.hipchat_room.present? && !@definition.slack_channel && !@definition.notify_cancellation
65
+ li None
66
+
67
+ h4 Next Job Execution
68
+ ul
69
+ - case @definition.prevent_multi
70
+ - when 0
71
+ li Always launch next job (allow parallel execution)
72
+ - when 1
73
+ li Prevent if current job is WORKING or ERROR
74
+ - when 2
75
+ li Prevent if current job is WORKING
76
+ - when 3
77
+ li Prevent if current job is ERROR
78
+
79
+ .box-footer
80
+ .row
81
+ .col-md-6
82
+ = link_to 'Edit Job definition', edit_job_definition_path(@definition), class: 'btn btn-default btn-block', role: 'button'
83
+ .col-md-6
84
+ = link_to 'Destroy Job definition', @definition, method: :delete, class: 'btn btn-default btn-block', role: 'button', data: { confirm: 'Are you sure?' }
85
+ .col-md-5#schedules-holder
86
+ = render template: 'kuroko2/job_schedules/index'
87
+ .col-md-5#suspend-schedules-holder
88
+ = render template: 'kuroko2/job_suspend_schedules/index'
89
+ .col-md-5#instances-holder
90
+ = render template: 'kuroko2/job_instances/index'
@@ -0,0 +1,42 @@
1
+ .box#instance data-instance-path="#{naked_job_definition_job_instance_path(@definition, @instance)}"
2
+ .box-header
3
+ h2.box-title
4
+ = link_to "##{@definition.id} #{@definition.name}", job_definition_path(@definition)
5
+ .box-body
6
+ table.table
7
+ tr
8
+ th Status
9
+ td#instance-status= labeled_status(@instance)
10
+ tr
11
+ th Job Definition Version
12
+ td= @instance.job_definition_version || '-'
13
+ tr
14
+ th Max Memory Consumption
15
+ td= @instance.memory_consumption_log ? "#{@instance.memory_consumption_log.value} Kbytes" : '-'
16
+ tr
17
+ th Created at
18
+ td= @instance.created_at || '-'
19
+ tr
20
+ th Finished at
21
+ td= @instance.finished_at || '-'
22
+ tr
23
+ th Elapsed Time
24
+ td
25
+ - if @instance.created_at && @instance.finished_at
26
+ = distance_of_time(@instance.created_at, @instance.finished_at)
27
+ - else
28
+ '-
29
+ tr
30
+ th Canceled at
31
+ td= @instance.canceled_at || '-'
32
+ tr
33
+ th Error at
34
+ td= @instance.error_at || '-'
35
+ h4 Script
36
+ pre.kuroko-script= @instance.script
37
+ .box-footer
38
+ .row
39
+ #cancel-button.col-md-4.col-md-offset-8
40
+ = link_to 'Cancel', job_definition_job_instance_path(@definition, @instance), class: 'btn btn-default btn-block', role: 'button', method: :delete, disabled: !@instance.cancelable?
41
+ #force-cancel-button.col-md-4.col-md-offset-8.display-none
42
+ = link_to 'Force Cancel', force_destroy_job_definition_job_instance_path(@definition, @instance), class: 'btn btn-danger btn-block', role: 'button', method: :delete, disabled: !@instance.working?
@@ -0,0 +1,58 @@
1
+ .box#instances data-instances-path="#{job_definition_job_instances_path(@definition)}"
2
+ .box-header
3
+ .row
4
+ .col-md-6
5
+ h3.box-title Job&nbsp;Instances
6
+ .col-md-6
7
+ .row
8
+ .col-md-6.right-button
9
+ = link_to raw('<i class="fa fa-bar-chart"></i> Show Stats'), job_definition_job_definition_stats_path(@definition), class: 'btn btn-default btn-small'
10
+ .col-md-6.right-button
11
+ button type="button" class="btn btn-default btn-small" data-toggle="modal" data-target="#launchAdHocModal"
12
+ i class="fa fa-play-circle"
13
+ 'Launch
14
+ .box-body.table-responsive
15
+ table.table.table-hover
16
+ tbody
17
+ tr
18
+ th #
19
+ th Status
20
+ th Started at
21
+ th Elapsed Time
22
+ th &nbsp;
23
+ - for instance in @instances
24
+ tr
25
+ td= instance.id
26
+ td= labeled_status(instance)
27
+ td= l(instance.created_at, format: :short)
28
+ td
29
+ - if instance.created_at && instance.finished_at
30
+ = distance_of_time(instance.created_at, instance.finished_at)
31
+ - else
32
+ '-
33
+ td
34
+ = link_to raw('<i class="fa fa-chevron-right"></i>Details'), job_definition_job_instance_path(job_definition_id: @definition.id, id: instance.id), class: 'btn btn-default btn-xs'
35
+ .box-footer
36
+ = paginate @instances, remote: true, theme: 'history'
37
+
38
+ .modal.fade id="launchAdHocModal" tabindex="-1" role="dialog" aria-labelledby="launchAdHocModalLabel"
39
+ .modal-dialog
40
+ .modal-content
41
+ = form_for @definition, url: job_definition_job_instances_path(@definition), method: :post, html: { role: 'form' } do |form|
42
+
43
+ .modal-header
44
+ button type="button" class="close" data-dismiss="modal" aria-label="Close"
45
+ span aria-hidden="true"
46
+ times
47
+ h4.modal-title
48
+ 'Launch Job
49
+ .modal-body
50
+ .form-group
51
+ = form.label :script
52
+ = form.text_area :script, class: 'form-control script-input', rows: 10, value: @definition.script
53
+
54
+ .modal-footer
55
+ button type="button" class="btn btn-default" data-dismiss="modal"
56
+ 'Cancel
57
+ button type="submit" class="btn btn-primary"
58
+ 'Launch