module LegacyFacter::Core::Resolvable

Attributes

logger[R]
timeout[RW]

The timeout, in seconds, for evaluating this resolution. @return [Integer] @api public

Public Instance Methods

flush() click to toggle source

flush executes the block, if any, stored by the {on_flush} method

@see Facter::Util::Fact#flush @see #on_flush

@api private

# File lib/facter/custom_facts/core/resolvable.rb, line 57
def flush
  @on_flush_block&.call
end
limit() click to toggle source

Return the timeout period for resolving a value. (see timeout) @return [Numeric] @comment requiring 'timeout' stdlib class causes Object#timeout to be

defined which delegates to Timeout.timeout. This method may potentially
overwrite the #timeout attr_reader on this class, so we define #limit to
avoid conflicts.
# File lib/facter/custom_facts/core/resolvable.rb, line 26
def limit
  @timeout || 0
end
on_flush(&block) click to toggle source

#on_flush accepts a block and executes the block when the resolution's value is flushed. This makes it possible to model a single, expensive system call inside of a Ruby object and then define multiple dynamic facts which resolve by sending messages to the model instance. If one of the dynamic facts is flushed then it can, in turn, flush the data stored in the model instance to keep all of the dynamic facts in sync without making multiple, expensive, system calls.

Please see the Solaris zones fact for an example of how this feature may be used.

@see Facter::Util::Fact#flush @see #flush

@api public

# File lib/facter/custom_facts/core/resolvable.rb, line 46
def on_flush(&block)
  @on_flush_block = block
end
value() click to toggle source
# File lib/facter/custom_facts/core/resolvable.rb, line 61
def value
  result = nil

  with_timing do
    Timeout.timeout(limit) do
      result = resolve_value
    end
  end

  LegacyFacter::Util::Normalization.normalize(result)
rescue Timeout::Error => e
  Facter.log_exception(e, "Timed out after #{limit} seconds while resolving #{qualified_name}")

  nil
rescue LegacyFacter::Util::Normalization::NormalizationError => e
  Facter.log_exception(e, "Fact resolution #{qualified_name} resolved to an invalid value: #{e.message}")

  nil
rescue StandardError => e
  Facter.log_exception(e, "Error while resolving custom fact #{qualified_name}: #{e.message}")

  raise Facter::ResolveCustomFactError
end

Private Instance Methods

qualified_name() click to toggle source
# File lib/facter/custom_facts/core/resolvable.rb, line 97
def qualified_name
  "fact='#{@fact.name}', resolution='#{@name || '<anonymous>'}'"
end
with_timing() { || ... } click to toggle source
# File lib/facter/custom_facts/core/resolvable.rb, line 87
def with_timing
  starttime = Time.now.to_f

  yield

  finishtime = Time.now.to_f
  ms = (finishtime - starttime) * 1000
  LegacyFacter.show_time format('%<qn>s: %<ms>.2fms', qn: qualified_name, ms: ms)
end