Class: Facter::Util::Fact

Inherits:
Object
  • Object
show all
Defined in:
lib/facter/custom_facts/util/fact.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, options = {}) ⇒ Fact

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.

Creates a new fact, with no resolution mechanisms. See Facter.add for the public API for creating facts.

Parameters:

  • name (String)

    the fact name

  • options (Hash) (defaults to: {})

    optional parameters

Options Hash (options):

  • :ldapname (String)

    set the ldapname property on the fact



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/facter/custom_facts/util/fact.rb', line 33

def initialize(name, options = {})
  @name = name.to_s.downcase.intern

  @options = Facter::Utils.deep_copy(options)
  extract_ldapname_option!(options)

  @ldapname ||= @name.to_s

  @resolves = []
  @searching = false
  @used_resolution_weight = 0

  @value = nil
end

Instance Attribute Details

#ldapnameString

Deprecated.

Returns:

  • (String)


18
19
20
# File 'lib/facter/custom_facts/util/fact.rb', line 18

def ldapname
  @ldapname
end

#nameString (readonly)

The name of the fact

Returns:

  • (String)


14
15
16
# File 'lib/facter/custom_facts/util/fact.rb', line 14

def name
  @name
end

#optionsObject

Fact options e.g. fact_type



21
22
23
# File 'lib/facter/custom_facts/util/fact.rb', line 21

def options
  @options
end

#used_resolution_weightObject

Weight of the resolution that was used to obtain the fact value



24
25
26
# File 'lib/facter/custom_facts/util/fact.rb', line 24

def used_resolution_weight
  @used_resolution_weight
end

Instance Method Details

#add(options = {}, &block) ⇒ Facter::Util::Resolution

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.

Adds a new resolution. This requires a block, which will then be evaluated in the context of the new resolution.

Parameters:

  • options (Hash) (defaults to: {})

    A hash of options to set on the resolution

Returns:



57
58
59
60
# File 'lib/facter/custom_facts/util/fact.rb', line 57

def add(options = {}, &block)
  @options = Facter::Utils.deep_copy(@options.merge(options))
  define_resolution(nil, options, &block)
end

#define_resolution(resolution_name, options = {}, &block) ⇒ Facter::Util::Resolution

Define a new named resolution or return an existing resolution with the given name.

Parameters:

  • resolution_name (String)

    The name of the resolve to define or look up

  • options (Hash) (defaults to: {})

    A hash of options to set on the resolution

Returns:



70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/facter/custom_facts/util/fact.rb', line 70

def define_resolution(resolution_name, options = {}, &block)
  resolution_type = options.delete(:type) || :simple

  resolve = create_or_return_resolution(resolution_name, resolution_type)

  resolve.options(options) unless options.empty?
  resolve.evaluate(&block) if block

  resolve
rescue StandardError => e
  LegacyFacter
    .log_exception(e, "Unable to add resolve #{resolution_name.inspect} for fact #{@name}: #{e.message}")
end

#extract_ldapname_option!(options) ⇒ Object

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.

Deprecated.


137
138
139
140
141
142
# File 'lib/facter/custom_facts/util/fact.rb', line 137

def extract_ldapname_option!(options)
  return unless options[:ldapname]

  LegacyFacter.warnonce('ldapname is deprecated and will be removed in a future version')
  self.ldapname = options.delete(:ldapname)
end

#flushvoid

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.

This method returns an undefined value.

Flushes any cached values.



101
102
103
104
# File 'lib/facter/custom_facts/util/fact.rb', line 101

def flush
  @resolves.each(&:flush)
  @value = nil
end

#resolution(name) ⇒ Facter::Util::Resolution?

Retrieve an existing resolution by name

Parameters:

  • name (String)

Returns:



90
91
92
93
94
# File 'lib/facter/custom_facts/util/fact.rb', line 90

def resolution(name)
  return nil if name.nil?

  @resolves.find { |resolve| resolve.name == name }
end

#valueObject

Returns the value for this fact. This searches all resolutions by suitability and weight (see Resolution). If no suitable resolution is found, it returns nil.



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/facter/custom_facts/util/fact.rb', line 111

def value
  return @value if @value

  if @resolves.empty?
    LegacyFacter.debug format('No resolves for %<name>s', name: @name)
    return nil
  end

  searching do
    suitable_resolutions = sort_by_weight(find_suitable_resolutions(@resolves))

    Facter::Framework::Benchmarking::Timer.measure(@name) do
      @value = find_first_real_value(suitable_resolutions)
    end

    announce_when_no_suitable_resolution(suitable_resolutions)
    announce_when_no_value_found(@value)

    @value = resolve_value
  end

  @value
end