Module: Facter::Core::Resolvable

Included in:
Aggregate, Util::Resolution
Defined in:
lib/facter/core/resolvable.rb

Overview

The resolvable mixin defines behavior for evaluating and returning fact resolutions.

Classes including this mixin should implement at #name method describing the value being resolved and a #resolve_value that actually executes the code to resolve the value.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#timeoutInteger

The timeout, in seconds, for evaluating this resolution.

Returns:

  • (Integer)


14
15
16
# File 'lib/facter/core/resolvable.rb', line 14

def timeout
  @timeout
end

Instance Method Details

#flushObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

flush executes the block, if any, stored by the #on_flush method

See Also:



54
55
56
# File 'lib/facter/core/resolvable.rb', line 54

def flush
  @on_flush_block.call if @on_flush_block
end

#limitNumeric

Return the timeout period for resolving a value. (see #timeout)

Returns:

  • (Numeric)


23
24
25
# File 'lib/facter/core/resolvable.rb', line 23

def limit
  @timeout || 0
end

#on_flush(&block) ⇒ Object

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 Also:



43
44
45
# File 'lib/facter/core/resolvable.rb', line 43

def on_flush(&block)
  @on_flush_block = block
end

#valueObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/facter/core/resolvable.rb', line 58

def value
  result = nil

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

  Facter::Util::Normalization.normalize(result)
rescue Timeout::Error => detail
  Facter.log_exception(detail, "Timed out after #{limit} seconds while resolving #{qualified_name}")
  return nil
rescue Facter::Util::Normalization::NormalizationError => detail
  Facter.log_exception(detail, "Fact resolution #{qualified_name} resolved to an invalid value: #{detail.message}")
  return nil
rescue => detail
  Facter.log_exception(detail, "Could not retrieve #{qualified_name}: #{detail.message}")
  return nil
end