foreman-tasks 0.10.0 → 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +0 -2
- data/app/assets/javascripts/{trigger_form.js → foreman_tasks/trigger_form.js} +0 -0
- data/app/controllers/foreman_tasks/recurring_logics_controller.rb +6 -1
- data/app/controllers/foreman_tasks/tasks_controller.rb +16 -2
- data/app/lib/actions/proxy_action.rb +7 -0
- data/app/models/foreman_tasks/task/dynflow_task.rb +19 -4
- data/app/models/foreman_tasks/task/summarizer.rb +3 -1
- data/app/views/common/_trigger_form.html.erb +1 -1
- data/app/views/foreman_tasks/recurring_logics/index.html.erb +1 -2
- data/app/views/foreman_tasks/tasks/dashboard/_latest_tasks_in_error_warning.html.erb +1 -1
- data/app/views/foreman_tasks/tasks/dashboard/_tasks_status.html.erb +2 -0
- data/app/views/foreman_tasks/tasks/index.html.erb +1 -2
- data/config/routes.rb +1 -0
- data/foreman-tasks.gemspec +1 -3
- data/lib/foreman_tasks.rb +2 -1
- data/lib/foreman_tasks/dynflow.rb +2 -108
- data/lib/foreman_tasks/dynflow/configuration.rb +7 -142
- data/lib/foreman_tasks/dynflow/persistence.rb +3 -2
- data/lib/foreman_tasks/engine.rb +2 -2
- data/lib/foreman_tasks/version.rb +1 -1
- data/test/controllers/recurring_logics_controller_test.rb +14 -0
- data/test/controllers/tasks_controller_test.rb +17 -0
- data/test/unit/otp_manager_test.rb +70 -0
- metadata +12 -43
- data/bin/dynflow-executor +0 -71
- data/bin/foreman-tasks +0 -5
- data/deploy/foreman-tasks.init +0 -231
- data/deploy/foreman-tasks.service +0 -16
- data/deploy/foreman-tasks.sysconfig +0 -26
- data/lib/foreman_tasks/dynflow/daemon.rb +0 -143
- data/lib/foreman_tasks/tasks/dynflow.rake +0 -7
- data/test/unit/daemon_test.rb +0 -86
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f1ef8e297d56025b9460e44ca7e96e753307d55
|
4
|
+
data.tar.gz: a26e87a7cd3abda09035c1b63747234a77c0562f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bf2da8785b5fb0504c110b4089b2a27fcb30173a6c060f0171295d77c4d3240192406822a38872edeb102beacfdd0f3fd462a03bcb5d2c9992de2a1b08b3fab
|
7
|
+
data.tar.gz: f95dcdf3437613f5c702df30248c6f962db176e88e2474edba21db0d97d362af4d554ccaecee5726fdef27686f2869eef2fb7853ce9fa26fb3458ade1f947a66
|
data/.rubocop_todo.yml
CHANGED
@@ -57,7 +57,6 @@ Metrics/PerceivedComplexity:
|
|
57
57
|
Rails/Exit:
|
58
58
|
Exclude:
|
59
59
|
- 'lib/**/*.rake'
|
60
|
-
- 'lib/foreman_tasks/dynflow/daemon.rb'
|
61
60
|
|
62
61
|
Rails/HttpPositionalArguments:
|
63
62
|
Enabled: false
|
@@ -84,7 +83,6 @@ Style/ClassAndModuleChildren:
|
|
84
83
|
- 'app/models/setting/foreman_tasks.rb'
|
85
84
|
- 'lib/foreman_tasks/dynflow/configuration.rb'
|
86
85
|
- 'lib/foreman_tasks/dynflow/console_authorizer.rb'
|
87
|
-
- 'lib/foreman_tasks/dynflow/daemon.rb'
|
88
86
|
- 'lib/foreman_tasks/dynflow/persistence.rb'
|
89
87
|
- 'test/controllers/api/recurring_logics_controller_test.rb'
|
90
88
|
- 'test/controllers/api/tasks_controller_test.rb'
|
File without changes
|
@@ -17,6 +17,10 @@ module ForemanTasks
|
|
17
17
|
'foreman_tasks_recurring_logics'
|
18
18
|
end
|
19
19
|
|
20
|
+
def resource_class
|
21
|
+
::ForemanTasks::RecurringLogic
|
22
|
+
end
|
23
|
+
|
20
24
|
private
|
21
25
|
|
22
26
|
def find_recurring_logic
|
@@ -24,7 +28,8 @@ module ForemanTasks
|
|
24
28
|
end
|
25
29
|
|
26
30
|
def filter(scope)
|
27
|
-
scope.search_for(params[:search])
|
31
|
+
scope.search_for(params[:search])
|
32
|
+
.paginate(:page => params[:page], :per_page => params[:per_page])
|
28
33
|
end
|
29
34
|
end
|
30
35
|
end
|
@@ -36,6 +36,16 @@ module ForemanTasks
|
|
36
36
|
redirect_to :back
|
37
37
|
end
|
38
38
|
|
39
|
+
def abort
|
40
|
+
task = find_dynflow_task
|
41
|
+
if task.abort
|
42
|
+
flash[:notice] = _('Trying to abort the task')
|
43
|
+
else
|
44
|
+
flash[:warning] = _('The task cannot be aborted at the moment.')
|
45
|
+
end
|
46
|
+
redirect_to :back
|
47
|
+
end
|
48
|
+
|
39
49
|
def resume
|
40
50
|
task = find_dynflow_task
|
41
51
|
if task.resumable?
|
@@ -72,6 +82,10 @@ module ForemanTasks
|
|
72
82
|
'foreman_tasks_tasks'
|
73
83
|
end
|
74
84
|
|
85
|
+
def resource_class
|
86
|
+
ForemanTasks::Task
|
87
|
+
end
|
88
|
+
|
75
89
|
private
|
76
90
|
|
77
91
|
def restrict_dangerous_actions
|
@@ -86,7 +100,7 @@ module ForemanTasks
|
|
86
100
|
case params[:action]
|
87
101
|
when 'sub_tasks'
|
88
102
|
:view
|
89
|
-
when 'resume', 'unlock', 'force_unlock', 'cancel_step', 'cancel'
|
103
|
+
when 'resume', 'unlock', 'force_unlock', 'cancel_step', 'cancel', 'abort'
|
90
104
|
:edit
|
91
105
|
else
|
92
106
|
super
|
@@ -103,7 +117,7 @@ module ForemanTasks
|
|
103
117
|
|
104
118
|
def filter(scope)
|
105
119
|
scope.search_for(params[:search], :order => params[:order])
|
106
|
-
.paginate(:page => params[:page]).
|
120
|
+
.paginate(:page => params[:page], :per_page => params[:per_page]).distinct
|
107
121
|
end
|
108
122
|
end
|
109
123
|
end
|
@@ -31,6 +31,8 @@ module Actions
|
|
31
31
|
# do nothing
|
32
32
|
when ::Dynflow::Action::Cancellable::Cancel
|
33
33
|
cancel_proxy_task
|
34
|
+
when ::Dynflow::Action::Cancellable::Abort
|
35
|
+
abort_proxy_task
|
34
36
|
when CallbackData
|
35
37
|
on_data(event.data)
|
36
38
|
when ::Dynflow::Action::Timeouts::Timeout
|
@@ -78,6 +80,11 @@ module Actions
|
|
78
80
|
end
|
79
81
|
end
|
80
82
|
|
83
|
+
def abort_proxy_task
|
84
|
+
proxy.cancel_task(output[:proxy_task_id])
|
85
|
+
error! ForemanTasks::Task::TaskCancelledException.new(_('Task aborted: the task might be still running on the proxy'))
|
86
|
+
end
|
87
|
+
|
81
88
|
def on_resume
|
82
89
|
# TODO: add logic to load the data from the external action
|
83
90
|
suspend
|
@@ -9,8 +9,8 @@ module ForemanTasks
|
|
9
9
|
self.external_id = data[:id]
|
10
10
|
self.started_at = utc_zone.parse(data[:started_at]) unless data[:started_at].nil?
|
11
11
|
self.ended_at = utc_zone.parse(data[:ended_at]) unless data[:ended_at].nil?
|
12
|
+
self.result = map_result(data).to_s
|
12
13
|
self.state = data[:state].to_s
|
13
|
-
self.result = map_result(data[:result])
|
14
14
|
self.start_at = utc_zone.parse(data[:start_at]) if data[:start_at]
|
15
15
|
self.start_before = utc_zone.parse(data[:start_before]) if data[:start_before]
|
16
16
|
self.parent_task_id ||= begin
|
@@ -32,6 +32,10 @@ module ForemanTasks
|
|
32
32
|
execution_plan!.cancel.any?
|
33
33
|
end
|
34
34
|
|
35
|
+
def abort
|
36
|
+
execution_plan!.cancel(true).any?
|
37
|
+
end
|
38
|
+
|
35
39
|
def resumable?
|
36
40
|
execution_plan.try(:state) == :paused
|
37
41
|
end
|
@@ -148,9 +152,20 @@ module ForemanTasks
|
|
148
152
|
|
149
153
|
private
|
150
154
|
|
151
|
-
def map_result(
|
152
|
-
|
153
|
-
|
155
|
+
def map_result(data)
|
156
|
+
if state_result_transitioned?(%w[planned pending], %w[stopped error], data) ||
|
157
|
+
(data[:result] == :error && cancelled?)
|
158
|
+
:cancelled
|
159
|
+
else
|
160
|
+
data[:result]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def state_result_transitioned?(from, to, data)
|
165
|
+
oldstate, oldresult = from
|
166
|
+
newstate, newresult = to
|
167
|
+
state == oldstate && data[:state].to_s == newstate &&
|
168
|
+
result == oldresult && data[:result].to_s == newresult
|
154
169
|
end
|
155
170
|
|
156
171
|
def cancelled?
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module ForemanTasks
|
2
2
|
class Task::Summarizer
|
3
3
|
def summarize_by_status(since = nil)
|
4
|
-
result = ::ForemanTasks::Task.
|
4
|
+
result = ::ForemanTasks::Task.where("result <> 'success'")
|
5
|
+
.select('count(state) AS count, state, result, max(started_at) AS started_at')
|
6
|
+
.group(:state, :result).order(:state)
|
5
7
|
result = result.where('started_at > ?', since) if since
|
6
8
|
result
|
7
9
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<div class="form-group ">
|
2
2
|
<label class="col-md-2 control-label"><%= _('Schedule') %></label>
|
3
3
|
<div class="col-md-6">
|
4
|
-
<% javascript 'trigger_form' %>
|
4
|
+
<% javascript 'foreman_tasks/trigger_form' %>
|
5
5
|
<% stylesheet 'foreman_tasks/trigger_form' %>
|
6
6
|
|
7
7
|
<%= javascript_tag do %>
|
@@ -11,7 +11,7 @@
|
|
11
11
|
<td class="ellipsis"><%= link_to task.humanized[:action], defined?(main_app) ? main_app.foreman_tasks_task_path(task.id) : foreman_tasks_task_path(task.id) %></td>
|
12
12
|
<td><%= task.state %></td>
|
13
13
|
<td><%= task.result %></td>
|
14
|
-
<td><%= _('%s ago') % time_ago_in_words(task.started_at) %></td>
|
14
|
+
<td><%= task.started_at ? (_('%s ago') % time_ago_in_words(task.started_at)) : _('N/A') %></td>
|
15
15
|
</tr>
|
16
16
|
<% end %>
|
17
17
|
</table>
|
@@ -4,12 +4,14 @@
|
|
4
4
|
<th><%= _("State") %></th>
|
5
5
|
<th><%= _("Result") %></th>
|
6
6
|
<th><%= _("No. of Tasks") %></th>
|
7
|
+
<th><%= _("Last start time") %></th>
|
7
8
|
</tr>
|
8
9
|
<% ForemanTasks::Task::Summarizer.new.summarize_by_status.each do |result| %>
|
9
10
|
<tr class="<%= ForemanTasks::Task::StatusExplicator.new.is_erroneous(result) ? 'text-danger' : '' %>">
|
10
11
|
<td><%= result.state %></td>
|
11
12
|
<td><%= result.result %></td>
|
12
13
|
<td><%= link_to result.count, main_app.foreman_tasks_tasks_path(:search => "state=#{result.state}&result=#{result.result}") %></td>
|
14
|
+
<td><%= result.started_at ? (_('%s ago') % time_ago_in_words(result.started_at)) : _('N/A') %></td>
|
13
15
|
</tr>
|
14
16
|
<% end %>
|
15
17
|
</table>
|
data/config/routes.rb
CHANGED
data/foreman-tasks.gemspec
CHANGED
@@ -29,10 +29,8 @@ same resource. It also optionally provides Dynflow infrastructure for using it f
|
|
29
29
|
s.extra_rdoc_files = Dir['README*', 'LICENSE']
|
30
30
|
|
31
31
|
s.add_dependency "foreman-tasks-core"
|
32
|
-
s.add_dependency "dynflow", '~> 0.8.
|
33
|
-
s.add_dependency "sequel" # for Dynflow process persistence
|
32
|
+
s.add_dependency "dynflow", '~> 0.8.26'
|
34
33
|
s.add_dependency "sinatra" # for Dynflow web console
|
35
|
-
s.add_dependency "daemons" # for running remote executor
|
36
34
|
s.add_dependency "parse-cron", '~> 0.1.4'
|
37
35
|
s.add_dependency "get_process_mem" # for memory polling
|
38
36
|
end
|
data/lib/foreman_tasks.rb
CHANGED
@@ -2,6 +2,7 @@ require 'foreman_tasks/version'
|
|
2
2
|
require 'foreman_tasks/task_error'
|
3
3
|
require 'foreman_tasks/engine'
|
4
4
|
require 'foreman_tasks/dynflow'
|
5
|
+
require 'foreman_tasks/dynflow/configuration'
|
5
6
|
require 'foreman_tasks/triggers'
|
6
7
|
require 'foreman_tasks/authorizer_ext'
|
7
8
|
require 'foreman_tasks/cleaner'
|
@@ -11,7 +12,7 @@ module ForemanTasks
|
|
11
12
|
extend Algebrick::Matching
|
12
13
|
|
13
14
|
def self.dynflow
|
14
|
-
@dynflow ||= ForemanTasks::Dynflow.new
|
15
|
+
@dynflow ||= ForemanTasks::Dynflow.new(nil, ForemanTasks::Dynflow::Configuration.new)
|
15
16
|
end
|
16
17
|
|
17
18
|
def self.trigger(action, *args, &block)
|
@@ -3,92 +3,9 @@ require 'dynflow'
|
|
3
3
|
|
4
4
|
module ForemanTasks
|
5
5
|
# Class for configuring and preparing the Dynflow runtime environment.
|
6
|
-
class Dynflow
|
7
|
-
require 'foreman_tasks/dynflow/configuration'
|
8
|
-
require 'foreman_tasks/dynflow/persistence'
|
9
|
-
require 'foreman_tasks/dynflow/daemon'
|
6
|
+
class Dynflow < ::Dynflow::Rails
|
10
7
|
require 'foreman_tasks/dynflow/console_authorizer'
|
11
8
|
|
12
|
-
def initialize(world_class = nil)
|
13
|
-
@required = false
|
14
|
-
@world_class = world_class
|
15
|
-
end
|
16
|
-
|
17
|
-
def config
|
18
|
-
@config ||= ForemanTasks::Dynflow::Configuration.new
|
19
|
-
end
|
20
|
-
|
21
|
-
# call this method if your engine uses Dynflow
|
22
|
-
def require!
|
23
|
-
@required = true
|
24
|
-
end
|
25
|
-
|
26
|
-
def required?
|
27
|
-
@required
|
28
|
-
end
|
29
|
-
|
30
|
-
def initialized?
|
31
|
-
!@world.nil?
|
32
|
-
end
|
33
|
-
|
34
|
-
def initialize!
|
35
|
-
return unless @required
|
36
|
-
return @world if @world
|
37
|
-
|
38
|
-
if config.lazy_initialization && defined?(PhusionPassenger)
|
39
|
-
config.dynflow_logger.warn('ForemanTasks: lazy loading with PhusionPassenger might lead to unexpected results')
|
40
|
-
end
|
41
|
-
init_world.tap do |world|
|
42
|
-
@world = world
|
43
|
-
|
44
|
-
unless config.remote?
|
45
|
-
# don't try to do any rescuing until the tables are properly migrated
|
46
|
-
if !Foreman.in_rake?('db:migrate') && (begin
|
47
|
-
ForemanTasks::Task.table_exists?
|
48
|
-
rescue
|
49
|
-
(false)
|
50
|
-
end)
|
51
|
-
config.run_on_init_hooks(world)
|
52
|
-
# leave this just for long-running executors
|
53
|
-
unless config.rake_task_with_executor?
|
54
|
-
world.auto_execute
|
55
|
-
ForemanTasks::Task::DynflowTask.consistency_check
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# Mark that the process is executor. This prevents the remote setting from
|
63
|
-
# applying. Needs to be set up before the world is being initialized
|
64
|
-
def executor!
|
65
|
-
@executor = true
|
66
|
-
end
|
67
|
-
|
68
|
-
def executor?
|
69
|
-
@executor
|
70
|
-
end
|
71
|
-
|
72
|
-
def reinitialize!
|
73
|
-
@world = nil
|
74
|
-
initialize!
|
75
|
-
end
|
76
|
-
|
77
|
-
def world
|
78
|
-
return @world if @world
|
79
|
-
|
80
|
-
initialize! if config.lazy_initialization
|
81
|
-
unless @world
|
82
|
-
raise 'The Dynflow world was not initialized yet. '\
|
83
|
-
'If your plugin uses it, make sure to call ForemanTasks.dynflow.require! '\
|
84
|
-
'in some initializer'
|
85
|
-
end
|
86
|
-
|
87
|
-
@world
|
88
|
-
end
|
89
|
-
|
90
|
-
attr_writer :world
|
91
|
-
|
92
9
|
def web_console
|
93
10
|
::Dynflow::Web.setup do
|
94
11
|
before do
|
@@ -101,31 +18,8 @@ module ForemanTasks
|
|
101
18
|
set(:custom_navigation) do
|
102
19
|
{ _('Back to tasks') => "/#{ForemanTasks::TasksController.controller_path}" }
|
103
20
|
end
|
104
|
-
set(:world) {
|
21
|
+
set(:world) { Rails.application.dynflow.world }
|
105
22
|
end
|
106
23
|
end
|
107
|
-
|
108
|
-
def eager_load_actions!
|
109
|
-
config.eager_load_paths.each do |load_path|
|
110
|
-
Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
|
111
|
-
unless loaded_paths.include?(file)
|
112
|
-
require_dependency file
|
113
|
-
loaded_paths << file
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
@world.reload! if @world
|
118
|
-
end
|
119
|
-
|
120
|
-
def loaded_paths
|
121
|
-
@loaded_paths ||= Set.new
|
122
|
-
end
|
123
|
-
|
124
|
-
private
|
125
|
-
|
126
|
-
def init_world
|
127
|
-
return config.initialize_world(@world_class) if @world_class
|
128
|
-
config.initialize_world
|
129
|
-
end
|
130
24
|
end
|
131
25
|
end
|
@@ -1,146 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
# the size of db connection pool
|
7
|
-
attr_accessor :db_pool_size
|
8
|
-
|
9
|
-
# set true if the executor runs externally (by default true in procution, othewise false)
|
10
|
-
attr_accessor :remote
|
11
|
-
alias remote? remote
|
12
|
-
|
13
|
-
# what transaction adapater should be used, by default, it uses the ActiveRecord
|
14
|
-
# based adapter, expecting ActiveRecord is used as ORM in the application
|
15
|
-
attr_accessor :transaction_adapter
|
16
|
-
|
17
|
-
attr_accessor :eager_load_paths
|
18
|
-
|
19
|
-
attr_accessor :lazy_initialization
|
20
|
-
|
21
|
-
# what rake tasks should run their own executor, not depending on the external one
|
22
|
-
attr_accessor :rake_tasks_with_executor
|
23
|
-
|
24
|
-
# if true, the ForemanTasks::Concerns::ActionTriggering will make
|
25
|
-
# no effect. Useful for testing, where we mignt not want to execute
|
26
|
-
# the orchestration tied to the models.
|
27
|
-
attr_accessor :disable_active_record_actions
|
28
|
-
|
29
|
-
def initialize
|
30
|
-
self.pool_size = 5
|
31
|
-
self.db_pool_size = pool_size + 5
|
32
|
-
self.remote = Rails.env.production?
|
33
|
-
self.transaction_adapter = ::Dynflow::TransactionAdapters::ActiveRecord.new
|
34
|
-
self.eager_load_paths = []
|
35
|
-
self.lazy_initialization = !Rails.env.production?
|
36
|
-
self.rake_tasks_with_executor = %w[db:migrate db:seed]
|
37
|
-
|
38
|
-
@on_init = []
|
39
|
-
end
|
1
|
+
# Require foreman's lib directory which contains foreman/dynflow/configuration
|
2
|
+
lib_foreman = File.expand_path('lib/foreman', Rails.root)
|
3
|
+
require lib_foreman if Dir.exist?(lib_foreman)
|
4
|
+
require 'foreman_tasks/dynflow/persistence'
|
40
5
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
Foreman::Logging.logger('foreman-tasks/action')
|
45
|
-
end
|
46
|
-
|
47
|
-
# for logging dynflow related info about the progress of the execution etc.
|
48
|
-
def dynflow_logger
|
49
|
-
Foreman::Logging.logger('foreman-tasks/dynflow')
|
50
|
-
end
|
51
|
-
|
52
|
-
def on_init(&block)
|
53
|
-
@on_init << block
|
54
|
-
end
|
55
|
-
|
56
|
-
def run_on_init_hooks(world)
|
57
|
-
@on_init.each { |init| init.call(world) }
|
58
|
-
end
|
59
|
-
|
60
|
-
def initialize_world(world_class = ::Dynflow::World)
|
61
|
-
world_class.new(world_config)
|
62
|
-
end
|
63
|
-
|
64
|
-
# No matter what config.remote says, when the process is marked as executor,
|
65
|
-
# it can't be remote
|
66
|
-
def remote?
|
67
|
-
!ForemanTasks.dynflow.executor? &&
|
68
|
-
!rake_task_with_executor? &&
|
69
|
-
@remote
|
70
|
-
end
|
71
|
-
|
72
|
-
def rake_task_with_executor?
|
73
|
-
return false unless defined?(Rake)
|
74
|
-
|
75
|
-
Rake.application.top_level_tasks.any? do |rake_task|
|
76
|
-
rake_tasks_with_executor.include?(rake_task)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def increase_db_pool_size?
|
81
|
-
ForemanTasks.dynflow.required? && !remote? && !Rails.env.test?
|
82
|
-
end
|
83
|
-
|
84
|
-
# To avoid pottential timeouts on db connection pool, make sure
|
85
|
-
# we have the pool bigger than the thread pool
|
86
|
-
def increase_db_pool_size
|
87
|
-
if increase_db_pool_size?
|
88
|
-
ActiveRecord::Base.connection_pool.disconnect!
|
89
|
-
|
90
|
-
config = ActiveRecord::Base.configurations[Rails.env]
|
91
|
-
config['pool'] = db_pool_size if config['pool'].to_i < db_pool_size
|
92
|
-
ActiveRecord::Base.establish_connection(config)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
# generates the options hash consumable by the Dynflow's world
|
97
|
-
def world_config
|
98
|
-
::Dynflow::Config.new.tap do |config|
|
99
|
-
config.auto_rescue = true
|
100
|
-
config.logger_adapter = ::Dynflow::LoggerAdapters::Delegator.new(action_logger, dynflow_logger)
|
101
|
-
config.pool_size = 5
|
102
|
-
config.persistence_adapter = initialize_persistence
|
103
|
-
config.transaction_adapter = transaction_adapter
|
104
|
-
config.executor = ->(world, _) { initialize_executor(world) }
|
105
|
-
config.connector = ->(world, _) { initialize_connector(world) }
|
106
|
-
|
107
|
-
# we can't do any operation until the ForemanTasks.dynflow.world is set
|
108
|
-
config.auto_execute = false
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
protected
|
113
|
-
|
114
|
-
def default_sequel_adapter_options
|
115
|
-
db_config = ActiveRecord::Base.configurations[Rails.env].dup
|
116
|
-
db_config['adapter'] = 'postgres' if db_config['adapter'] == 'postgresql'
|
117
|
-
db_config['max_connections'] = db_pool_size if increase_db_pool_size?
|
118
|
-
|
119
|
-
if db_config['adapter'] == 'sqlite3'
|
120
|
-
db_config['adapter'] = 'sqlite'
|
121
|
-
database = db_config['database']
|
122
|
-
unless database == ':memory:'
|
123
|
-
# We need to create separate database for sqlite
|
124
|
-
# to avoid lock conflicts on the database
|
125
|
-
db_config['database'] = "#{File.dirname(database)}/dynflow-#{File.basename(database)}"
|
126
|
-
end
|
127
|
-
end
|
128
|
-
db_config
|
129
|
-
end
|
130
|
-
|
131
|
-
def initialize_executor(world)
|
132
|
-
if remote?
|
133
|
-
false
|
134
|
-
else
|
135
|
-
::Dynflow::Executors::Parallel.new(world, pool_size)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
def initialize_connector(world)
|
140
|
-
::Dynflow::Connectors::Database.new(world)
|
141
|
-
end
|
142
|
-
|
143
|
-
# Sequel adapter based on Rails app database.yml configuration
|
6
|
+
module ForemanTasks
|
7
|
+
# Import all Dynflow configuration from Foreman, and add our own for Tasks
|
8
|
+
class Dynflow::Configuration < ::Foreman::Dynflow::Configuration
|
144
9
|
def initialize_persistence
|
145
10
|
ForemanTasks::Dynflow::Persistence.new(default_sequel_adapter_options)
|
146
11
|
end
|