Class: Facter::Core::Aggregate

Inherits:
Object
  • Object
show all
Includes:
Resolvable, Suitable
Defined in:
lib/facter/core/aggregate.rb

Overview

Aggregates provide a mechanism for facts to be resolved in multiple steps.

Aggregates are evaluated in two parts: generating individual chunks and then aggregating all chunks together. Each chunk is a block of code that generates a value, and may depend on other chunks when it runs. After all chunks have been evaluated they are passed to the aggregate block as Hash<name, result>. The aggregate block converts the individual chunks into a single value that is returned as the final value of the aggregate.

Since:

  • 2.0.0

Defined Under Namespace

Classes: DependencyError

Instance Attribute Summary collapse

Attributes included from Resolvable

#timeout

Attributes included from Suitable

#weight

Instance Method Summary collapse

Methods included from Resolvable

#flush, #limit, #on_flush, #value

Methods included from Suitable

#confine, #has_weight, #suitable?

Constructor Details

#initialize(name, fact) ⇒ Aggregate

Returns a new instance of Aggregate.

Since:

  • 2.0.0



43
44
45
46
47
48
49
50
51
52
# File 'lib/facter/core/aggregate.rb', line 43

def initialize(name, fact)
  @name = name
  @fact = fact

  @confines = []
  @chunks = {}

  @aggregate = nil
  @deps = Facter::Core::DirectedGraph.new
end

Instance Attribute Details

#confinesObject (readonly)

Since:

  • 2.0.0



36
37
38
# File 'lib/facter/core/aggregate.rb', line 36

def confines
  @confines
end

#depsObject (readonly)

Since:

  • 2.0.0



30
31
32
# File 'lib/facter/core/aggregate.rb', line 30

def deps
  @deps
end

#factFacter::Util::Fact (readonly)

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.

Returns:

Since:

  • 2.0.0



41
42
43
# File 'lib/facter/core/aggregate.rb', line 41

def fact
  @fact
end

#nameObject (readonly)

Since:

  • 2.0.0



25
26
27
# File 'lib/facter/core/aggregate.rb', line 25

def name
  @name
end

Instance Method Details

#aggregate {|Hash<Symbol, Object>| ... } ⇒ void

This method returns an undefined value.

Define how all chunks should be combined

Examples:

Merge all chunks

aggregate.aggregate do |chunks|
  final_result = {}
  chunks.each_value do |chunk|
    final_result.deep_merge(chunk)
  end
  final_result
end

Sum all chunks

aggregate.aggregate do |chunks|
  total = 0
  chunks.each_value do |chunk|
    total += chunk
  end
  total
end

Yields:

  • (Hash<Symbol, Object>)

    A hash containing chunk names and chunk values

Since:

  • 2.0.0



139
140
141
142
143
144
145
# File 'lib/facter/core/aggregate.rb', line 139

def aggregate(&block)
  if block_given?
    @aggregate = block
  else
    raise ArgumentError, "#{self.class.name}#aggregate requires a block"
  end
end

#chunk(name, opts = {}) {|*Object| ... } ⇒ void

This method returns an undefined value.

Define a new chunk for the given aggregate

Examples:

Defining a chunk with no dependencies

aggregate.chunk(:mountpoints) do
  # generate mountpoint information
end

Defining an chunk to add mount options

aggregate.chunk(:mount_options, :require => [:mountpoints]) do |mountpoints|
  # `mountpoints` is the result of the previous chunk
  # generate mount option information based on the mountpoints
end

Parameters:

  • name (Symbol)

    A name unique to this aggregate describing the chunk

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

Yields:

  • (*Object)

    Zero or more chunk results

Since:

  • 2.0.0



98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/facter/core/aggregate.rb', line 98

def chunk(name, opts = {}, &block)
  if not block_given?
    raise ArgumentError, "#{self.class.name}#chunk requires a block"
  end

  deps = Array(opts.delete(:require))

  if not opts.empty?
    raise ArgumentError, "Unexpected options passed to #{self.class.name}#chunk: #{opts.keys.inspect}"
  end

  @deps[name] = deps
  @chunks[name] = block
end

#evaluate(&block) ⇒ Object

Since:

  • 2.0.0



72
73
74
# File 'lib/facter/core/aggregate.rb', line 72

def evaluate(&block)
  instance_eval(&block)
end

#resolution_typeObject

Since:

  • 2.0.0



147
148
149
# File 'lib/facter/core/aggregate.rb', line 147

def resolution_type
  :aggregate
end

#set_options(options) ⇒ Object

Since:

  • 2.0.0



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/facter/core/aggregate.rb', line 54

def set_options(options)
  if options[:name]
    @name = options.delete(:name)
  end

  if options.has_key?(:timeout)
    @timeout = options.delete(:timeout)
  end

  if options.has_key?(:weight)
    @weight = options.delete(:weight)
  end

  if not options.keys.empty?
    raise ArgumentError, "Invalid aggregate options #{options.keys.inspect}"
  end
end