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