kuroko2 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +15 -0
- data/Rakefile +26 -0
- data/app/assets/images/kuroko2/avatar.png +0 -0
- data/app/assets/images/kuroko2/kuroko-logo-horizontal.png +0 -0
- data/app/assets/javascripts/kuroko2/application.js +28 -0
- data/app/assets/javascripts/kuroko2/bootstrap.js +2363 -0
- data/app/assets/javascripts/kuroko2/definition_linker.js +20 -0
- data/app/assets/javascripts/kuroko2/instance_linker.js +10 -0
- data/app/assets/javascripts/kuroko2/job_definition_stats.js +67 -0
- data/app/assets/javascripts/kuroko2/job_definitions.js +79 -0
- data/app/assets/javascripts/kuroko2/job_instances.js +88 -0
- data/app/assets/javascripts/kuroko2/job_timelines.js.coffee +24 -0
- data/app/assets/javascripts/kuroko2/narrow_job_definitions.js +30 -0
- data/app/assets/stylesheets/kuroko2/admin-lte.css +3402 -0
- data/app/assets/stylesheets/kuroko2/application.scss +86 -0
- data/app/assets/stylesheets/kuroko2/bootstrap.css +6799 -0
- data/app/assets/stylesheets/kuroko2/fonts.scss +1 -0
- data/app/assets/stylesheets/kuroko2/job_definitions.scss +19 -0
- data/app/assets/stylesheets/kuroko2/users.scss +7 -0
- data/app/controllers/kuroko2/api/application_controller.rb +49 -0
- data/app/controllers/kuroko2/api/job_instances_controller.rb +46 -0
- data/app/controllers/kuroko2/api/stats_controller.rb +28 -0
- data/app/controllers/kuroko2/application_controller.rb +43 -0
- data/app/controllers/kuroko2/dashboard_controller.rb +27 -0
- data/app/controllers/kuroko2/execution_logs_controller.rb +19 -0
- data/app/controllers/kuroko2/executions_controller.rb +28 -0
- data/app/controllers/kuroko2/job_definition_stats_controller.rb +54 -0
- data/app/controllers/kuroko2/job_definitions_controller.rb +100 -0
- data/app/controllers/kuroko2/job_instances_controller.rb +87 -0
- data/app/controllers/kuroko2/job_schedules_controller.rb +39 -0
- data/app/controllers/kuroko2/job_suspend_schedules_controller.rb +38 -0
- data/app/controllers/kuroko2/job_timelines_controller.rb +56 -0
- data/app/controllers/kuroko2/logs_controller.rb +15 -0
- data/app/controllers/kuroko2/sessions_controller.rb +32 -0
- data/app/controllers/kuroko2/stars_controller.rb +30 -0
- data/app/controllers/kuroko2/tokens_controller.rb +47 -0
- data/app/controllers/kuroko2/users_controller.rb +62 -0
- data/app/controllers/kuroko2/workers_controller.rb +5 -0
- data/app/errors/http/bad_request.rb +4 -0
- data/app/errors/http/forbidden.rb +4 -0
- data/app/errors/http/unauthorized.rb +4 -0
- data/app/helpers/kuroko2/application_helper.rb +8 -0
- data/app/helpers/kuroko2/dashboard_helper.rb +4 -0
- data/app/helpers/kuroko2/executions_helper.rb +4 -0
- data/app/helpers/kuroko2/job_definitions_helper.rb +38 -0
- data/app/helpers/kuroko2/job_instances_helper.rb +71 -0
- data/app/helpers/kuroko2/job_schedules_helper.rb +4 -0
- data/app/helpers/kuroko2/logs_helper.rb +4 -0
- data/app/helpers/kuroko2/sessions_helper.rb +4 -0
- data/app/helpers/kuroko2/stars_helper.rb +4 -0
- data/app/helpers/kuroko2/tokens_helper.rb +4 -0
- data/app/helpers/kuroko2/users_helper.rb +4 -0
- data/app/helpers/kuroko2/workers_helper.rb +4 -0
- data/app/jobs/kuroko2/application_job.rb +4 -0
- data/app/mailers/kuroko2/application_mailer.rb +6 -0
- data/app/mailers/kuroko2/notifications.rb +63 -0
- data/app/models/concerns/kuroko2/table_name_customizable.rb +16 -0
- data/app/models/kuroko2/admin_assignment.rb +6 -0
- data/app/models/kuroko2/api/application_resource.rb +10 -0
- data/app/models/kuroko2/api/job_instance_resource.rb +7 -0
- data/app/models/kuroko2/application_record.rb +5 -0
- data/app/models/kuroko2/execution.rb +55 -0
- data/app/models/kuroko2/job_definition.rb +147 -0
- data/app/models/kuroko2/job_definition_tag.rb +6 -0
- data/app/models/kuroko2/job_instance.rb +118 -0
- data/app/models/kuroko2/job_schedule.rb +93 -0
- data/app/models/kuroko2/job_suspend_schedule.rb +35 -0
- data/app/models/kuroko2/log.rb +3 -0
- data/app/models/kuroko2/memory_consumption_log.rb +49 -0
- data/app/models/kuroko2/memory_expectancy.rb +21 -0
- data/app/models/kuroko2/process_signal.rb +14 -0
- data/app/models/kuroko2/star.rb +6 -0
- data/app/models/kuroko2/tag.rb +8 -0
- data/app/models/kuroko2/tick.rb +12 -0
- data/app/models/kuroko2/token.rb +101 -0
- data/app/models/kuroko2/user.rb +48 -0
- data/app/models/kuroko2/worker.rb +12 -0
- data/app/views/kaminari/history/_paginator.html.slim +15 -0
- data/app/views/kaminari/list/_paginator.html.slim +17 -0
- data/app/views/kuroko2/dashboard/_taglist.html.slim +13 -0
- data/app/views/kuroko2/dashboard/index.html.slim +49 -0
- data/app/views/kuroko2/execution_logs/index.json.jbuilder +16 -0
- data/app/views/kuroko2/executions/index.html.slim +35 -0
- data/app/views/kuroko2/job_definition_stats/execution_time.json.jbuilder +13 -0
- data/app/views/kuroko2/job_definition_stats/index.html.slim +48 -0
- data/app/views/kuroko2/job_definition_stats/memory.json.jbuilder +10 -0
- data/app/views/kuroko2/job_definitions/_alert.html.slim +7 -0
- data/app/views/kuroko2/job_definitions/_form.html.slim +93 -0
- data/app/views/kuroko2/job_definitions/_list.html.slim +26 -0
- data/app/views/kuroko2/job_definitions/_search_results.html.slim +51 -0
- data/app/views/kuroko2/job_definitions/_taglist.html.slim +13 -0
- data/app/views/kuroko2/job_definitions/edit.html.slim +15 -0
- data/app/views/kuroko2/job_definitions/index.html.slim +11 -0
- data/app/views/kuroko2/job_definitions/new.html.slim +12 -0
- data/app/views/kuroko2/job_definitions/show.html.slim +90 -0
- data/app/views/kuroko2/job_instances/_instance.html.slim +42 -0
- data/app/views/kuroko2/job_instances/index.html.slim +58 -0
- data/app/views/kuroko2/job_instances/show.html.slim +19 -0
- data/app/views/kuroko2/job_instances/working.html.slim +37 -0
- data/app/views/kuroko2/job_schedules/index.html.slim +32 -0
- data/app/views/kuroko2/job_suspend_schedules/index.html.slim +27 -0
- data/app/views/kuroko2/job_timelines/dataset.json.jbuilder +11 -0
- data/app/views/kuroko2/job_timelines/index.html.slim +31 -0
- data/app/views/kuroko2/kaminari/history/_paginator.html.slim +15 -0
- data/app/views/kuroko2/kaminari/list/_paginator.html.slim +17 -0
- data/app/views/kuroko2/layouts/application.html.slim +68 -0
- data/app/views/kuroko2/logs/index.html.slim +33 -0
- data/app/views/kuroko2/notifications/executor_not_assigned.text.erb +22 -0
- data/app/views/kuroko2/notifications/job_failure.html.slim +21 -0
- data/app/views/kuroko2/notifications/job_failure.text.erb +18 -0
- data/app/views/kuroko2/notifications/notify_long_elapsed_time.text.erb +9 -0
- data/app/views/kuroko2/notifications/process_absence.text.erb +22 -0
- data/app/views/kuroko2/notifications/remind_failure.html.slim +21 -0
- data/app/views/kuroko2/notifications/remind_failure.text.erb +10 -0
- data/app/views/kuroko2/sessions/new.html.slim +20 -0
- data/app/views/kuroko2/tokens/index.html.slim +42 -0
- data/app/views/kuroko2/users/index.html.slim +55 -0
- data/app/views/kuroko2/users/show.html.slim +76 -0
- data/app/views/kuroko2/workers/index.html.slim +40 -0
- data/app/views/layouts/kuroko2/application.html.slim +72 -0
- data/app/views/layouts/mailer.html.erb +13 -0
- data/app/views/layouts/mailer.text.erb +1 -0
- data/bin/cleanup_old_instances.rb +9 -0
- data/bin/remind_failure.rb +5 -0
- data/config/initializers/000_kuroko2.rb +16 -0
- data/config/initializers/assets.rb +9 -0
- data/config/initializers/garage.rb +2 -0
- data/config/initializers/kaminari_config.rb +3 -0
- data/config/initializers/omniauth.rb +5 -0
- data/config/locales/en.yml +28 -0
- data/config/routes.rb +54 -0
- data/db/migrate/001_create_job_definitions.rb +22 -0
- data/db/migrate/002_create_job_instances.rb +17 -0
- data/db/migrate/003_create_job_schedules.rb +14 -0
- data/db/migrate/004_create_ticks.rb +7 -0
- data/db/migrate/005_create_logs.rb +13 -0
- data/db/migrate/006_create_tokens.rb +21 -0
- data/db/migrate/007_create_executions.rb +26 -0
- data/db/migrate/008_create_process_signals.rb +15 -0
- data/db/migrate/009_create_users.rb +20 -0
- data/db/migrate/010_create_admin_assignments.rb +12 -0
- data/db/migrate/011_create_stars.rb +12 -0
- data/db/migrate/012_create_workers.rb +15 -0
- data/db/migrate/018_create_job_definition_tags.rb +13 -0
- data/db/migrate/019_create_tags.rb +11 -0
- data/db/migrate/021_create_memory_expectancies.rb +17 -0
- data/db/migrate/025_create_job_suspend_schedules.rb +12 -0
- data/lib/kuroko2/command/executor.rb +62 -0
- data/lib/kuroko2/command/kill.rb +24 -0
- data/lib/kuroko2/command/monitor.rb +109 -0
- data/lib/kuroko2/command/shell.rb +163 -0
- data/lib/kuroko2/configuration.rb +19 -0
- data/lib/kuroko2/engine.rb +59 -0
- data/lib/kuroko2/execution_logger/cloud_watch_logs.rb +92 -0
- data/lib/kuroko2/execution_logger/void.rb +13 -0
- data/lib/kuroko2/execution_logger.rb +20 -0
- data/lib/kuroko2/memory_sampler.rb +50 -0
- data/lib/kuroko2/return_to_validator.rb +14 -0
- data/lib/kuroko2/servers/base.rb +30 -0
- data/lib/kuroko2/servers/command_executor.rb +27 -0
- data/lib/kuroko2/servers/job_scheduler.rb +25 -0
- data/lib/kuroko2/servers/workflow_processor.rb +25 -0
- data/lib/kuroko2/util/logger.rb +19 -0
- data/lib/kuroko2/util/rails_logger_formatter.rb +9 -0
- data/lib/kuroko2/version.rb +3 -0
- data/lib/kuroko2/workflow/assertion_error.rb +6 -0
- data/lib/kuroko2/workflow/engine.rb +141 -0
- data/lib/kuroko2/workflow/engine_error.rb +6 -0
- data/lib/kuroko2/workflow/node.rb +124 -0
- data/lib/kuroko2/workflow/notifier/concerns/chat_message_builder.rb +39 -0
- data/lib/kuroko2/workflow/notifier/hipchat.rb +88 -0
- data/lib/kuroko2/workflow/notifier/mail.rb +44 -0
- data/lib/kuroko2/workflow/notifier/slack.rb +121 -0
- data/lib/kuroko2/workflow/notifier.rb +31 -0
- data/lib/kuroko2/workflow/processor.rb +40 -0
- data/lib/kuroko2/workflow/scheduler.rb +42 -0
- data/lib/kuroko2/workflow/script_parser.rb +66 -0
- data/lib/kuroko2/workflow/shell_scanner.rb +34 -0
- data/lib/kuroko2/workflow/syntax_error.rb +6 -0
- data/lib/kuroko2/workflow/task/auto_skip_error.rb +20 -0
- data/lib/kuroko2/workflow/task/base.rb +32 -0
- data/lib/kuroko2/workflow/task/env.rb +45 -0
- data/lib/kuroko2/workflow/task/execute.rb +128 -0
- data/lib/kuroko2/workflow/task/expected_time.rb +9 -0
- data/lib/kuroko2/workflow/task/fork.rb +45 -0
- data/lib/kuroko2/workflow/task/kuroko_runner.rb +24 -0
- data/lib/kuroko2/workflow/task/noop.rb +13 -0
- data/lib/kuroko2/workflow/task/queue.rb +27 -0
- data/lib/kuroko2/workflow/task/rails_env.rb +24 -0
- data/lib/kuroko2/workflow/task/sequence.rb +13 -0
- data/lib/kuroko2/workflow/task/sleep.rb +29 -0
- data/lib/kuroko2/workflow/task/sub_process.rb +53 -0
- data/lib/kuroko2/workflow/task/time_base.rb +44 -0
- data/lib/kuroko2/workflow/task/timeout.rb +9 -0
- data/lib/kuroko2/workflow/task/wait.rb +143 -0
- data/lib/kuroko2.rb +26 -0
- data/lib/tasks/kuroko2_tasks.rake +4 -0
- data/spec/command/kill_spec.rb +20 -0
- data/spec/command/monitor_spec.rb +68 -0
- data/spec/command/shell_spec.rb +87 -0
- data/spec/controllers/dashboard_controller_spec.rb +5 -0
- data/spec/controllers/executions_controller_spec.rb +23 -0
- data/spec/controllers/job_definition_stats_controller_spec.rb +95 -0
- data/spec/controllers/job_definitions_controller_spec.rb +89 -0
- data/spec/controllers/job_instances_controller_spec.rb +62 -0
- data/spec/controllers/job_schedules_controller_spec.rb +39 -0
- data/spec/controllers/job_suspend_schedules_controller_spec.rb +39 -0
- data/spec/controllers/job_timelines_controller_spec.rb +114 -0
- data/spec/controllers/logs_controller_spec.rb +5 -0
- data/spec/controllers/sessions_controller_spec.rb +58 -0
- data/spec/controllers/stars_controller_spec.rb +28 -0
- data/spec/controllers/tokens_controller_spec.rb +5 -0
- data/spec/controllers/users_controller_spec.rb +51 -0
- data/spec/controllers/workers_controller_spec.rb +5 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/config/manifest.js +5 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/javascripts/cable.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +34 -0
- data/spec/dummy/bin/update +29 -0
- data/spec/dummy/config/application.rb +25 -0
- data/spec/dummy/config/boot.rb +3 -0
- data/spec/dummy/config/cable.yml +9 -0
- data/spec/dummy/config/database.yml +29 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +54 -0
- data/spec/dummy/config/environments/production.rb +86 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/new_framework_defaults.rb +23 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/kuroko2.yml +35 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/puma.rb +47 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/db/schema.rb +217 -0
- data/spec/dummy/lib/dummy_extention.rb +14 -0
- data/spec/dummy/lib/kuroko2/workflow/task/custom_task1.rb +13 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/execution_logger/cloud_watch_logs_spec.rb +95 -0
- data/spec/factories/execution_factory.rb +13 -0
- data/spec/factories/job_definition_factory.rb +21 -0
- data/spec/factories/job_instance_factory.rb +4 -0
- data/spec/factories/job_schedule_factory.rb +10 -0
- data/spec/factories/job_suspend_schedule_factory.rb +8 -0
- data/spec/factories/memory_expectancy_factory.rb +5 -0
- data/spec/factories/process_signal_factory.rb +4 -0
- data/spec/factories/star_factory.rb +4 -0
- data/spec/factories/tick_factory.rb +4 -0
- data/spec/factories/token_factory.rb +10 -0
- data/spec/factories/user_factory.rb +11 -0
- data/spec/factories/worker_factory.rb +8 -0
- data/spec/features/dashborad_spec.rb +82 -0
- data/spec/features/job_definition_spec.rb +74 -0
- data/spec/features/job_instance_spec.rb +94 -0
- data/spec/features/sign_in_and_out_spec.rb +17 -0
- data/spec/features/users_spec.rb +90 -0
- data/spec/features/workers_spec.rb +44 -0
- data/spec/helpers/executions_helper_spec.rb +4 -0
- data/spec/helpers/job_definition_helper_spec.rb +42 -0
- data/spec/helpers/job_schedules_helper_spec.rb +4 -0
- data/spec/helpers/logs_helper_spec.rb +4 -0
- data/spec/helpers/tokens_helper_spec.rb +4 -0
- data/spec/helpers/users_helper_spec.rb +4 -0
- data/spec/helpers/workers_helper_spec.rb +4 -0
- data/spec/mailers/notifications_spec.rb +54 -0
- data/spec/memory_sampler_spec.rb +11 -0
- data/spec/models/admin_assignment_spec.rb +4 -0
- data/spec/models/execution_spec.rb +26 -0
- data/spec/models/job_definition_spec.rb +163 -0
- data/spec/models/job_instance_spec.rb +115 -0
- data/spec/models/job_schedule_spec.rb +121 -0
- data/spec/models/job_suspend_schedule_spec.rb +32 -0
- data/spec/models/memory_consumption_log_spec.rb +50 -0
- data/spec/models/memory_expectancy_spec.rb +26 -0
- data/spec/models/star_spec.rb +4 -0
- data/spec/models/tick_spec.rb +23 -0
- data/spec/models/token_spec.rb +54 -0
- data/spec/models/user_spec.rb +17 -0
- data/spec/models/worker_spec.rb +5 -0
- data/spec/rails_helper.rb +81 -0
- data/spec/requests/api/job_instances_spec.rb +96 -0
- data/spec/requests/api/stats_spec.rb +45 -0
- data/spec/return_to_validator_spec.rb +28 -0
- data/spec/settings_spec.rb +10 -0
- data/spec/spec_helper.rb +49 -0
- data/spec/support/feature_sign_in_helper.rb +31 -0
- data/spec/support/sign_in_helper.rb +5 -0
- data/spec/support/wait_for_ajax.rb +11 -0
- data/spec/workflow/engine_spec.rb +241 -0
- data/spec/workflow/node_spec.rb +62 -0
- data/spec/workflow/notifier/hipchat_spec.rb +117 -0
- data/spec/workflow/notifier/mail_spec.rb +86 -0
- data/spec/workflow/notifier/slack_spec.rb +110 -0
- data/spec/workflow/script_parser_spec.rb +119 -0
- data/spec/workflow/shell_scanner_spec.rb +47 -0
- data/spec/workflow/task/auto_skip_error_spec.rb +35 -0
- data/spec/workflow/task/env_spec.rb +47 -0
- data/spec/workflow/task/execute_spec.rb +127 -0
- data/spec/workflow/task/expected_time_spec.rb +52 -0
- data/spec/workflow/task/fork_spec.rb +30 -0
- data/spec/workflow/task/queue_spec.rb +45 -0
- data/spec/workflow/task/rails_env_spec.rb +30 -0
- data/spec/workflow/task/sleep_spec.rb +22 -0
- data/spec/workflow/task/sub_process_spec.rb +32 -0
- data/spec/workflow/task/wait_spec.rb +162 -0
- metadata +1038 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
class Kuroko2::SessionsController < Kuroko2::ApplicationController
|
2
|
+
skip_before_action :require_sign_in
|
3
|
+
|
4
|
+
def new
|
5
|
+
render layout: false
|
6
|
+
end
|
7
|
+
|
8
|
+
def create
|
9
|
+
return_to = params[:state]
|
10
|
+
reset_session
|
11
|
+
|
12
|
+
self.current_user = Kuroko2::User.find_or_create_user(auth_hash[:uid], auth_hash[:info])
|
13
|
+
|
14
|
+
unless Kuroko2::ReturnToValidator.valid?(return_to)
|
15
|
+
return_to = root_path
|
16
|
+
end
|
17
|
+
redirect_to return_to
|
18
|
+
end
|
19
|
+
|
20
|
+
def destroy
|
21
|
+
reset_session
|
22
|
+
|
23
|
+
redirect_to sign_in_path
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def auth_hash
|
29
|
+
request.env['omniauth.auth']
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Kuroko2::StarsController < Kuroko2::ApplicationController
|
2
|
+
def create
|
3
|
+
star = Kuroko2::Star.new do |star|
|
4
|
+
star.job_definition = Kuroko2::JobDefinition.find(star_params[:job_definition_id])
|
5
|
+
star.user = current_user
|
6
|
+
end
|
7
|
+
|
8
|
+
if (star.save)
|
9
|
+
render json: star, status: :created
|
10
|
+
else
|
11
|
+
raise HTTP::BadRequest
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def destroy
|
16
|
+
star = Kuroko2::Star.find(params[:id])
|
17
|
+
|
18
|
+
if (star.destroy)
|
19
|
+
render json: star, status: :ok
|
20
|
+
else
|
21
|
+
raise HTTP::BadRequest
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def star_params
|
28
|
+
params.permit(:job_definition_id)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class Kuroko2::TokensController < Kuroko2::ApplicationController
|
2
|
+
|
3
|
+
before_action :set_token, only: %i(update)
|
4
|
+
before_action :set_engine, only: %i(update)
|
5
|
+
|
6
|
+
def index
|
7
|
+
@definition = Kuroko2::JobDefinition.find(tokens_params[:job_definition_id])
|
8
|
+
@instance = Kuroko2::JobInstance.find(tokens_params[:job_instance_id])
|
9
|
+
@tokens = @instance.tokens
|
10
|
+
|
11
|
+
render layout: false
|
12
|
+
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
@instance = @token.job_instance
|
16
|
+
|
17
|
+
case params[:invoke]
|
18
|
+
when 'skip'
|
19
|
+
@instance.logs.info("Skipped by #{current_user.name}.")
|
20
|
+
|
21
|
+
@engine.skip(@token)
|
22
|
+
when 'retry'
|
23
|
+
@instance.logs.info("Retry by #{current_user.name}.")
|
24
|
+
|
25
|
+
@engine.retry(@token)
|
26
|
+
else
|
27
|
+
raise HTTP::BadRequest
|
28
|
+
end
|
29
|
+
|
30
|
+
redirect_to job_definition_job_instance_path(job_definition_id: @token.job_definition_id, id: @token.job_instance.id)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def set_engine
|
36
|
+
@engine = Kuroko2::Workflow::Engine.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def set_token
|
40
|
+
@token = Kuroko2::Token.where(job_definition_id: params[:job_definition_id], job_instance_id: params[:job_instance_id]).find(params[:id])
|
41
|
+
end
|
42
|
+
|
43
|
+
def tokens_params
|
44
|
+
params.permit(:job_definition_id, :job_instance_id)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class Kuroko2::UsersController < Kuroko2::ApplicationController
|
2
|
+
before_action :set_user, only: [:destroy]
|
3
|
+
|
4
|
+
def index
|
5
|
+
@user = Kuroko2::User.new
|
6
|
+
if params[:target] == 'group'
|
7
|
+
@users = Kuroko2::User.group_user.all.page(page_params[:page])
|
8
|
+
else
|
9
|
+
@users = Kuroko2::User.all.page(page_params[:page])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def show
|
14
|
+
@user = Kuroko2::User.find(params[:id])
|
15
|
+
@input_tags = params[:tag] || []
|
16
|
+
|
17
|
+
@definitions = @user.assigned_job_definitions
|
18
|
+
if @input_tags.present?
|
19
|
+
@definitions = @definitions.tagged_by(@input_tags)
|
20
|
+
end
|
21
|
+
|
22
|
+
@instances = Kuroko2::JobInstance.working.where(job_definition: @definitions)
|
23
|
+
@related_tags = @definitions.includes(:tags).map(&:tags).flatten.uniq
|
24
|
+
end
|
25
|
+
|
26
|
+
def create
|
27
|
+
@user = Kuroko2::User.new(user_params)
|
28
|
+
@user.provider = Kuroko2::User::GROUP_PROVIDER
|
29
|
+
@user.uid = @user.email
|
30
|
+
|
31
|
+
if @user.save
|
32
|
+
redirect_to users_path
|
33
|
+
else
|
34
|
+
@users = Kuroko2::User.all
|
35
|
+
|
36
|
+
render action: :index
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy
|
41
|
+
if @user.destroy
|
42
|
+
redirect_to users_url
|
43
|
+
else
|
44
|
+
@users = Kuroko2::User.all
|
45
|
+
|
46
|
+
render :index
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def set_user
|
52
|
+
@user = Kuroko2::User.find(params[:id])
|
53
|
+
end
|
54
|
+
|
55
|
+
def user_params
|
56
|
+
params.require(:user).permit(:name, :email)
|
57
|
+
end
|
58
|
+
|
59
|
+
def page_params
|
60
|
+
params.permit(:page)
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Kuroko2
|
2
|
+
module JobDefinitionsHelper
|
3
|
+
def first_line(text)
|
4
|
+
truncate(text.split("\n").first, length: 140)
|
5
|
+
end
|
6
|
+
|
7
|
+
def markdown_format(text)
|
8
|
+
pipeline = HTML::Pipeline.new([HTML::Pipeline::MarkdownFilter])
|
9
|
+
raw(pipeline.call(text)[:output].to_s)
|
10
|
+
end
|
11
|
+
|
12
|
+
def stared_with(definition)
|
13
|
+
current_user.stars.find {|star| star.job_definition_id == definition.id }
|
14
|
+
end
|
15
|
+
|
16
|
+
def star_link_for(definition)
|
17
|
+
if stared_with(definition)
|
18
|
+
link_to(
|
19
|
+
raw('<i class="fa fa-star"></i>'),
|
20
|
+
job_definition_star_path(id: stared_with(definition), job_definition_id: definition),
|
21
|
+
remote: true,
|
22
|
+
method: :delete,
|
23
|
+
class: 'star',
|
24
|
+
data: { definition_id: definition.id, star_id: stared_with(definition).id, definitions_path: job_definitions_path }
|
25
|
+
)
|
26
|
+
else
|
27
|
+
link_to(
|
28
|
+
raw('<i class="fa fa-star-o"></i>'),
|
29
|
+
job_definition_stars_path(definition.id),
|
30
|
+
remote: true,
|
31
|
+
method: :post,
|
32
|
+
class: 'star',
|
33
|
+
data: { definition_id: definition.id, definitions_path: job_definitions_path }
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Kuroko2
|
2
|
+
module JobInstancesHelper
|
3
|
+
def labeled_log_level(level)
|
4
|
+
modifier = case level
|
5
|
+
when 'INFO'
|
6
|
+
'info'
|
7
|
+
when 'ERROR'
|
8
|
+
'danger'
|
9
|
+
when 'WARN'
|
10
|
+
'warning'
|
11
|
+
else
|
12
|
+
'default'
|
13
|
+
end
|
14
|
+
content_tag(:span, level, class: "label label-#{modifier}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def labeled_token_status(status)
|
18
|
+
modifier = case status
|
19
|
+
when 'working'
|
20
|
+
'primary'
|
21
|
+
when 'finished'
|
22
|
+
'success'
|
23
|
+
when 'waiting'
|
24
|
+
'warning'
|
25
|
+
when 'failure'
|
26
|
+
'danger'
|
27
|
+
when 'critical'
|
28
|
+
'warning'
|
29
|
+
else
|
30
|
+
'default'
|
31
|
+
end
|
32
|
+
content_tag(:span, status.upcase, class: "label label-#{modifier}")
|
33
|
+
end
|
34
|
+
|
35
|
+
def labeled_status(instance)
|
36
|
+
return '--' if instance.nil?
|
37
|
+
modifier = case instance.status
|
38
|
+
when 'success'
|
39
|
+
'success'
|
40
|
+
when 'canceled'
|
41
|
+
'warning'
|
42
|
+
when 'error'
|
43
|
+
'danger'
|
44
|
+
when 'working'
|
45
|
+
'primary'
|
46
|
+
else
|
47
|
+
'default'
|
48
|
+
end
|
49
|
+
content_tag(:span, instance.status.upcase, class: "label label-#{modifier}")
|
50
|
+
end
|
51
|
+
|
52
|
+
def first_line(lines)
|
53
|
+
lines.split("\n").first
|
54
|
+
end
|
55
|
+
|
56
|
+
def distance_of_time(from, to)
|
57
|
+
secs = (to - from).to_i
|
58
|
+
mins = secs / 60
|
59
|
+
hours = mins / 60
|
60
|
+
days = hours / 24
|
61
|
+
|
62
|
+
text = ''
|
63
|
+
if days > 0
|
64
|
+
text << "#{days}days "
|
65
|
+
end
|
66
|
+
|
67
|
+
text << "#{sprintf('%02d', hours % 24)}:#{sprintf('%02d', mins % 60)}:#{sprintf('%02d', secs % 60)}"
|
68
|
+
text
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Kuroko2
|
2
|
+
class Notifications < ApplicationMailer
|
3
|
+
default(
|
4
|
+
from: Kuroko2.config.notifiers.mail.mail_from,
|
5
|
+
to: Kuroko2.config.notifiers.mail.mail_to,
|
6
|
+
)
|
7
|
+
helper_method :job_instance_url
|
8
|
+
|
9
|
+
def job_failure(job_instance)
|
10
|
+
@definition = job_instance.job_definition
|
11
|
+
@instance = job_instance
|
12
|
+
|
13
|
+
attachments.inline['kuroko-logo-horizontal.jpg'] = Kuroko2::Engine.root.join('app/assets/images/kuroko2/kuroko-logo-horizontal.png').read
|
14
|
+
|
15
|
+
mail(subject: "[CRITICAL] Failed to execute '#{@definition.name}' on kuroko",
|
16
|
+
to: @definition.admins.map(&:email),
|
17
|
+
cc: Kuroko2.config.notifiers.mail.mail_to)
|
18
|
+
end
|
19
|
+
|
20
|
+
def remind_failure(job_instance)
|
21
|
+
@definition = job_instance.job_definition
|
22
|
+
@instance = job_instance
|
23
|
+
|
24
|
+
attachments.inline['kuroko-logo-horizontal.jpg'] = Kuroko2::Engine.root.join('app/assets/images/kuroko2/kuroko-logo-horizontal.png').read
|
25
|
+
|
26
|
+
mail(subject: "[WARN] '#{@definition.name}' is still in ERROR state",
|
27
|
+
to: @definition.admins.map(&:email),
|
28
|
+
cc: Kuroko2.config.notifiers.mail.mail_to)
|
29
|
+
end
|
30
|
+
|
31
|
+
def process_absence(execution, hostname)
|
32
|
+
@execution = execution
|
33
|
+
@definition = execution.job_definition
|
34
|
+
@instance = execution.job_instance
|
35
|
+
@hostname = hostname
|
36
|
+
|
37
|
+
mail(subject: '[CRITICAL] Process is not running on kuroko')
|
38
|
+
end
|
39
|
+
|
40
|
+
def executor_not_assigned(execution, hostname)
|
41
|
+
@execution = execution
|
42
|
+
@definition = execution.job_definition
|
43
|
+
@instance = execution.job_instance
|
44
|
+
|
45
|
+
mail(subject: '[CRITICAL] Process is not assigned to any job-executor')
|
46
|
+
end
|
47
|
+
|
48
|
+
def notify_long_elapsed_time(job_instance)
|
49
|
+
@definition = job_instance.job_definition
|
50
|
+
@instance = job_instance
|
51
|
+
|
52
|
+
mail(subject: "[WARN] The running time is longer than expected '#{@definition.name}' on kuroko",
|
53
|
+
to: @definition.admins.map(&:email),
|
54
|
+
cc: Kuroko2.config.notifiers.mail.mail_to)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def job_instance_url
|
60
|
+
job_definition_job_instance_url(@definition, @instance)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Kuroko2
|
2
|
+
module TableNameCustomizable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
self.table_name = self.kuroko2_table_name
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def kuroko2_table_name
|
11
|
+
Kuroko2.config.table_name_prefix +
|
12
|
+
self.name.gsub(/^Kuroko2::/, '').underscore.pluralize
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class Kuroko2::Execution < Kuroko2::ApplicationRecord
|
2
|
+
include Kuroko2::TableNameCustomizable
|
3
|
+
|
4
|
+
DEFAULT_QUEUE = '@default'
|
5
|
+
|
6
|
+
scope :of, ->(token) { where(token: token) }
|
7
|
+
scope :with, ->(queue) { where(queue: queue) }
|
8
|
+
scope :unstarted, -> { where(started_at: nil) }
|
9
|
+
scope :started, -> { where.not(started_at: nil) }
|
10
|
+
|
11
|
+
serialize :context, JSON
|
12
|
+
|
13
|
+
belongs_to :job_definition
|
14
|
+
belongs_to :job_instance
|
15
|
+
belongs_to :token, optional: true
|
16
|
+
|
17
|
+
has_one :worker
|
18
|
+
|
19
|
+
before_create :set_default_values
|
20
|
+
|
21
|
+
delegate :log_memory_consumption, to: :job_instance
|
22
|
+
|
23
|
+
def completed?
|
24
|
+
started_at? && finished_at?
|
25
|
+
end
|
26
|
+
|
27
|
+
def success?
|
28
|
+
exit_status == 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.poll(queue = DEFAULT_QUEUE)
|
32
|
+
self.transaction do
|
33
|
+
unstarted.with(queue).lock.take.tap do |execution|
|
34
|
+
execution.touch(:started_at) if execution
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def finish(output:, exit_status:)
|
40
|
+
update!(output: output, exit_status: exit_status, finished_at: Time.now)
|
41
|
+
job_definition.memory_expectancy.calculate!
|
42
|
+
end
|
43
|
+
|
44
|
+
def finish_by_signal(output:, term_signal:)
|
45
|
+
update!(output: output, term_signal: term_signal, finished_at: Time.now)
|
46
|
+
job_definition.memory_expectancy.calculate!
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def set_default_values
|
52
|
+
self.uuid ||= SecureRandom.uuid
|
53
|
+
self.context ||= {}
|
54
|
+
end
|
55
|
+
end
|