Parent

Files

Class/Module Index [+]

Quicksearch

Chef::ResourceReporter

Attributes

error_descriptions[R]
exception[R]
run_id[R]
status[R]
summary_only[R]
updated_resources[R]

Public Class Methods

new(rest_client) click to toggle source
# File lib/chef/resource_reporter.rb, line 90
def initialize(rest_client)
  if Chef::Config[:enable_reporting] && !Chef::Config[:why_run]
    @reporting_enabled = true
  else
    @reporting_enabled = false
  end
  @updated_resources = []
  @total_res_count = 0
  @pending_update  = nil
  @status = "success"
  @exception = nil
  @run_id = nil
  @rest_client = rest_client
  @node = nil
  @error_descriptions = {}
  @summary_only = true
end

Public Instance Methods

cookbook_resolution_failed(expanded_run_list, exception) click to toggle source
# File lib/chef/resource_reporter.rb, line 250
def cookbook_resolution_failed(expanded_run_list, exception)
  description = Formatters::ErrorMapper.cookbook_resolution_failed(expanded_run_list, exception)
  @error_descriptions = description.for_json
end
cookbook_sync_failed(cookbooks, exception) click to toggle source
# File lib/chef/resource_reporter.rb, line 255
def cookbook_sync_failed(cookbooks, exception)
  description = Formatters::ErrorMapper.cookbook_sync_failed(cookbooks, exception)
  @error_descriptions = description.for_json
end
node_load_completed(node, expanded_run_list_with_versions, config) click to toggle source
# File lib/chef/resource_reporter.rb, line 108
def node_load_completed(node, expanded_run_list_with_versions, config)
  @node = node
  if reporting_enabled?
    begin
      resource_history_url = "reports/nodes/#{node.name}/runs"
      server_response = @rest_client.post_rest(resource_history_url, {:action => :begin})
      run_uri = URI.parse(server_response["uri"])
      @run_id = ::File.basename(run_uri.path)
      Chef::Log.info("Chef server generated run history id: #{@run_id}")
      @summary_only = server_response["summary_only"]
    rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
      if !e.response || e.response.code.to_s != "404"
        if Chef::Config[:enable_reporting_url_fatals]
          Chef::Log.error("Received exception #{"(" + e.response.code + ") " if e.response.code}attempting to generate run history id (URL Path: #{resource_history_url}), and enable_reporting_url_fatals is set, aborting run.")
          raise
        else
          Chef::Log.info("Received exception #{"(" + e.response.code + ") " if e.response.code}attempting to generate run history id (URL Path: #{resource_history_url}), disabling reporting for this run.")
        end
      else
        Chef::Log.debug("Received 404 attempting to generate run history id (URL Path: #{resource_history_url}), assuming feature is not supported on server.")
      end
      @reporting_enabled = false
    end
  end
end
post_reporting_data() click to toggle source
# File lib/chef/resource_reporter.rb, line 183
def post_reporting_data
  if reporting_enabled?
    run_data = prepare_run_data
    resource_history_url = "reports/nodes/#{@node.name}/runs/#{@run_id}"
    Chef::Log.info("Sending resource update report (run-id: #{@run_id})")
    Chef::Log.debug run_data.inspect
    compressed_data = encode_gzip(run_data.to_json)
    begin
      #if summary only is enabled send the uncompressed run_data excluding the run_data["resources"] and some additional metrics.
      if @summary_only
        run_data = report_summary(run_data, compressed_data)
        Chef::Log.info("run_data_summary: #{run_data}")
        @rest_client.post_rest(resource_history_url, run_data)
      else
        Chef::Log.debug("Sending compressed run data...")
        # Since we're posting compressed data we can not directly call
        # post_rest which expects JSON
        reporting_url = @rest_client.create_url(resource_history_url)
        @rest_client.raw_http_request(:POST, reporting_url, {'Content-Encoding' => 'gzip'}, compressed_data)
      end
    rescue Net::HTTPServerException => e
      if e.response.code.to_s == "400"
        Chef::FileCache.store("failed-reporting-data.json", Chef::JSONCompat.to_json_pretty(run_data), 0640)
        Chef::Log.error("Failed to post reporting data to server (HTTP 400), saving to #{Chef::FileCache.load("failed-reporting-data.json", false)}")
      else
        Chef::Log.error("Failed to post reporting data to server (HTTP #{e.response.code.to_s})")
      end
    end
  else
    Chef::Log.debug("Server doesn't support resource history, skipping resource report.")
  end
end
prepare_run_data() click to toggle source
# File lib/chef/resource_reporter.rb, line 216
def prepare_run_data
  run_data = {}
  run_data["action"] = "end"
  run_data["resources"] = updated_resources.map do |resource_record|
    resource_record.for_json
  end
  run_data["status"] = @status
  run_data["run_list"] = @node.run_list.to_json
  run_data["total_res_count"] = @total_res_count.to_s
  run_data["data"] = {}

  if exception
    exception_data = {}
    exception_data["class"] = exception.inspect
    exception_data["message"] = exception.message
    exception_data["backtrace"] = exception.backtrace.to_json
    exception_data["description"] =  @error_descriptions
    run_data["data"]["exception"] = exception_data
  end
  run_data
end
report_summary(run_data, compressed_data) click to toggle source
# File lib/chef/resource_reporter.rb, line 238
def report_summary(run_data, compressed_data)
  run_data["updated_res_count"] = updated_resources.count.to_s
  run_data["post_size"] = compressed_data.bytesize.to_s
  run_data["resources"] = []
  run_data
end
reporting_enabled?() click to toggle source
# File lib/chef/resource_reporter.rb, line 260
def reporting_enabled?
  @reporting_enabled
end
resource_completed(new_resource) click to toggle source
# File lib/chef/resource_reporter.rb, line 164
def resource_completed(new_resource)
  if @pending_update && !nested_resource?(new_resource)
    @pending_update.finish
    @updated_resources << @pending_update
    @pending_update = nil
  end
end
resource_current_state_loaded(new_resource, action, current_resource) click to toggle source
# File lib/chef/resource_reporter.rb, line 134
def resource_current_state_loaded(new_resource, action, current_resource)
  unless nested_resource?(new_resource)
    @pending_update = ResourceReport.new_with_current_state(new_resource, action, current_resource)
  end
end
resource_failed(new_resource, action, exception) click to toggle source
# File lib/chef/resource_reporter.rb, line 154
def resource_failed(new_resource, action, exception)
  @total_res_count += 1
  unless nested_resource?(new_resource)
    @pending_update ||= ResourceReport.new_for_exception(new_resource, action)
    @pending_update.exception = exception
  end
  description = Formatters::ErrorMapper.resource_failed(new_resource, action, exception)
  @error_descriptions = description.for_json
end
resource_skipped(resource, action, conditional) click to toggle source
# File lib/chef/resource_reporter.rb, line 145
def resource_skipped(resource, action, conditional)
  @total_res_count += 1
  @pending_update = nil unless nested_resource?(resource)
end
resource_up_to_date(new_resource, action) click to toggle source
# File lib/chef/resource_reporter.rb, line 140
def resource_up_to_date(new_resource, action)
  @total_res_count += 1
  @pending_update = nil unless nested_resource?(new_resource)
end
resource_updated(new_resource, action) click to toggle source
# File lib/chef/resource_reporter.rb, line 150
def resource_updated(new_resource, action)
  @total_res_count += 1
end
run_completed(node) click to toggle source
# File lib/chef/resource_reporter.rb, line 172
def run_completed(node)
  @status = "success"
  post_reporting_data
end
run_failed(exception) click to toggle source
# File lib/chef/resource_reporter.rb, line 177
def run_failed(exception)
  @exception = exception
  @status = "failure"
  post_reporting_data
end
run_list_expand_failed(node, exception) click to toggle source
# File lib/chef/resource_reporter.rb, line 245
def run_list_expand_failed(node, exception)
  description = Formatters::ErrorMapper.run_list_expand_failed(node, exception)
  @error_descriptions = description.for_json
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.