class Loom::Facts::FactSet

A factset is created by running each registered Loom::Facts::Provider and calling Provider+collect_facts+. See ./fact_file_provider.rb and lib/loomext/facts/facter_provider.rb for examples of fact providers.

Constants

InvalidFactName
InvalidFactValue
UnmarshalableError

Attributes

host_spec[R]

Public Class Methods

create_for_host(host_spec, shell, loom_config) click to toggle source
# File lib/loom/facts/fact_set.rb, line 27
def create_for_host(host_spec, shell, loom_config)
  fact_map = {}
  fact_providers = Provider.create_fact_providers(host_spec, shell, loom_config)
  fact_providers.each do |provider|
    next if Provider.disabled_for_host?(host_spec, provider.class)

    namespace = provider.namespace
    Loom.log.debug { "loading facts from provider => #{provider}[#{namespace}]" }

    provider_facts = {}
    begin
      provider.collect_facts.each do |k, v|
        k = k.to_sym
        provider_facts[k] = v
      end

      if namespace
        if fact_map[namespace]
          Loom.log.warn "overriding fact[#{namespace}] with namespace"
        end
        fact_map[namespace] = provider_facts
      else
        provider_facts.each do |k, v|
          if fact_map[k]
            Loom.log.warn "overriding fact[#{k}]"
          end
          Loom.log.debug5(self) { "adding fact => #{k}=#{v.to_s}" }
          fact_map[k] = v
        end
      end
    rescue => e
      Loom.log.error "error executing fact provider #{provider.class} => #{e.message}"
      Loom.log.debug(self) { e.backtrace.join("\n\t") }
      provider.disable(host_spec)
    end
  end

  FactSet.new host_spec, fact_map
end
new(host_spec, fact_map) click to toggle source
# File lib/loom/facts/fact_set.rb, line 68
def initialize(host_spec, fact_map)
  raise unless fact_map.is_a? Hash
  validate_facts fact_map

  @fact_map = YAML.load(fact_map.to_yaml).reduce({}) do |memo, tuple|
    memo[tuple.first.to_sym] = tuple.last
    memo
  end
  @host_spec = host_spec
end

Public Instance Methods

[](fact_name)
Alias for: get
facts() click to toggle source
# File lib/loom/facts/fact_set.rb, line 120
def facts
  @fact_map.dup
end
get(fact_name) click to toggle source
# File lib/loom/facts/fact_set.rb, line 109
def get(fact_name)
  v = @fact_map[fact_name.to_sym]
  dup = v.dup rescue v
  if dup.nil?
    Loom::Facts::EMPTY
  else
    dup
  end
end
Also aliased as: []
hostname() click to toggle source
# File lib/loom/facts/fact_set.rb, line 94
    def hostname
      Loom.log.debug(<<NB
`facts.hostname ` is actually the name by which SSH knows the host, not
necessarily the actual host name. e.g. it may be an ip address, /etc/hosts
alias, or ssh config alias. Use `facts.sshname` for the same value without this
warning.
NB
        )
      sshname
    end
merge(facts) click to toggle source
# File lib/loom/facts/fact_set.rb, line 81
def merge(facts)
  facts = case facts
          when FactSet
            facts.facts
          when Hash
            facts
          else
            raise "unable to merge facts => #{facts.class}:#{facts}"
          end
  merged_facts = @fact_map.merge facts
  FactSet.new @host_spec, merged_facts
end
sshname() click to toggle source
# File lib/loom/facts/fact_set.rb, line 105
def sshname
  host_spec.hostname
end
to_s() click to toggle source
# File lib/loom/facts/fact_set.rb, line 124
def to_s
  @fact_map.to_a.map { |tuple| tuple.join "=" }.join "\n"
end

Private Instance Methods

validate_fact_name(name) click to toggle source
# File lib/loom/facts/fact_set.rb, line 137
def validate_fact_name(name)
  raise InvalidFactName, name unless name.eql? YAML.load(name.to_yaml)
end
validate_fact_value(value) click to toggle source
# File lib/loom/facts/fact_set.rb, line 141
def validate_fact_value(value)
  raise InvalidFactValue, value unless value.eql? YAML.load(value.to_yaml)
end
validate_facts(fact_map) click to toggle source
# File lib/loom/facts/fact_set.rb, line 129
def validate_facts(fact_map)
  fact_map.each do |k, v|
    validate_fact_name k.to_sym
    validate_fact_value v
  end
  raise UnmarshalableError unless fact_map.eql? YAML.load(fact_map.to_yaml)
end