foreman-tasks 0.6.4 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/foreman_tasks/api/tasks_controller.rb +12 -0
- data/app/lib/actions/base.rb +5 -4
- data/app/models/foreman_tasks/lock.rb +8 -7
- data/app/models/foreman_tasks/task.rb +1 -0
- data/app/models/foreman_tasks/task/dynflow_task.rb +5 -12
- data/app/views/foreman_tasks/tasks/_details.html.erb +1 -1
- data/lib/foreman_tasks/dynflow/persistence.rb +4 -4
- data/lib/foreman_tasks/version.rb +1 -1
- metadata +4 -4
@@ -52,6 +52,9 @@ module ForemanTasks
|
|
52
52
|
param :resource_type, String, :desc => <<-DESC
|
53
53
|
In case :type = 'resource', what resource id we're searching the tasks for
|
54
54
|
DESC
|
55
|
+
param :action_types, [String], :desc => <<-DESC
|
56
|
+
Return just tasks of given action type, e.g. ["Actions::Katello::Repository::Synchronize"]
|
57
|
+
DESC
|
55
58
|
param :active_only, :bool
|
56
59
|
param :page, String
|
57
60
|
param :per_page, String
|
@@ -80,6 +83,7 @@ module ForemanTasks
|
|
80
83
|
scope = ordering_scope(scope, search_params)
|
81
84
|
scope = search_scope(scope, search_params)
|
82
85
|
scope = active_scope(scope, search_params)
|
86
|
+
scope = action_types_scope(scope, search_params)
|
83
87
|
scope = pagination_scope(scope, search_params)
|
84
88
|
scope.all.map { |task| task_hash(task) }
|
85
89
|
end
|
@@ -122,6 +126,14 @@ module ForemanTasks
|
|
122
126
|
end
|
123
127
|
end
|
124
128
|
|
129
|
+
def action_types_scope(scope, search_params)
|
130
|
+
if action_types = search_params[:action_types]
|
131
|
+
scope.for_action_types(action_types)
|
132
|
+
else
|
133
|
+
scope
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
125
137
|
def pagination_scope(scope, search_params)
|
126
138
|
page = search_params[:page] || 1
|
127
139
|
per_page = search_params[:per_page] || 10
|
data/app/lib/actions/base.rb
CHANGED
@@ -20,7 +20,7 @@ module Actions
|
|
20
20
|
self.class.name.demodulize.underscore.humanize
|
21
21
|
end
|
22
22
|
|
23
|
-
# This method should return String
|
23
|
+
# This method should return String or Array<String> describing input for the task
|
24
24
|
def humanized_input
|
25
25
|
if task_input.blank?
|
26
26
|
""
|
@@ -40,10 +40,11 @@ module Actions
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
# This method should return String or Array<String> describing the errors during the action
|
44
|
+
def humanized_errors
|
44
45
|
execution_plan.steps_in_state(:skipped, :skipping, :error).map do |step|
|
45
|
-
step.error.message
|
46
|
-
end.
|
46
|
+
step.error.message if step.error
|
47
|
+
end.compact
|
47
48
|
end
|
48
49
|
end
|
49
50
|
end
|
@@ -13,13 +13,14 @@ module ForemanTasks
|
|
13
13
|
class LockConflict < StandardError
|
14
14
|
attr_reader :required_lock, :conflicting_locks
|
15
15
|
def initialize(required_lock, conflicting_locks)
|
16
|
-
header =
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
header = _("Required lock is already taken by other running tasks.")
|
17
|
+
header << "\n"
|
18
|
+
header << _("Please inspect their state, fix their errors and resume them.")
|
19
|
+
header << "\n\n"
|
20
|
+
header << _("Required lock: %s") % required_lock.name
|
21
|
+
header << "\n"
|
22
|
+
header << _("Conflicts with tasks:")
|
23
|
+
header << "\n"
|
23
24
|
url_helpers = Rails.application.routes.url_helpers
|
24
25
|
conflicting_tasks = conflicting_locks.
|
25
26
|
map(&:task).
|
@@ -30,6 +30,7 @@ module ForemanTasks
|
|
30
30
|
joins(:locks).where(:"foreman_tasks_locks.resource_id" => resource.id,
|
31
31
|
:"foreman_tasks_locks.resource_type" => resource.class.name)
|
32
32
|
end)
|
33
|
+
scope :for_action_types, (lambda { |action_types| where('label IN (?)', Array(action_types)) })
|
33
34
|
|
34
35
|
def input
|
35
36
|
{}
|
@@ -5,21 +5,13 @@ module ForemanTasks
|
|
5
5
|
|
6
6
|
scope :for_action, ->(action_class) { where(label: action_class.name) }
|
7
7
|
|
8
|
-
def update_from_dynflow(data
|
8
|
+
def update_from_dynflow(data)
|
9
9
|
self.external_id = data[:id]
|
10
10
|
self.started_at = data[:started_at]
|
11
11
|
self.ended_at = data[:ended_at]
|
12
12
|
self.state = data[:state].to_s
|
13
13
|
self.result = data[:result].to_s
|
14
|
-
|
15
|
-
if planned
|
16
|
-
# for now, this part needs to laod the execution_plan to
|
17
|
-
# load extra data, there is place for optimization on Dynflow side
|
18
|
-
# if needed (getting more keys into the data value)
|
19
|
-
unless self.label
|
20
|
-
self.label = main_action.class.name
|
21
|
-
end
|
22
|
-
end
|
14
|
+
self.label ||= main_action.class.name
|
23
15
|
self.save!
|
24
16
|
end
|
25
17
|
|
@@ -58,7 +50,8 @@ module ForemanTasks
|
|
58
50
|
def humanized
|
59
51
|
{ action: get_humanized(:humanized_name),
|
60
52
|
input: get_humanized(:humanized_input),
|
61
|
-
output:
|
53
|
+
output: get_humanized(:humanized_output),
|
54
|
+
errors: get_humanized(:humanized_errors) }
|
62
55
|
end
|
63
56
|
|
64
57
|
def cli_example
|
@@ -73,7 +66,7 @@ module ForemanTasks
|
|
73
66
|
end
|
74
67
|
|
75
68
|
def get_humanized(method)
|
76
|
-
Match! method, :humanized_name, :humanized_input, :humanized_output, :
|
69
|
+
Match! method, :humanized_name, :humanized_input, :humanized_output, :humanized_errors
|
77
70
|
if main_action.respond_to? method
|
78
71
|
begin
|
79
72
|
main_action.send method
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<%= link_to(_('Auto Reload'), '', class: %w(btn btn-sm btn-default reload-button hidden)) %>
|
3
3
|
|
4
4
|
<%= link_to(_('Dynflow console'),
|
5
|
-
format('/foreman_tasks/dynflow/%s', @task.external_id),
|
5
|
+
format((defined?(Rails) ? request.script_name : '') + '/foreman_tasks/dynflow/%s', @task.external_id),
|
6
6
|
class: %w(btn btn-sm btn-default)) if Setting['dynflow_enable_console'] %>
|
7
7
|
|
8
8
|
<%= link_to(_('Resume'),
|
@@ -21,14 +21,14 @@ module ForemanTasks
|
|
21
21
|
def on_execution_plan_save(execution_plan_id, data)
|
22
22
|
# We can load the data unless the execution plan was properly planned and saved
|
23
23
|
# including its steps
|
24
|
-
if data[:state] == :
|
24
|
+
if data[:state] == :planning
|
25
25
|
task = ::ForemanTasks::Task::DynflowTask.new
|
26
|
-
task.update_from_dynflow(data
|
26
|
+
task.update_from_dynflow(data)
|
27
27
|
Lock.owner!(::User.current, task.id) if ::User.current
|
28
|
-
elsif data[:state] != :
|
28
|
+
elsif data[:state] != :pending
|
29
29
|
if task = ::ForemanTasks::Task::DynflowTask.find_by_external_id(execution_plan_id)
|
30
30
|
unless task.state.to_s == data[:state].to_s
|
31
|
-
task.update_from_dynflow(data
|
31
|
+
task.update_from_dynflow(data)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman-tasks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-07-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ! '>='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.7.
|
53
|
+
version: 0.7.2
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.7.
|
61
|
+
version: 0.7.2
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: sequel
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|