class Dynflow::Rails::Configuration

Attributes

db_pool_size[RW]

the size of db connection pool

disable_active_record_actions[RW]

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.

eager_load_paths[RW]
lazy_initialization[RW]
pool_size[RW]

the number of threads in the pool handling the execution

rake_tasks_with_executor[RW]

what rake tasks should run their own executor, not depending on the external one

remote[RW]

set true if the executor runs externally (by default true in procution, othewise false)

remote?[RW]

set true if the executor runs externally (by default true in procution, othewise false)

transaction_adapter[RW]

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

new() click to toggle source
# File lib/dynflow/rails/configuration.rb, line 33
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

action_logger() click to toggle source

Action related info such as exceptions raised inside the actions' methods To be overridden in the Rails application

# File lib/dynflow/rails/configuration.rb, line 47
def action_logger
  ::Rails.logger
end
dynflow_logger() click to toggle source

Dynflow related info about the progress of the execution To be overridden in the Rails application

# File lib/dynflow/rails/configuration.rb, line 53
def dynflow_logger
  ::Rails.logger
end
increase_db_pool_size() click to toggle source

To avoid pottential timeouts on db connection pool, make sure we have the pool bigger than the thread pool

# File lib/dynflow/rails/configuration.rb, line 91
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
increase_db_pool_size?() click to toggle source
# File lib/dynflow/rails/configuration.rb, line 85
def increase_db_pool_size?
  !::Rails.env.test?
end
initialize_world(world_class = ::Dynflow::World) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 65
def initialize_world(world_class = ::Dynflow::World)
  world_class.new(world_config)
end
on_init(&block) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 57
def on_init(&block)
  @on_init << block
end
rake_task_with_executor?() click to toggle source
# File lib/dynflow/rails/configuration.rb, line 77
def rake_task_with_executor?
  return false unless defined?(::Rake) && ::Rake.respond_to?(:application)

  ::Rake.application.top_level_tasks.any? do |rake_task|
    rake_tasks_with_executor.include?(rake_task)
  end
end
run_on_init_hooks(world) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 61
def run_on_init_hooks(world)
  @on_init.each { |init| init.call(world) }
end
world_config() click to toggle source

generates the options hash consumable by the Dynflow's world

# File lib/dynflow/rails/configuration.rb, line 102
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 Rails.application.dynflow.world is set
    config.auto_execute        = false
  end
end

Protected Instance Methods

default_sequel_adapter_options() click to toggle source
# File lib/dynflow/rails/configuration.rb, line 119
def default_sequel_adapter_options
  db_config            = ::ActiveRecord::Base.configurations[::Rails.env].dup
  db_config['adapter'] = db_config['adapter'].gsub(/_?makara_?/, '')
  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
initialize_connector(world) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 145
def initialize_connector(world)
  ::Dynflow::Connectors::Database.new(world)
end
initialize_executor(world) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 137
def initialize_executor(world)
  if remote?
    false
  else
    ::Dynflow::Executors::Parallel.new(world, pool_size)
  end
end
initialize_persistence() click to toggle source

Sequel adapter based on Rails app database.yml configuration

# File lib/dynflow/rails/configuration.rb, line 150
def initialize_persistence
  ::Dynflow::PersistenceAdapters::Sequel.new(default_sequel_adapter_options)
end