class Bosh::Director::ProblemResolver

Attributes

logger[R]

Public Class Methods

new(deployment) click to toggle source
# File lib/bosh/director/problem_resolver.rb, line 6
def initialize(deployment)
  @deployment = deployment
  @resolved_count = 0
  @resolution_error_logs = StringIO.new

  #temp
  @event_log_stage = nil
  @logger = Config.logger
end

Public Instance Methods

apply_resolutions(resolutions) click to toggle source
# File lib/bosh/director/problem_resolver.rb, line 28
def apply_resolutions(resolutions)
  @resolutions = resolutions
  problems = Models::DeploymentProblem.where(id: resolutions.keys)

  begin_stage('Applying problem resolutions', problems.count)

  problems.each do |problem|
    if problem.state != 'open'
      reason = "state is '#{problem.state}'"
      track_and_log("Ignoring problem #{problem.id} (#{reason})")
    elsif problem.deployment_id != @deployment.id
      reason = 'not a part of this deployment'
      track_and_log("Ignoring problem #{problem.id} (#{reason})")

    else
      apply_resolution(problem)
    end
  end

  error_message = @resolution_error_logs.string.empty? ? nil : @resolution_error_logs.string.chomp

  [@resolved_count, error_message]
end
begin_stage(stage_name, n_steps) click to toggle source
# File lib/bosh/director/problem_resolver.rb, line 16
def begin_stage(stage_name, n_steps)
  @event_log_stage = Config.event_log.begin_stage(stage_name, n_steps)
  logger.info(stage_name)
end
track_and_log(task, log = true) { |ticker| ... } click to toggle source
# File lib/bosh/director/problem_resolver.rb, line 21
def track_and_log(task, log = true)
  @event_log_stage.advance_and_track(task) do |ticker|
    logger.info(task) if log
    yield ticker if block_given?
  end
end

Private Instance Methods

apply_resolution(problem) click to toggle source
# File lib/bosh/director/problem_resolver.rb, line 54
def apply_resolution(problem)
  handler = ProblemHandlers::Base.create_from_model(problem)
  handler.job = self

  resolution = @resolutions[problem.id.to_s] || handler.auto_resolution
  problem_summary = "#{problem.type} #{problem.resource_id}"
  resolution_summary = handler.resolution_plan(resolution)
  resolution_summary ||= 'no resolution'

  begin
    track_and_log("#{problem.description} (#{problem_summary}): #{resolution_summary}") do
      handler.apply_resolution(resolution)
    end
  rescue Bosh::Director::ProblemHandlerError => e
    log_resolution_error(problem, e)
  end

  problem.state = 'resolved'
  problem.save
  @resolved_count += 1

rescue => e
  log_resolution_error(problem, e)
end
log_resolution_error(problem, error) click to toggle source
# File lib/bosh/director/problem_resolver.rb, line 81
def log_resolution_error(problem, error)
  error_message = "Error resolving problem '#{problem.id}': #{error}"
  logger.error(error_message)
  logger.error(error.backtrace.join("\n"))
  @resolution_error_logs.puts(error_message)
end