rocketjob_mission_control 4.3.0 → 6.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +12 -13
- data/app/assets/config/manifest.js +3 -0
- data/app/assets/javascripts/rocket_job_mission_control/application.js +2 -4
- data/app/assets/javascripts/rocket_job_mission_control/nested_fields.js +112 -0
- data/app/assets/stylesheets/rocket_job_mission_control/{application.scss → application.css} +9 -9
- data/app/assets/stylesheets/rocket_job_mission_control/base.css +420 -0
- data/app/assets/stylesheets/rocket_job_mission_control/{callout.scss → callout.css} +50 -52
- data/app/assets/stylesheets/rocket_job_mission_control/jobs.css +57 -0
- data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.css +7 -0
- data/app/controllers/rocket_job_mission_control/application_controller.rb +2 -3
- data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +53 -33
- data/app/controllers/rocket_job_mission_control/jobs_controller.rb +78 -37
- data/app/controllers/rocket_job_mission_control/servers_controller.rb +32 -38
- data/app/datatables/rocket_job_mission_control/abstract_datatable.rb +8 -6
- data/app/datatables/rocket_job_mission_control/active_workers_datatable.rb +5 -5
- data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +4 -4
- data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +55 -62
- data/app/datatables/rocket_job_mission_control/servers_datatable.rb +13 -14
- data/app/helpers/rocket_job_mission_control/application_helper.rb +70 -52
- data/app/helpers/rocket_job_mission_control/dirmon_entries_helper.rb +8 -0
- data/app/helpers/rocket_job_mission_control/jobs_helper.rb +80 -13
- data/app/helpers/rocket_job_mission_control/pagination_helper.rb +1 -1
- data/app/helpers/rocket_job_mission_control/servers_helper.rb +6 -6
- data/app/helpers/rocket_job_mission_control/slices_helper.rb +2 -4
- data/app/models/rocket_job_mission_control/access_policy.rb +3 -4
- data/app/models/rocket_job_mission_control/authorization.rb +3 -2
- data/app/models/rocket_job_mission_control/dirmon_sanitizer.rb +68 -0
- data/app/models/rocket_job_mission_control/job_sanitizer.rb +48 -16
- data/app/models/rocket_job_mission_control/query.rb +2 -5
- data/app/views/rocket_job_mission_control/dirmon_entries/_form.html.erb +78 -42
- data/app/views/rocket_job_mission_control/dirmon_entries/_input_categories.html.erb +59 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_input_category_fields.html.erb +56 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_output_categories.html.erb +44 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_output_category_fields.html.erb +36 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.erb +22 -16
- data/app/views/rocket_job_mission_control/dirmon_entries/copy.html.erb +4 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/edit.html.erb +7 -3
- data/app/views/rocket_job_mission_control/dirmon_entries/show.html.erb +8 -5
- data/app/views/rocket_job_mission_control/jobs/_attributes.html.erb +89 -0
- data/app/views/rocket_job_mission_control/jobs/_dates.html.erb +39 -0
- data/app/views/rocket_job_mission_control/jobs/_details.html.erb +86 -0
- data/app/views/rocket_job_mission_control/jobs/_exception.html.erb +33 -0
- data/app/views/rocket_job_mission_control/jobs/_exceptions.html.erb +1 -1
- data/app/views/rocket_job_mission_control/jobs/_input_categories.html.erb +126 -0
- data/app/views/rocket_job_mission_control/jobs/_input_category_fields.html.erb +56 -0
- data/app/views/rocket_job_mission_control/jobs/_output_categories.html.erb +60 -0
- data/app/views/rocket_job_mission_control/jobs/_output_category_fields.html.erb +36 -0
- data/app/views/rocket_job_mission_control/jobs/_retryable.html.erb +27 -0
- data/app/views/rocket_job_mission_control/jobs/_status.html.erb +21 -49
- data/app/views/rocket_job_mission_control/jobs/edit.html.erb +28 -0
- data/app/views/rocket_job_mission_control/jobs/edit_slice.html.erb +1 -1
- data/app/views/rocket_job_mission_control/jobs/exception.html.erb +1 -1
- data/app/views/rocket_job_mission_control/jobs/index.html.erb +24 -18
- data/app/views/rocket_job_mission_control/jobs/show.html.erb +32 -58
- data/app/views/rocket_job_mission_control/jobs/view_slice.html.erb +4 -4
- data/app/views/rocket_job_mission_control/servers/index.html.erb +2 -2
- data/config/initializers/assets.rb +5 -8
- data/config/locales/en.yml +3 -0
- data/config/routes.rb +24 -21
- data/lib/rocket_job_mission_control/engine.rb +6 -9
- data/lib/rocket_job_mission_control/version.rb +1 -1
- data/lib/rocketjob_mission_control.rb +1 -1
- data/test/compare_hashes.rb +1 -2
- data/test/controllers/rocket_job_mission_control/application_controller_test.rb +13 -21
- data/test/controllers/rocket_job_mission_control/dirmon_entries_controller_test.rb +124 -157
- data/test/controllers/rocket_job_mission_control/jobs_controller_test.rb +103 -127
- data/test/controllers/rocket_job_mission_control/servers_controller_test.rb +66 -103
- data/test/helpers/rocket_job_mission_control/application_helper_test.rb +13 -14
- data/test/helpers/rocket_job_mission_control/jobs_helper_test.rb +31 -31
- data/test/helpers/rocket_job_mission_control/pagination_helper_test.rb +7 -9
- data/test/helpers/rocket_job_mission_control/servers_helper_test.rb +15 -15
- data/test/helpers/rocket_job_mission_control/slices_helper_test.rb +8 -10
- data/test/models/rocket_job_mission_control/dirmon_sanitizer_test.rb +146 -0
- data/test/models/rocket_job_mission_control/job_sanitizer_test.rb +47 -42
- data/test/models/rocket_job_mission_control/query_test.rb +26 -28
- data/test/test_helper.rb +9 -15
- data/vendor/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/vendor/assets/fonts/glyphicons-halflings-regular.svg +288 -0
- data/vendor/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/vendor/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/vendor/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/vendor/assets/javascripts/datatables.min.js +881 -0
- data/vendor/assets/stylesheets/bootstrap.min.css.erb +6 -0
- data/vendor/assets/stylesheets/datatables.min.css +141 -0
- metadata +61 -65
- data/app/assets/stylesheets/rocket_job_mission_control/base.scss +0 -436
- data/app/assets/stylesheets/rocket_job_mission_control/bootstrap_and_overrides.scss +0 -488
- data/app/assets/stylesheets/rocket_job_mission_control/jobs.scss +0 -72
- data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +0 -9
- data/vendor/assets/stylesheets/bootstrap.min.css +0 -6
@@ -12,56 +12,59 @@ module RocketJobMissionControl
|
|
12
12
|
|
13
13
|
rescue_from AccessGranted::AccessDenied do |exception|
|
14
14
|
raise exception if Rails.env.development? || Rails.env.test?
|
15
|
-
|
15
|
+
|
16
|
+
redirect_to :back, alert: "Access not authorized."
|
16
17
|
end
|
17
18
|
|
18
19
|
def index
|
19
|
-
@data_table_url = servers_url(format:
|
20
|
-
@actions = [
|
21
|
-
render_datatable(RocketJob::Server.all,
|
20
|
+
@data_table_url = servers_url(format: "json")
|
21
|
+
@actions = %i[pause resume stop kill destroy_zombies]
|
22
|
+
render_datatable(RocketJob::Server.all, "All")
|
22
23
|
end
|
23
24
|
|
24
25
|
def starting
|
25
|
-
@data_table_url = starting_servers_url(format:
|
26
|
-
@actions = [
|
27
|
-
render_datatable(RocketJob::Server.starting,
|
26
|
+
@data_table_url = starting_servers_url(format: "json")
|
27
|
+
@actions = %i[pause stop kill]
|
28
|
+
render_datatable(RocketJob::Server.starting, "Starting")
|
28
29
|
end
|
29
30
|
|
30
31
|
def running
|
31
|
-
@data_table_url = running_servers_url(format:
|
32
|
-
@actions = [
|
33
|
-
render_datatable(RocketJob::Server.running,
|
32
|
+
@data_table_url = running_servers_url(format: "json")
|
33
|
+
@actions = %i[pause stop kill destroy_zombies]
|
34
|
+
render_datatable(RocketJob::Server.running, "Running")
|
34
35
|
end
|
35
36
|
|
36
37
|
def paused
|
37
|
-
@data_table_url = paused_servers_url(format:
|
38
|
-
@actions = [
|
39
|
-
render_datatable(RocketJob::Server.paused,
|
38
|
+
@data_table_url = paused_servers_url(format: "json")
|
39
|
+
@actions = %i[resume destroy_zombies]
|
40
|
+
render_datatable(RocketJob::Server.paused, "Paused")
|
40
41
|
end
|
41
42
|
|
42
43
|
def stopping
|
43
|
-
@data_table_url = stopping_servers_url(format:
|
44
|
+
@data_table_url = stopping_servers_url(format: "json")
|
44
45
|
@actions = [:destroy_zombies]
|
45
|
-
render_datatable(RocketJob::Server.stopping,
|
46
|
+
render_datatable(RocketJob::Server.stopping, "Stopping")
|
46
47
|
end
|
47
48
|
|
48
49
|
def zombie
|
49
|
-
@data_table_url = zombie_servers_url(format:
|
50
|
+
@data_table_url = zombie_servers_url(format: "json")
|
50
51
|
@actions = [:destroy_zombies]
|
51
|
-
render_datatable(RocketJob::Server.zombies,
|
52
|
+
render_datatable(RocketJob::Server.zombies, "Zombie")
|
52
53
|
end
|
53
54
|
|
54
|
-
VALID_ACTIONS = [
|
55
|
+
VALID_ACTIONS = %i[stop kill pause resume thread_dump].freeze
|
55
56
|
|
56
57
|
def update_all
|
57
|
-
authorize! :update_all, RocketJob::Server
|
58
58
|
server_action = params[:server_action].to_sym
|
59
|
+
authorize! server_action, RocketJob::Server
|
60
|
+
|
59
61
|
if server_action == :destroy_zombies
|
60
62
|
RocketJob::Server.destroy_zombies
|
61
63
|
elsif VALID_ACTIONS.include?(server_action)
|
62
64
|
RocketJob::Subscribers::Server.publish(server_action)
|
65
|
+
flash[:notice] = t(:success, scope: %i[server update_all], action: server_action.to_s)
|
63
66
|
else
|
64
|
-
flash[:alert] = t(:invalid, scope: [
|
67
|
+
flash[:alert] = t(:invalid, scope: %i[server update_all])
|
65
68
|
end
|
66
69
|
|
67
70
|
# TODO: Refresh the same page it was on
|
@@ -72,11 +75,8 @@ module RocketJobMissionControl
|
|
72
75
|
|
73
76
|
def stop
|
74
77
|
authorize! :stop, @server
|
75
|
-
|
76
|
-
|
77
|
-
else
|
78
|
-
flash[:alert] = t(:failure, scope: [:server, :stop])
|
79
|
-
end
|
78
|
+
RocketJob::Subscribers::Server.publish(:stop, server_id: @server.id)
|
79
|
+
flash[:notice] = t(:success, scope: %i[server update_one], action: "stop", name: @server.name)
|
80
80
|
|
81
81
|
respond_to do |format|
|
82
82
|
format.html { redirect_to servers_path }
|
@@ -86,7 +86,7 @@ module RocketJobMissionControl
|
|
86
86
|
def destroy
|
87
87
|
authorize! :destroy, @server
|
88
88
|
@server.destroy
|
89
|
-
flash[:notice] = t(:success, scope: [
|
89
|
+
flash[:notice] = t(:success, scope: %i[server destroy])
|
90
90
|
|
91
91
|
respond_to do |format|
|
92
92
|
format.html { redirect_to servers_path }
|
@@ -95,11 +95,8 @@ module RocketJobMissionControl
|
|
95
95
|
|
96
96
|
def pause
|
97
97
|
authorize! :pause, @server
|
98
|
-
|
99
|
-
|
100
|
-
else
|
101
|
-
flash[:alert] = t(:failure, scope: [:server, :pause])
|
102
|
-
end
|
98
|
+
RocketJob::Subscribers::Server.publish(:pause, server_id: @server.id)
|
99
|
+
flash[:notice] = t(:success, scope: %i[server update_one], action: "pause", name: @server.name)
|
103
100
|
|
104
101
|
respond_to do |format|
|
105
102
|
format.html { redirect_to servers_path }
|
@@ -108,11 +105,8 @@ module RocketJobMissionControl
|
|
108
105
|
|
109
106
|
def resume
|
110
107
|
authorize! :resume, @server
|
111
|
-
|
112
|
-
|
113
|
-
else
|
114
|
-
flash[:alert] = t(:failure, scope: [:server, :resume])
|
115
|
-
end
|
108
|
+
RocketJob::Subscribers::Server.publish(:resume, server_id: @server.id)
|
109
|
+
flash[:notice] = t(:success, scope: %i[server update_one], action: "resume", name: @server.name)
|
116
110
|
|
117
111
|
respond_to do |format|
|
118
112
|
format.html { redirect_to servers_path }
|
@@ -130,7 +124,7 @@ module RocketJobMissionControl
|
|
130
124
|
format.html do
|
131
125
|
@description = description
|
132
126
|
@states = RocketJob::Server.aasm.states.map { |s| s.name.to_s }
|
133
|
-
@states <<
|
127
|
+
@states << "zombie"
|
134
128
|
|
135
129
|
@server_counts = RocketJob::Server.counts_by_state
|
136
130
|
# TODO: Move into RocketJob
|
@@ -146,7 +140,7 @@ module RocketJobMissionControl
|
|
146
140
|
|
147
141
|
def find_server_or_redirect
|
148
142
|
unless @server = RocketJob::Server.where(id: params[:id]).first
|
149
|
-
flash[:alert] = t(:failure, scope: [
|
143
|
+
flash[:alert] = t(:failure, scope: %i[server find], id: params[:id])
|
150
144
|
|
151
145
|
redirect_to(servers_path)
|
152
146
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
2
|
class AbstractDatatable
|
3
3
|
delegate :params, :link_to, :render, to: :@view
|
4
|
-
delegate :h, to:
|
4
|
+
delegate :h, to: "ERB::Util"
|
5
5
|
|
6
6
|
attr_accessor :view, :query
|
7
7
|
|
@@ -11,7 +11,7 @@ module RocketJobMissionControl
|
|
11
11
|
extract_query_params
|
12
12
|
end
|
13
13
|
|
14
|
-
def as_json(
|
14
|
+
def as_json(_options = {})
|
15
15
|
{
|
16
16
|
draw: params[:draw].to_i,
|
17
17
|
recordsTotal: query.unfiltered_count,
|
@@ -39,7 +39,7 @@ module RocketJobMissionControl
|
|
39
39
|
end
|
40
40
|
|
41
41
|
# Pagination
|
42
|
-
unless params[:length].present? && params[:length] ==
|
42
|
+
unless params[:length].present? && params[:length] == "-1"
|
43
43
|
query.start = params[:start].to_i
|
44
44
|
query.page_size = params.fetch(:length, 10).to_i
|
45
45
|
end
|
@@ -49,13 +49,15 @@ module RocketJobMissionControl
|
|
49
49
|
return nil unless order.present?
|
50
50
|
|
51
51
|
sort_by = {}
|
52
|
-
order.each_pair do |
|
52
|
+
order.each_pair do |_key, value|
|
53
53
|
name = query.display_columns[value[:column].to_i]
|
54
|
-
|
54
|
+
unless name.present?
|
55
|
+
raise(ArgumentError, "Invalid column id: #{value[:column]}. Must fit #{query.display_columns.inspect}")
|
56
|
+
end
|
57
|
+
|
55
58
|
sort_by[name] = value[:dir]
|
56
59
|
end
|
57
60
|
sort_by
|
58
61
|
end
|
59
|
-
|
60
62
|
end
|
61
63
|
end
|
@@ -10,11 +10,11 @@ module RocketJobMissionControl
|
|
10
10
|
|
11
11
|
def map(active_worker)
|
12
12
|
{
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
"0" => worker_name_with_icon(active_worker, active_worker.job),
|
14
|
+
"1" => job_name_with_link(active_worker.job.class.name, active_worker.job.id),
|
15
|
+
"2" => h(active_worker.job.description.try!(:truncate, 50)),
|
16
|
+
"3" => h("#{active_worker.duration} ago"),
|
17
|
+
"DT_RowClass" => "card callout callout-running"
|
18
18
|
}
|
19
19
|
end
|
20
20
|
|
@@ -6,10 +6,10 @@ module RocketJobMissionControl
|
|
6
6
|
|
7
7
|
def map(dirmon)
|
8
8
|
{
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
"0" => name_with_link(dirmon),
|
10
|
+
"1" => h(dirmon.job_class_name),
|
11
|
+
"2" => h(dirmon.pattern.try(:truncate, 80)),
|
12
|
+
"DT_RowClass" => "card callout callout-#{dirmon.state}"
|
13
13
|
}
|
14
14
|
end
|
15
15
|
|
@@ -4,68 +4,68 @@ module RocketJobMissionControl
|
|
4
4
|
:abort_job_path, :job_path, :fail_job_path, :run_now_job_path, :pause_job_path,
|
5
5
|
:resume_job_path, :retry_job_path, :exception_job_path, :job_action_link, :exceptions_job_path, to: :@view
|
6
6
|
|
7
|
-
COMMON_FIELDS = [
|
7
|
+
COMMON_FIELDS = %i[id _type description completed_at created_at started_at state worker_name login].freeze
|
8
8
|
|
9
9
|
ABORTED_COLUMNS = [
|
10
|
-
{display:
|
11
|
-
{display:
|
12
|
-
{display:
|
13
|
-
{display:
|
14
|
-
]
|
10
|
+
{display: "Class", value: :class_with_link, field: "_type", width: "30%"},
|
11
|
+
{display: "Description", value: :description, field: "description", width: "30%"},
|
12
|
+
{display: "Aborted", value: :completed_ago, field: "completed_at"},
|
13
|
+
{display: "Actions", value: :action_buttons, orderable: false}
|
14
|
+
].freeze
|
15
15
|
|
16
16
|
COMPLETED_COLUMNS = [
|
17
|
-
{display:
|
18
|
-
{display:
|
19
|
-
{display:
|
20
|
-
{display:
|
21
|
-
{display:
|
22
|
-
]
|
17
|
+
{display: "Class", value: :class_with_link, field: "_type", width: "30%"},
|
18
|
+
{display: "Description", value: :description, field: "description", width: "30%"},
|
19
|
+
{display: "Duration", value: :duration, field: "duration", orderable: false},
|
20
|
+
{display: "Completed", value: :completed_ago, field: "completed_at"},
|
21
|
+
{display: "Actions", value: :action_buttons, orderable: false}
|
22
|
+
].freeze
|
23
23
|
|
24
24
|
FAILED_COLUMNS = ABORTED_COLUMNS.deep_dup
|
25
|
-
FAILED_COLUMNS[2][:display] =
|
25
|
+
FAILED_COLUMNS[2][:display] = "Failed"
|
26
26
|
|
27
27
|
PAUSED_COLUMNS = ABORTED_COLUMNS.deep_dup
|
28
|
-
PAUSED_COLUMNS[2][:display] =
|
28
|
+
PAUSED_COLUMNS[2][:display] = "Paused"
|
29
29
|
|
30
30
|
QUEUED_COLUMNS = [
|
31
|
-
{display:
|
32
|
-
{display:
|
33
|
-
{display:
|
34
|
-
{display:
|
35
|
-
{display:
|
36
|
-
{display:
|
37
|
-
]
|
38
|
-
QUEUED_FIELDS
|
31
|
+
{display: "Class", value: :class_with_link, field: "_type"},
|
32
|
+
{display: "Description", value: :description, field: "description"},
|
33
|
+
{display: "Record Count", value: :record_count, field: "record_count"},
|
34
|
+
{display: "Priority", value: :priority, field: "priority"},
|
35
|
+
{display: "Queued For", value: :duration, field: "duration", orderable: false},
|
36
|
+
{display: "Actions", value: :action_buttons, orderable: false}
|
37
|
+
].freeze
|
38
|
+
QUEUED_FIELDS = (COMMON_FIELDS + %i[record_count run_at priority]).freeze
|
39
39
|
|
40
40
|
RUNNING_COLUMNS = [
|
41
|
-
{display:
|
42
|
-
{display:
|
43
|
-
{display:
|
44
|
-
{display:
|
45
|
-
{display:
|
46
|
-
{display:
|
47
|
-
{display:
|
48
|
-
{display:
|
49
|
-
]
|
50
|
-
RUNNING_FIELDS
|
41
|
+
{display: "Class", value: :class_with_link, field: "_type"},
|
42
|
+
{display: "Description", value: :description, field: "description"},
|
43
|
+
{display: "Record Count", value: :record_count, field: "record_count"},
|
44
|
+
{display: "Progress", value: :progress, field: "percent_complete", orderable: false},
|
45
|
+
{display: "Workers", value: :worker_count, field: "worker_count", orderable: false},
|
46
|
+
{display: "Priority", value: :priority, field: "priority"},
|
47
|
+
{display: "Started", value: :started, field: "started_at"},
|
48
|
+
{display: "Actions", value: :action_buttons, orderable: false}
|
49
|
+
].freeze
|
50
|
+
RUNNING_FIELDS = (COMMON_FIELDS + %i[record_count input_categories output_categories priority sub_state percent_complete]).freeze
|
51
51
|
|
52
52
|
SCHEDULED_COLUMNS = [
|
53
|
-
{display:
|
54
|
-
{display:
|
55
|
-
{display:
|
56
|
-
{display:
|
57
|
-
{display:
|
58
|
-
]
|
59
|
-
SCHEDULED_FIELDS
|
53
|
+
{display: "Class", value: :class_with_link, field: "_type"},
|
54
|
+
{display: "Description", value: :description, field: "description"},
|
55
|
+
{display: "Runs in", value: :time_till_run, field: "run_at"},
|
56
|
+
{display: "Cron Schedule", value: :cron_schedule, field: "cron_schedule"},
|
57
|
+
{display: "Actions", value: :action_buttons, orderable: false}
|
58
|
+
].freeze
|
59
|
+
SCHEDULED_FIELDS = (COMMON_FIELDS + %i[run_at cron_schedule]).freeze
|
60
60
|
|
61
61
|
ALL_COLUMNS = [
|
62
|
-
{display:
|
63
|
-
{display:
|
64
|
-
{display:
|
65
|
-
{display:
|
66
|
-
{display:
|
67
|
-
]
|
68
|
-
ALL_FIELDS
|
62
|
+
{display: "Class", value: :class_with_link, field: "_type"},
|
63
|
+
{display: "Description", value: :description, field: "description"},
|
64
|
+
{display: "Created", value: :created_at, field: "created_at"},
|
65
|
+
{display: "Duration", value: :duration, field: "duration", orderable: false},
|
66
|
+
{display: "Actions", value: :action_buttons, orderable: false}
|
67
|
+
].freeze
|
68
|
+
ALL_FIELDS = (QUEUED_FIELDS + RUNNING_FIELDS + SCHEDULED_FIELDS).uniq.freeze
|
69
69
|
|
70
70
|
def initialize(view, query, columns)
|
71
71
|
@columns = columns
|
@@ -84,9 +84,9 @@ module RocketJobMissionControl
|
|
84
84
|
h = {}
|
85
85
|
@columns.each do |column|
|
86
86
|
h[index.to_s] = send(column[:value], job)
|
87
|
-
index
|
87
|
+
index += 1
|
88
88
|
end
|
89
|
-
h[
|
89
|
+
h["DT_RowClass"] = "card callout callout-#{job_state(job)}"
|
90
90
|
h
|
91
91
|
end
|
92
92
|
|
@@ -121,7 +121,7 @@ module RocketJobMissionControl
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def record_count(job)
|
124
|
-
job.attributes.key?(
|
124
|
+
job.attributes.key?("record_count") ? h(job.record_count) : 0
|
125
125
|
end
|
126
126
|
|
127
127
|
def started(job)
|
@@ -141,7 +141,7 @@ module RocketJobMissionControl
|
|
141
141
|
end
|
142
142
|
|
143
143
|
def progress(job)
|
144
|
-
if (sub_state = job.attributes[
|
144
|
+
if (sub_state = job.attributes["sub_state"]) && %i[before after].include?(sub_state)
|
145
145
|
<<-EOS
|
146
146
|
<div class="job-status">
|
147
147
|
<div class="job-state">
|
@@ -162,27 +162,20 @@ module RocketJobMissionControl
|
|
162
162
|
def action_buttons(job)
|
163
163
|
events = valid_events(job)
|
164
164
|
buttons = "<div class='inline-job-actions'>"
|
165
|
-
if job.scheduled? && view.can?(:run_now, job)
|
166
|
-
buttons += "#{ job_action_link('Run', run_now_job_path(job), :patch) }"
|
167
|
-
end
|
165
|
+
buttons += job_action_link("Run", run_now_job_path(job), :patch).to_s if job.scheduled? && view.can?(:run_now, job)
|
168
166
|
if events.include?(:pause) && job.pausable? && view.can?(:pause, job)
|
169
|
-
buttons +=
|
167
|
+
buttons += job_action_link("Pause", pause_job_path(job), :patch).to_s
|
170
168
|
end
|
171
169
|
if events.include?(:resume) && view.can?(:resume, job)
|
172
|
-
buttons +=
|
173
|
-
end
|
174
|
-
if events.include?(:retry) && view.can?(:retry, job)
|
175
|
-
buttons += "#{ job_action_link('Retry', retry_job_path(job), :patch) }"
|
176
|
-
end
|
177
|
-
if view.can?(:destroy, job)
|
178
|
-
buttons += "#{ job_action_link('Destroy', job_path(job), :delete) }"
|
170
|
+
buttons += job_action_link("Resume", resume_job_path(job), :patch).to_s
|
179
171
|
end
|
172
|
+
buttons += job_action_link("Retry", retry_job_path(job), :patch).to_s if events.include?(:retry) && view.can?(:retry, job)
|
173
|
+
buttons += job_action_link("Destroy", job_path(job), :delete).to_s if view.can?(:destroy, job)
|
180
174
|
buttons += "</div>"
|
181
175
|
end
|
182
176
|
|
183
177
|
def valid_events(job)
|
184
178
|
job.aasm.events.collect(&:name)
|
185
179
|
end
|
186
|
-
|
187
180
|
end
|
188
181
|
end
|
@@ -12,12 +12,12 @@ module RocketJobMissionControl
|
|
12
12
|
|
13
13
|
def map(server)
|
14
14
|
{
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
"0" => name_with_icon(server),
|
16
|
+
"1" => h(threads(server)),
|
17
|
+
"2" => h(started_ago(server)),
|
18
|
+
"3" => h(time_since_heartbeat(server)),
|
19
|
+
"4" => action_links_html(server),
|
20
|
+
"DT_RowClass" => "card callout #{server_card_class(server)}"
|
21
21
|
}
|
22
22
|
end
|
23
23
|
|
@@ -45,33 +45,32 @@ module RocketJobMissionControl
|
|
45
45
|
events = valid_events(server)
|
46
46
|
|
47
47
|
if events.include?(:resume) && view.can?(:resume, server)
|
48
|
-
actions +=
|
48
|
+
actions += (link_to "resume", resume_server_path(server), method: :patch, class: "btn btn-default", data: {confirm: "Resume this server?"}).to_s
|
49
49
|
end
|
50
50
|
|
51
51
|
if events.include?(:pause) && view.can?(:pause, server)
|
52
|
-
actions +=
|
52
|
+
actions += (link_to "pause", pause_server_path(server), method: :patch, class: "btn btn-default", data: {confirm: "Pause this server?"}).to_s
|
53
53
|
end
|
54
54
|
|
55
55
|
if events.include?(:stop) && view.can?(:stop, server)
|
56
|
-
actions +=
|
56
|
+
actions += (link_to "stop", stop_server_path(server), method: :patch, class: "btn btn-danger", data: {confirm: "Stop this server?"}).to_s
|
57
57
|
end
|
58
58
|
|
59
59
|
if server.stopping? && view.can?(:destroy, server)
|
60
|
-
actions
|
61
|
-
confirmation =
|
60
|
+
actions += "Server is stopping..."
|
61
|
+
confirmation = ""
|
62
62
|
unless server.zombie?
|
63
63
|
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"
|
64
64
|
end
|
65
65
|
confirmation << "Are you sure you want to destroy #{server.name} ?"
|
66
|
-
actions +=
|
66
|
+
actions += (link_to "destroy", server_path(server), method: :delete, class: "btn btn-danger", data: {confirm: confirmation}).to_s
|
67
67
|
end
|
68
68
|
|
69
|
-
actions +=
|
69
|
+
actions += "</div>"
|
70
70
|
end
|
71
71
|
|
72
72
|
def valid_events(server)
|
73
73
|
server.aasm.events.collect(&:name)
|
74
74
|
end
|
75
|
-
|
76
75
|
end
|
77
76
|
end
|