class Puppet::Resource::TypeCollection
@api private
Constants
- COLON_COLON
Attributes
environment[R]
parse_failed[RW]
Public Class Methods
new(env)
click to toggle source
# File lib/puppet/resource/type_collection.rb 21 def initialize(env) 22 @environment = env 23 @hostclasses = {} 24 @definitions = {} 25 @nodes = {} 26 @notfound = {} 27 # always lock the environment before acquiring this lock 28 @lock = Puppet::Concurrent::Lock.new 29 30 # So we can keep a list and match the first-defined regex 31 @node_list = [] 32 end
Public Instance Methods
<<(thing)
click to toggle source
@api private
# File lib/puppet/resource/type_collection.rb 49 def <<(thing) 50 add(thing) 51 self 52 end
add(instance)
click to toggle source
# File lib/puppet/resource/type_collection.rb 54 def add(instance) 55 # return a merged instance, or the given 56 catch(:merged) { 57 send("add_#{instance.type}", instance) 58 instance.resource_type_collection = self 59 instance 60 } 61 end
add_definition(instance)
click to toggle source
# File lib/puppet/resource/type_collection.rb 133 def add_definition(instance) 134 dupe_check(instance, @hostclasses) { |dupe| _("'%{name}' is already defined%{error} as a class; cannot redefine as a definition") % { name: instance.name, error: dupe.error_context } } 135 dupe_check(instance, @definitions) { |dupe| _("Definition '%{name}' is already defined%{error}; cannot be redefined") % { name: instance.name, error: dupe.error_context } } 136 137 @definitions[instance.name] = instance 138 end
add_hostclass(instance)
click to toggle source
# File lib/puppet/resource/type_collection.rb 63 def add_hostclass(instance) 64 handle_hostclass_merge(instance) 65 dupe_check(instance, @hostclasses) { |dupe| _("Class '%{klass}' is already defined%{error}; cannot redefine") % { klass: instance.name, error: dupe.error_context } } 66 dupe_check(instance, @nodes) { |dupe| _("Node '%{klass}' is already defined%{error}; cannot be redefined as a class") % { klass: instance.name, error: dupe.error_context } } 67 dupe_check(instance, @definitions) { |dupe| _("Definition '%{klass}' is already defined%{error}; cannot be redefined as a class") % { klass: instance.name, error: dupe.error_context } } 68 69 @hostclasses[instance.name] = instance 70 instance 71 end
add_node(instance)
click to toggle source
# File lib/puppet/resource/type_collection.rb 97 def add_node(instance) 98 dupe_check(instance, @nodes) { |dupe| _("Node '%{name}' is already defined%{error}; cannot redefine") % { name: instance.name, error: dupe.error_context } } 99 dupe_check(instance, @hostclasses) { |dupe| _("Class '%{klass}' is already defined%{error}; cannot be redefined as a node") % { klass: instance.name, error: dupe.error_context } } 100 101 @node_list << instance 102 @nodes[instance.name] = instance 103 instance 104 end
clear()
click to toggle source
# File lib/puppet/resource/type_collection.rb 14 def clear 15 @hostclasses.clear 16 @definitions.clear 17 @nodes.clear 18 @notfound.clear 19 end
definition(name)
click to toggle source
# File lib/puppet/resource/type_collection.rb 140 def definition(name) 141 @definitions[munge_name(name)] 142 end
find_definition(name)
click to toggle source
# File lib/puppet/resource/type_collection.rb 152 def find_definition(name) 153 find_or_load(name, :definition) 154 end
find_hostclass(name)
click to toggle source
# File lib/puppet/resource/type_collection.rb 148 def find_hostclass(name) 149 find_or_load(name, :hostclass) 150 end
find_node(name)
click to toggle source
# File lib/puppet/resource/type_collection.rb 144 def find_node(name) 145 @nodes[munge_name(name)] 146 end
handle_hostclass_merge(instance)
click to toggle source
# File lib/puppet/resource/type_collection.rb 73 def handle_hostclass_merge(instance) 74 # Only main class (named '') can be merged (for purpose of merging top-scopes). 75 return instance unless instance.name == '' 76 if instance.type == :hostclass && (other = @hostclasses[instance.name]) && other.type == :hostclass 77 other.merge(instance) 78 # throw is used to signal merge - avoids dupe checks and adding it to hostclasses 79 throw :merged, other 80 end 81 end
hostclass(name)
click to toggle source
# File lib/puppet/resource/type_collection.rb 93 def hostclass(name) 94 @hostclasses[munge_name(name)] 95 end
import_ast(ast, modname)
click to toggle source
# File lib/puppet/resource/type_collection.rb 34 def import_ast(ast, modname) 35 ast.instantiate(modname).each do |instance| 36 add(instance) 37 end 38 end
inspect()
click to toggle source
# File lib/puppet/resource/type_collection.rb 40 def inspect 41 "TypeCollection" + { 42 :hostclasses => @hostclasses.keys, 43 :definitions => @definitions.keys, 44 :nodes => @nodes.keys 45 }.inspect 46 end
loader()
click to toggle source
# File lib/puppet/resource/type_collection.rb 106 def loader 107 @loader ||= Puppet::Parser::TypeLoader.new(environment) 108 end
node(name)
click to toggle source
# File lib/puppet/resource/type_collection.rb 110 def node(name) 111 name = munge_name(name) 112 113 node = @nodes[name] 114 if node 115 return node 116 end 117 118 @node_list.each do |n| 119 next unless n.name_is_regex? 120 return n if n.match(name) 121 end 122 nil 123 end
node_exists?(name)
click to toggle source
# File lib/puppet/resource/type_collection.rb 125 def node_exists?(name) 126 @nodes[munge_name(name)] 127 end
nodes?()
click to toggle source
# File lib/puppet/resource/type_collection.rb 129 def nodes? 130 @nodes.length > 0 131 end
parse_failed?()
click to toggle source
# File lib/puppet/resource/type_collection.rb 164 def parse_failed? 165 @parse_failed 166 end
replace_settings(instance)
click to toggle source
Replaces the known settings with a new instance (that must be named ‘settings’). This is primarily needed for testing purposes. Also see PUP-5954 as it makes it illegal to merge classes other than the ” (main) class. Prior to this change settings where always merged rather than being defined from scratch for many testing scenarios not having a complete side effect free setup for compilation.
# File lib/puppet/resource/type_collection.rb 89 def replace_settings(instance) 90 @hostclasses['settings'] = instance 91 end
version()
click to toggle source
# File lib/puppet/resource/type_collection.rb 168 def version 169 if !defined?(@version) 170 if environment.config_version.nil? || environment.config_version == "" 171 @version = Time.now.to_i 172 else 173 @version = Puppet::Util::Execution.execute([environment.config_version]).to_s.strip 174 end 175 end 176 177 @version 178 rescue Puppet::ExecutionFailure => e 179 raise Puppet::ParseError, _("Execution of config_version command `%{cmd}` failed: %{message}") % { cmd: environment.config_version, message: e.message }, e.backtrace 180 end
Private Instance Methods
dupe_check(instance, hash) { |dupe| ... }
click to toggle source
# File lib/puppet/resource/type_collection.rb 219 def dupe_check(instance, hash) 220 dupe = hash[instance.name] 221 return unless dupe 222 message = yield dupe 223 instance.fail Puppet::ParseError, message 224 end
dupe_check_singleton(instance, set) { |set| ... }
click to toggle source
# File lib/puppet/resource/type_collection.rb 226 def dupe_check_singleton(instance, set) 227 return if set.empty? 228 message = yield set[0] 229 instance.fail Puppet::ParseError, message 230 end
find_or_load(name, type)
click to toggle source
Resolve namespaces and find the given object. Autoload it if necessary.
# File lib/puppet/resource/type_collection.rb 188 def find_or_load(name, type) 189 # always lock the environment before locking the type collection 190 @environment.lock.synchronize do 191 @lock.synchronize do 192 # Name is always absolute, but may start with :: which must be removed 193 fqname = (name[0,2] == COLON_COLON ? name[2..-1] : name) 194 195 result = send(type, fqname) 196 unless result 197 if @notfound[ fqname ] && Puppet[ :ignoremissingtypes ] 198 # do not try to autoload if we already tried and it wasn't conclusive 199 # as this is a time consuming operation. Warn the user. 200 # Check first if debugging is on since the call to debug_once is expensive 201 if Puppet[:debug] 202 debug_once _("Not attempting to load %{type} %{fqname} as this object was missing during a prior compilation") % { type: type, fqname: fqname } 203 end 204 else 205 fqname = munge_name(fqname) 206 result = loader.try_load_fqname(type, fqname) 207 @notfound[ fqname ] = result.nil? 208 end 209 end 210 result 211 end 212 end 213 end
munge_name(name)
click to toggle source
# File lib/puppet/resource/type_collection.rb 215 def munge_name(name) 216 name.to_s.downcase 217 end