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
@@ -0,0 +1,62 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
class AbstractDatatable
|
3
|
+
delegate :params, :link_to, :render, to: :@view
|
4
|
+
delegate :h, to: 'ERB::Util'
|
5
|
+
|
6
|
+
attr_accessor :view, :query
|
7
|
+
|
8
|
+
def initialize(view, query)
|
9
|
+
@view = view
|
10
|
+
@query = query
|
11
|
+
extract_query_params
|
12
|
+
end
|
13
|
+
|
14
|
+
def as_json(options = {})
|
15
|
+
{
|
16
|
+
draw: params[:draw].to_i,
|
17
|
+
recordsTotal: query.unfiltered_count,
|
18
|
+
recordsFiltered: query.count,
|
19
|
+
data: data(query.query)
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def data(records)
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
def extract_query_params
|
30
|
+
# Search term
|
31
|
+
search = params[:search]
|
32
|
+
if search.present? && search[:value].present?
|
33
|
+
query.search_term = search[:value] if search.present?
|
34
|
+
end
|
35
|
+
|
36
|
+
# Sort order
|
37
|
+
if order_by = extract_sort(params[:order])
|
38
|
+
query.order_by = order_by
|
39
|
+
end
|
40
|
+
|
41
|
+
# Pagination
|
42
|
+
unless params[:length].present? && params[:length] == '-1'
|
43
|
+
query.start = params[:start].to_i
|
44
|
+
query.page_size = params.fetch(:length, 10).to_i
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def extract_sort(order)
|
49
|
+
return nil unless order.present?
|
50
|
+
|
51
|
+
ap order
|
52
|
+
sort_by = {}
|
53
|
+
order.each_pair do |key, value|
|
54
|
+
name = query.display_columns[value[:column].to_i]
|
55
|
+
raise(ArgumentError, "Invalid column id: #{value[:column]}. Must fit #{query.display_columns.inspect}") unless name.present?
|
56
|
+
sort_by[name] = value[:dir]
|
57
|
+
end
|
58
|
+
sort_by
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
class ActiveWorkersDatatable < AbstractDatatable
|
3
|
+
delegate :job_path, :state_icon, to: :@view
|
4
|
+
|
5
|
+
def initialize(view, query)
|
6
|
+
super(view, query)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def extract_query_params
|
12
|
+
@query.order_by = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def data(active_workers)
|
16
|
+
active_workers.collect do |active_worker|
|
17
|
+
{
|
18
|
+
'0' => worker_name_with_icon(active_worker, active_worker.job),
|
19
|
+
'1' => job_name_with_link(active_worker.job.class.name, active_worker.job.id),
|
20
|
+
'2' => h(active_worker.job.description.try!(:truncate, 50)),
|
21
|
+
'3' => h("#{active_worker.duration} ago"),
|
22
|
+
'DT_RowClass' => 'card callout callout-running'
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def worker_name_with_icon(active_worker, job)
|
28
|
+
state = active_worker.zombie? ? :zombie : job.state
|
29
|
+
<<-EOS
|
30
|
+
<i class="fa #{state_icon(state)}" style="font-size: 75%" title="#{state}"></i>
|
31
|
+
#{active_worker.name}
|
32
|
+
EOS
|
33
|
+
end
|
34
|
+
|
35
|
+
def job_name_with_link(job_class_name, job_id)
|
36
|
+
<<-EOS
|
37
|
+
<a href="#{job_path(job_id)}">
|
38
|
+
#{job_class_name}
|
39
|
+
</a>
|
40
|
+
EOS
|
41
|
+
end
|
42
|
+
|
43
|
+
def duration(started_at)
|
44
|
+
"#{RocketJob.seconds_as_duration(Time.now - started_at)} ago" if started_at
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,88 +1,26 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
|
-
class DirmonEntriesDatatable
|
3
|
-
delegate :
|
4
|
-
:link_to,
|
5
|
-
:dirmon_entry_path,
|
6
|
-
:state_icon,
|
7
|
-
:render, to: :@view
|
2
|
+
class DirmonEntriesDatatable < AbstractDatatable
|
3
|
+
delegate :dirmon_entry_path, :state_icon, to: :@view
|
8
4
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
}
|
5
|
+
def initialize(view, query)
|
6
|
+
query.display_columns = %w[name _type pattern]
|
7
|
+
query.search_columns = [:job_class_name, :name, :pattern]
|
8
|
+
super(view, query)
|
23
9
|
end
|
24
10
|
|
25
11
|
private
|
26
12
|
|
27
|
-
def data
|
13
|
+
def data(dirmons)
|
28
14
|
dirmons.map do |dirmon|
|
29
15
|
{
|
30
|
-
'0'
|
31
|
-
'1'
|
32
|
-
'2'
|
16
|
+
'0' => name_with_link(dirmon),
|
17
|
+
'1' => h(dirmon.job_class_name),
|
18
|
+
'2' => h(dirmon.pattern.try(:truncate, 80)),
|
33
19
|
'DT_RowClass' => "card callout callout-#{dirmon.state}"
|
34
20
|
}
|
35
21
|
end
|
36
22
|
end
|
37
23
|
|
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
24
|
def name_with_link(dirmon)
|
87
25
|
<<-EOS
|
88
26
|
<a href="#{dirmon_entry_path(dirmon.id)}">
|
@@ -1,55 +1,29 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
|
-
class JobsDatatable
|
3
|
-
delegate :
|
4
|
-
|
5
|
-
|
6
|
-
delegate :h, to: 'ERB::Util'
|
2
|
+
class JobsDatatable < AbstractDatatable
|
3
|
+
delegate :job_path, :job_icon, :edit_job_path,
|
4
|
+
:abort_job_path, :job_path, :fail_job_path, :run_now_job_path, :pause_job_path,
|
5
|
+
:resume_job_path, :retry_job_path, :job_failures_path, :job_action_link, :exceptions_job_path, to: :@view
|
7
6
|
|
8
|
-
def initialize(view,
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
def as_json(options = {})
|
14
|
-
{
|
15
|
-
:draw => params[:draw].to_i,
|
16
|
-
:recordsTotal => get_raw_records.count,
|
17
|
-
:recordsFiltered => filter_records(get_raw_records).count,
|
18
|
-
:data => data
|
19
|
-
}
|
7
|
+
def initialize(view, query)
|
8
|
+
query.search_columns = [:_type, :description]
|
9
|
+
super(view, query)
|
20
10
|
end
|
21
11
|
|
22
12
|
private
|
23
13
|
|
24
|
-
def data
|
14
|
+
def data(jobs)
|
25
15
|
jobs.map do |job|
|
26
16
|
{
|
27
|
-
'0'
|
28
|
-
'1'
|
29
|
-
'2'
|
30
|
-
'3'
|
31
|
-
'4'
|
17
|
+
'0' => class_with_link(job),
|
18
|
+
'1' => h(job.description.try(:truncate, 50)),
|
19
|
+
'2' => h(job.created_at),
|
20
|
+
'3' => h(job.duration),
|
21
|
+
'4' => action_buttons(job),
|
32
22
|
'DT_RowClass' => "card callout callout-#{job.state}"
|
33
23
|
}
|
34
24
|
end
|
35
25
|
end
|
36
26
|
|
37
|
-
def get_raw_records
|
38
|
-
@unfiltered_jobs
|
39
|
-
end
|
40
|
-
|
41
|
-
def jobs
|
42
|
-
@jobs ||= fetch_jobs
|
43
|
-
end
|
44
|
-
|
45
|
-
def fetch_jobs
|
46
|
-
records = get_raw_records
|
47
|
-
records = sort_records(records) if params[:order].present?
|
48
|
-
records = filter_records(records) if params[:search].present?
|
49
|
-
records = paginate_records(records) unless params[:length].present? && params[:length] == '-1'
|
50
|
-
records
|
51
|
-
end
|
52
|
-
|
53
27
|
def class_with_link(job)
|
54
28
|
<<-EOS
|
55
29
|
<a class='job-link' href="#{job_path(job.id)}">
|
@@ -60,23 +34,11 @@ module RocketJobMissionControl
|
|
60
34
|
end
|
61
35
|
|
62
36
|
def action_buttons(job)
|
63
|
-
events
|
37
|
+
events = valid_events(job)
|
64
38
|
buttons = "<div class='inline-job-actions'>"
|
65
|
-
unless job.completed? || job.aborted?
|
66
|
-
buttons += "#{ link_to( 'Edit', edit_job_path(job), class: 'btn btn-default', title: 'Edit job') }"
|
67
|
-
end
|
68
39
|
if job.scheduled?
|
69
40
|
buttons += "#{ job_action_link('Run', run_now_job_path(job), :patch) }"
|
70
41
|
end
|
71
|
-
if events.include?(:abort)
|
72
|
-
buttons += "#{ job_action_link('Abort', abort_job_path(job), :patch) }"
|
73
|
-
end
|
74
|
-
if job.completed? || job.aborted?
|
75
|
-
buttons += "#{ job_action_link('Destroy', job_path(job), :delete) }"
|
76
|
-
end
|
77
|
-
if events.include?(:fail)
|
78
|
-
buttons += "#{ job_action_link('Fail', fail_job_path(job), :patch) }"
|
79
|
-
end
|
80
42
|
if events.include?(:pause)
|
81
43
|
buttons += "#{ job_action_link('Pause', pause_job_path(job), :patch) }"
|
82
44
|
end
|
@@ -86,50 +48,13 @@ module RocketJobMissionControl
|
|
86
48
|
if events.include?(:retry)
|
87
49
|
buttons += "#{ job_action_link('Retry', retry_job_path(job), :patch) }"
|
88
50
|
end
|
89
|
-
|
90
|
-
buttons += "#{ link_to('View Errors', job_failures_path(job), class: 'btn btn-default') }"
|
91
|
-
end
|
51
|
+
buttons += "#{ job_action_link('Destroy', job_path(job), :delete) }"
|
92
52
|
buttons += "</div>"
|
93
53
|
end
|
94
54
|
|
95
55
|
def valid_events(job)
|
96
|
-
job.aasm.events.collect
|
56
|
+
job.aasm.events.collect(&:name)
|
97
57
|
end
|
98
58
|
|
99
|
-
def page
|
100
|
-
(params[:start].to_i / per_page) + 1
|
101
|
-
end
|
102
|
-
|
103
|
-
def per_page
|
104
|
-
params.fetch(:length, 10).to_i
|
105
|
-
end
|
106
|
-
|
107
|
-
def sort_records(records)
|
108
|
-
sort_by = {}
|
109
|
-
params[:order].keys.each do |key|
|
110
|
-
sort_by[sort_column(params[:order][key][:column])] = params[:order][key][:dir]
|
111
|
-
end
|
112
|
-
records.sort(sort_by)
|
113
|
-
end
|
114
|
-
|
115
|
-
def counts
|
116
|
-
RocketJob::Job.counts_by_state
|
117
|
-
end
|
118
|
-
|
119
|
-
def sort_column(index)
|
120
|
-
columns = %w[_type description completed_at]
|
121
|
-
columns[index.to_i]
|
122
|
-
end
|
123
|
-
|
124
|
-
def filter_records(records)
|
125
|
-
return records unless (params[:search].present? && params[:search][:value].present?)
|
126
|
-
conditions = params[:search][:value]
|
127
|
-
records = RocketJobMissionControl::Jobs::Search.new(conditions, records).execute if conditions
|
128
|
-
records
|
129
|
-
end
|
130
|
-
|
131
|
-
def paginate_records(records)
|
132
|
-
Kaminari.paginate_array(records.all).page(page).per(per_page)
|
133
|
-
end
|
134
59
|
end
|
135
60
|
end
|
@@ -2,15 +2,15 @@ module RocketJobMissionControl
|
|
2
2
|
class RunningJobsDatatable < JobsDatatable
|
3
3
|
private
|
4
4
|
|
5
|
-
def data
|
5
|
+
def data(jobs)
|
6
6
|
jobs.map do |job|
|
7
7
|
{
|
8
|
-
'0'
|
9
|
-
'1'
|
10
|
-
'2'
|
11
|
-
'3'
|
12
|
-
'4'
|
13
|
-
'5'
|
8
|
+
'0' => class_with_link(job),
|
9
|
+
'1' => h(job.description.try(:truncate, 50)),
|
10
|
+
'2' => progress(job),
|
11
|
+
'3' => h(job.priority),
|
12
|
+
'4' => h(started(job)),
|
13
|
+
'5' => action_buttons(job),
|
14
14
|
'DT_RowClass' => "card callout callout-#{job.state}"
|
15
15
|
}
|
16
16
|
end
|
@@ -22,11 +22,22 @@ module RocketJobMissionControl
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def progress(job)
|
25
|
-
|
26
|
-
|
27
|
-
<div class=
|
28
|
-
|
29
|
-
|
25
|
+
if (sub_state = job.attributes['sub_state']) && [:before, :after].include?(sub_state)
|
26
|
+
<<-EOS
|
27
|
+
<div class="job-status">
|
28
|
+
<div class="job-state">
|
29
|
+
<div class="left">Batch</div>
|
30
|
+
<div class="right running">#{sub_state}</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
EOS
|
34
|
+
else
|
35
|
+
<<-EOS
|
36
|
+
<div class='progress'>
|
37
|
+
<div class='progress-bar' style="width: #{job.percent_complete}%;", title="#{job.percent_complete}% complete."></div>
|
38
|
+
</div>
|
39
|
+
EOS
|
40
|
+
end
|
30
41
|
end
|
31
42
|
|
32
43
|
def started(job)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module RocketJobMissionControl
|
2
|
+
class ServersDatatable < AbstractDatatable
|
3
|
+
delegate :server_icon, :server_path, :stop_server_path, :resume_server_path, :pause_server_path, :server_card_class, to: :@view
|
4
|
+
|
5
|
+
def initialize(view, query)
|
6
|
+
query.display_columns = %w[name heartbeat.workers started_at heartbeat.updated_at]
|
7
|
+
query.search_columns = [:name]
|
8
|
+
super(view, query)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def data(servers)
|
14
|
+
servers.collect do |server|
|
15
|
+
{
|
16
|
+
'0' => name_with_icon(server),
|
17
|
+
'1' => h(threads(server)),
|
18
|
+
'2' => h(started_ago(server)),
|
19
|
+
'3' => h(time_since_heartbeat(server)),
|
20
|
+
'4' => action_links_html(server),
|
21
|
+
'DT_RowClass' => "card callout #{server_card_class(server)}"
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def name_with_icon(server)
|
27
|
+
<<-EOS
|
28
|
+
<i class="fa #{server_icon(server)}" style="font-size: 75%" title="#{server.state}"></i>
|
29
|
+
#{server.name}
|
30
|
+
EOS
|
31
|
+
end
|
32
|
+
|
33
|
+
def threads(server)
|
34
|
+
"#{server.heartbeat.workers.to_i}/#{server.max_workers}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def started_ago(server)
|
38
|
+
"#{RocketJob.seconds_as_duration(Time.now - server.started_at)} ago"
|
39
|
+
end
|
40
|
+
|
41
|
+
def time_since_heartbeat(server)
|
42
|
+
"#{RocketJob.seconds_as_duration(Time.now - server.heartbeat.updated_at)} ago"
|
43
|
+
end
|
44
|
+
|
45
|
+
def action_links_html(server)
|
46
|
+
actions = '<div class="actions">'
|
47
|
+
if server.stopping?
|
48
|
+
actions += "Server is stopping..."
|
49
|
+
confirmation = ''
|
50
|
+
unless server.zombie?
|
51
|
+
confirmation << "Warning!\n\nDestroying this server will hard kill its active workers/jobs.\nKilled jobs will be requeued for processing on another worker.\n\n"
|
52
|
+
end
|
53
|
+
confirmation << "Are you sure you want to destroy #{server.name} ?"
|
54
|
+
actions += "#{ link_to "destroy", server_path(server), method: :delete, class: 'btn btn-danger', data: {confirm: confirmation} }"
|
55
|
+
else
|
56
|
+
if server.paused?
|
57
|
+
actions += "#{ link_to "resume", resume_server_path(server), method: :patch, class: 'btn btn-default', data: {confirm: "Resume this server?"} }"
|
58
|
+
else
|
59
|
+
actions += "#{ link_to "pause", pause_server_path(server), method: :patch, class: 'btn btn-default', data: {confirm: "Pause this server?"} }"
|
60
|
+
end
|
61
|
+
actions += "#{ link_to "stop", stop_server_path(server), method: :patch, class: 'btn btn-danger', data: {confirm: "Stop this server?"} }"
|
62
|
+
end
|
63
|
+
actions += '</div>'
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|