kuroko2 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (338) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +15 -0
  4. data/Rakefile +26 -0
  5. data/app/assets/images/kuroko2/avatar.png +0 -0
  6. data/app/assets/images/kuroko2/kuroko-logo-horizontal.png +0 -0
  7. data/app/assets/javascripts/kuroko2/application.js +28 -0
  8. data/app/assets/javascripts/kuroko2/bootstrap.js +2363 -0
  9. data/app/assets/javascripts/kuroko2/definition_linker.js +20 -0
  10. data/app/assets/javascripts/kuroko2/instance_linker.js +10 -0
  11. data/app/assets/javascripts/kuroko2/job_definition_stats.js +67 -0
  12. data/app/assets/javascripts/kuroko2/job_definitions.js +79 -0
  13. data/app/assets/javascripts/kuroko2/job_instances.js +88 -0
  14. data/app/assets/javascripts/kuroko2/job_timelines.js.coffee +24 -0
  15. data/app/assets/javascripts/kuroko2/narrow_job_definitions.js +30 -0
  16. data/app/assets/stylesheets/kuroko2/admin-lte.css +3402 -0
  17. data/app/assets/stylesheets/kuroko2/application.scss +86 -0
  18. data/app/assets/stylesheets/kuroko2/bootstrap.css +6799 -0
  19. data/app/assets/stylesheets/kuroko2/fonts.scss +1 -0
  20. data/app/assets/stylesheets/kuroko2/job_definitions.scss +19 -0
  21. data/app/assets/stylesheets/kuroko2/users.scss +7 -0
  22. data/app/controllers/kuroko2/api/application_controller.rb +49 -0
  23. data/app/controllers/kuroko2/api/job_instances_controller.rb +46 -0
  24. data/app/controllers/kuroko2/api/stats_controller.rb +28 -0
  25. data/app/controllers/kuroko2/application_controller.rb +43 -0
  26. data/app/controllers/kuroko2/dashboard_controller.rb +27 -0
  27. data/app/controllers/kuroko2/execution_logs_controller.rb +19 -0
  28. data/app/controllers/kuroko2/executions_controller.rb +28 -0
  29. data/app/controllers/kuroko2/job_definition_stats_controller.rb +54 -0
  30. data/app/controllers/kuroko2/job_definitions_controller.rb +100 -0
  31. data/app/controllers/kuroko2/job_instances_controller.rb +87 -0
  32. data/app/controllers/kuroko2/job_schedules_controller.rb +39 -0
  33. data/app/controllers/kuroko2/job_suspend_schedules_controller.rb +38 -0
  34. data/app/controllers/kuroko2/job_timelines_controller.rb +56 -0
  35. data/app/controllers/kuroko2/logs_controller.rb +15 -0
  36. data/app/controllers/kuroko2/sessions_controller.rb +32 -0
  37. data/app/controllers/kuroko2/stars_controller.rb +30 -0
  38. data/app/controllers/kuroko2/tokens_controller.rb +47 -0
  39. data/app/controllers/kuroko2/users_controller.rb +62 -0
  40. data/app/controllers/kuroko2/workers_controller.rb +5 -0
  41. data/app/errors/http/bad_request.rb +4 -0
  42. data/app/errors/http/forbidden.rb +4 -0
  43. data/app/errors/http/unauthorized.rb +4 -0
  44. data/app/helpers/kuroko2/application_helper.rb +8 -0
  45. data/app/helpers/kuroko2/dashboard_helper.rb +4 -0
  46. data/app/helpers/kuroko2/executions_helper.rb +4 -0
  47. data/app/helpers/kuroko2/job_definitions_helper.rb +38 -0
  48. data/app/helpers/kuroko2/job_instances_helper.rb +71 -0
  49. data/app/helpers/kuroko2/job_schedules_helper.rb +4 -0
  50. data/app/helpers/kuroko2/logs_helper.rb +4 -0
  51. data/app/helpers/kuroko2/sessions_helper.rb +4 -0
  52. data/app/helpers/kuroko2/stars_helper.rb +4 -0
  53. data/app/helpers/kuroko2/tokens_helper.rb +4 -0
  54. data/app/helpers/kuroko2/users_helper.rb +4 -0
  55. data/app/helpers/kuroko2/workers_helper.rb +4 -0
  56. data/app/jobs/kuroko2/application_job.rb +4 -0
  57. data/app/mailers/kuroko2/application_mailer.rb +6 -0
  58. data/app/mailers/kuroko2/notifications.rb +63 -0
  59. data/app/models/concerns/kuroko2/table_name_customizable.rb +16 -0
  60. data/app/models/kuroko2/admin_assignment.rb +6 -0
  61. data/app/models/kuroko2/api/application_resource.rb +10 -0
  62. data/app/models/kuroko2/api/job_instance_resource.rb +7 -0
  63. data/app/models/kuroko2/application_record.rb +5 -0
  64. data/app/models/kuroko2/execution.rb +55 -0
  65. data/app/models/kuroko2/job_definition.rb +147 -0
  66. data/app/models/kuroko2/job_definition_tag.rb +6 -0
  67. data/app/models/kuroko2/job_instance.rb +118 -0
  68. data/app/models/kuroko2/job_schedule.rb +93 -0
  69. data/app/models/kuroko2/job_suspend_schedule.rb +35 -0
  70. data/app/models/kuroko2/log.rb +3 -0
  71. data/app/models/kuroko2/memory_consumption_log.rb +49 -0
  72. data/app/models/kuroko2/memory_expectancy.rb +21 -0
  73. data/app/models/kuroko2/process_signal.rb +14 -0
  74. data/app/models/kuroko2/star.rb +6 -0
  75. data/app/models/kuroko2/tag.rb +8 -0
  76. data/app/models/kuroko2/tick.rb +12 -0
  77. data/app/models/kuroko2/token.rb +101 -0
  78. data/app/models/kuroko2/user.rb +48 -0
  79. data/app/models/kuroko2/worker.rb +12 -0
  80. data/app/views/kaminari/history/_paginator.html.slim +15 -0
  81. data/app/views/kaminari/list/_paginator.html.slim +17 -0
  82. data/app/views/kuroko2/dashboard/_taglist.html.slim +13 -0
  83. data/app/views/kuroko2/dashboard/index.html.slim +49 -0
  84. data/app/views/kuroko2/execution_logs/index.json.jbuilder +16 -0
  85. data/app/views/kuroko2/executions/index.html.slim +35 -0
  86. data/app/views/kuroko2/job_definition_stats/execution_time.json.jbuilder +13 -0
  87. data/app/views/kuroko2/job_definition_stats/index.html.slim +48 -0
  88. data/app/views/kuroko2/job_definition_stats/memory.json.jbuilder +10 -0
  89. data/app/views/kuroko2/job_definitions/_alert.html.slim +7 -0
  90. data/app/views/kuroko2/job_definitions/_form.html.slim +93 -0
  91. data/app/views/kuroko2/job_definitions/_list.html.slim +26 -0
  92. data/app/views/kuroko2/job_definitions/_search_results.html.slim +51 -0
  93. data/app/views/kuroko2/job_definitions/_taglist.html.slim +13 -0
  94. data/app/views/kuroko2/job_definitions/edit.html.slim +15 -0
  95. data/app/views/kuroko2/job_definitions/index.html.slim +11 -0
  96. data/app/views/kuroko2/job_definitions/new.html.slim +12 -0
  97. data/app/views/kuroko2/job_definitions/show.html.slim +90 -0
  98. data/app/views/kuroko2/job_instances/_instance.html.slim +42 -0
  99. data/app/views/kuroko2/job_instances/index.html.slim +58 -0
  100. data/app/views/kuroko2/job_instances/show.html.slim +19 -0
  101. data/app/views/kuroko2/job_instances/working.html.slim +37 -0
  102. data/app/views/kuroko2/job_schedules/index.html.slim +32 -0
  103. data/app/views/kuroko2/job_suspend_schedules/index.html.slim +27 -0
  104. data/app/views/kuroko2/job_timelines/dataset.json.jbuilder +11 -0
  105. data/app/views/kuroko2/job_timelines/index.html.slim +31 -0
  106. data/app/views/kuroko2/kaminari/history/_paginator.html.slim +15 -0
  107. data/app/views/kuroko2/kaminari/list/_paginator.html.slim +17 -0
  108. data/app/views/kuroko2/layouts/application.html.slim +68 -0
  109. data/app/views/kuroko2/logs/index.html.slim +33 -0
  110. data/app/views/kuroko2/notifications/executor_not_assigned.text.erb +22 -0
  111. data/app/views/kuroko2/notifications/job_failure.html.slim +21 -0
  112. data/app/views/kuroko2/notifications/job_failure.text.erb +18 -0
  113. data/app/views/kuroko2/notifications/notify_long_elapsed_time.text.erb +9 -0
  114. data/app/views/kuroko2/notifications/process_absence.text.erb +22 -0
  115. data/app/views/kuroko2/notifications/remind_failure.html.slim +21 -0
  116. data/app/views/kuroko2/notifications/remind_failure.text.erb +10 -0
  117. data/app/views/kuroko2/sessions/new.html.slim +20 -0
  118. data/app/views/kuroko2/tokens/index.html.slim +42 -0
  119. data/app/views/kuroko2/users/index.html.slim +55 -0
  120. data/app/views/kuroko2/users/show.html.slim +76 -0
  121. data/app/views/kuroko2/workers/index.html.slim +40 -0
  122. data/app/views/layouts/kuroko2/application.html.slim +72 -0
  123. data/app/views/layouts/mailer.html.erb +13 -0
  124. data/app/views/layouts/mailer.text.erb +1 -0
  125. data/bin/cleanup_old_instances.rb +9 -0
  126. data/bin/remind_failure.rb +5 -0
  127. data/config/initializers/000_kuroko2.rb +16 -0
  128. data/config/initializers/assets.rb +9 -0
  129. data/config/initializers/garage.rb +2 -0
  130. data/config/initializers/kaminari_config.rb +3 -0
  131. data/config/initializers/omniauth.rb +5 -0
  132. data/config/locales/en.yml +28 -0
  133. data/config/routes.rb +54 -0
  134. data/db/migrate/001_create_job_definitions.rb +22 -0
  135. data/db/migrate/002_create_job_instances.rb +17 -0
  136. data/db/migrate/003_create_job_schedules.rb +14 -0
  137. data/db/migrate/004_create_ticks.rb +7 -0
  138. data/db/migrate/005_create_logs.rb +13 -0
  139. data/db/migrate/006_create_tokens.rb +21 -0
  140. data/db/migrate/007_create_executions.rb +26 -0
  141. data/db/migrate/008_create_process_signals.rb +15 -0
  142. data/db/migrate/009_create_users.rb +20 -0
  143. data/db/migrate/010_create_admin_assignments.rb +12 -0
  144. data/db/migrate/011_create_stars.rb +12 -0
  145. data/db/migrate/012_create_workers.rb +15 -0
  146. data/db/migrate/018_create_job_definition_tags.rb +13 -0
  147. data/db/migrate/019_create_tags.rb +11 -0
  148. data/db/migrate/021_create_memory_expectancies.rb +17 -0
  149. data/db/migrate/025_create_job_suspend_schedules.rb +12 -0
  150. data/lib/kuroko2/command/executor.rb +62 -0
  151. data/lib/kuroko2/command/kill.rb +24 -0
  152. data/lib/kuroko2/command/monitor.rb +109 -0
  153. data/lib/kuroko2/command/shell.rb +163 -0
  154. data/lib/kuroko2/configuration.rb +19 -0
  155. data/lib/kuroko2/engine.rb +59 -0
  156. data/lib/kuroko2/execution_logger/cloud_watch_logs.rb +92 -0
  157. data/lib/kuroko2/execution_logger/void.rb +13 -0
  158. data/lib/kuroko2/execution_logger.rb +20 -0
  159. data/lib/kuroko2/memory_sampler.rb +50 -0
  160. data/lib/kuroko2/return_to_validator.rb +14 -0
  161. data/lib/kuroko2/servers/base.rb +30 -0
  162. data/lib/kuroko2/servers/command_executor.rb +27 -0
  163. data/lib/kuroko2/servers/job_scheduler.rb +25 -0
  164. data/lib/kuroko2/servers/workflow_processor.rb +25 -0
  165. data/lib/kuroko2/util/logger.rb +19 -0
  166. data/lib/kuroko2/util/rails_logger_formatter.rb +9 -0
  167. data/lib/kuroko2/version.rb +3 -0
  168. data/lib/kuroko2/workflow/assertion_error.rb +6 -0
  169. data/lib/kuroko2/workflow/engine.rb +141 -0
  170. data/lib/kuroko2/workflow/engine_error.rb +6 -0
  171. data/lib/kuroko2/workflow/node.rb +124 -0
  172. data/lib/kuroko2/workflow/notifier/concerns/chat_message_builder.rb +39 -0
  173. data/lib/kuroko2/workflow/notifier/hipchat.rb +88 -0
  174. data/lib/kuroko2/workflow/notifier/mail.rb +44 -0
  175. data/lib/kuroko2/workflow/notifier/slack.rb +121 -0
  176. data/lib/kuroko2/workflow/notifier.rb +31 -0
  177. data/lib/kuroko2/workflow/processor.rb +40 -0
  178. data/lib/kuroko2/workflow/scheduler.rb +42 -0
  179. data/lib/kuroko2/workflow/script_parser.rb +66 -0
  180. data/lib/kuroko2/workflow/shell_scanner.rb +34 -0
  181. data/lib/kuroko2/workflow/syntax_error.rb +6 -0
  182. data/lib/kuroko2/workflow/task/auto_skip_error.rb +20 -0
  183. data/lib/kuroko2/workflow/task/base.rb +32 -0
  184. data/lib/kuroko2/workflow/task/env.rb +45 -0
  185. data/lib/kuroko2/workflow/task/execute.rb +128 -0
  186. data/lib/kuroko2/workflow/task/expected_time.rb +9 -0
  187. data/lib/kuroko2/workflow/task/fork.rb +45 -0
  188. data/lib/kuroko2/workflow/task/kuroko_runner.rb +24 -0
  189. data/lib/kuroko2/workflow/task/noop.rb +13 -0
  190. data/lib/kuroko2/workflow/task/queue.rb +27 -0
  191. data/lib/kuroko2/workflow/task/rails_env.rb +24 -0
  192. data/lib/kuroko2/workflow/task/sequence.rb +13 -0
  193. data/lib/kuroko2/workflow/task/sleep.rb +29 -0
  194. data/lib/kuroko2/workflow/task/sub_process.rb +53 -0
  195. data/lib/kuroko2/workflow/task/time_base.rb +44 -0
  196. data/lib/kuroko2/workflow/task/timeout.rb +9 -0
  197. data/lib/kuroko2/workflow/task/wait.rb +143 -0
  198. data/lib/kuroko2.rb +26 -0
  199. data/lib/tasks/kuroko2_tasks.rake +4 -0
  200. data/spec/command/kill_spec.rb +20 -0
  201. data/spec/command/monitor_spec.rb +68 -0
  202. data/spec/command/shell_spec.rb +87 -0
  203. data/spec/controllers/dashboard_controller_spec.rb +5 -0
  204. data/spec/controllers/executions_controller_spec.rb +23 -0
  205. data/spec/controllers/job_definition_stats_controller_spec.rb +95 -0
  206. data/spec/controllers/job_definitions_controller_spec.rb +89 -0
  207. data/spec/controllers/job_instances_controller_spec.rb +62 -0
  208. data/spec/controllers/job_schedules_controller_spec.rb +39 -0
  209. data/spec/controllers/job_suspend_schedules_controller_spec.rb +39 -0
  210. data/spec/controllers/job_timelines_controller_spec.rb +114 -0
  211. data/spec/controllers/logs_controller_spec.rb +5 -0
  212. data/spec/controllers/sessions_controller_spec.rb +58 -0
  213. data/spec/controllers/stars_controller_spec.rb +28 -0
  214. data/spec/controllers/tokens_controller_spec.rb +5 -0
  215. data/spec/controllers/users_controller_spec.rb +51 -0
  216. data/spec/controllers/workers_controller_spec.rb +5 -0
  217. data/spec/dummy/Rakefile +6 -0
  218. data/spec/dummy/app/assets/config/manifest.js +5 -0
  219. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  220. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  221. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  222. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  223. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  224. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  225. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  226. data/spec/dummy/app/jobs/application_job.rb +2 -0
  227. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  228. data/spec/dummy/app/models/application_record.rb +3 -0
  229. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  230. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  231. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  232. data/spec/dummy/bin/bundle +3 -0
  233. data/spec/dummy/bin/rails +4 -0
  234. data/spec/dummy/bin/rake +4 -0
  235. data/spec/dummy/bin/setup +34 -0
  236. data/spec/dummy/bin/update +29 -0
  237. data/spec/dummy/config/application.rb +25 -0
  238. data/spec/dummy/config/boot.rb +3 -0
  239. data/spec/dummy/config/cable.yml +9 -0
  240. data/spec/dummy/config/database.yml +29 -0
  241. data/spec/dummy/config/environment.rb +5 -0
  242. data/spec/dummy/config/environments/development.rb +54 -0
  243. data/spec/dummy/config/environments/production.rb +86 -0
  244. data/spec/dummy/config/environments/test.rb +42 -0
  245. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  246. data/spec/dummy/config/initializers/assets.rb +11 -0
  247. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  248. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  249. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  250. data/spec/dummy/config/initializers/inflections.rb +16 -0
  251. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  252. data/spec/dummy/config/initializers/new_framework_defaults.rb +23 -0
  253. data/spec/dummy/config/initializers/session_store.rb +3 -0
  254. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  255. data/spec/dummy/config/kuroko2.yml +35 -0
  256. data/spec/dummy/config/locales/en.yml +23 -0
  257. data/spec/dummy/config/puma.rb +47 -0
  258. data/spec/dummy/config/routes.rb +3 -0
  259. data/spec/dummy/config/secrets.yml +22 -0
  260. data/spec/dummy/config/spring.rb +6 -0
  261. data/spec/dummy/config.ru +5 -0
  262. data/spec/dummy/db/schema.rb +217 -0
  263. data/spec/dummy/lib/dummy_extention.rb +14 -0
  264. data/spec/dummy/lib/kuroko2/workflow/task/custom_task1.rb +13 -0
  265. data/spec/dummy/public/404.html +67 -0
  266. data/spec/dummy/public/422.html +67 -0
  267. data/spec/dummy/public/500.html +66 -0
  268. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  269. data/spec/dummy/public/apple-touch-icon.png +0 -0
  270. data/spec/dummy/public/favicon.ico +0 -0
  271. data/spec/execution_logger/cloud_watch_logs_spec.rb +95 -0
  272. data/spec/factories/execution_factory.rb +13 -0
  273. data/spec/factories/job_definition_factory.rb +21 -0
  274. data/spec/factories/job_instance_factory.rb +4 -0
  275. data/spec/factories/job_schedule_factory.rb +10 -0
  276. data/spec/factories/job_suspend_schedule_factory.rb +8 -0
  277. data/spec/factories/memory_expectancy_factory.rb +5 -0
  278. data/spec/factories/process_signal_factory.rb +4 -0
  279. data/spec/factories/star_factory.rb +4 -0
  280. data/spec/factories/tick_factory.rb +4 -0
  281. data/spec/factories/token_factory.rb +10 -0
  282. data/spec/factories/user_factory.rb +11 -0
  283. data/spec/factories/worker_factory.rb +8 -0
  284. data/spec/features/dashborad_spec.rb +82 -0
  285. data/spec/features/job_definition_spec.rb +74 -0
  286. data/spec/features/job_instance_spec.rb +94 -0
  287. data/spec/features/sign_in_and_out_spec.rb +17 -0
  288. data/spec/features/users_spec.rb +90 -0
  289. data/spec/features/workers_spec.rb +44 -0
  290. data/spec/helpers/executions_helper_spec.rb +4 -0
  291. data/spec/helpers/job_definition_helper_spec.rb +42 -0
  292. data/spec/helpers/job_schedules_helper_spec.rb +4 -0
  293. data/spec/helpers/logs_helper_spec.rb +4 -0
  294. data/spec/helpers/tokens_helper_spec.rb +4 -0
  295. data/spec/helpers/users_helper_spec.rb +4 -0
  296. data/spec/helpers/workers_helper_spec.rb +4 -0
  297. data/spec/mailers/notifications_spec.rb +54 -0
  298. data/spec/memory_sampler_spec.rb +11 -0
  299. data/spec/models/admin_assignment_spec.rb +4 -0
  300. data/spec/models/execution_spec.rb +26 -0
  301. data/spec/models/job_definition_spec.rb +163 -0
  302. data/spec/models/job_instance_spec.rb +115 -0
  303. data/spec/models/job_schedule_spec.rb +121 -0
  304. data/spec/models/job_suspend_schedule_spec.rb +32 -0
  305. data/spec/models/memory_consumption_log_spec.rb +50 -0
  306. data/spec/models/memory_expectancy_spec.rb +26 -0
  307. data/spec/models/star_spec.rb +4 -0
  308. data/spec/models/tick_spec.rb +23 -0
  309. data/spec/models/token_spec.rb +54 -0
  310. data/spec/models/user_spec.rb +17 -0
  311. data/spec/models/worker_spec.rb +5 -0
  312. data/spec/rails_helper.rb +81 -0
  313. data/spec/requests/api/job_instances_spec.rb +96 -0
  314. data/spec/requests/api/stats_spec.rb +45 -0
  315. data/spec/return_to_validator_spec.rb +28 -0
  316. data/spec/settings_spec.rb +10 -0
  317. data/spec/spec_helper.rb +49 -0
  318. data/spec/support/feature_sign_in_helper.rb +31 -0
  319. data/spec/support/sign_in_helper.rb +5 -0
  320. data/spec/support/wait_for_ajax.rb +11 -0
  321. data/spec/workflow/engine_spec.rb +241 -0
  322. data/spec/workflow/node_spec.rb +62 -0
  323. data/spec/workflow/notifier/hipchat_spec.rb +117 -0
  324. data/spec/workflow/notifier/mail_spec.rb +86 -0
  325. data/spec/workflow/notifier/slack_spec.rb +110 -0
  326. data/spec/workflow/script_parser_spec.rb +119 -0
  327. data/spec/workflow/shell_scanner_spec.rb +47 -0
  328. data/spec/workflow/task/auto_skip_error_spec.rb +35 -0
  329. data/spec/workflow/task/env_spec.rb +47 -0
  330. data/spec/workflow/task/execute_spec.rb +127 -0
  331. data/spec/workflow/task/expected_time_spec.rb +52 -0
  332. data/spec/workflow/task/fork_spec.rb +30 -0
  333. data/spec/workflow/task/queue_spec.rb +45 -0
  334. data/spec/workflow/task/rails_env_spec.rb +30 -0
  335. data/spec/workflow/task/sleep_spec.rb +22 -0
  336. data/spec/workflow/task/sub_process_spec.rb +32 -0
  337. data/spec/workflow/task/wait_spec.rb +162 -0
  338. metadata +1038 -0
@@ -0,0 +1,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