rocketjob_mission_control 1.2.4 → 2.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +201 -0
- data/README.md +85 -0
- data/Rakefile +12 -18
- data/app/assets/javascripts/rocket_job_mission_control/application.js +3 -0
- data/app/assets/javascripts/rocket_job_mission_control/base.js.coffee +9 -12
- data/app/assets/javascripts/rocket_job_mission_control/datatable.js.coffee +31 -0
- data/app/assets/javascripts/rocket_job_mission_control/dirmon_entries.js.coffee +0 -1
- data/app/assets/stylesheets/rocket_job_mission_control/application.scss +2 -0
- data/app/assets/stylesheets/rocket_job_mission_control/base.scss +310 -357
- data/app/assets/stylesheets/rocket_job_mission_control/bootstrap_and_overrides.scss +474 -3
- data/app/assets/stylesheets/rocket_job_mission_control/callout.scss +57 -12
- data/app/assets/stylesheets/rocket_job_mission_control/jobs.scss +3 -2
- data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +9 -0
- data/app/controllers/rocket_job_mission_control/active_processes_controller.rb +26 -0
- data/app/controllers/rocket_job_mission_control/dirmon_entries/index_filters_controller.rb +50 -0
- data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +11 -14
- data/app/controllers/rocket_job_mission_control/jobs/failures_controller.rb +2 -2
- data/app/controllers/rocket_job_mission_control/jobs/index_filters_controller.rb +69 -0
- data/app/controllers/rocket_job_mission_control/jobs_controller.rb +10 -12
- data/app/controllers/rocket_job_mission_control/workers/index_filters_controller.rb +50 -0
- data/app/controllers/rocket_job_mission_control/workers_controller.rb +14 -5
- data/app/datatables/rocket_job_mission_control/active_processes_datatable.rb +79 -0
- data/app/datatables/rocket_job_mission_control/completed_jobs_datatable.rb +26 -0
- data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +95 -0
- data/app/datatables/rocket_job_mission_control/interrupted_jobs_datatable.rb +25 -0
- data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +95 -0
- data/app/datatables/rocket_job_mission_control/queued_jobs_datatable.rb +22 -0
- data/app/datatables/rocket_job_mission_control/running_jobs_datatable.rb +35 -0
- data/app/datatables/rocket_job_mission_control/scheduled_jobs_datatable.rb +30 -0
- data/app/datatables/rocket_job_mission_control/workers_datatable.rb +127 -0
- data/app/helpers/rocket_job_mission_control/application_helper.rb +21 -2
- data/app/helpers/rocket_job_mission_control/dirmon_entries_helper.rb +7 -0
- data/app/helpers/rocket_job_mission_control/jobs_helper.rb +9 -26
- data/app/helpers/rocket_job_mission_control/workers_helper.rb +18 -6
- data/app/interactors/rocket_job_mission_control/dirmon_entries/search.rb +19 -0
- data/app/interactors/rocket_job_mission_control/jobs/search.rb +19 -0
- data/app/interactors/rocket_job_mission_control/workers/search.rb +19 -0
- data/app/models/job_failures.rb +5 -5
- data/app/views/layouts/rocket_job_mission_control/application.html.haml +22 -22
- data/app/views/layouts/rocket_job_mission_control/partials/_header.html.haml +33 -18
- data/app/views/layouts/rocket_job_mission_control/partials/_sidebar.html.haml +11 -24
- data/app/views/rocket_job_mission_control/active_processes/index.html.haml +24 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_form.html.haml +11 -10
- data/app/views/rocket_job_mission_control/dirmon_entries/_properties.html.haml +6 -3
- data/app/views/rocket_job_mission_control/dirmon_entries/_sidebar.html.haml +27 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.haml +0 -3
- data/app/views/rocket_job_mission_control/dirmon_entries/edit.html.haml +3 -7
- data/app/views/rocket_job_mission_control/dirmon_entries/index.html.haml +17 -10
- data/app/views/rocket_job_mission_control/dirmon_entries/index_filters/disabled.html.haml +17 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/index_filters/enabled.html.haml +17 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/index_filters/failed.html.haml +17 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/index_filters/pending.html.haml +17 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/new.html.haml +5 -8
- data/app/views/rocket_job_mission_control/dirmon_entries/show.html.haml +18 -22
- data/app/views/rocket_job_mission_control/jobs/_sidebar.html.haml +28 -0
- data/app/views/rocket_job_mission_control/jobs/failures/index.html.haml +2 -2
- data/app/views/rocket_job_mission_control/jobs/index.html.haml +23 -10
- data/app/views/rocket_job_mission_control/jobs/index_filters/aborted.html.haml +22 -0
- data/app/views/rocket_job_mission_control/jobs/index_filters/completed.html.haml +23 -0
- data/app/views/rocket_job_mission_control/jobs/index_filters/failed.html.haml +22 -0
- data/app/views/rocket_job_mission_control/jobs/index_filters/paused.html.haml +22 -0
- data/app/views/rocket_job_mission_control/jobs/index_filters/queued.html.haml +23 -0
- data/app/views/rocket_job_mission_control/jobs/index_filters/running.html.haml +24 -0
- data/app/views/rocket_job_mission_control/jobs/index_filters/scheduled.html.haml +23 -0
- data/app/views/rocket_job_mission_control/jobs/show.html.haml +5 -8
- data/app/views/rocket_job_mission_control/workers/_sidebar.html.haml +20 -0
- data/app/views/rocket_job_mission_control/workers/index.html.haml +36 -59
- data/app/views/rocket_job_mission_control/workers/index_filters/paused.html.haml +37 -0
- data/app/views/rocket_job_mission_control/workers/index_filters/running.html.haml +37 -0
- data/app/views/rocket_job_mission_control/workers/index_filters/starting.html.haml +37 -0
- data/app/views/rocket_job_mission_control/workers/index_filters/stopping.html.haml +37 -0
- data/config/routes.rb +28 -5
- data/lib/rocket_job_mission_control/engine.rb +2 -0
- data/lib/rocket_job_mission_control/version.rb +1 -1
- data/spec/controllers/application_controller_spec.rb +1 -1
- data/spec/controllers/dirmon_entries_controller_spec.rb +35 -97
- data/spec/controllers/jobs/failures_controller_spec.rb +4 -4
- data/spec/controllers/jobs_controller_spec.rb +10 -80
- data/spec/dummy/config/environments/development.rb +7 -7
- data/spec/dummy/config/environments/test.rb +9 -9
- data/spec/dummy/log/test.log +5446 -23487
- data/spec/helpers/application_helper_spec.rb +58 -0
- data/spec/helpers/jobs_helper_spec.rb +0 -65
- data/spec/helpers/slices_helper_spec.rb +1 -1
- data/spec/helpers/workers_helper_spec.rb +1 -1
- metadata +64 -44
- data/MIT-LICENSE +0 -20
- data/app/assets/javascripts/rocket_job_mission_control/jobs.js.coffee +0 -11
- data/app/views/rocket_job_mission_control/dirmon_entries/_list.html.haml +0 -31
- data/app/views/rocket_job_mission_control/jobs/_list.html.haml +0 -35
- data/app/views/rocket_job_mission_control/jobs/running.html.haml +0 -37
- data/spec/dummy/log/development.log +0 -0
- data/spec/views/workers/index.html.haml_spec.rb +0 -23
@@ -3,16 +3,20 @@ module RocketJobMissionControl
|
|
3
3
|
class DirmonEntriesController < RocketJobMissionControl::ApplicationController
|
4
4
|
before_filter :find_entry_or_redirect, except: [:index, :new, :create]
|
5
5
|
before_filter :clean_values, only: [:create, :update]
|
6
|
-
|
6
|
+
before_filter :show_sidebar
|
7
7
|
|
8
8
|
def index
|
9
|
+
@dirmons = RocketJob::DirmonEntry.where()
|
10
|
+
respond_to do |format|
|
11
|
+
format.html
|
12
|
+
format.json { render(json: DirmonEntriesDatatable.new(view_context, @dirmons)) }
|
13
|
+
end
|
9
14
|
end
|
10
15
|
|
11
16
|
def show
|
12
17
|
end
|
13
18
|
|
14
19
|
def new
|
15
|
-
dirmon_params.reverse_merge!(perform_method: :perform)
|
16
20
|
@dirmon_entry = RocketJob::DirmonEntry.new(dirmon_params)
|
17
21
|
@previous_job_class_names = RocketJob::DirmonEntry.distinct(:job_class_name)
|
18
22
|
|
@@ -31,7 +35,6 @@ module RocketJobMissionControl
|
|
31
35
|
flash[:success] = t(:success, scope: [:dirmon_entry, :create])
|
32
36
|
redirect_to(dirmon_entry_path(@dirmon_entry))
|
33
37
|
else
|
34
|
-
load_entries
|
35
38
|
render :new
|
36
39
|
end
|
37
40
|
end
|
@@ -54,7 +57,6 @@ module RocketJobMissionControl
|
|
54
57
|
flash[:success] = t(:success, scope: [:dirmon_entry, :update])
|
55
58
|
redirect_to(rocket_job_mission_control.dirmon_entry_path(@dirmon_entry))
|
56
59
|
else
|
57
|
-
load_entries
|
58
60
|
render :edit
|
59
61
|
end
|
60
62
|
end
|
@@ -66,7 +68,6 @@ module RocketJobMissionControl
|
|
66
68
|
redirect_to(rocket_job_mission_control.dirmon_entry_path(@dirmon_entry))
|
67
69
|
else
|
68
70
|
flash[:alert] = t(:failure, scope: [:dirmon_entry, :enable])
|
69
|
-
load_entries
|
70
71
|
render(:show)
|
71
72
|
end
|
72
73
|
end
|
@@ -78,7 +79,6 @@ module RocketJobMissionControl
|
|
78
79
|
redirect_to(rocket_job_mission_control.dirmon_entry_path(@dirmon_entry))
|
79
80
|
else
|
80
81
|
flash[:alert] = t(:failure, scope: [:dirmon_entry, :disable])
|
81
|
-
load_entries
|
82
82
|
render(:show)
|
83
83
|
end
|
84
84
|
end
|
@@ -90,6 +90,10 @@ module RocketJobMissionControl
|
|
90
90
|
|
91
91
|
private
|
92
92
|
|
93
|
+
def show_sidebar
|
94
|
+
@dirmon_sidebar = true
|
95
|
+
end
|
96
|
+
|
93
97
|
def parse_and_assign_arguments
|
94
98
|
arguments = params[:rocket_job_dirmon_entry][:arguments] || []
|
95
99
|
@dirmon_entry.arguments = arguments.collect do |value|
|
@@ -140,12 +144,6 @@ module RocketJobMissionControl
|
|
140
144
|
end
|
141
145
|
end
|
142
146
|
|
143
|
-
def load_entries
|
144
|
-
@states = dirmons_params
|
145
|
-
@dirmons = RocketJob::DirmonEntry.limit(1000).sort(created_at: :desc)
|
146
|
-
@dirmons = @dirmons.where(state: @states) unless @states.empty?
|
147
|
-
end
|
148
|
-
|
149
147
|
def find_entry_or_redirect
|
150
148
|
@dirmon_entry = RocketJob::DirmonEntry.find(params[:id])
|
151
149
|
|
@@ -163,10 +161,9 @@ module RocketJobMissionControl
|
|
163
161
|
def dirmon_params
|
164
162
|
params
|
165
163
|
.fetch(:rocket_job_dirmon_entry, {})
|
166
|
-
.permit(:name, :archive_directory, :pattern, :job_class_name
|
164
|
+
.permit(:name, :archive_directory, :pattern, :job_class_name).tap do |whitelist|
|
167
165
|
whitelist[:properties] = params[:rocket_job_dirmon_entry][:properties] if params.fetch(:rocket_job_dirmon_entry, {})[:properties]
|
168
166
|
end
|
169
167
|
end
|
170
|
-
|
171
168
|
end
|
172
169
|
end
|
@@ -3,13 +3,13 @@ module RocketJobMissionControl
|
|
3
3
|
class FailuresController < RocketJobMissionControl::ApplicationController
|
4
4
|
def index
|
5
5
|
job_failures = JobFailures.new(params[:job_id])
|
6
|
-
@job
|
6
|
+
@job = job_failures.job
|
7
7
|
|
8
8
|
if @job && @job.failed?
|
9
9
|
@slice_errors = job_failures.list
|
10
10
|
|
11
11
|
if @slice_errors.present?
|
12
|
-
@error_type
|
12
|
+
@error_type = params[:error_type] || @slice_errors.first['_id']['error_class']
|
13
13
|
|
14
14
|
offset = params.fetch(:offset, 0).to_i
|
15
15
|
selected_exception = job_failures.for_error(@error_type, offset)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
module Jobs
|
3
|
+
class IndexFiltersController < RocketJobMissionControl::ApplicationController
|
4
|
+
before_filter :show_sidebar
|
5
|
+
|
6
|
+
def running
|
7
|
+
running_jobs = RocketJob::Job.where(state: :running).sort(_id: :desc)
|
8
|
+
respond_to do |format|
|
9
|
+
format.html
|
10
|
+
format.json { render(json: RunningJobsDatatable.new(view_context, running_jobs)) }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def paused
|
15
|
+
paused_jobs = RocketJob::Job.where(state: :paused).sort(_id: :desc)
|
16
|
+
respond_to do |format|
|
17
|
+
format.html
|
18
|
+
format.json { render(json: InterruptedJobsDatatable.new(view_context, paused_jobs)) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def completed
|
23
|
+
completed_jobs = RocketJob::Job.where(state: :completed).sort(_id: :desc)
|
24
|
+
respond_to do |format|
|
25
|
+
format.html
|
26
|
+
format.json { render(json: CompletedJobsDatatable.new(view_context, completed_jobs)) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def aborted
|
31
|
+
aborted_jobs = RocketJob::Job.where(state: :aborted).sort(_id: :desc)
|
32
|
+
respond_to do |format|
|
33
|
+
format.html
|
34
|
+
format.json { render(json: InterruptedJobsDatatable.new(view_context, aborted_jobs)) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def failed
|
39
|
+
failed_jobs = RocketJob::Job.where(state: :failed).sort(_id: :desc)
|
40
|
+
respond_to do |format|
|
41
|
+
format.html
|
42
|
+
format.json { render(json: InterruptedJobsDatatable.new(view_context, failed_jobs)) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def queued
|
47
|
+
queued_jobs = RocketJob::Job.queued_now.sort(_id: :desc)
|
48
|
+
respond_to do |format|
|
49
|
+
format.html
|
50
|
+
format.json { render(json: QueuedJobsDatatable.new(view_context, queued_jobs)) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def scheduled
|
55
|
+
scheduled_jobs = RocketJob::Job.scheduled.sort(_id: :desc)
|
56
|
+
respond_to do |format|
|
57
|
+
format.html
|
58
|
+
format.json { render(json: ScheduledJobsDatatable.new(view_context, scheduled_jobs)) }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def show_sidebar
|
65
|
+
@jobs_sidebar = true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -1,10 +1,15 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
2
|
class JobsController < RocketJobMissionControl::ApplicationController
|
3
|
-
before_filter :find_job_or_redirect, except: [:index
|
3
|
+
before_filter :find_job_or_redirect, except: [:index]
|
4
|
+
before_filter :show_sidebar
|
4
5
|
rescue_from StandardError, with: :error_occurred
|
5
6
|
|
6
|
-
def
|
7
|
-
@jobs
|
7
|
+
def index
|
8
|
+
@jobs = RocketJob::Job.sort(_id: :desc)
|
9
|
+
respond_to do |format|
|
10
|
+
format.html
|
11
|
+
format.json { render(json: JobsDatatable.new(view_context, @jobs)) }
|
12
|
+
end
|
8
13
|
end
|
9
14
|
|
10
15
|
def update
|
@@ -54,19 +59,12 @@ module RocketJobMissionControl
|
|
54
59
|
end
|
55
60
|
|
56
61
|
def show
|
57
|
-
load_jobs
|
58
|
-
end
|
59
|
-
|
60
|
-
def index
|
61
|
-
load_jobs
|
62
62
|
end
|
63
63
|
|
64
64
|
private
|
65
65
|
|
66
|
-
def
|
67
|
-
@
|
68
|
-
@jobs = RocketJob::Job.limit(1000).sort(created_at: :desc)
|
69
|
-
@jobs = @jobs.where(state: @states) unless @states.empty?
|
66
|
+
def show_sidebar
|
67
|
+
@jobs_sidebar = true
|
70
68
|
end
|
71
69
|
|
72
70
|
def find_job_or_redirect
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
module Workers
|
3
|
+
class IndexFiltersController < RocketJobMissionControl::ApplicationController
|
4
|
+
before_filter :load_workers
|
5
|
+
before_filter :show_sidebar
|
6
|
+
|
7
|
+
def starting
|
8
|
+
@workers = @workers.where(state: :starting)
|
9
|
+
respond_to do |format|
|
10
|
+
format.html
|
11
|
+
format.json { render(json: WorkersDatatable.new(view_context, @workers)) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def running
|
16
|
+
@workers = @workers.where(state: :running)
|
17
|
+
respond_to do |format|
|
18
|
+
format.html
|
19
|
+
format.json { render(json: WorkersDatatable.new(view_context, @workers)) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def paused
|
24
|
+
@workers = @workers.where(state: :paused)
|
25
|
+
respond_to do |format|
|
26
|
+
format.html
|
27
|
+
format.json { render(json: WorkersDatatable.new(view_context, @workers)) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def stopping
|
32
|
+
@workers = @workers.where(state: :stopping)
|
33
|
+
respond_to do |format|
|
34
|
+
format.html
|
35
|
+
format.json { render(json: WorkersDatatable.new(view_context, @workers)) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def load_workers
|
42
|
+
@workers = RocketJob::Worker.sort(:name)
|
43
|
+
end
|
44
|
+
|
45
|
+
def show_sidebar
|
46
|
+
@workers_sidebar = true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -1,9 +1,14 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
2
|
class WorkersController < RocketJobMissionControl::ApplicationController
|
3
3
|
before_filter :find_worker, only: [:stop, :pause, :resume, :destroy]
|
4
|
+
before_filter :show_sidebar
|
4
5
|
|
5
6
|
def index
|
6
7
|
@workers = RocketJob::Worker.sort(:name)
|
8
|
+
respond_to do |format|
|
9
|
+
format.html
|
10
|
+
format.json { render(json: WorkersDatatable.new(view_context, @workers)) }
|
11
|
+
end
|
7
12
|
end
|
8
13
|
|
9
14
|
VALID_STATES = {
|
@@ -19,7 +24,7 @@ module RocketJobMissionControl
|
|
19
24
|
RocketJob::Worker.send(worker_action.to_sym)
|
20
25
|
flash[:notice] = t(:success, scope: [:worker, :update_all], worker_action: VALID_STATES[worker_action])
|
21
26
|
else
|
22
|
-
flash[:alert]
|
27
|
+
flash[:alert] = t(:invalid, scope: [:worker, :update_all])
|
23
28
|
end
|
24
29
|
|
25
30
|
respond_to do |format|
|
@@ -31,7 +36,7 @@ module RocketJobMissionControl
|
|
31
36
|
if @worker.stop!
|
32
37
|
flash[:notice] = t(:success, scope: [:worker, :stop])
|
33
38
|
else
|
34
|
-
flash[:alert]
|
39
|
+
flash[:alert] = t(:failure, scope: [:worker, :stop])
|
35
40
|
end
|
36
41
|
|
37
42
|
respond_to do |format|
|
@@ -43,7 +48,7 @@ module RocketJobMissionControl
|
|
43
48
|
if @worker.destroy
|
44
49
|
flash[:notice] = t(:success, scope: [:worker, :destroy])
|
45
50
|
else
|
46
|
-
flash[:alert]
|
51
|
+
flash[:alert] = t(:failure, scope: [:worker, :destroy])
|
47
52
|
end
|
48
53
|
|
49
54
|
respond_to do |format|
|
@@ -55,7 +60,7 @@ module RocketJobMissionControl
|
|
55
60
|
if @worker.pause!
|
56
61
|
flash[:notice] = t(:success, scope: [:worker, :pause])
|
57
62
|
else
|
58
|
-
flash[:alert]
|
63
|
+
flash[:alert] = t(:failure, scope: [:worker, :pause])
|
59
64
|
end
|
60
65
|
|
61
66
|
respond_to do |format|
|
@@ -67,7 +72,7 @@ module RocketJobMissionControl
|
|
67
72
|
if @worker.resume!
|
68
73
|
flash[:notice] = t(:success, scope: [:worker, :resume])
|
69
74
|
else
|
70
|
-
flash[:alert]
|
75
|
+
flash[:alert] = t(:failure, scope: [:worker, :resume])
|
71
76
|
end
|
72
77
|
|
73
78
|
respond_to do |format|
|
@@ -80,5 +85,9 @@ module RocketJobMissionControl
|
|
80
85
|
def find_worker
|
81
86
|
@worker = RocketJob::Worker.find(params[:id])
|
82
87
|
end
|
88
|
+
|
89
|
+
def show_sidebar
|
90
|
+
@workers_sidebar = true
|
91
|
+
end
|
83
92
|
end
|
84
93
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
class ActiveProcessesDatatable
|
3
|
+
delegate :params, :link_to, :job_path, :job_icon, to: :@view
|
4
|
+
delegate :h, to: 'ERB::Util'
|
5
|
+
|
6
|
+
def initialize(view, processes)
|
7
|
+
@view = view
|
8
|
+
@unfiltered_processes = processes
|
9
|
+
end
|
10
|
+
|
11
|
+
def as_json(options = {})
|
12
|
+
{
|
13
|
+
:draw => params[:draw].to_i,
|
14
|
+
:recordsTotal => get_raw_records.count,
|
15
|
+
:recordsFiltered => get_raw_records.count,
|
16
|
+
:data => data
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def data
|
23
|
+
processes.map do |worker_name, job, started_at|
|
24
|
+
{
|
25
|
+
'0' => worker_name_with_icon(worker_name, job),
|
26
|
+
'1' => job_name_with_link(job),
|
27
|
+
'2' => h(job.description.try(:truncate, 50)),
|
28
|
+
'3' => h(duration(started_at)),
|
29
|
+
'DT_RowClass' => "card callout callout-running"
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_raw_records
|
35
|
+
@unfiltered_processes
|
36
|
+
end
|
37
|
+
|
38
|
+
def processes
|
39
|
+
@processes ||= fetch_processes
|
40
|
+
end
|
41
|
+
|
42
|
+
def fetch_processes
|
43
|
+
records = get_raw_records
|
44
|
+
records = paginate_records(records) unless params[:length].present? && params[:length] == '-1'
|
45
|
+
records
|
46
|
+
end
|
47
|
+
|
48
|
+
def page
|
49
|
+
(params[:start].to_i / per_page) + 1
|
50
|
+
end
|
51
|
+
|
52
|
+
def per_page
|
53
|
+
params.fetch(:length, 10).to_i
|
54
|
+
end
|
55
|
+
|
56
|
+
def paginate_records(records)
|
57
|
+
Kaminari.paginate_array(records).page(page).per(per_page)
|
58
|
+
end
|
59
|
+
|
60
|
+
def worker_name_with_icon(worker_name, job)
|
61
|
+
<<-EOS
|
62
|
+
<i class="fa #{job_icon(job)}" style="font-size: 75%" title="#{job.state}"></i>
|
63
|
+
#{worker_name}
|
64
|
+
EOS
|
65
|
+
end
|
66
|
+
|
67
|
+
def job_name_with_link(job)
|
68
|
+
<<-EOS
|
69
|
+
<a href="#{job_path(job.id)}">
|
70
|
+
#{job.class.name}
|
71
|
+
</a>
|
72
|
+
EOS
|
73
|
+
end
|
74
|
+
|
75
|
+
def duration(started_at)
|
76
|
+
"#{RocketJob.seconds_as_duration(Time.now - started_at)} ago" if started_at
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
class CompletedJobsDatatable < JobsDatatable
|
3
|
+
private
|
4
|
+
|
5
|
+
def data
|
6
|
+
jobs.map do |job|
|
7
|
+
{
|
8
|
+
'0' => class_with_link(job),
|
9
|
+
'1' => h(job.description.try(:truncate, 50)),
|
10
|
+
'2' => h(job.duration),
|
11
|
+
'3' => h(completed_ago(job)),
|
12
|
+
'DT_RowClass' => "card callout callout-#{job.state}"
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def sort_column(index)
|
18
|
+
columns = %w[_type description duration completed_at]
|
19
|
+
columns[index.to_i]
|
20
|
+
end
|
21
|
+
|
22
|
+
def completed_ago(job)
|
23
|
+
"#{RocketJob.seconds_as_duration(Time.now - job.completed_at)} ago"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
class DirmonEntriesDatatable
|
3
|
+
delegate :params,
|
4
|
+
:link_to,
|
5
|
+
:dirmon_entry_path,
|
6
|
+
:state_icon,
|
7
|
+
:render, to: :@view
|
8
|
+
|
9
|
+
delegate :h, to: 'ERB::Util'
|
10
|
+
|
11
|
+
def initialize(view, dirmons)
|
12
|
+
@view = view
|
13
|
+
@unfiltered_dirmons = dirmons
|
14
|
+
end
|
15
|
+
|
16
|
+
def as_json(options = {})
|
17
|
+
{
|
18
|
+
:draw => params[:draw].to_i,
|
19
|
+
:recordsTotal => get_raw_records.count,
|
20
|
+
:recordsFiltered => filter_records(get_raw_records).count,
|
21
|
+
:data => data
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def data
|
28
|
+
dirmons.map do |dirmon|
|
29
|
+
{
|
30
|
+
'0' => name_with_link(dirmon),
|
31
|
+
'1' => h(dirmon.job_class_name),
|
32
|
+
'2' => h(dirmon.pattern.try(:truncate, 80)),
|
33
|
+
'DT_RowClass' => "card callout callout-#{dirmon.state}"
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_raw_records
|
39
|
+
@unfiltered_dirmons
|
40
|
+
end
|
41
|
+
|
42
|
+
def dirmons
|
43
|
+
@dirmons ||= fetch_dirmons
|
44
|
+
end
|
45
|
+
|
46
|
+
def fetch_dirmons
|
47
|
+
records = get_raw_records
|
48
|
+
records = sort_records(records) if params[:order].present?
|
49
|
+
records = filter_records(records) if params[:search].present?
|
50
|
+
records = paginate_records(records) unless params[:length].present? && params[:length] == '-1'
|
51
|
+
records
|
52
|
+
end
|
53
|
+
|
54
|
+
def page
|
55
|
+
(params[:start].to_i / per_page) + 1
|
56
|
+
end
|
57
|
+
|
58
|
+
def per_page
|
59
|
+
params.fetch(:length, 10).to_i
|
60
|
+
end
|
61
|
+
|
62
|
+
def sort_records(records)
|
63
|
+
sort_by = {}
|
64
|
+
params[:order].keys.each do |key|
|
65
|
+
sort_by[sort_column(params[:order][key][:column])] = params[:order][key][:dir]
|
66
|
+
end
|
67
|
+
records.sort(sort_by)
|
68
|
+
end
|
69
|
+
|
70
|
+
def sort_column(index)
|
71
|
+
columns = %w[name max_threads started_at heartbeat.updated_at]
|
72
|
+
columns[index.to_i]
|
73
|
+
end
|
74
|
+
|
75
|
+
def filter_records(records)
|
76
|
+
return records unless (params[:search].present? && params[:search][:value].present?)
|
77
|
+
conditions = params[:search][:value]#build_conditions_for(params[:search][:value])
|
78
|
+
records = RocketJobMissionControl::DirmonEntries::Search.new(conditions, records).execute if conditions
|
79
|
+
records
|
80
|
+
end
|
81
|
+
|
82
|
+
def paginate_records(records)
|
83
|
+
Kaminari.paginate_array(records.all).page(page).per(per_page)
|
84
|
+
end
|
85
|
+
|
86
|
+
def name_with_link(dirmon)
|
87
|
+
<<-EOS
|
88
|
+
<a href="#{dirmon_entry_path(dirmon.id)}">
|
89
|
+
<i class="fa #{state_icon(dirmon.state)}" style="font-size: 75%" title="#{dirmon.state}"></i>
|
90
|
+
#{dirmon.name}
|
91
|
+
</a>
|
92
|
+
EOS
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
class InterruptedJobsDatatable < JobsDatatable
|
3
|
+
private
|
4
|
+
|
5
|
+
def data
|
6
|
+
jobs.map do |job|
|
7
|
+
{
|
8
|
+
'0' => class_with_link(job),
|
9
|
+
'1' => h(job.description.try(:truncate, 50)),
|
10
|
+
'2' => h(interrupted_ago(job)),
|
11
|
+
'DT_RowClass' => "card callout callout-#{job.state}"
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def sort_column(index)
|
17
|
+
columns = %w[_type description completed_at]
|
18
|
+
columns[index.to_i]
|
19
|
+
end
|
20
|
+
|
21
|
+
def interrupted_ago(job)
|
22
|
+
"#{RocketJob.seconds_as_duration(Time.now - job.completed_at)} ago"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
class JobsDatatable
|
3
|
+
delegate :params, :link_to, :job_path, :job_icon, to: :@view
|
4
|
+
delegate :h, to: 'ERB::Util'
|
5
|
+
|
6
|
+
def initialize(view, jobs)
|
7
|
+
@view = view
|
8
|
+
@unfiltered_jobs = jobs
|
9
|
+
end
|
10
|
+
|
11
|
+
def as_json(options = {})
|
12
|
+
{
|
13
|
+
:draw => params[:draw].to_i,
|
14
|
+
:recordsTotal => get_raw_records.count,
|
15
|
+
:recordsFiltered => filter_records(get_raw_records).count,
|
16
|
+
:data => data
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def data
|
23
|
+
jobs.map do |job|
|
24
|
+
{
|
25
|
+
'0' => class_with_link(job),
|
26
|
+
'1' => h(job.description.try(:truncate, 50)),
|
27
|
+
'2' => h(job.completed_at),
|
28
|
+
'3' => h(job.duration),
|
29
|
+
'DT_RowClass' => "card callout callout-#{job.state}"
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_raw_records
|
35
|
+
@unfiltered_jobs
|
36
|
+
end
|
37
|
+
|
38
|
+
def jobs
|
39
|
+
@jobs ||= fetch_jobs
|
40
|
+
end
|
41
|
+
|
42
|
+
def fetch_jobs
|
43
|
+
records = get_raw_records
|
44
|
+
records = sort_records(records) if params[:order].present?
|
45
|
+
records = filter_records(records) if params[:search].present?
|
46
|
+
records = paginate_records(records) unless params[:length].present? && params[:length] == '-1'
|
47
|
+
records
|
48
|
+
end
|
49
|
+
|
50
|
+
def class_with_link(job)
|
51
|
+
<<-EOS
|
52
|
+
<a href="#{job_path(job.id)}">
|
53
|
+
<i class="fa #{job_icon(job)}" style="font-size: 75%" title="#{job.state}"></i>
|
54
|
+
#{job.class.name}
|
55
|
+
</a>
|
56
|
+
EOS
|
57
|
+
end
|
58
|
+
|
59
|
+
def page
|
60
|
+
(params[:start].to_i / per_page) + 1
|
61
|
+
end
|
62
|
+
|
63
|
+
def per_page
|
64
|
+
params.fetch(:length, 10).to_i
|
65
|
+
end
|
66
|
+
|
67
|
+
def sort_records(records)
|
68
|
+
sort_by = {}
|
69
|
+
params[:order].keys.each do |key|
|
70
|
+
sort_by[sort_column(params[:order][key][:column])] = params[:order][key][:dir]
|
71
|
+
end
|
72
|
+
records.sort(sort_by)
|
73
|
+
end
|
74
|
+
|
75
|
+
def counts
|
76
|
+
RocketJob::Job.counts_by_state
|
77
|
+
end
|
78
|
+
|
79
|
+
def sort_column(index)
|
80
|
+
columns = %w[_type description completed_at]
|
81
|
+
columns[index.to_i]
|
82
|
+
end
|
83
|
+
|
84
|
+
def filter_records(records)
|
85
|
+
return records unless (params[:search].present? && params[:search][:value].present?)
|
86
|
+
conditions = params[:search][:value]#build_conditions_for(params[:search][:value])
|
87
|
+
records = RocketJobMissionControl::Jobs::Search.new(conditions, records).execute if conditions
|
88
|
+
records
|
89
|
+
end
|
90
|
+
|
91
|
+
def paginate_records(records)
|
92
|
+
Kaminari.paginate_array(records.all).page(page).per(per_page)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
class QueuedJobsDatatable < JobsDatatable
|
3
|
+
private
|
4
|
+
|
5
|
+
def data
|
6
|
+
jobs.map do |job|
|
7
|
+
{
|
8
|
+
'0' => class_with_link(job),
|
9
|
+
'1' => h(job.description.try(:truncate, 50)),
|
10
|
+
'2' => h(job.priority),
|
11
|
+
'3' => h(job.duration),
|
12
|
+
'DT_RowClass' => "card callout callout-#{job.state}"
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def sort_column(index)
|
18
|
+
columns = %w[_type description priority duration]
|
19
|
+
columns[index.to_i]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|