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



37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/facter/custom_facts/util/fact.rb', line 37

def initialize(name, options = {})
  @name = LegacyFacter::Util::Normalization.normalize(name.to_s.downcase).intern

  @options = options.dup
  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)


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

def ldapname
  @ldapname
end

#locationString (readonly)

The location from where fact is resolved

Returns:

  • (String)


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

def location
  @location
end

#nameString (readonly)

The name of the fact

Returns:

  • (String)


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

def name
  @name
end

#optionsObject

Fact options e.g. fact_type



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

def options
  @options
end

#used_resolution_weightObject

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



28
29
30
# File 'lib/facter/custom_facts/util/fact.rb', line 28

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:



61
62
63
64
65
66
67
68
# File 'lib/facter/custom_facts/util/fact.rb', line 61

def add(options = {}, &block)
  @options = @options.merge(options)

  @location = options[:file]
  @location ||= block.source_location if block_given?

  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:



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/facter/custom_facts/util/fact.rb', line 78

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
  msg = "Unable to add resolve #{resolution_name.inspect} for fact '#{@name}': #{e.message}"
  msg += "\n#{e.backtrace.join("\n")}" if Options[:trace]
  log.error(msg, true)
  nil
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.


147
148
149
150
151
152
# File 'lib/facter/custom_facts/util/fact.rb', line 147

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

  log.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.



111
112
113
114
# File 'lib/facter/custom_facts/util/fact.rb', line 111

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

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

Retrieve an existing resolution by name

Parameters:

  • name (String)

Returns:



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

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.



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/facter/custom_facts/util/fact.rb', line 121

def value
  return @value unless @value.nil?

  if @resolves.empty?
    log.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