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
@@ -0,0 +1,37 @@
|
|
1
|
+
#workers
|
2
|
+
.worker-list
|
3
|
+
.list
|
4
|
+
.row
|
5
|
+
.col-md-6
|
6
|
+
%h2 Running Worker Processes
|
7
|
+
.col-md-6
|
8
|
+
.col-sm-10
|
9
|
+
.worker-collection-actions
|
10
|
+
- if @workers.present?
|
11
|
+
%ol.pull-right
|
12
|
+
.btn-group
|
13
|
+
- [:stop_all, :pause_all, :resume_all, :destroy_zombies].each do |action|
|
14
|
+
= link_to("#{action.to_s.humanize.capitalize}",
|
15
|
+
rocket_job_mission_control.update_all_workers_path(worker_action: action),
|
16
|
+
method: :patch,
|
17
|
+
data: { confirm: t(:confirm, scope: [:worker, :update_all], action: action.to_s.singularize.humanize.downcase) },
|
18
|
+
class: 'btn btn-default')
|
19
|
+
.col-sm-2.pull-right
|
20
|
+
.btn.btn-default.pull-right.dt-reload{ data: { behavior: 'reload' } }
|
21
|
+
%i.fa.fa-refresh
|
22
|
+
%table.table.datatable.workers-datatable{ style: "width: 100%", data: { source: "#{running_workers_url(format: 'json')}" } }
|
23
|
+
%thead
|
24
|
+
%tr
|
25
|
+
%th Hostname : PID
|
26
|
+
%th Workers (Current/Max)
|
27
|
+
%th Started
|
28
|
+
%th Heartbeat
|
29
|
+
%th Actions
|
30
|
+
%tbody
|
31
|
+
|
32
|
+
:javascript
|
33
|
+
jQuery(function() {
|
34
|
+
new RjmcDatatable(
|
35
|
+
$('.workers-datatable'),
|
36
|
+
[{data: '0'}, {data: '1', orderable: false}, {data: '2', orderable: false}, {data: '3', orderable: false}, {data: '4', orderable: false}]);
|
37
|
+
});
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#workers
|
2
|
+
.worker-list
|
3
|
+
.list
|
4
|
+
.row
|
5
|
+
.col-md-6
|
6
|
+
%h2 Starting Worker Processes
|
7
|
+
.col-md-6
|
8
|
+
.col-sm-10
|
9
|
+
.worker-collection-actions
|
10
|
+
- if @workers.present?
|
11
|
+
%ol.pull-right
|
12
|
+
.btn-group
|
13
|
+
- [:stop_all, :pause_all, :resume_all, :destroy_zombies].each do |action|
|
14
|
+
= link_to("#{action.to_s.humanize.capitalize}",
|
15
|
+
rocket_job_mission_control.update_all_workers_path(worker_action: action),
|
16
|
+
method: :patch,
|
17
|
+
data: { confirm: t(:confirm, scope: [:worker, :update_all], action: action.to_s.singularize.humanize.downcase) },
|
18
|
+
class: 'btn btn-default')
|
19
|
+
.col-sm-2.pull-right
|
20
|
+
.btn.btn-default.pull-right.dt-reload{ data: { behavior: 'reload' } }
|
21
|
+
%i.fa.fa-refresh
|
22
|
+
%table.table.datatable.workers-datatable{ style: "width: 100%", data: { source: "#{starting_workers_url(format: 'json')}" } }
|
23
|
+
%thead
|
24
|
+
%tr
|
25
|
+
%th Hostname : PID
|
26
|
+
%th Workers (Current/Max)
|
27
|
+
%th Started
|
28
|
+
%th Heartbeat
|
29
|
+
%th Actions
|
30
|
+
%tbody
|
31
|
+
|
32
|
+
:javascript
|
33
|
+
jQuery(function() {
|
34
|
+
new RjmcDatatable(
|
35
|
+
$('.workers-datatable'),
|
36
|
+
[{data: '0'}, {data: '1', orderable: false}, {data: '2', orderable: false}, {data: '3', orderable: false}, {data: '4', orderable: false}]);
|
37
|
+
});
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#workers
|
2
|
+
.worker-list
|
3
|
+
.list
|
4
|
+
.row
|
5
|
+
.col-md-6
|
6
|
+
%h2 Stopping Worker Processes
|
7
|
+
.col-md-6
|
8
|
+
.col-sm-10
|
9
|
+
.worker-collection-actions
|
10
|
+
- if @workers.present?
|
11
|
+
%ol.pull-right
|
12
|
+
.btn-group
|
13
|
+
- [:pause_all, :resume_all, :destroy_zombies].each do |action|
|
14
|
+
= link_to("#{action.to_s.humanize.capitalize}",
|
15
|
+
rocket_job_mission_control.update_all_workers_path(worker_action: action),
|
16
|
+
method: :patch,
|
17
|
+
data: { confirm: t(:confirm, scope: [:worker, :update_all], action: action.to_s.singularize.humanize.downcase) },
|
18
|
+
class: 'btn btn-default')
|
19
|
+
.col-sm-2.pull-right
|
20
|
+
.btn.btn-default.pull-right.dt-reload{ data: { behavior: 'reload' } }
|
21
|
+
%i.fa.fa-refresh
|
22
|
+
%table.table.datatable.workers-datatable{ style: "width: 100%", data: { source: "#{stopping_workers_url(format: 'json')}" } }
|
23
|
+
%thead
|
24
|
+
%tr
|
25
|
+
%th Hostname : PID
|
26
|
+
%th Workers (Current/Max)
|
27
|
+
%th Started
|
28
|
+
%th Heartbeat
|
29
|
+
%th Actions
|
30
|
+
%tbody
|
31
|
+
|
32
|
+
:javascript
|
33
|
+
jQuery(function() {
|
34
|
+
new RjmcDatatable(
|
35
|
+
$('.workers-datatable'),
|
36
|
+
[{data: '0'}, {data: '1', orderable: false}, {data: '2', orderable: false}, {data: '3', orderable: false}, {data: '4', orderable: false}]);
|
37
|
+
});
|
data/config/routes.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
RocketJobMissionControl::Engine.routes.draw do
|
2
2
|
|
3
3
|
resources :jobs, only: [:index, :show, :update, :destroy] do
|
4
|
+
collection do
|
5
|
+
get :running, to: 'jobs/index_filters#running'
|
6
|
+
get :scheduled, to: 'jobs/index_filters#scheduled'
|
7
|
+
get :completed, to: 'jobs/index_filters#completed'
|
8
|
+
get :queued, to: 'jobs/index_filters#queued'
|
9
|
+
get :paused, to: 'jobs/index_filters#paused'
|
10
|
+
get :failed, to: 'jobs/index_filters#failed'
|
11
|
+
get :aborted, to: 'jobs/index_filters#aborted'
|
12
|
+
end
|
13
|
+
|
4
14
|
member do
|
5
15
|
patch :abort
|
6
16
|
patch :fail
|
@@ -8,13 +18,19 @@ RocketJobMissionControl::Engine.routes.draw do
|
|
8
18
|
patch :resume
|
9
19
|
patch :retry
|
10
20
|
end
|
11
|
-
|
12
|
-
get :running
|
13
|
-
end
|
14
|
-
resources :failures, controller: 'jobs/failures', only: [:index]
|
21
|
+
resources :failures, controller: 'jobs/failures', only: :index
|
15
22
|
end
|
16
23
|
|
24
|
+
resources :active_processes, only: :index
|
25
|
+
|
17
26
|
resources :workers, only: [:index, :destroy] do
|
27
|
+
collection do
|
28
|
+
get :starting, to: 'workers/index_filters#starting'
|
29
|
+
get :running, to: 'workers/index_filters#running'
|
30
|
+
get :paused, to: 'workers/index_filters#paused'
|
31
|
+
get :stopping, to: 'workers/index_filters#stopping'
|
32
|
+
end
|
33
|
+
|
18
34
|
member do
|
19
35
|
patch :stop
|
20
36
|
patch :pause
|
@@ -26,11 +42,18 @@ RocketJobMissionControl::Engine.routes.draw do
|
|
26
42
|
end
|
27
43
|
|
28
44
|
resources :dirmon_entries do
|
45
|
+
collection do
|
46
|
+
get :pending, to: 'dirmon_entries/index_filters#pending'
|
47
|
+
get :enabled, to: 'dirmon_entries/index_filters#enabled'
|
48
|
+
get :failed, to: 'dirmon_entries/index_filters#failed'
|
49
|
+
get :disabled, to: 'dirmon_entries/index_filters#disabled'
|
50
|
+
end
|
51
|
+
|
29
52
|
member do
|
30
53
|
put :enable
|
31
54
|
put :disable
|
32
55
|
end
|
33
56
|
end
|
34
57
|
|
35
|
-
root to: "jobs#
|
58
|
+
root to: "jobs/index_filters#running"
|
36
59
|
end
|
@@ -29,7 +29,7 @@ module RocketJobMissionControl
|
|
29
29
|
end
|
30
30
|
|
31
31
|
context 'that does not contain a time zone' do
|
32
|
-
let(:session_params) { {
|
32
|
+
let(:session_params) { {'user_id' => '42'} }
|
33
33
|
|
34
34
|
it 'sets the time zone correctly' do
|
35
35
|
expect(assigns(:time_zone).name).to eq(expected_time_zone)
|
@@ -1,15 +1,15 @@
|
|
1
1
|
require_relative '../rails_helper'
|
2
2
|
|
3
|
-
class
|
4
|
-
|
3
|
+
class OneParamJob < RocketJob::Job
|
5
4
|
def perform(id)
|
6
5
|
id
|
7
6
|
end
|
7
|
+
end
|
8
8
|
|
9
|
-
|
9
|
+
class NoParamsJob < RocketJob::Job
|
10
|
+
def perform
|
10
11
|
100_000
|
11
12
|
end
|
12
|
-
|
13
13
|
end
|
14
14
|
|
15
15
|
module RocketJobMissionControl
|
@@ -30,7 +30,7 @@ module RocketJobMissionControl
|
|
30
30
|
let(:existing_dirmon) do
|
31
31
|
RocketJob::DirmonEntry.create!(
|
32
32
|
name: 'Test',
|
33
|
-
job_class_name: '
|
33
|
+
job_class_name: 'OneParamJob',
|
34
34
|
pattern: 'the_path',
|
35
35
|
arguments: ['42'],
|
36
36
|
state: starting_state,
|
@@ -62,7 +62,7 @@ module RocketJobMissionControl
|
|
62
62
|
let(:existing_dirmon) do
|
63
63
|
RocketJob::DirmonEntry.create!(
|
64
64
|
name: 'Test',
|
65
|
-
job_class_name: '
|
65
|
+
job_class_name: 'OneParamJob',
|
66
66
|
pattern: 'the_path',
|
67
67
|
arguments: ['42'],
|
68
68
|
state: starting_state,
|
@@ -109,7 +109,7 @@ module RocketJobMissionControl
|
|
109
109
|
end
|
110
110
|
|
111
111
|
context 'with form params' do
|
112
|
-
let(:entry_params) { {
|
112
|
+
let(:entry_params) { {rocket_job_dirmon_entry: {name: 'new entry'}} }
|
113
113
|
|
114
114
|
it { expect(response.status).to eq(200) }
|
115
115
|
|
@@ -119,18 +119,18 @@ module RocketJobMissionControl
|
|
119
119
|
end
|
120
120
|
|
121
121
|
context 'with a valid job_class_name' do
|
122
|
-
let(:entry_params) { {
|
122
|
+
let(:entry_params) { {rocket_job_dirmon_entry: {job_class_name: 'OneParamJob'}} }
|
123
123
|
|
124
124
|
it { expect(response.status).to eq(200) }
|
125
125
|
|
126
126
|
it 'assigns the job class' do
|
127
127
|
expect(assigns(:dirmon_entry)).to be_present
|
128
|
-
expect(assigns(:dirmon_entry).job_class).to eq(
|
128
|
+
expect(assigns(:dirmon_entry).job_class).to eq(OneParamJob)
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
132
|
context 'with an invalid job_class_name' do
|
133
|
-
let(:entry_params) { {
|
133
|
+
let(:entry_params) { {rocket_job_dirmon_entry: {job_class_name: 'BadJob'}} }
|
134
134
|
|
135
135
|
it { expect(response.status).to eq(200) }
|
136
136
|
|
@@ -147,7 +147,7 @@ module RocketJobMissionControl
|
|
147
147
|
let(:existing_dirmon) do
|
148
148
|
RocketJob::DirmonEntry.create!(
|
149
149
|
name: 'Test',
|
150
|
-
job_class_name: '
|
150
|
+
job_class_name: 'OneParamJob',
|
151
151
|
pattern: 'the_path',
|
152
152
|
arguments: ['{"argument1":"value1", "argument2":"value2", "argument3":"value3"}']
|
153
153
|
)
|
@@ -161,7 +161,7 @@ module RocketJobMissionControl
|
|
161
161
|
let(:dirmon_params) do
|
162
162
|
{
|
163
163
|
pattern: 'the_path2',
|
164
|
-
job_class_name: '
|
164
|
+
job_class_name: 'OneParamJob',
|
165
165
|
arguments: ['42']
|
166
166
|
}
|
167
167
|
end
|
@@ -195,15 +195,11 @@ module RocketJobMissionControl
|
|
195
195
|
expect(assigns(:dirmon_entry)).to_not be_valid
|
196
196
|
end
|
197
197
|
|
198
|
-
it 'loads the other entries' do
|
199
|
-
expect(dirmon_list).to have_received(:sort)
|
200
|
-
end
|
201
|
-
|
202
198
|
context 'with invalid arguments json' do
|
203
199
|
let(:dirmon_params) do
|
204
200
|
{
|
205
201
|
name: 'Test',
|
206
|
-
job_class_name: '
|
202
|
+
job_class_name: 'OneParamJob',
|
207
203
|
arguments: [],
|
208
204
|
}
|
209
205
|
end
|
@@ -216,10 +212,6 @@ module RocketJobMissionControl
|
|
216
212
|
it 'has errors on arguments' do
|
217
213
|
expect(assigns(:dirmon_entry).errors[:arguments]).to be_present
|
218
214
|
end
|
219
|
-
|
220
|
-
it 'loads the other entries' do
|
221
|
-
expect(dirmon_list).to have_received(:sort)
|
222
|
-
end
|
223
215
|
end
|
224
216
|
end
|
225
217
|
end
|
@@ -227,20 +219,19 @@ module RocketJobMissionControl
|
|
227
219
|
describe 'POST #create' do
|
228
220
|
context 'with valid parameters' do
|
229
221
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
222
|
+
[
|
223
|
+
{job_class_name: 'OneParamJob', argument: ['42'], expected_value: [42]},
|
224
|
+
{job_class_name: 'OneParamJob', argument: ['{"argument1":"value1", "argument2":"value2", "argument3":"value3"}'], expected_value: [{"argument1" => "value1", "argument2" => "value2", "argument3" => "value3"}]},
|
225
|
+
{job_class_name: 'NoParamsJob', argument: [], expected_value: []}
|
226
|
+
].each do |arguments|
|
235
227
|
context "and arguments are '#{arguments}'" do
|
236
228
|
let(:dirmon_params) do
|
237
229
|
{
|
238
230
|
name: 'Test',
|
239
231
|
pattern: '/files/*',
|
240
|
-
job_class_name:
|
232
|
+
job_class_name: arguments[:job_class_name],
|
241
233
|
arguments: arguments[:argument],
|
242
234
|
properties: {description: '', priority: 42},
|
243
|
-
perform_method: perform_method,
|
244
235
|
}
|
245
236
|
end
|
246
237
|
|
@@ -307,17 +298,13 @@ module RocketJobMissionControl
|
|
307
298
|
it 'has errors on the entry' do
|
308
299
|
expect(assigns(:dirmon_entry)).to_not be_valid
|
309
300
|
end
|
310
|
-
|
311
|
-
it 'loads the other entries' do
|
312
|
-
expect(dirmon_list).to have_received(:sort)
|
313
|
-
end
|
314
301
|
end
|
315
302
|
|
316
303
|
context 'with invalid arguments json' do
|
317
304
|
let(:dirmon_params) do
|
318
305
|
{
|
319
306
|
name: 'Test',
|
320
|
-
job_class_name: '
|
307
|
+
job_class_name: 'OneParamJob',
|
321
308
|
arguments: ['{"bad" "json"}'],
|
322
309
|
}
|
323
310
|
end
|
@@ -330,10 +317,6 @@ module RocketJobMissionControl
|
|
330
317
|
it 'has errors on arguments' do
|
331
318
|
expect(assigns(:dirmon_entry).errors[:arguments]).to be_present
|
332
319
|
end
|
333
|
-
|
334
|
-
it 'loads the other entries' do
|
335
|
-
expect(dirmon_list).to have_received(:sort)
|
336
|
-
end
|
337
320
|
end
|
338
321
|
end
|
339
322
|
end
|
@@ -343,7 +326,7 @@ module RocketJobMissionControl
|
|
343
326
|
@entry = RocketJob::DirmonEntry.create(
|
344
327
|
name: 'Test',
|
345
328
|
pattern: '/files/',
|
346
|
-
job_class_name: '
|
329
|
+
job_class_name: 'OneParamJob',
|
347
330
|
arguments: [42]
|
348
331
|
)
|
349
332
|
get :edit, id: @entry.id
|
@@ -386,14 +369,6 @@ module RocketJobMissionControl
|
|
386
369
|
it 'assigns the entry' do
|
387
370
|
expect(assigns(:dirmon_entry)).to be_present
|
388
371
|
end
|
389
|
-
|
390
|
-
it 'assigns the entries' do
|
391
|
-
expect(assigns(:dirmons)).to eq([])
|
392
|
-
end
|
393
|
-
|
394
|
-
it 'grabs a sorted list' do
|
395
|
-
expect(dirmon_list).to have_received(:sort).with(created_at: :desc)
|
396
|
-
end
|
397
372
|
end
|
398
373
|
end
|
399
374
|
|
@@ -401,7 +376,7 @@ module RocketJobMissionControl
|
|
401
376
|
let(:existing_dirmon) do
|
402
377
|
RocketJob::DirmonEntry.create!(
|
403
378
|
name: 'Test',
|
404
|
-
job_class_name: '
|
379
|
+
job_class_name: 'OneParamJob',
|
405
380
|
pattern: 'the_path',
|
406
381
|
arguments: [42].to_json
|
407
382
|
)
|
@@ -427,6 +402,7 @@ module RocketJobMissionControl
|
|
427
402
|
describe 'GET #index' do
|
428
403
|
describe 'with no entries' do
|
429
404
|
before do
|
405
|
+
RocketJob::DirmonEntry.destroy_all
|
430
406
|
get :index
|
431
407
|
end
|
432
408
|
|
@@ -434,67 +410,29 @@ module RocketJobMissionControl
|
|
434
410
|
expect(response.status).to be(200)
|
435
411
|
end
|
436
412
|
|
437
|
-
it 'grabs a sorted list of entries' do
|
438
|
-
expect(dirmon_list).to have_received(:sort).with(created_at: :desc)
|
439
|
-
end
|
440
|
-
|
441
413
|
it 'returns no entries' do
|
442
|
-
expect(assigns(:dirmons)).to eq(
|
414
|
+
expect(assigns(:dirmons).count).to eq(0)
|
443
415
|
end
|
444
416
|
end
|
445
417
|
|
446
418
|
describe 'with jobs' do
|
447
|
-
let(:dirmon_list) { spy(sort: dirmons) }
|
448
419
|
let(:dirmons) { ['fake_dirmon1', 'fake_dirmon2'] }
|
449
420
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
it 'succeeds' do
|
454
|
-
expect(response.status).to be(200)
|
455
|
-
end
|
456
|
-
|
457
|
-
it 'grabs a sorted list of entries' do
|
458
|
-
expect(dirmon_list).to have_received(:sort).with(created_at: :desc)
|
459
|
-
end
|
460
|
-
|
461
|
-
it 'returns the entries' do
|
462
|
-
expect(assigns(:dirmons)).to match_array(dirmons)
|
463
|
-
end
|
421
|
+
before do
|
422
|
+
allow(RocketJob::DirmonEntry).to receive(:where).and_return(dirmons)
|
423
|
+
get :index
|
464
424
|
end
|
465
425
|
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
context 'that is empty' do
|
470
|
-
let(:states) { [] }
|
471
|
-
|
472
|
-
it { expect(response.status).to be(200) }
|
473
|
-
|
474
|
-
it 'grabs a sorted list' do
|
475
|
-
expect(dirmon_list).to have_received(:sort).with(created_at: :desc)
|
476
|
-
end
|
477
|
-
|
478
|
-
it 'returns the entries' do
|
479
|
-
expect(assigns(:dirmons)).to match_array(dirmons)
|
480
|
-
end
|
481
|
-
end
|
482
|
-
|
483
|
-
context 'with a state' do
|
484
|
-
let(:query_spy) { spy(where: dirmons) }
|
485
|
-
let(:dirmon_list) { spy(sort: query_spy) }
|
486
|
-
let(:states) { ['enabled'] }
|
487
|
-
|
488
|
-
it { expect(response.status).to be(200) }
|
426
|
+
it 'succeeds' do
|
427
|
+
expect(response.status).to be(200)
|
428
|
+
end
|
489
429
|
|
490
|
-
|
491
|
-
|
492
|
-
|
430
|
+
it 'grabs all dirmons with empty where' do
|
431
|
+
expect(RocketJob::DirmonEntry).to have_received(:where)
|
432
|
+
end
|
493
433
|
|
494
|
-
|
495
|
-
|
496
|
-
end
|
497
|
-
end
|
434
|
+
it 'returns the entries' do
|
435
|
+
expect(assigns(:dirmons)).to eq(dirmons)
|
498
436
|
end
|
499
437
|
end
|
500
438
|
end
|
@@ -104,40 +104,12 @@ module RocketJobMissionControl
|
|
104
104
|
it "assigns the job" do
|
105
105
|
expect(assigns(:job)).to be_present
|
106
106
|
end
|
107
|
-
|
108
|
-
it "assigns the jobs" do
|
109
|
-
expect(assigns(:jobs)).to eq([])
|
110
|
-
end
|
111
|
-
|
112
|
-
it "grabs a sorted list of rocket jobs" do
|
113
|
-
expect(result).to have_received(:sort).with(created_at: :desc)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe "GET #running" do
|
119
|
-
before do
|
120
|
-
allow(RocketJob::Job).to receive(:where).and_return([])
|
121
|
-
get :running
|
122
|
-
end
|
123
|
-
|
124
|
-
it { expect(response.status).to be(200) }
|
125
|
-
|
126
|
-
it "queries for running jobs" do
|
127
|
-
expect(RocketJob::Job).to have_received(:where).with(state: 'running')
|
128
|
-
end
|
129
|
-
|
130
|
-
it "returns expected jobs" do
|
131
|
-
expect(assigns[:jobs]).to eq([])
|
132
107
|
end
|
133
108
|
end
|
134
109
|
|
135
110
|
describe "GET #index" do
|
136
111
|
describe "with no jobs" do
|
137
|
-
let(:result) { spy(sort: []) }
|
138
|
-
|
139
112
|
before do
|
140
|
-
allow(RocketJob::Job).to receive(:limit).and_return(result)
|
141
113
|
get :index
|
142
114
|
end
|
143
115
|
|
@@ -145,71 +117,29 @@ module RocketJobMissionControl
|
|
145
117
|
expect(response.status).to be(200)
|
146
118
|
end
|
147
119
|
|
148
|
-
it "grabs a sorted list of rocket jobs" do
|
149
|
-
expect(result).to have_received(:sort).with(created_at: :desc)
|
150
|
-
end
|
151
|
-
|
152
120
|
it "returns no jobs" do
|
153
|
-
expect(assigns(:jobs)).to eq(
|
121
|
+
expect(assigns(:jobs).count).to eq(0)
|
154
122
|
end
|
155
123
|
end
|
156
124
|
|
157
125
|
describe "with jobs" do
|
158
|
-
let(:result) { spy(sort: jobs) }
|
159
126
|
let(:jobs) { ['fake_job1', 'fake_job2'] }
|
160
127
|
|
161
128
|
before do
|
162
|
-
allow(RocketJob::Job).to receive(:
|
129
|
+
allow(RocketJob::Job).to receive(:sort).and_return(jobs)
|
130
|
+
get :index
|
163
131
|
end
|
164
132
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
it "succeeds" do
|
169
|
-
expect(response.status).to be(200)
|
170
|
-
end
|
171
|
-
|
172
|
-
it "grabs a sorted list of rocket jobs" do
|
173
|
-
expect(result).to have_received(:sort).with(created_at: :desc)
|
174
|
-
end
|
175
|
-
|
176
|
-
it "returns the jobs" do
|
177
|
-
expect(assigns(:jobs)).to match_array(jobs)
|
178
|
-
end
|
133
|
+
it "succeeds" do
|
134
|
+
expect(response.status).to be(200)
|
179
135
|
end
|
180
136
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
context "that is empty" do
|
185
|
-
let(:states) { [] }
|
186
|
-
|
187
|
-
it { expect(response.status).to be(200) }
|
188
|
-
|
189
|
-
it "grabs a sorted list of rocket jobs" do
|
190
|
-
expect(result).to have_received(:sort).with(created_at: :desc)
|
191
|
-
end
|
192
|
-
|
193
|
-
it "returns the jobs" do
|
194
|
-
expect(assigns(:jobs)).to match_array(jobs)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
context "with a state" do
|
199
|
-
let(:query_spy) { spy(where: jobs) }
|
200
|
-
let(:result) { spy(sort: query_spy) }
|
201
|
-
let(:states) { ['completed', 'running'] }
|
202
|
-
|
203
|
-
it { expect(response.status).to be(200) }
|
204
|
-
|
205
|
-
it "grabs a filtered list of rocket jobs" do
|
206
|
-
expect(query_spy).to have_received(:where).with(state: states)
|
207
|
-
end
|
137
|
+
it "grabs a sorted list of rocket jobs" do
|
138
|
+
expect(RocketJob::Job).to have_received(:sort).with(_id: :desc)
|
139
|
+
end
|
208
140
|
|
209
|
-
|
210
|
-
|
211
|
-
end
|
212
|
-
end
|
141
|
+
it "returns the jobs" do
|
142
|
+
expect(assigns(:jobs)).to eq(jobs)
|
213
143
|
end
|
214
144
|
end
|
215
145
|
end
|
@@ -4,30 +4,30 @@ Rails.application.configure do
|
|
4
4
|
# In the development environment your application's code is reloaded on
|
5
5
|
# every request. This slows down response time but is perfect for development
|
6
6
|
# since you don't have to restart the web server when you make code changes.
|
7
|
-
config.cache_classes
|
7
|
+
config.cache_classes = false
|
8
8
|
|
9
9
|
# Do not eager load code on boot.
|
10
|
-
config.eager_load
|
10
|
+
config.eager_load = false
|
11
11
|
|
12
12
|
# Show full error reports and disable caching.
|
13
|
-
config.consider_all_requests_local
|
14
|
-
config.action_controller.perform_caching
|
13
|
+
config.consider_all_requests_local = true
|
14
|
+
config.action_controller.perform_caching = false
|
15
15
|
|
16
16
|
# Don't care if the mailer can't send.
|
17
17
|
config.action_mailer.raise_delivery_errors = false
|
18
18
|
|
19
19
|
# Print deprecation notices to the Rails logger.
|
20
|
-
config.active_support.deprecation
|
20
|
+
config.active_support.deprecation = :log
|
21
21
|
|
22
22
|
# Debug mode disables concatenation and preprocessing of assets.
|
23
23
|
# This option may cause significant delays in view rendering with a large
|
24
24
|
# number of complex assets.
|
25
|
-
config.assets.debug
|
25
|
+
config.assets.debug = true
|
26
26
|
|
27
27
|
# Adds additional error checking when serving assets at runtime.
|
28
28
|
# Checks for improperly declared sprockets dependencies.
|
29
29
|
# Raises helpful error messages.
|
30
|
-
config.assets.raise_runtime_errors
|
30
|
+
config.assets.raise_runtime_errors = true
|
31
31
|
|
32
32
|
# Raises error for missing translations
|
33
33
|
# config.action_view.raise_on_missing_translations = true
|