Class: Puppet::Node

Inherits:
Object show all
Extended by:
Indirector
Includes:
Util::PsychSupport
Defined in:
lib/puppet/node.rb,
lib/puppet/node/environment.rb

Overview

Just define it, so this class has fewer load dependencies.

Defined Under Namespace

Classes: Environment, Exec, Facts, Ldap, Memory, Msgpack, Plain, Rest, StoreConfigs, WriteOnlyYaml, Yaml

Constant Summary

Constants included from Indirector

Indirector::BadNameRegexp

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Indirector

configure_routes, indirects

Methods included from Util::PsychSupport

#encode_with, #init_with

Constructor Details

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

Returns a new instance of Node.

Raises:

  • (ArgumentError)


79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/puppet/node.rb', line 79

def initialize(name, options = {})
  raise ArgumentError, "Node names cannot be nil" unless name
  @name = name

  if classes = options[:classes]
    if classes.is_a?(String)
      @classes = [classes]
    else
      @classes = classes
    end
  else
    @classes = []
  end

  @parameters = options[:parameters] || {}

  @facts = options[:facts]

  @server_facts = {}

  if env = options[:environment]
    self.environment = env
  end

  @time = Time.now
end

Instance Attribute Details

#classesObject



19
20
21
# File 'lib/puppet/node.rb', line 19

def classes
  @classes
end

#environment_nameObject



19
20
21
# File 'lib/puppet/node.rb', line 19

def environment_name
  @environment_name
end

#factsObject (readonly)



20
21
22
# File 'lib/puppet/node.rb', line 20

def facts
  @facts
end

#ipaddressObject



19
20
21
# File 'lib/puppet/node.rb', line 19

def ipaddress
  @ipaddress
end

#nameObject



19
20
21
# File 'lib/puppet/node.rb', line 19

def name
  @name
end

#parametersObject



19
20
21
# File 'lib/puppet/node.rb', line 19

def parameters
  @parameters
end

#server_factsObject (readonly)



22
23
24
# File 'lib/puppet/node.rb', line 22

def server_facts
  @server_facts
end

#sourceObject



19
20
21
# File 'lib/puppet/node.rb', line 19

def source
  @source
end

#timeObject (readonly)



20
21
22
# File 'lib/puppet/node.rb', line 20

def time
  @time
end

#trusted_dataObject



19
20
21
# File 'lib/puppet/node.rb', line 19

def trusted_data
  @trusted_data
end

Class Method Details

.from_data_hash(data) ⇒ Object



31
32
33
34
35
# File 'lib/puppet/node.rb', line 31

def self.from_data_hash(data)
  node = new(name)
  node.initialize_from_hash(data)
  node
end

Instance Method Details

#add_server_facts(facts) ⇒ Object



131
132
133
134
135
136
137
# File 'lib/puppet/node.rb', line 131

def add_server_facts(facts)
  # Append the current environment to the list of server facts
  @server_facts = facts.merge({ "environment" => self.environment.name.to_s})

  # Merge the server facts into the parameters for the node
  merge(facts)
end

#environmentObject



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/puppet/node.rb', line 47

def environment
  if @environment
    @environment
  else
    if env = parameters["environment"]
      self.environment = env
    elsif environment_name
      self.environment = environment_name
    else
      # This should not be :current_environment, this is the default
      # for a node when it has not specified its environment
      # Tt will be used to establish what the current environment is.
      #
      self.environment = Puppet.lookup(:environments).get!(Puppet[:environment])
    end

    @environment
  end
end

#environment=(env) ⇒ Object



67
68
69
70
71
72
73
# File 'lib/puppet/node.rb', line 67

def environment=(env)
  if env.is_a?(String) or env.is_a?(Symbol)
    @environment = Puppet.lookup(:environments).get!(env)
  else
    @environment = env
  end
end

#fact_mergeObject

Merge the node facts with parameters from the node source.



107
108
109
110
111
112
113
114
115
116
# File 'lib/puppet/node.rb', line 107

def fact_merge
  if @facts = Puppet::Node::Facts.indirection.find(name, :environment => environment)
    @facts.sanitize
    merge(@facts.values)
  end
rescue => detail
  error = Puppet::Error.new("Could not retrieve facts for #{name}: #{detail}")
  error.set_backtrace(detail.backtrace)
  raise error
end

#has_environment_instance?Boolean

Returns:

  • (Boolean)


75
76
77
# File 'lib/puppet/node.rb', line 75

def has_environment_instance?
  !@environment.nil?
end

#initialize_from_hash(data) ⇒ Object



24
25
26
27
28
29
# File 'lib/puppet/node.rb', line 24

def initialize_from_hash(data)
  @name       = data['name']       || (raise ArgumentError, "No name provided in serialized data")
  @classes    = data['classes']    || []
  @parameters = data['parameters'] || {}
  @environment_name = data['environment']
end

#merge(params) ⇒ Object

Merge any random parameters into our parameter list.



119
120
121
122
123
124
125
126
127
128
129
# File 'lib/puppet/node.rb', line 119

def merge(params)
  params.each do |name, value|
    if @parameters.include?(name)
      Puppet::Util::Warnings.warnonce("The node parameter '#{name}' for node '#{@name}' was already set to '#{@parameters[name]}'. It could not be set to '#{value}'")
    else
      @parameters[name] = value
    end
  end

  @parameters["environment"] ||= self.environment.name.to_s
end

#namesObject

Calculate the list of names we might use for looking up our node. This is only used for AST nodes.



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/puppet/node.rb', line 141

def names
  return [name] if Puppet.settings[:strict_hostname_checking]

  names = []

  names += split_name(name) if name.include?(".")

  # First, get the fqdn
  unless fqdn = parameters["fqdn"]
    if parameters["hostname"] and parameters["domain"]
      fqdn = parameters["hostname"] + "." + parameters["domain"]
    else
      Puppet.warning "Host is missing hostname and/or domain: #{name}"
    end
  end

  # Now that we (might) have the fqdn, add each piece to the name
  # list to search, in order of longest to shortest.
  names += split_name(fqdn) if fqdn

  # And make sure the node name is first, since that's the most
  # likely usage.
  #   The name is usually the Certificate CN, but it can be
  # set to the 'facter' hostname instead.
  if Puppet[:node_name] == 'cert'
    names.unshift name
  else
    names.unshift parameters["hostname"]
  end
  names.uniq
end

#split_name(name) ⇒ Object



173
174
175
176
177
178
179
180
# File 'lib/puppet/node.rb', line 173

def split_name(name)
  list = name.split(".")
  tmp = []
  list.each_with_index do |short, i|
    tmp << list[0..i].join(".")
  end
  tmp.reverse
end

#to_data_hashObject



37
38
39
40
41
42
43
44
45
# File 'lib/puppet/node.rb', line 37

def to_data_hash
  result = {
    'name' => name,
    'environment' => environment.name,
  }
  result['classes'] = classes unless classes.empty?
  result['parameters'] = parameters unless parameters.empty?
  result
end