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.


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

def initialize(env)
  @environment = env
  @hostclasses = {}
  @definitions = {}
  @capability_mappings = {}
  @applications = {}
  @nodes = {}
  @notfound = {}
  @sites = []
  @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.


8
9
10
# File 'lib/puppet/resource/type_collection.rb', line 8

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.


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

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.


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

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.


61
62
63
64
65
66
67
68
# File 'lib/puppet/resource/type_collection.rb', line 61

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_application(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.


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

def add_application(instance)
  dupe_check(instance, @hostclasses) { |dupe| _("'%{name}' is already defined%{error} as a class; cannot redefine as an application") % { name: instance.name, error: dupe.error_context } }
  dupe_check(instance, @definitions) { |dupe| _("'%{name}' is already defined%{error} as a definition; cannot redefine as an application") % { name: instance.name, error: dupe.error_context } }
  dupe_check(instance, @applications) { |dupe| _("'%{name}' is already defined%{error} as an application; cannot be redefined") % { name: instance.name, error: dupe.error_context } }
  @applications[instance.name] = instance
end

#add_capability_mapping(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.


156
157
158
159
# File 'lib/puppet/resource/type_collection.rb', line 156

def add_capability_mapping(instance)
  dupe_check(instance, @capability_mappings) { |dupe| _("'%{name}' is already defined%{error} as a class; cannot redefine as a mapping") % { name: instance.name, error: dupe.error_context } }
  @capability_mappings[instance.name] = 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.


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

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 } }
  dupe_check(instance, @applications) { |dupe| _("'%{name}' is already defined%{error} as an application; 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.


70
71
72
73
74
75
76
77
78
# File 'lib/puppet/resource/type_collection.rb', line 70

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


104
105
106
107
108
109
110
# File 'lib/puppet/resource/type_collection.rb', line 104

def add_node(instance)
  dupe_check(instance, @nodes) { |dupe| _("Node '%{name}' is already defined%{error}; cannot redefine") % { name: instance.name, error: dupe.error_context } }

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

#add_site(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.


112
113
114
115
116
# File 'lib/puppet/resource/type_collection.rb', line 112

def add_site(instance)
  dupe_check_singleton(instance, @sites) { |dupe| _("Site is already defined%{error}; cannot redefine") % { error: dupe.error_context } }
  @sites << instance
  instance
end

#application(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.


172
173
174
# File 'lib/puppet/resource/type_collection.rb', line 172

def application(name)
  @applications[munge_name(name)]
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.


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

def clear
  @hostclasses.clear
  @definitions.clear
  @applications.clear
  @nodes.clear
  @notfound.clear
  @capability_mappings.clear
  @sites.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.


161
162
163
# File 'lib/puppet/resource/type_collection.rb', line 161

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

#find_application(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.


192
193
194
# File 'lib/puppet/resource/type_collection.rb', line 192

def find_application(name)
  find_or_load(name, :application)
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.


188
189
190
# File 'lib/puppet/resource/type_collection.rb', line 188

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.


184
185
186
# File 'lib/puppet/resource/type_collection.rb', line 184

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.


176
177
178
# File 'lib/puppet/resource/type_collection.rb', line 176

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

#find_siteObject

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.


180
181
182
# File 'lib/puppet/resource/type_collection.rb', line 180

def find_site()
  @sites[0]
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.


80
81
82
83
84
85
86
87
88
# File 'lib/puppet/resource/type_collection.rb', line 80

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.


100
101
102
# File 'lib/puppet/resource/type_collection.rb', line 100

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.


38
39
40
41
42
# File 'lib/puppet/resource/type_collection.rb', line 38

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.


44
45
46
47
48
49
50
51
52
53
# File 'lib/puppet/resource/type_collection.rb', line 44

def inspect
  "TypeCollection" + {
    :hostclasses => @hostclasses.keys,
    :definitions => @definitions.keys,
    :nodes => @nodes.keys,
    :capability_mappings => @capability_mappings.keys,
    :applications => @applications.keys,
    :site => @sites[0] # todo, could be just a binary, this dumps the entire body (good while developing)
  }.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.


122
123
124
# File 'lib/puppet/resource/type_collection.rb', line 122

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.


126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/puppet/resource/type_collection.rb', line 126

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)

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

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)

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

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)

205
206
207
# File 'lib/puppet/resource/type_collection.rb', line 205

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.


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

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

#site(_) ⇒ 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.


118
119
120
# File 'lib/puppet/resource/type_collection.rb', line 118

def site(_)
  @sites[0]
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.


209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/puppet/resource/type_collection.rb', line 209

def version
  if !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