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