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 collapse

ENVIRONMENT =
'environment'.freeze

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)


88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/puppet/node.rb', line 88

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



33
34
35
36
37
# File 'lib/puppet/node.rb', line 33

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

Instance Method Details

#add_server_facts(facts) ⇒ Object



140
141
142
143
144
145
146
# File 'lib/puppet/node.rb', line 140

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



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

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



69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/puppet/node.rb', line 69

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

  # Keep environment_name attribute and parameter in sync if they have been set
  unless @environment.nil?
    @parameters[ENVIRONMENT] = @environment.name.to_s if @parameters.include?(ENVIRONMENT)
    self.environment_name = @environment.name if instance_variable_defined?(:@environment_name)
  end
  @environment
end

#fact_mergeObject

Merge the node facts with parameters from the node source.



116
117
118
119
120
121
122
123
124
125
# File 'lib/puppet/node.rb', line 116

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)


84
85
86
# File 'lib/puppet/node.rb', line 84

def has_environment_instance?
  !@environment.nil?
end

#initialize_from_hash(data) ⇒ Object



26
27
28
29
30
31
# File 'lib/puppet/node.rb', line 26

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.



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

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.



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/puppet/node.rb', line 150

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



182
183
184
185
186
187
188
189
# File 'lib/puppet/node.rb', line 182

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



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

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