class SmartProxyDynflowCore::Core

Attributes

instance[R]
accepted_cert_serial[RW]
world[RW]

Public Class Methods

after_initialize(&block) click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 111
def after_initialize(&block)
  after_initialize_blocks << block
end
ensure_initialized() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 72
def ensure_initialized
  return @instance if @instance
  @instance = Core.new
  after_initialize_blocks.each { |block| block.call(@instance) }
  @instance
end
new() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 5
def initialize
  @world = create_world
  cert_file = Settings.instance.foreman_ssl_cert || Settings.instance.ssl_certificate
  if cert_file
    client_cert = File.read(cert_file)
    # we trust only requests using the same certificate as we are
    # (in other words the local proxy only)
    @accepted_cert_serial = OpenSSL::X509::Certificate.new(client_cert).serial
  end
end
register_silencer_matchers(matchers) click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 83
def register_silencer_matchers(matchers)
  silencer_matchers.concat matchers
end
silencer_matchers() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 79
def silencer_matchers
  @matchers ||= []
end
web_console() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 87
def web_console
  require 'dynflow/web'
  dynflow_console = ::Dynflow::Web.setup do
    # we can't use the proxy's after_activation hook, as
    # it happens before the Daemon forks the process (including
    # closing opened file descriptors)
    # TODO: extend smart proxy to enable hooks that happen after
    # the forking
    helpers Helpers

    before do
      authorize_with_ssl_client if Settings.instance.console_auth
    end

    Core.ensure_initialized
    set :world, Core.world
  end
  dynflow_console
end
world() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 107
def world
  instance.world
end

Private Class Methods

after_initialize_blocks() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 117
def after_initialize_blocks
  @after_initialize_blocks ||= []
end

Public Instance Methods

create_world(&block) click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 16
def create_world(&block)
  config = default_world_config(&block)
  ::Dynflow::World.new(config)
end
default_world_config() { |config| ... } click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 40
def default_world_config
  ::Dynflow::Config.new.tap do |config|
    config.auto_rescue = true
    config.logger_adapter = logger_adapter
    config.persistence_adapter = persistence_adapter
    config.execution_plan_cleaner = execution_plan_cleaner
    # TODO: There has to be a better way
    matchers = config.silent_dead_letter_matchers.call.concat(self.class.silencer_matchers)
    config.silent_dead_letter_matchers = matchers
    yield config if block_given?
  end
end
execution_plan_cleaner() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 61
def execution_plan_cleaner
  proc do |world|
    age = Settings.instance.execution_plan_cleaner_age
    options = { :poll_interval => age, :max_age => age }
    ::Dynflow::Actors::ExecutionPlanCleaner.new(world, options)
  end
end
logger_adapter() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 53
def logger_adapter
  if Settings.instance.standalone
    Log::ProxyAdapter.new(Log.instance, Log.instance.level)
  else
    Log::ProxyAdapter.new(Proxy::LogBuffer::Decorator.instance, Log.instance.level)
  end
end
persistence_adapter() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 36
def persistence_adapter
  ::Dynflow::PersistenceAdapters::Sequel.new persistence_conn_string
end
persistence_conn_string() click to toggle source
# File lib/smart_proxy_dynflow_core/core.rb, line 21
def persistence_conn_string
  return ENV['DYNFLOW_DB_CONN_STRING'] if ENV.key? 'DYNFLOW_DB_CONN_STRING'
  db_conn_string = 'sqlite:/'

  db_file = Settings.instance.database
  if db_file.nil? || db_file.empty?
    Log.instance.warn "Could not open DB for dynflow at '#{db_file}', " \
                      "will keep data in memory. Restart will drop all dynflow data."
  else
    db_conn_string += "/#{db_file}"
  end

  db_conn_string
end