rocketjob_mission_control 2.1.1 → 3.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/README.md +3 -3
- data/app/assets/stylesheets/rocket_job_mission_control/callout.scss +1 -1
- data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +2 -2
- data/app/controllers/rocket_job_mission_control/active_workers_controller.rb +15 -0
- data/app/controllers/rocket_job_mission_control/dirmon_entries/index_filters_controller.rb +8 -13
- data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +3 -14
- data/app/controllers/rocket_job_mission_control/jobs/failures_controller.rb +6 -11
- data/app/controllers/rocket_job_mission_control/jobs/index_filters_controller.rb +35 -14
- data/app/controllers/rocket_job_mission_control/jobs_controller.rb +12 -15
- data/app/controllers/rocket_job_mission_control/servers/index_filters_controller.rb +49 -0
- data/app/controllers/rocket_job_mission_control/servers_controller.rb +93 -0
- data/app/datatables/rocket_job_mission_control/abstract_datatable.rb +62 -0
- data/app/datatables/rocket_job_mission_control/active_workers_datatable.rb +47 -0
- data/app/datatables/rocket_job_mission_control/completed_jobs_datatable.rb +1 -1
- data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +10 -72
- data/app/datatables/rocket_job_mission_control/interrupted_jobs_datatable.rb +1 -1
- data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +16 -91
- data/app/datatables/rocket_job_mission_control/queued_jobs_datatable.rb +1 -1
- data/app/datatables/rocket_job_mission_control/running_jobs_datatable.rb +23 -12
- data/app/datatables/rocket_job_mission_control/scheduled_jobs_datatable.rb +1 -1
- data/app/datatables/rocket_job_mission_control/servers_datatable.rb +67 -0
- data/app/helpers/rocket_job_mission_control/{workers_helper.rb → servers_helper.rb} +9 -9
- data/app/models/job_failures.rb +3 -16
- data/app/models/rocket_job_mission_control/query.rb +51 -0
- data/app/views/layouts/rocket_job_mission_control/partials/_header.html.haml +3 -3
- data/app/views/layouts/rocket_job_mission_control/partials/_sidebar.html.haml +2 -2
- data/app/views/rocket_job_mission_control/{active_processes → active_workers}/index.html.haml +3 -3
- data/app/views/rocket_job_mission_control/dirmon_entries/_properties.html.haml +7 -18
- data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.haml +0 -5
- data/app/views/rocket_job_mission_control/dirmon_entries/show.html.haml +4 -3
- data/app/views/rocket_job_mission_control/jobs/_status.html.haml +22 -17
- data/app/views/rocket_job_mission_control/jobs/edit.html.haml +1 -1
- data/app/views/rocket_job_mission_control/jobs/exceptions.html.haml +29 -0
- data/app/views/rocket_job_mission_control/jobs/failures/index.html.haml +7 -7
- data/app/views/rocket_job_mission_control/jobs/show.html.haml +23 -11
- data/app/views/rocket_job_mission_control/servers/_actions.html.haml +9 -0
- data/app/views/rocket_job_mission_control/servers/_sidebar.html.haml +20 -0
- data/app/views/rocket_job_mission_control/{workers → servers}/index.html.haml +9 -9
- data/app/views/rocket_job_mission_control/{workers → servers}/index_filters/paused.html.haml +8 -8
- data/app/views/rocket_job_mission_control/{workers → servers}/index_filters/running.html.haml +8 -8
- data/app/views/rocket_job_mission_control/{workers → servers}/index_filters/starting.html.haml +8 -8
- data/app/views/rocket_job_mission_control/{workers → servers}/index_filters/stopping.html.haml +8 -8
- data/config/locales/en.yml +2 -2
- data/config/routes.rb +7 -6
- data/lib/rocket_job_mission_control/engine.rb +0 -12
- data/lib/rocket_job_mission_control/version.rb +1 -1
- data/spec/controllers/dirmon_entries/index_filters_controller_spec.rb +2 -4
- data/spec/controllers/dirmon_entries_controller_spec.rb +15 -72
- data/spec/controllers/jobs/index_filters_controller_spec.rb +1 -1
- data/spec/controllers/workers/index_filters_controller_spec.rb +9 -9
- data/spec/controllers/workers_controller_spec.rb +47 -47
- data/spec/dummy/config/mongoid.yml +88 -0
- data/spec/dummy/config/symmetric-encryption.yml +8 -0
- data/spec/dummy/log/test.log +89072 -0
- data/spec/helpers/servers_helper_spec.rb +16 -0
- data/spec/spec_helper.rb +3 -0
- metadata +31 -45
- data/app/controllers/rocket_job_mission_control/active_processes_controller.rb +0 -27
- data/app/controllers/rocket_job_mission_control/workers/index_filters_controller.rb +0 -50
- data/app/controllers/rocket_job_mission_control/workers_controller.rb +0 -93
- data/app/datatables/rocket_job_mission_control/active_processes_datatable.rb +0 -79
- data/app/datatables/rocket_job_mission_control/workers_datatable.rb +0 -127
- data/app/interactors/rocket_job_mission_control/dirmon_entries/search.rb +0 -19
- data/app/interactors/rocket_job_mission_control/jobs/search.rb +0 -19
- data/app/interactors/rocket_job_mission_control/workers/search.rb +0 -19
- data/app/views/rocket_job_mission_control/workers/_actions.html.haml +0 -9
- data/app/views/rocket_job_mission_control/workers/_sidebar.html.haml +0 -20
- data/spec/dummy/config/mongo.yml +0 -15
- data/spec/helpers/workers_helper_spec.rb +0 -16
- data/spec/interactors/jobs/search_spec.rb +0 -35
@@ -1,127 +0,0 @@
|
|
1
|
-
module RocketJobMissionControl
|
2
|
-
class WorkersDatatable
|
3
|
-
delegate :params,
|
4
|
-
:link_to,
|
5
|
-
:worker_icon,
|
6
|
-
:worker_path,
|
7
|
-
:stop_worker_path,
|
8
|
-
:resume_worker_path,
|
9
|
-
:pause_worker_path,
|
10
|
-
:worker_card_class,
|
11
|
-
:render, to: :@view
|
12
|
-
|
13
|
-
delegate :h, to: 'ERB::Util'
|
14
|
-
|
15
|
-
def initialize(view, workers)
|
16
|
-
@view = view
|
17
|
-
@unfiltered_workers = workers
|
18
|
-
end
|
19
|
-
|
20
|
-
def as_json(options = {})
|
21
|
-
{
|
22
|
-
:draw => params[:draw].to_i,
|
23
|
-
:recordsTotal => get_raw_records.count,
|
24
|
-
:recordsFiltered => filter_records(get_raw_records).count,
|
25
|
-
:data => data
|
26
|
-
}
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def data
|
32
|
-
workers.map do |worker|
|
33
|
-
{
|
34
|
-
'0' => name_with_icon(worker),
|
35
|
-
'1' => h(threads(worker)),
|
36
|
-
'2' => h(started_ago(worker)),
|
37
|
-
'3' => h(time_since_heartbeat(worker)),
|
38
|
-
'4' => action_links_html(worker),
|
39
|
-
'DT_RowClass' => "card callout #{worker_card_class(worker)}"
|
40
|
-
}
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def get_raw_records
|
45
|
-
@unfiltered_workers
|
46
|
-
end
|
47
|
-
|
48
|
-
def workers
|
49
|
-
@workers ||= fetch_workers
|
50
|
-
end
|
51
|
-
|
52
|
-
def fetch_workers
|
53
|
-
records = get_raw_records
|
54
|
-
records = sort_records(records) if params[:order].present?
|
55
|
-
records = filter_records(records) if params[:search].present?
|
56
|
-
records = paginate_records(records) unless params[:length].present? && params[:length] == '-1'
|
57
|
-
records
|
58
|
-
end
|
59
|
-
|
60
|
-
def page
|
61
|
-
(params[:start].to_i / per_page) + 1
|
62
|
-
end
|
63
|
-
|
64
|
-
def per_page
|
65
|
-
params.fetch(:length, 10).to_i
|
66
|
-
end
|
67
|
-
|
68
|
-
def sort_records(records)
|
69
|
-
sort_by = {}
|
70
|
-
params[:order].keys.each do |key|
|
71
|
-
sort_by[sort_column(params[:order][key][:column])] = params[:order][key][:dir]
|
72
|
-
end
|
73
|
-
records.sort(sort_by)
|
74
|
-
end
|
75
|
-
|
76
|
-
def sort_column(index)
|
77
|
-
columns = %w[name max_threads started_at heartbeat.updated_at]
|
78
|
-
columns[index.to_i]
|
79
|
-
end
|
80
|
-
|
81
|
-
def filter_records(records)
|
82
|
-
return records unless (params[:search].present? && params[:search][:value].present?)
|
83
|
-
conditions = params[:search][:value]
|
84
|
-
records = RocketJobMissionControl::Workers::Search.new(conditions, records).execute if conditions
|
85
|
-
records
|
86
|
-
end
|
87
|
-
|
88
|
-
def paginate_records(records)
|
89
|
-
Kaminari.paginate_array(records.all).page(page).per(per_page)
|
90
|
-
end
|
91
|
-
|
92
|
-
def name_with_icon(worker)
|
93
|
-
<<-EOS
|
94
|
-
<i class="fa #{worker_icon(worker)}" style="font-size: 75%" title="#{worker.state}"></i>
|
95
|
-
#{worker.name}
|
96
|
-
EOS
|
97
|
-
end
|
98
|
-
|
99
|
-
def threads(worker)
|
100
|
-
"#{worker.heartbeat.current_threads.to_i}/#{worker.max_threads}"
|
101
|
-
end
|
102
|
-
|
103
|
-
def started_ago(worker)
|
104
|
-
"#{RocketJob.seconds_as_duration(Time.now - worker.started_at)} ago"
|
105
|
-
end
|
106
|
-
|
107
|
-
def time_since_heartbeat(worker)
|
108
|
-
"#{RocketJob.seconds_as_duration(Time.now - worker.heartbeat.updated_at)} ago"
|
109
|
-
end
|
110
|
-
|
111
|
-
def action_links_html(worker)
|
112
|
-
actions = '<div class="actions">'
|
113
|
-
if worker.stopping?
|
114
|
-
actions += "Worker is stopping..."
|
115
|
-
actions += "#{ link_to "destroy", worker_path(worker), method: :delete, class: 'btn btn-danger', data: { confirm: "Destroy this worker?"} }"
|
116
|
-
else
|
117
|
-
if worker.paused?
|
118
|
-
actions += "#{ link_to "resume", resume_worker_path(worker), method: :patch, class: 'btn btn-default', data: { confirm: "Resume this worker?"} }"
|
119
|
-
else
|
120
|
-
actions += "#{ link_to "pause", pause_worker_path(worker), method: :patch, class: 'btn btn-default', data: { confirm: "Pause this worker?"} }"
|
121
|
-
end
|
122
|
-
actions += "#{ link_to "stop", stop_worker_path(worker), method: :patch, class: 'btn btn-danger', data: { confirm: "Stop this worker?"} }"
|
123
|
-
end
|
124
|
-
actions += '</div>'
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module RocketJobMissionControl
|
2
|
-
module DirmonEntries
|
3
|
-
class Search
|
4
|
-
attr_reader :results, :search_term
|
5
|
-
|
6
|
-
def initialize(search_term, search_subset)
|
7
|
-
@search_term = Regexp.escape(search_term)
|
8
|
-
@results = search_subset
|
9
|
-
end
|
10
|
-
|
11
|
-
def execute
|
12
|
-
if !search_term.blank?
|
13
|
-
@results = @results.where('$or' => [{job_class_name: /#{search_term}/i}, {name: /#{search_term}/i}, {pattern: /#{search_term}/i}])
|
14
|
-
end
|
15
|
-
@results
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module RocketJobMissionControl
|
2
|
-
module Jobs
|
3
|
-
class Search
|
4
|
-
attr_reader :results, :search_term
|
5
|
-
|
6
|
-
def initialize(search_term, search_subset)
|
7
|
-
@search_term = Regexp.escape(search_term)
|
8
|
-
@results = search_subset
|
9
|
-
end
|
10
|
-
|
11
|
-
def execute
|
12
|
-
if !search_term.blank?
|
13
|
-
@results = @results.where('$or' => [{_type: /#{search_term}/i}, {description: /#{search_term}/i}])
|
14
|
-
end
|
15
|
-
@results
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module RocketJobMissionControl
|
2
|
-
module Workers
|
3
|
-
class Search
|
4
|
-
attr_reader :results, :search_term
|
5
|
-
|
6
|
-
def initialize(search_term, search_subset)
|
7
|
-
@search_term = Regexp.escape(search_term)
|
8
|
-
@results = search_subset
|
9
|
-
end
|
10
|
-
|
11
|
-
def execute
|
12
|
-
if !search_term.blank?
|
13
|
-
@results = @results.where('$or' => [{name: /#{search_term}/i}])
|
14
|
-
end
|
15
|
-
@results
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
- if worker.stopping?
|
2
|
-
%p Worker is stopping...
|
3
|
-
= link_to "destroy", rocket_job_mission_control.worker_path(worker), method: :delete, class: 'btn btn-danger'
|
4
|
-
-else
|
5
|
-
= link_to "stop", rocket_job_mission_control.stop_worker_path(worker), method: :patch, class: 'btn btn-danger'
|
6
|
-
- if worker.paused?
|
7
|
-
= link_to "resume", rocket_job_mission_control.resume_worker_path(worker), method: :patch, class: 'btn btn-default'
|
8
|
-
- else
|
9
|
-
= link_to "pause", rocket_job_mission_control.pause_worker_path(worker), method: :patch, class: 'btn btn-default'
|
@@ -1,20 +0,0 @@
|
|
1
|
-
%ul#lg-menu.nav.hidden-xs
|
2
|
-
%li
|
3
|
-
= link_to(workers_path) do
|
4
|
-
%i.fa.fa-list
|
5
|
-
All
|
6
|
-
- RocketJob::Worker.aasm.states.map { |s| s.name.to_s }.each do |state|
|
7
|
-
%li{class: state}
|
8
|
-
= link_to("#{state}_workers".to_sym) do
|
9
|
-
%i.fa{class: state_icon(state)}
|
10
|
-
= state.to_s.capitalize!
|
11
|
-
= "(#{worker_counts_by_state(state)})"
|
12
|
-
/ tiny only nav
|
13
|
-
%ul#xs-menu.nav.visible-xs
|
14
|
-
%li
|
15
|
-
= link_to(workers_path) do
|
16
|
-
%i.fa.fa-list
|
17
|
-
- RocketJob::Worker.aasm.states.map { |s| s.name.to_s }.each do |state|
|
18
|
-
%li{class: state}
|
19
|
-
= link_to("#{state}_workers".to_sym) do
|
20
|
-
%i.fa{class: state_icon(state)}
|
data/spec/dummy/config/mongo.yml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
default_options: &default_options
|
2
|
-
:w: 1
|
3
|
-
:pool_size: 5
|
4
|
-
:pool_timeout: 5
|
5
|
-
:connect_timeout: 5
|
6
|
-
:reconnect_attempts: 53
|
7
|
-
:reconnect_retry_seconds: 0.1
|
8
|
-
:reconnect_retry_multiplier: 2
|
9
|
-
:reconnect_max_retry_seconds: 5
|
10
|
-
:read: :nearest
|
11
|
-
|
12
|
-
test:
|
13
|
-
uri: mongodb://localhost:27017/rocket_job_mission_control
|
14
|
-
options:
|
15
|
-
<<: *default_options
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'rails_helper'
|
2
|
-
|
3
|
-
module RocketJobMissionControl
|
4
|
-
RSpec.describe WorkersHelper, type: :helper do
|
5
|
-
describe '#worker_card_class' do
|
6
|
-
context 'when the worker is a zombie' do
|
7
|
-
let(:worker) { spy(zombie?: true) }
|
8
|
-
|
9
|
-
it 'returns the correct class' do
|
10
|
-
expect(helper.worker_card_class(worker)).to eq('callout-zombie')
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'rails_helper'
|
2
|
-
|
3
|
-
describe RocketJobMissionControl::Jobs::Search do
|
4
|
-
|
5
|
-
let(:search_term) { "bad[^$" }
|
6
|
-
let(:expected_result) { [] }
|
7
|
-
let(:search_subset) { spy("query_builder", where: expected_result) }
|
8
|
-
|
9
|
-
subject { described_class.new(search_term, search_subset) }
|
10
|
-
|
11
|
-
it 'escapes the search_term' do
|
12
|
-
expect(subject.search_term).to eq('bad\\[\\^\\$')
|
13
|
-
end
|
14
|
-
|
15
|
-
describe '#execute' do
|
16
|
-
before { subject.execute }
|
17
|
-
|
18
|
-
describe 'with blank search terms' do
|
19
|
-
let(:search_term) { "" }
|
20
|
-
|
21
|
-
it 'does not search' do
|
22
|
-
expect(search_subset).to_not have_received(:where)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe 'with search terms' do
|
27
|
-
let(:search_term) { "job[" }
|
28
|
-
|
29
|
-
it 'searches for the search term' do
|
30
|
-
expect(search_subset).to have_received(:where).with({"$or"=>[{:_type=>/job\[/i}, {:description=>/job\[/i}]})
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|