class ForemanTasks::Dynflow::Configuration
Attributes
the size of db connection pool
if true, the ForemanTasks::Concerns::ActionTriggering will make no effect. Useful for testing, where we mignt not want to execute the orchestration tied to the models.
the number of threads in the pool handling the execution
what rake tasks should run their own executor, not depending on the external one
set true if the executor runs externally (by default true in procution, othewise false)
set true if the executor runs externally (by default true in procution, othewise false)
what transaction adapater should be used, by default, it uses the ActiveRecord based adapter, expecting ActiveRecord is used as ORM in the application
Public Class Methods
# File lib/foreman_tasks/dynflow/configuration.rb, line 29 def initialize self.pool_size = 5 self.db_pool_size = pool_size + 5 self.remote = Rails.env.production? self.transaction_adapter = ::Dynflow::TransactionAdapters::ActiveRecord.new self.eager_load_paths = [] self.lazy_initialization = !Rails.env.production? self.rake_tasks_with_executor = %w(db:migrate db:seed) @on_init = [] end
Public Instance Methods
for logging action related info (such as exceptions raised in side the actions' methods
# File lib/foreman_tasks/dynflow/configuration.rb, line 43 def action_logger Foreman::Logging.logger('foreman-tasks/action') end
for logging dynflow related info about the progress of the execution etc.
# File lib/foreman_tasks/dynflow/configuration.rb, line 48 def dynflow_logger Foreman::Logging.logger('foreman-tasks/dynflow') end
To avoid pottential timeouts on db connection pool, make sure we have the pool bigger than the thread pool
# File lib/foreman_tasks/dynflow/configuration.rb, line 86 def increase_db_pool_size if increase_db_pool_size? ActiveRecord::Base.connection_pool.disconnect! config = ActiveRecord::Base.configurations[Rails.env] config['pool'] = db_pool_size if config['pool'].to_i < db_pool_size ActiveRecord::Base.establish_connection(config) end end
# File lib/foreman_tasks/dynflow/configuration.rb, line 80 def increase_db_pool_size? ForemanTasks.dynflow.required? && !remote? && !Rails.env.test? end
# File lib/foreman_tasks/dynflow/configuration.rb, line 60 def initialize_world(world_class = ::Dynflow::World) world_class.new(world_config) end
# File lib/foreman_tasks/dynflow/configuration.rb, line 52 def on_init(&block) @on_init << block end
# File lib/foreman_tasks/dynflow/configuration.rb, line 72 def rake_task_with_executor? return false unless defined?(Rake) Rake.application.top_level_tasks.any? do |rake_task| rake_tasks_with_executor.include?(rake_task) end end
# File lib/foreman_tasks/dynflow/configuration.rb, line 56 def run_on_init_hooks(world) @on_init.each { |init| init.call(world) } end
generates the options hash consumable by the Dynflow's world
# File lib/foreman_tasks/dynflow/configuration.rb, line 97 def world_config ::Dynflow::Config.new.tap do |config| config.auto_rescue = true config.logger_adapter = ::Dynflow::LoggerAdapters::Delegator.new(action_logger, dynflow_logger) config.pool_size = 5 config.persistence_adapter = initialize_persistence config.transaction_adapter = transaction_adapter config.executor = ->(world, _) { initialize_executor(world) } config.connector = ->(world, _) { initialize_connector(world) } # we can't do any operation until the ForemanTasks.dynflow.world is set config.auto_execute = false end end
Protected Instance Methods
# File lib/foreman_tasks/dynflow/configuration.rb, line 114 def default_sequel_adapter_options db_config = ActiveRecord::Base.configurations[Rails.env].dup db_config['adapter'] = 'postgres' if db_config['adapter'] == 'postgresql' db_config['max_connections'] = db_pool_size if increase_db_pool_size? if db_config['adapter'] == 'sqlite3' db_config['adapter'] = 'sqlite' database = db_config['database'] unless database == ':memory:' # We need to create separate database for sqlite # to avoid lock conflicts on the database db_config['database'] = "#{File.dirname(database)}/dynflow-#{File.basename(database)}" end end db_config end
# File lib/foreman_tasks/dynflow/configuration.rb, line 139 def initialize_connector(world) ::Dynflow::Connectors::Database.new(world) end
# File lib/foreman_tasks/dynflow/configuration.rb, line 131 def initialize_executor(world) if remote? false else ::Dynflow::Executors::Parallel.new(world, pool_size) end end
Sequel adapter based on Rails app database.yml configuration
# File lib/foreman_tasks/dynflow/configuration.rb, line 144 def initialize_persistence ForemanTasks::Dynflow::Persistence.new(default_sequel_adapter_options) end