Class: Puppet::Resource::TypeCollection Private

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

Overview

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.

API:

  • private

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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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.

API:

  • private



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:

API:

  • private



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:

API:

  • private



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:

API:

  • private



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.

API:

  • private



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.

API:

  • private



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