class Object

Constants

CommandDeactivateNode
CommandStoreReport

Public Instance Methods

build_events_list(events) click to toggle source
# File lib/puppet/reports/puppetdb.rb, line 173
def build_events_list(events)
  profile("Build events list (count: #{events.count})",
          [:puppetdb, :events_list, :build]) do
    events.map { |event| event_to_hash(event) }
  end
end
build_logs_list() click to toggle source

@return Array @api private

# File lib/puppet/reports/puppetdb.rb, line 104
def build_logs_list
  profile("Build logs list (count: #{logs.count})",
          [:puppetdb, :logs_list, :build]) do
    logs.map do |log|
      {
        'file' => log.file,
        'line' => log.line,
        'level' => log.level,
        'message' => log.message,
        'source' => log.source,
        'tags' => [*log.tags],
        'time' => Puppet::Util::Puppetdb.to_wire_time(log.time),
      }
    end
  end
end
build_metrics_list() click to toggle source

@return Array[Hash} @api private

# File lib/puppet/reports/puppetdb.rb, line 123
def build_metrics_list
  profile("Build metrics list (count: #{metrics.count})",
          [:puppetdb, :metrics_list, :build]) do
    metrics_list = []
    metrics.each do |name, data|
      metric_hashes = data.values.map {|x| {"category" => data.name, "name" => x.first, "value" => x.last}}
      metrics_list.concat(metric_hashes)
    end
    metrics_list
  end
end
build_resources_list() click to toggle source

@return Array @api private

# File lib/puppet/reports/puppetdb.rb, line 90
def build_resources_list
  profile("Build resources list (count: #{resource_statuses.count})",
          [:puppetdb, :resources_list, :build]) do
    resources = resource_statuses.values.map { |resource| resource_status_to_hash(resource) }
    if ! config.include_unchanged_resources?
      resources.select{ |resource| (! resource["events"].empty?) or resource["skipped"] }
    else
      resources
    end
  end
end
config() click to toggle source

Helper method for accessing the puppetdb configuration

@api private

# File lib/puppet/reports/puppetdb.rb, line 203
def config
  Puppet::Util::Puppetdb.config
end
event_to_hash(event) click to toggle source

Convert an instance of `Puppet::Transaction::Event` to a hash suitable for sending over the wire to PuppetDB

@return Hash[<String, Object>] @api private

# File lib/puppet/reports/puppetdb.rb, line 160
def event_to_hash(event)
  corrective_change = defined?(event.corrective_change) ? event.corrective_change : nil
  {
    "status"            => event.status,
    "timestamp"         => Puppet::Util::Puppetdb.to_wire_time(event.time),
    "property"          => event.property,
    "new_value"         => event.desired_value,
    "old_value"         => event.previous_value,
    "corrective_change" => corrective_change,
    "message"           => event.message,
  }
end
has_enforcement_event?(resource) click to toggle source

@return TrueClass @api private

# File lib/puppet/reports/puppetdb.rb, line 84
def has_enforcement_event?(resource)
  resource["events"].any? { |event| event["status"] != 'noop' }
end
has_noop_event?(resource) click to toggle source

@return TrueClass @api private

# File lib/puppet/reports/puppetdb.rb, line 78
def has_noop_event?(resource)
  resource["events"].any? { |event| event["status"] == 'noop' }
end
headers() click to toggle source
# File lib/puppet/face/node/status.rb, line 74
def headers
  {
    "Accept" => "application/json",
    "Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8",
  }
end
process() click to toggle source

Process the report by formatting it into a PuppetDB 'store report' command and submitting it.

@return [void]

# File lib/puppet/reports/puppetdb.rb, line 20
def process
  profile("report#process", [:puppetdb, :report, :process]) do
    submit_command(self.host, report_to_hash, CommandStoreReport, 8)
  end

  nil
end
puppetdb_query(query) click to toggle source
# File lib/puppet/functions/puppetdb_query.rb, line 7
def puppetdb_query(query)
  Puppet::Util::Puppetdb.query_puppetdb(query)
end
report_to_hash() click to toggle source

Convert `self` (an instance of `Puppet::Transaction::Report`) to a hash suitable for sending over the wire to PuppetDB

@return Hash[<String, Object>] @api private

# File lib/puppet/reports/puppetdb.rb, line 33
def report_to_hash
  profile("Convert report to wire format hash",
          [:puppetdb, :report, :convert_to_wire_format_hash]) do
    if environment.nil?
      raise Puppet::Error, "Environment is nil, unable to submit report. This may be due a bug with Puppet. Ensure you are running the latest revision, see PUP-2508 for more details."
    end

    resources = build_resources_list
    is_noop = (defined?(noop) && (not noop.nil?)) ?
                noop :
                resources.any? { |rs| has_noop_event?(rs) } && resources.none? { |rs| has_enforcement_event?(rs) }

    defaulted_catalog_uuid = defined?(catalog_uuid) ? catalog_uuid : transaction_uuid
    defaulted_code_id = defined?(code_id) ? code_id : nil
    defaulted_cached_catalog_status = defined?(cached_catalog_status) ? cached_catalog_status : nil
    defaulted_noop_pending = defined?(noop_pending) ? noop_pending : nil
    defaulted_corrective_change = defined?(corrective_change) ? corrective_change : nil

    {
      "certname" => host,
      "puppet_version" => puppet_version,
      "report_format" => report_format,
      "configuration_version" => configuration_version.to_s,
      "producer_timestamp" => Puppet::Util::Puppetdb.to_wire_time(Time.now),
      "start_time" => Puppet::Util::Puppetdb.to_wire_time(time),
      "end_time" => Puppet::Util::Puppetdb.to_wire_time(time + run_duration),
      "environment" => environment,
      "transaction_uuid" => transaction_uuid,
      "status" => status,
      "noop" => is_noop,
      "noop_pending" => defaulted_noop_pending,
      "corrective_change" => defaulted_corrective_change,
      "logs" => build_logs_list,
      "metrics" => build_metrics_list,
      "resources" => resources,
      "catalog_uuid" => defaulted_catalog_uuid,
      "code_id" => defaulted_code_id,
      "cached_catalog_status" => defaulted_cached_catalog_status,
      "producer" => Puppet[:node_name_value]
    }
  end
end
resource_status_to_hash(resource_status) click to toggle source

Convert an instance of `Puppet::Resource::Status` to a hash suitable for sending over the wire to PuppetDB

@return Hash[<String, Object>] @api private

# File lib/puppet/reports/puppetdb.rb, line 185
def resource_status_to_hash(resource_status)
  defaulted_corrective_change = defined?(resource_status.corrective_change) ? resource_status.corrective_change : nil
  {
    "skipped"           => resource_status.skipped,
    "timestamp"         => Puppet::Util::Puppetdb.to_wire_time(resource_status.time),
    "resource_type"     => resource_status.resource_type,
    "resource_title"    => resource_status.title.to_s,
    "file"              => resource_status.file,
    "line"              => resource_status.line,
    "containment_path"  => resource_status.containment_path,
    "corrective_change" => defaulted_corrective_change,
    "events"            => build_events_list(resource_status.events),
  }
end
run_duration() click to toggle source

@return Number @api private

# File lib/puppet/reports/puppetdb.rb, line 138
def run_duration
  # TODO: this is wrong in puppet.  I am consistently seeing reports where
  # start-time + this value is less than the timestamp on the individual
  # resource events.  Not sure what the best short-term fix is yet; the long
  # term fix is obviously to make the correct data available in puppet.
  # I've filed a ticket against puppet here:
  #  http://projects.puppetlabs.com/issues/16480
  #
  # NOTE: failed reports have an empty metrics hash. Just send 0 for run time,
  #  since we don't have access to any better information.
  if metrics["time"] and metrics["time"]["total"]
    metrics["time"]["total"]
  else
    0
  end
end