class ChefHandlerForeman::ForemanReporting

Attributes

uploader[RW]

Public Instance Methods

report() click to toggle source
# File lib/chef_handler_foreman/foreman_reporting.rb, line 20
def report
  report                   = { 'host' => node['fqdn'].downcase, 'reported_at' => Time.now.utc.to_s }
  report_status            = Hash.new(0)


  report_status['failed']  = 1 if failed?
  report_status['applied'] = run_status.updated_resources.count
  report['status']         = report_status

  # I can't compute much metrics for now
  metrics                  = {}
  metrics['resources']     = { 'total' => run_status.all_resources.count }

  times = {}
  run_status.all_resources.each do |resource|
    resource_name = resource.resource_name
    if times[resource_name].nil?
      times[resource_name] = resource.elapsed_time
    else
      times[resource_name] += resource.elapsed_time
    end
  end
  metrics['time']   = times.merge!({ 'total' => run_status.elapsed_time })
  report['metrics'] = metrics

  logs = []
  run_status.updated_resources.each do |resource|
    l = { 'log' => { 'sources' => {}, 'messages' => {}, 'level' => 'notice' } }

    case resource.resource_name.to_s
      when 'template', 'cookbook_file'
        message = resource.diff
      when 'package'
        message = "Installed #{resource.package_name} package in #{resource.version}"
      else
        message = resource.action.to_s
    end
    l['log']['messages']['message'] = message
    l['log']['sources']['source']   = [resource.resource_name.to_s, resource.name].join(' ')
    #Chef::Log.info("Diff is #{l['log']['messages']['message']}")
    logs << l
  end

  # I only set failed to 1 if chef run failed
  if failed?
    logs << {
        'log' => {
            'sources'  => { 'source' => 'chef' },
            'messages' => { 'message' => run_status.exception },
            'level'    => 'err' }
    }
  end

  report['logs'] = logs
  full_report    = { 'config_report' => report }

  send_report(full_report)
end

Private Instance Methods

send_report(report) click to toggle source
# File lib/chef_handler_foreman/foreman_reporting.rb, line 81
def send_report(report)
  if uploader
    uploader.foreman_request('/api/config_reports', report, node.name)
  else
    Chef::Log.error "No uploader registered for foreman reporting, skipping report upload"
  end

end