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.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +201 -0
  3. data/README.md +85 -0
  4. data/Rakefile +12 -18
  5. data/app/assets/javascripts/rocket_job_mission_control/application.js +3 -0
  6. data/app/assets/javascripts/rocket_job_mission_control/base.js.coffee +9 -12
  7. data/app/assets/javascripts/rocket_job_mission_control/datatable.js.coffee +31 -0
  8. data/app/assets/javascripts/rocket_job_mission_control/dirmon_entries.js.coffee +0 -1
  9. data/app/assets/stylesheets/rocket_job_mission_control/application.scss +2 -0
  10. data/app/assets/stylesheets/rocket_job_mission_control/base.scss +310 -357
  11. data/app/assets/stylesheets/rocket_job_mission_control/bootstrap_and_overrides.scss +474 -3
  12. data/app/assets/stylesheets/rocket_job_mission_control/callout.scss +57 -12
  13. data/app/assets/stylesheets/rocket_job_mission_control/jobs.scss +3 -2
  14. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +9 -0
  15. data/app/controllers/rocket_job_mission_control/active_processes_controller.rb +26 -0
  16. data/app/controllers/rocket_job_mission_control/dirmon_entries/index_filters_controller.rb +50 -0
  17. data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +11 -14
  18. data/app/controllers/rocket_job_mission_control/jobs/failures_controller.rb +2 -2
  19. data/app/controllers/rocket_job_mission_control/jobs/index_filters_controller.rb +69 -0
  20. data/app/controllers/rocket_job_mission_control/jobs_controller.rb +10 -12
  21. data/app/controllers/rocket_job_mission_control/workers/index_filters_controller.rb +50 -0
  22. data/app/controllers/rocket_job_mission_control/workers_controller.rb +14 -5
  23. data/app/datatables/rocket_job_mission_control/active_processes_datatable.rb +79 -0
  24. data/app/datatables/rocket_job_mission_control/completed_jobs_datatable.rb +26 -0
  25. data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +95 -0
  26. data/app/datatables/rocket_job_mission_control/interrupted_jobs_datatable.rb +25 -0
  27. data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +95 -0
  28. data/app/datatables/rocket_job_mission_control/queued_jobs_datatable.rb +22 -0
  29. data/app/datatables/rocket_job_mission_control/running_jobs_datatable.rb +35 -0
  30. data/app/datatables/rocket_job_mission_control/scheduled_jobs_datatable.rb +30 -0
  31. data/app/datatables/rocket_job_mission_control/workers_datatable.rb +127 -0
  32. data/app/helpers/rocket_job_mission_control/application_helper.rb +21 -2
  33. data/app/helpers/rocket_job_mission_control/dirmon_entries_helper.rb +7 -0
  34. data/app/helpers/rocket_job_mission_control/jobs_helper.rb +9 -26
  35. data/app/helpers/rocket_job_mission_control/workers_helper.rb +18 -6
  36. data/app/interactors/rocket_job_mission_control/dirmon_entries/search.rb +19 -0
  37. data/app/interactors/rocket_job_mission_control/jobs/search.rb +19 -0
  38. data/app/interactors/rocket_job_mission_control/workers/search.rb +19 -0
  39. data/app/models/job_failures.rb +5 -5
  40. data/app/views/layouts/rocket_job_mission_control/application.html.haml +22 -22
  41. data/app/views/layouts/rocket_job_mission_control/partials/_header.html.haml +33 -18
  42. data/app/views/layouts/rocket_job_mission_control/partials/_sidebar.html.haml +11 -24
  43. data/app/views/rocket_job_mission_control/active_processes/index.html.haml +24 -0
  44. data/app/views/rocket_job_mission_control/dirmon_entries/_form.html.haml +11 -10
  45. data/app/views/rocket_job_mission_control/dirmon_entries/_properties.html.haml +6 -3
  46. data/app/views/rocket_job_mission_control/dirmon_entries/_sidebar.html.haml +27 -0
  47. data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.haml +0 -3
  48. data/app/views/rocket_job_mission_control/dirmon_entries/edit.html.haml +3 -7
  49. data/app/views/rocket_job_mission_control/dirmon_entries/index.html.haml +17 -10
  50. data/app/views/rocket_job_mission_control/dirmon_entries/index_filters/disabled.html.haml +17 -0
  51. data/app/views/rocket_job_mission_control/dirmon_entries/index_filters/enabled.html.haml +17 -0
  52. data/app/views/rocket_job_mission_control/dirmon_entries/index_filters/failed.html.haml +17 -0
  53. data/app/views/rocket_job_mission_control/dirmon_entries/index_filters/pending.html.haml +17 -0
  54. data/app/views/rocket_job_mission_control/dirmon_entries/new.html.haml +5 -8
  55. data/app/views/rocket_job_mission_control/dirmon_entries/show.html.haml +18 -22
  56. data/app/views/rocket_job_mission_control/jobs/_sidebar.html.haml +28 -0
  57. data/app/views/rocket_job_mission_control/jobs/failures/index.html.haml +2 -2
  58. data/app/views/rocket_job_mission_control/jobs/index.html.haml +23 -10
  59. data/app/views/rocket_job_mission_control/jobs/index_filters/aborted.html.haml +22 -0
  60. data/app/views/rocket_job_mission_control/jobs/index_filters/completed.html.haml +23 -0
  61. data/app/views/rocket_job_mission_control/jobs/index_filters/failed.html.haml +22 -0
  62. data/app/views/rocket_job_mission_control/jobs/index_filters/paused.html.haml +22 -0
  63. data/app/views/rocket_job_mission_control/jobs/index_filters/queued.html.haml +23 -0
  64. data/app/views/rocket_job_mission_control/jobs/index_filters/running.html.haml +24 -0
  65. data/app/views/rocket_job_mission_control/jobs/index_filters/scheduled.html.haml +23 -0
  66. data/app/views/rocket_job_mission_control/jobs/show.html.haml +5 -8
  67. data/app/views/rocket_job_mission_control/workers/_sidebar.html.haml +20 -0
  68. data/app/views/rocket_job_mission_control/workers/index.html.haml +36 -59
  69. data/app/views/rocket_job_mission_control/workers/index_filters/paused.html.haml +37 -0
  70. data/app/views/rocket_job_mission_control/workers/index_filters/running.html.haml +37 -0
  71. data/app/views/rocket_job_mission_control/workers/index_filters/starting.html.haml +37 -0
  72. data/app/views/rocket_job_mission_control/workers/index_filters/stopping.html.haml +37 -0
  73. data/config/routes.rb +28 -5
  74. data/lib/rocket_job_mission_control/engine.rb +2 -0
  75. data/lib/rocket_job_mission_control/version.rb +1 -1
  76. data/spec/controllers/application_controller_spec.rb +1 -1
  77. data/spec/controllers/dirmon_entries_controller_spec.rb +35 -97
  78. data/spec/controllers/jobs/failures_controller_spec.rb +4 -4
  79. data/spec/controllers/jobs_controller_spec.rb +10 -80
  80. data/spec/dummy/config/environments/development.rb +7 -7
  81. data/spec/dummy/config/environments/test.rb +9 -9
  82. data/spec/dummy/log/test.log +5446 -23487
  83. data/spec/helpers/application_helper_spec.rb +58 -0
  84. data/spec/helpers/jobs_helper_spec.rb +0 -65
  85. data/spec/helpers/slices_helper_spec.rb +1 -1
  86. data/spec/helpers/workers_helper_spec.rb +1 -1
  87. metadata +64 -44
  88. data/MIT-LICENSE +0 -20
  89. data/app/assets/javascripts/rocket_job_mission_control/jobs.js.coffee +0 -11
  90. data/app/views/rocket_job_mission_control/dirmon_entries/_list.html.haml +0 -31
  91. data/app/views/rocket_job_mission_control/jobs/_list.html.haml +0 -35
  92. data/app/views/rocket_job_mission_control/jobs/running.html.haml +0 -37
  93. data/spec/dummy/log/development.log +0 -0
  94. 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
- before_action :load_entries, only: [:index, :show, :new, :edit]
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, :perform_method).tap do |whitelist|
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 = job_failures.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 = params[:error_type] || @slice_errors.first['_id']['error_class']
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, :running]
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 running
7
- @jobs = RocketJob::Job.where(state: 'running')
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 load_jobs
67
- @states = jobs_params
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] = t(:invalid, scope: [:worker, :update_all])
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] = t(:failure, scope: [:worker, :stop])
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] = t(:failure, scope: [:worker, :destroy])
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] = t(:failure, scope: [:worker, :pause])
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] = t(:failure, scope: [:worker, :resume])
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