Class: Puppet::Resource::TypeCollection Private

Inherits:
Object
  • Object
show all
Includes:
Util::Warnings
Defined in:
lib/puppet/resource/type_collection.rb

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Util::Warnings

clear_warnings, debug_once, maybe_log, notice_once, warnonce

Constructor Details

#initialize(env) ⇒ TypeCollection

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of TypeCollection.



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/puppet/resource/type_collection.rb', line 22

def initialize(env)
  @environment = env
  @hostclasses = {}
  @definitions = {}
  @nodes = {}
  @notfound = {}
  # always lock the environment before acquiring this lock
  @lock = Puppet::Concurrent::Lock.new

  # So we can keep a list and match the first-defined regex
  @node_list = []
end

Instance Attribute Details

#environmentObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



10
11
12
# File 'lib/puppet/resource/type_collection.rb', line 10

def environment
  @environment
end

#parse_failedObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



11
12
13
# File 'lib/puppet/resource/type_collection.rb', line 11

def parse_failed
  @parse_failed
end

Instance Method Details

#<<(thing) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



50
51
52
53
# File 'lib/puppet/resource/type_collection.rb', line 50

def <<(thing)
  add(thing)
  self
end

#add(instance) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



55
56
57
58
59
60
61
62
# File 'lib/puppet/resource/type_collection.rb', line 55

def add(instance)
  # return a merged instance, or the given
  catch(:merged) {
    send("add_#{instance.type}", instance)
    instance.resource_type_collection = self
    instance
  }
end

#add_definition(instance) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



135
136
137
138
139
140
# File 'lib/puppet/resource/type_collection.rb', line 135

def add_definition(instance)
  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 } }
  dupe_check(instance, @definitions) { |dupe| _("Definition '%{name}' is already defined%{error}; cannot be redefined") % { name: instance.name, error: dupe.error_context } }

  @definitions[instance.name] = instance
end

#add_hostclass(instance) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



64
65
66
67
68
69
70
71
72
# File 'lib/puppet/resource/type_collection.rb', line 64

def add_hostclass(instance)
  handle_hostclass_merge(instance)
  dupe_check(instance, @hostclasses) { |dupe| _("Class '%{klass}' is already defined%{error}; cannot redefine") % { klass: instance.name, error: dupe.error_context } }
  dupe_check(instance, @nodes)       { |dupe| _("Node '%{klass}' is already defined%{error}; cannot be redefined as a class") % { klass: instance.name, error: dupe.error_context } }
  dupe_check(instance, @definitions) { |dupe| _("Definition '%{klass}' is already defined%{error}; cannot be redefined as a class") % { klass: instance.name, error: dupe.error_context } }

  @hostclasses[instance.name] = instance
  instance
end

#add_node(instance) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



99
100
101
102
103
104
105
106
# File 'lib/puppet/resource/type_collection.rb', line 99

def add_node(instance)
  dupe_check(instance, @nodes) { |dupe| _("Node '%{name}' is already defined%{error}; cannot redefine") % { name: instance.name, error: dupe.error_context } }
  dupe_check(instance, @hostclasses) { |dupe| _("Class '%{klass}' is already defined%{error}; cannot be redefined as a node") % { klass: instance.name, error: dupe.error_context } }

  @node_list << instance
  @nodes[instance.name] = instance
  instance
end

#clearObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



15
16
17
18
19
20
# File 'lib/puppet/resource/type_collection.rb', line 15

def clear
  @hostclasses.clear
  @definitions.clear
  @nodes.clear
  @notfound.clear
end

#definition(name) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



142
143
144
# File 'lib/puppet/resource/type_collection.rb', line 142

def definition(name)
  @definitions[munge_name(name)]
end

#find_definition(name) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



154
155
156
# File 'lib/puppet/resource/type_collection.rb', line 154

def find_definition(name)
  find_or_load(name, :definition)
end

#find_hostclass(name) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



150
151
152
# File 'lib/puppet/resource/type_collection.rb', line 150

def find_hostclass(name)
  find_or_load(name, :hostclass)
end

#find_node(name) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



146
147
148
# File 'lib/puppet/resource/type_collection.rb', line 146

def find_node(name)
  @nodes[munge_name(name)]
end

#handle_hostclass_merge(instance) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



74
75
76
77
78
79
80
81
82
83
# File 'lib/puppet/resource/type_collection.rb', line 74

def handle_hostclass_merge(instance)
  # Only main class (named '') can be merged (for purpose of merging top-scopes).
  return instance unless instance.name == ''

  if instance.type == :hostclass && (other = @hostclasses[instance.name]) && other.type == :hostclass
    other.merge(instance)
    # throw is used to signal merge - avoids dupe checks and adding it to hostclasses
    throw :merged, other
  end
end

#hostclass(name) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



95
96
97
# File 'lib/puppet/resource/type_collection.rb', line 95

def hostclass(name)
  @hostclasses[munge_name(name)]
end

#import_ast(ast, modname) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



35
36
37
38
39
# File 'lib/puppet/resource/type_collection.rb', line 35

def import_ast(ast, modname)
  ast.instantiate(modname).each do |instance|
    add(instance)
  end
end

#inspectObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



41
42
43
44
45
46
47
# File 'lib/puppet/resource/type_collection.rb', line 41

def inspect
  "TypeCollection" + {
    :hostclasses => @hostclasses.keys,
    :definitions => @definitions.keys,
    :nodes => @nodes.keys
  }.inspect
end

#loaderObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



108
109
110
# File 'lib/puppet/resource/type_collection.rb', line 108

def loader
  @loader ||= Puppet::Parser::TypeLoader.new(environment)
end

#node(name) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/puppet/resource/type_collection.rb', line 112

def node(name)
  name = munge_name(name)

  node = @nodes[name]
  if node
    return node
  end

  @node_list.each do |n|
    next unless n.name_is_regex?
    return n if n.match(name)
  end
  nil
end

#node_exists?(name) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


127
128
129
# File 'lib/puppet/resource/type_collection.rb', line 127

def node_exists?(name)
  @nodes[munge_name(name)]
end

#nodes?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


131
132
133
# File 'lib/puppet/resource/type_collection.rb', line 131

def nodes?
  @nodes.length > 0
end

#parse_failed?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


166
167
168
# File 'lib/puppet/resource/type_collection.rb', line 166

def parse_failed?
  @parse_failed
end

#replace_settings(instance) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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.



91
92
93
# File 'lib/puppet/resource/type_collection.rb', line 91

def replace_settings(instance)
  @hostclasses['settings'] = instance
end

#versionObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/puppet/resource/type_collection.rb', line 170

def version
  unless defined?(@version)
    if environment.config_version.nil? || environment.config_version == ""
      @version = Time.now.to_i
    else
      @version = Puppet::Util::Execution.execute([environment.config_version]).to_s.strip
    end
  end

  @version
rescue Puppet::ExecutionFailure => e
  raise Puppet::ParseError, _("Execution of config_version command `%{cmd}` failed: %{message}") % { cmd: environment.config_version, message: e.message }, e.backtrace
end