rocketjob_mission_control 2.1.1 → 3.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/app/assets/stylesheets/rocket_job_mission_control/callout.scss +1 -1
  4. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +2 -2
  5. data/app/controllers/rocket_job_mission_control/active_workers_controller.rb +15 -0
  6. data/app/controllers/rocket_job_mission_control/dirmon_entries/index_filters_controller.rb +8 -13
  7. data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +3 -14
  8. data/app/controllers/rocket_job_mission_control/jobs/failures_controller.rb +6 -11
  9. data/app/controllers/rocket_job_mission_control/jobs/index_filters_controller.rb +35 -14
  10. data/app/controllers/rocket_job_mission_control/jobs_controller.rb +12 -15
  11. data/app/controllers/rocket_job_mission_control/servers/index_filters_controller.rb +49 -0
  12. data/app/controllers/rocket_job_mission_control/servers_controller.rb +93 -0
  13. data/app/datatables/rocket_job_mission_control/abstract_datatable.rb +62 -0
  14. data/app/datatables/rocket_job_mission_control/active_workers_datatable.rb +47 -0
  15. data/app/datatables/rocket_job_mission_control/completed_jobs_datatable.rb +1 -1
  16. data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +10 -72
  17. data/app/datatables/rocket_job_mission_control/interrupted_jobs_datatable.rb +1 -1
  18. data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +16 -91
  19. data/app/datatables/rocket_job_mission_control/queued_jobs_datatable.rb +1 -1
  20. data/app/datatables/rocket_job_mission_control/running_jobs_datatable.rb +23 -12
  21. data/app/datatables/rocket_job_mission_control/scheduled_jobs_datatable.rb +1 -1
  22. data/app/datatables/rocket_job_mission_control/servers_datatable.rb +67 -0
  23. data/app/helpers/rocket_job_mission_control/{workers_helper.rb → servers_helper.rb} +9 -9
  24. data/app/models/job_failures.rb +3 -16
  25. data/app/models/rocket_job_mission_control/query.rb +51 -0
  26. data/app/views/layouts/rocket_job_mission_control/partials/_header.html.haml +3 -3
  27. data/app/views/layouts/rocket_job_mission_control/partials/_sidebar.html.haml +2 -2
  28. data/app/views/rocket_job_mission_control/{active_processes → active_workers}/index.html.haml +3 -3
  29. data/app/views/rocket_job_mission_control/dirmon_entries/_properties.html.haml +7 -18
  30. data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.haml +0 -5
  31. data/app/views/rocket_job_mission_control/dirmon_entries/show.html.haml +4 -3
  32. data/app/views/rocket_job_mission_control/jobs/_status.html.haml +22 -17
  33. data/app/views/rocket_job_mission_control/jobs/edit.html.haml +1 -1
  34. data/app/views/rocket_job_mission_control/jobs/exceptions.html.haml +29 -0
  35. data/app/views/rocket_job_mission_control/jobs/failures/index.html.haml +7 -7
  36. data/app/views/rocket_job_mission_control/jobs/show.html.haml +23 -11
  37. data/app/views/rocket_job_mission_control/servers/_actions.html.haml +9 -0
  38. data/app/views/rocket_job_mission_control/servers/_sidebar.html.haml +20 -0
  39. data/app/views/rocket_job_mission_control/{workers → servers}/index.html.haml +9 -9
  40. data/app/views/rocket_job_mission_control/{workers → servers}/index_filters/paused.html.haml +8 -8
  41. data/app/views/rocket_job_mission_control/{workers → servers}/index_filters/running.html.haml +8 -8
  42. data/app/views/rocket_job_mission_control/{workers → servers}/index_filters/starting.html.haml +8 -8
  43. data/app/views/rocket_job_mission_control/{workers → servers}/index_filters/stopping.html.haml +8 -8
  44. data/config/locales/en.yml +2 -2
  45. data/config/routes.rb +7 -6
  46. data/lib/rocket_job_mission_control/engine.rb +0 -12
  47. data/lib/rocket_job_mission_control/version.rb +1 -1
  48. data/spec/controllers/dirmon_entries/index_filters_controller_spec.rb +2 -4
  49. data/spec/controllers/dirmon_entries_controller_spec.rb +15 -72
  50. data/spec/controllers/jobs/index_filters_controller_spec.rb +1 -1
  51. data/spec/controllers/workers/index_filters_controller_spec.rb +9 -9
  52. data/spec/controllers/workers_controller_spec.rb +47 -47
  53. data/spec/dummy/config/mongoid.yml +88 -0
  54. data/spec/dummy/config/symmetric-encryption.yml +8 -0
  55. data/spec/dummy/log/test.log +89072 -0
  56. data/spec/helpers/servers_helper_spec.rb +16 -0
  57. data/spec/spec_helper.rb +3 -0
  58. metadata +31 -45
  59. data/app/controllers/rocket_job_mission_control/active_processes_controller.rb +0 -27
  60. data/app/controllers/rocket_job_mission_control/workers/index_filters_controller.rb +0 -50
  61. data/app/controllers/rocket_job_mission_control/workers_controller.rb +0 -93
  62. data/app/datatables/rocket_job_mission_control/active_processes_datatable.rb +0 -79
  63. data/app/datatables/rocket_job_mission_control/workers_datatable.rb +0 -127
  64. data/app/interactors/rocket_job_mission_control/dirmon_entries/search.rb +0 -19
  65. data/app/interactors/rocket_job_mission_control/jobs/search.rb +0 -19
  66. data/app/interactors/rocket_job_mission_control/workers/search.rb +0 -19
  67. data/app/views/rocket_job_mission_control/workers/_actions.html.haml +0 -9
  68. data/app/views/rocket_job_mission_control/workers/_sidebar.html.haml +0 -20
  69. data/spec/dummy/config/mongo.yml +0 -15
  70. data/spec/helpers/workers_helper_spec.rb +0 -16
  71. data/spec/interactors/jobs/search_spec.rb +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7962e3b8e27b8b98e946fedd53bfba833a92769f
4
- data.tar.gz: 6bf9aa56d4c51a47c459b0f13c33c604161f3b1a
3
+ metadata.gz: 70e693d49e4ca57ddb518fbd75c3b66facbe134d
4
+ data.tar.gz: f2d480f5f2f19fdb8106f5d258173b05b66e6d11
5
5
  SHA512:
6
- metadata.gz: fba1711a8c000adf050fe6dbf840c7aaa70ae189276696bc41edc615280572f7019242633d6b46d99d8e6a95f4c01ebc483b717bf793cac4bde91166ac49f405
7
- data.tar.gz: a1f334a2c43f79a67b0b3b98c417957518ac862107b02287c129577fbb31173195ece72303fb78e8678e56b6f468d82ad0c624a7e6a6b8159a6a5796e0753f52
6
+ metadata.gz: 6e040ed3c8d00608471dc4c55e07b4b28f17731ed07ab2c6309663993f91323e8f348816d4b2de37e9f9290ccc5c3bec7eda905227a76ac29bff082e4fc6abd4
7
+ data.tar.gz: f6871621fb675475d9733cd181c108a6d7ad3877b65a8a47128f68ef5b8eaaedb26859df81a511c4fb37a4487a4ca465339f5bb044b903736e95e84fa79d5367
data/README.md CHANGED
@@ -24,10 +24,10 @@ Job Management
24
24
  * Abort, or fail queued or running jobs
25
25
  * Destroy a completed or aborted job
26
26
 
27
- Worker Management
27
+ Server Management
28
28
 
29
- * View running workers
30
- * Stop workers
29
+ * View running servers
30
+ * Stop servers
31
31
 
32
32
  Running Jobs
33
33
 
@@ -60,7 +60,7 @@
60
60
  }
61
61
  }
62
62
 
63
- /* Used by Workers */
63
+ /* Used by Servers */
64
64
  .callout-top {
65
65
  border: 1px solid #eee;
66
66
  border-left-width: 5px;
@@ -1,5 +1,5 @@
1
- #workers {
2
- .worker-collection-actions {
1
+ #servers {
2
+ .server-collection-actions {
3
3
  margin: 1em 0;
4
4
  }
5
5
  .actions > a {
@@ -0,0 +1,15 @@
1
+ module RocketJobMissionControl
2
+ class ActiveWorkersController < RocketJobMissionControl::ApplicationController
3
+ # The list of workers actively processing jobs
4
+ # [Array[Array<server_name [String], job [RocketJob::Job], slice_id [String]]]
5
+ def index
6
+ @active_workers = RocketJob::ActiveWorker.all
7
+ @query = RocketJobMissionControl::Query.new(@active_workers, name: :asc)
8
+
9
+ respond_to do |format|
10
+ format.html
11
+ format.json { render(json: ActiveWorkersDatatable.new(view_context, @query)) }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,47 +1,42 @@
1
1
  module RocketJobMissionControl
2
2
  module DirmonEntries
3
3
  class IndexFiltersController < RocketJobMissionControl::ApplicationController
4
- before_filter :load_dirmon_entries
5
4
  before_filter :show_sidebar
6
5
 
7
6
  def pending
8
- @dirmons = @dirmons.where(state: :pending)
7
+ @query = RocketJobMissionControl::Query.new(RocketJob::DirmonEntry.pending, name: :asc)
9
8
  respond_to do |format|
10
9
  format.html
11
- format.json { render(json: DirmonEntriesDatatable.new(view_context, @dirmons)) }
10
+ format.json { render(json: DirmonEntriesDatatable.new(view_context, @query)) }
12
11
  end
13
12
  end
14
13
 
15
14
  def enabled
16
- @dirmons = @dirmons.where(state: :enabled)
15
+ @query = RocketJobMissionControl::Query.new(RocketJob::DirmonEntry.enabled, name: :asc)
17
16
  respond_to do |format|
18
17
  format.html
19
- format.json { render(json: DirmonEntriesDatatable.new(view_context, @dirmons)) }
18
+ format.json { render(json: DirmonEntriesDatatable.new(view_context, @query)) }
20
19
  end
21
20
  end
22
21
 
23
22
  def failed
24
- @dirmons = @dirmons.where(state: :failed)
23
+ @query = RocketJobMissionControl::Query.new(RocketJob::DirmonEntry.failed, name: :asc)
25
24
  respond_to do |format|
26
25
  format.html
27
- format.json { render(json: DirmonEntriesDatatable.new(view_context, @dirmons)) }
26
+ format.json { render(json: DirmonEntriesDatatable.new(view_context, @query)) }
28
27
  end
29
28
  end
30
29
 
31
30
  def disabled
32
- @dirmons = @dirmons.where(state: :disabled)
31
+ @query = RocketJobMissionControl::Query.new(RocketJob::DirmonEntry.disabled, name: :asc)
33
32
  respond_to do |format|
34
33
  format.html
35
- format.json { render(json: DirmonEntriesDatatable.new(view_context, @dirmons)) }
34
+ format.json { render(json: DirmonEntriesDatatable.new(view_context, @query)) }
36
35
  end
37
36
  end
38
37
 
39
38
  private
40
39
 
41
- def load_dirmon_entries
42
- @dirmons = RocketJob::DirmonEntry.where()
43
- end
44
-
45
40
  def show_sidebar
46
41
  @dirmon_sidebar = true
47
42
  end
@@ -6,10 +6,10 @@ module RocketJobMissionControl
6
6
  before_filter :show_sidebar
7
7
 
8
8
  def index
9
- @dirmons = RocketJob::DirmonEntry.where()
9
+ @query = RocketJobMissionControl::Query.new(RocketJob::DirmonEntry.all, name: :asc)
10
10
  respond_to do |format|
11
11
  format.html
12
- format.json { render(json: DirmonEntriesDatatable.new(view_context, @dirmons)) }
12
+ format.json { render(json: DirmonEntriesDatatable.new(view_context, @query)) }
13
13
  end
14
14
  end
15
15
 
@@ -28,7 +28,6 @@ module RocketJobMissionControl
28
28
  def create
29
29
  @dirmon_entry = RocketJob::DirmonEntry.new(dirmon_params)
30
30
 
31
- parse_and_assign_arguments
32
31
  parse_and_assign_properties
33
32
 
34
33
  if @dirmon_entry.errors.empty? && @dirmon_entry.save
@@ -51,7 +50,6 @@ module RocketJobMissionControl
51
50
 
52
51
  def update
53
52
  @dirmon_entry.attributes = dirmon_params
54
- parse_and_assign_arguments
55
53
  parse_and_assign_properties
56
54
  if @dirmon_entry.errors.empty? && @dirmon_entry.save
57
55
  flash[:success] = t(:success, scope: [:dirmon_entry, :update])
@@ -94,19 +92,10 @@ module RocketJobMissionControl
94
92
  @dirmon_sidebar = true
95
93
  end
96
94
 
97
- def parse_and_assign_arguments
98
- arguments = params[:rocket_job_dirmon_entry][:arguments] || []
99
- @dirmon_entry.arguments = arguments.collect do |value|
100
- cleansed = parse_array_element(value, :arguments, true)
101
- @dirmon_entry.errors.add(:arguments, 'All arguments are mandatory') unless cleansed
102
- cleansed
103
- end
104
- end
105
-
106
95
  def parse_and_assign_properties
107
96
  properties = params[:rocket_job_dirmon_entry].fetch(:properties, {})
108
97
  properties.each_pair do |property, value|
109
- if key = @dirmon_entry.job_class.keys[property]
98
+ if key = @dirmon_entry.job_class.fields[property]
110
99
  if key.type == Hash
111
100
  begin
112
101
  @dirmon_entry.properties[property] = JSON.parse(value)
@@ -3,26 +3,21 @@ 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
7
-
8
- if @job && @job.failed?
6
+ if @job = job_failures.job
9
7
  @slice_errors = job_failures.list
10
8
 
11
9
  if @slice_errors.present?
12
- @error_type = params[:error_type] || @slice_errors.first['_id']['error_class']
10
+ @error_type = params[:error_type] || @slice_errors.first.class_name
13
11
 
14
12
  offset = params.fetch(:offset, 0).to_i
15
- selected_exception = job_failures.for_error(@error_type, offset)
16
- current_failure = selected_exception.first
13
+ count = @slice_errors.find { |exception| exception.class_name == @error_type }.try!(:count) || 0
14
+ current_failure = job_failures.for_error(@error_type, offset)
15
+ @failure_exception = current_failure.try!(:exception)
17
16
 
18
17
  @pagination = {
19
18
  offset: offset,
20
- total: (selected_exception.count - 1),
19
+ total: (count - 1),
21
20
  }
22
-
23
- if current_failure.present?
24
- @failure_exception = current_failure['exception']
25
- end
26
21
  else
27
22
  flash[:notice] = t(:no_errors, scope: [:job, :failures])
28
23
  end
@@ -3,59 +3,79 @@ module RocketJobMissionControl
3
3
  class IndexFiltersController < RocketJobMissionControl::ApplicationController
4
4
  before_filter :show_sidebar
5
5
 
6
+ COMMON_FIELDS = [:id, :_type, :description, :completed_at, :created_at, :started_at, :state].freeze
7
+ RUNNING_FIELDS = COMMON_FIELDS + [:record_count, :collect_output, :input_categories, :output_categories, :encrypt, :compress, :slice_size, :priority, :sub_state, :percent_complete].freeze
8
+ QUEUED_FIELDS = COMMON_FIELDS + [:run_at, :priority].freeze
9
+ SCHEDULED_FIELDS = COMMON_FIELDS + [:run_at, :cron_schedule].freeze
10
+
6
11
  def running
7
- @jobs = RocketJob::Job.where(state: :running).sort(started_at: :desc)
12
+ @jobs = RocketJob::Job.running.only(RUNNING_FIELDS)
13
+ @query = RocketJobMissionControl::Query.new(@jobs, started_at: :desc)
14
+ @query.display_columns = %w[_type description runs_in cron_schedule completed_at]
15
+
8
16
  respond_to do |format|
9
17
  format.html
10
- format.json { render(json: RunningJobsDatatable.new(view_context, @jobs)) }
18
+ format.json { render(json: RunningJobsDatatable.new(view_context, @query)) }
11
19
  end
12
20
  end
13
21
 
14
22
  def paused
15
- @jobs = RocketJob::Job.where(state: :paused).sort(completed_at: :desc)
23
+ @jobs = RocketJob::Job.paused.only(COMMON_FIELDS)
24
+ @query = RocketJobMissionControl::Query.new(@jobs, completed_at: :desc)
25
+ @query.display_columns = %w[_type description completed_at]
16
26
  respond_to do |format|
17
27
  format.html
18
- format.json { render(json: InterruptedJobsDatatable.new(view_context, @jobs)) }
28
+ format.json { render(json: InterruptedJobsDatatable.new(view_context, @query)) }
19
29
  end
20
30
  end
21
31
 
22
32
  def completed
23
- @jobs = RocketJob::Job.where(state: :completed).sort(completed_at: :desc)
33
+ @jobs = RocketJob::Job.completed.only(COMMON_FIELDS)
34
+ @query = RocketJobMissionControl::Query.new(@jobs, completed_at: :desc)
35
+ @query.display_columns = %w[_type description duration completed_at]
24
36
  respond_to do |format|
25
37
  format.html
26
- format.json { render(json: CompletedJobsDatatable.new(view_context, @jobs)) }
38
+ format.json { render(json: CompletedJobsDatatable.new(view_context, @query)) }
27
39
  end
28
40
  end
29
41
 
30
42
  def aborted
31
- @jobs = RocketJob::Job.where(state: :aborted).sort(completed_at: :desc)
43
+ @jobs = RocketJob::Job.aborted.only(COMMON_FIELDS)
44
+ @query = RocketJobMissionControl::Query.new(@jobs, completed_at: :desc)
45
+ @query.display_columns = %w[_type description completed_at]
32
46
  respond_to do |format|
33
47
  format.html
34
- format.json { render(json: InterruptedJobsDatatable.new(view_context, @jobs)) }
48
+ format.json { render(json: InterruptedJobsDatatable.new(view_context, @query)) }
35
49
  end
36
50
  end
37
51
 
38
52
  def failed
39
- @jobs = RocketJob::Job.where(state: :failed).sort(completed_at: :desc)
53
+ @jobs = RocketJob::Job.failed.only(COMMON_FIELDS)
54
+ @query = RocketJobMissionControl::Query.new(@jobs, completed_at: :desc)
55
+ @query.display_columns = %w[_type description completed_at]
40
56
  respond_to do |format|
41
57
  format.html
42
- format.json { render(json: InterruptedJobsDatatable.new(view_context, @jobs)) }
58
+ format.json { render(json: InterruptedJobsDatatable.new(view_context, @query)) }
43
59
  end
44
60
  end
45
61
 
46
62
  def queued
47
- @jobs = RocketJob::Job.queued_now.sort(created_at: :desc)
63
+ @jobs = RocketJob::Job.queued_now.only(QUEUED_FIELDS)
64
+ @query = RocketJobMissionControl::Query.new(@jobs, completed_at: :desc)
65
+ @query.display_columns = %w[_type description priority queued_for]
48
66
  respond_to do |format|
49
67
  format.html
50
- format.json { render(json: QueuedJobsDatatable.new(view_context, @jobs)) }
68
+ format.json { render(json: QueuedJobsDatatable.new(view_context, @query)) }
51
69
  end
52
70
  end
53
71
 
54
72
  def scheduled
55
- @jobs = RocketJob::Job.scheduled.sort(run_at: :asc)
73
+ @jobs = RocketJob::Job.scheduled.only(SCHEDULED_FIELDS)
74
+ @query = RocketJobMissionControl::Query.new(@jobs, run_at: :asc)
75
+ @query.display_columns = %w[_type description runs_in cron_schedule]
56
76
  respond_to do |format|
57
77
  format.html
58
- format.json { render(json: ScheduledJobsDatatable.new(view_context, @jobs)) }
78
+ format.json { render(json: ScheduledJobsDatatable.new(view_context, @query)) }
59
79
  end
60
80
  end
61
81
 
@@ -64,6 +84,7 @@ module RocketJobMissionControl
64
84
  def show_sidebar
65
85
  @jobs_sidebar = true
66
86
  end
87
+
67
88
  end
68
89
  end
69
90
  end
@@ -5,10 +5,10 @@ module RocketJobMissionControl
5
5
  rescue_from StandardError, with: :error_occurred
6
6
 
7
7
  def index
8
- @jobs = RocketJob::Job.sort(_id: :desc)
8
+ @query = RocketJobMissionControl::Query.new(RocketJob::Job.all, id: :desc)
9
9
  respond_to do |format|
10
10
  format.html
11
- format.json { render(json: JobsDatatable.new(view_context, @jobs)) }
11
+ format.json { render(json: JobsDatatable.new(view_context, @query)) }
12
12
  end
13
13
  end
14
14
 
@@ -28,13 +28,8 @@ module RocketJobMissionControl
28
28
  end
29
29
 
30
30
  def destroy
31
- if @job.completed? || @job.aborted?
32
- @job.destroy
33
- redirect_to(jobs_path)
34
- else
35
- flash[:alert] = 'Cannot destroy a job unless it is completed or aborted'
36
- redirect_to(job_path(@job))
37
- end
31
+ @job.destroy
32
+ redirect_to(jobs_path)
38
33
  end
39
34
 
40
35
  def retry
@@ -56,7 +51,7 @@ module RocketJobMissionControl
56
51
  end
57
52
 
58
53
  def run_now
59
- @job.update_attribute(:run_at, nil) if @job.scheduled?
54
+ @job.unset(:run_at) if @job.scheduled?
60
55
  redirect_to scheduled_jobs_path
61
56
  end
62
57
 
@@ -72,6 +67,10 @@ module RocketJobMissionControl
72
67
  def edit
73
68
  end
74
69
 
70
+ def exceptions
71
+ @exceptions = @job.input.group_exceptions
72
+ end
73
+
75
74
  private
76
75
 
77
76
  def show_sidebar
@@ -79,9 +78,7 @@ module RocketJobMissionControl
79
78
  end
80
79
 
81
80
  def find_job_or_redirect
82
- @job = RocketJob::Job.find(params[:id])
83
-
84
- if @job.nil?
81
+ unless @job = RocketJob::Job.where(id: params[:id]).first
85
82
  flash[:alert] = t(:failure, scope: [:job, :find], id: params[:id])
86
83
 
87
84
  redirect_to(jobs_path)
@@ -93,14 +90,14 @@ module RocketJobMissionControl
93
90
  end
94
91
 
95
92
  def job_params
96
- params.require(:job).permit(RocketJob::Job.rocket_job_properties)
93
+ params.require(:job).permit(RocketJob::Job.user_editable_fields)
97
94
  end
98
95
 
99
96
  def error_occurred(exception)
100
97
  if defined?(SemanticLogger::Logger) && logger.is_a?(SemanticLogger::Logger)
101
98
  logger.error 'Error loading a job', exception
102
99
  else
103
- logger.error "Error loading a job. #{log.exception.class}: #{log.exception.message}\n#{(log.exception.backtrace || []).join("\n")}"
100
+ logger.error "Error loading a job. #{exception.class}: #{exception.message}\n#{(exception.backtrace || []).join("\n")}"
104
101
  end
105
102
  flash[:danger] = 'Error loading jobs.'
106
103
  raise exception if Rails.env.development?
@@ -0,0 +1,49 @@
1
+ module RocketJobMissionControl
2
+ module Servers
3
+ class IndexFiltersController < RocketJobMissionControl::ApplicationController
4
+ before_filter :show_sidebar
5
+
6
+ def starting
7
+ @servers = RocketJob::Server.starting
8
+ @query = RocketJobMissionControl::Query.new(@servers, name: :asc)
9
+ respond_to do |format|
10
+ format.html
11
+ format.json { render(json: ServersDatatable.new(view_context, @query)) }
12
+ end
13
+ end
14
+
15
+ def running
16
+ @servers = RocketJob::Server.running
17
+ @query = RocketJobMissionControl::Query.new(@servers, name: :asc)
18
+ respond_to do |format|
19
+ format.html
20
+ format.json { render(json: ServersDatatable.new(view_context, @query)) }
21
+ end
22
+ end
23
+
24
+ def paused
25
+ @servers = RocketJob::Server.paused
26
+ @query = RocketJobMissionControl::Query.new(@servers, name: :asc)
27
+ respond_to do |format|
28
+ format.html
29
+ format.json { render(json: ServersDatatable.new(view_context, @query)) }
30
+ end
31
+ end
32
+
33
+ def stopping
34
+ @servers = RocketJob::Server.stopping
35
+ @query = RocketJobMissionControl::Query.new(@servers, name: :asc)
36
+ respond_to do |format|
37
+ format.html
38
+ format.json { render(json: ServersDatatable.new(view_context, @query)) }
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def show_sidebar
45
+ @servers_sidebar = true
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,93 @@
1
+ module RocketJobMissionControl
2
+ class ServersController < RocketJobMissionControl::ApplicationController
3
+ before_filter :find_server, only: [:stop, :pause, :resume, :destroy]
4
+ before_filter :show_sidebar
5
+
6
+ def index
7
+ @query = RocketJobMissionControl::Query.new(RocketJob::Server.all, name: :asc)
8
+ respond_to do |format|
9
+ format.html
10
+ format.json { render(json: ServersDatatable.new(view_context, @query)) }
11
+ end
12
+ end
13
+
14
+ VALID_STATES = {
15
+ stop_all: 'stopped',
16
+ pause_all: 'paused',
17
+ resume_all: 'resumed',
18
+ destroy_zombies: 'destroyed if zombified',
19
+ }
20
+
21
+ def update_all
22
+ server_action = params[:server_action].to_sym
23
+ if VALID_STATES.keys.include?(server_action)
24
+ RocketJob::Server.send(server_action.to_sym)
25
+ flash[:notice] = t(:success, scope: [:server, :update_all], server_action: VALID_STATES[server_action])
26
+ else
27
+ flash[:alert] = t(:invalid, scope: [:server, :update_all])
28
+ end
29
+
30
+ respond_to do |format|
31
+ format.html { redirect_to servers_path }
32
+ end
33
+ end
34
+
35
+ def stop
36
+ if @server.stop!
37
+ flash[:notice] = t(:success, scope: [:server, :stop])
38
+ else
39
+ flash[:alert] = t(:failure, scope: [:server, :stop])
40
+ end
41
+
42
+ respond_to do |format|
43
+ format.html { redirect_to servers_path }
44
+ end
45
+ end
46
+
47
+ def destroy
48
+ if @server.nil? || @server.destroy
49
+ flash[:notice] = t(:success, scope: [:server, :destroy])
50
+ else
51
+ flash[:alert] = t(:failure, scope: [:server, :destroy])
52
+ end
53
+
54
+ respond_to do |format|
55
+ format.html { redirect_to servers_path }
56
+ end
57
+ end
58
+
59
+ def pause
60
+ if @server.pause!
61
+ flash[:notice] = t(:success, scope: [:server, :pause])
62
+ else
63
+ flash[:alert] = t(:failure, scope: [:server, :pause])
64
+ end
65
+
66
+ respond_to do |format|
67
+ format.html { redirect_to servers_path }
68
+ end
69
+ end
70
+
71
+ def resume
72
+ if @server.resume!
73
+ flash[:notice] = t(:success, scope: [:server, :resume])
74
+ else
75
+ flash[:alert] = t(:failure, scope: [:server, :resume])
76
+ end
77
+
78
+ respond_to do |format|
79
+ format.html { redirect_to servers_path }
80
+ end
81
+ end
82
+
83
+ private
84
+
85
+ def find_server
86
+ @server = RocketJob::Server.find(params[:id])
87
+ end
88
+
89
+ def show_sidebar
90
+ @servers_sidebar = true
91
+ end
92
+ end
93
+ end