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
34
# File 'lib/puppet/resource/type_collection.rb', line 22

def initialize(env)
  @environment = env
  @hostclasses = {}
  @definitions = {}
  @capability_mappings = {}
  @applications = {}
  @nodes = {}
  @notfound = {}
  @sites = []

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


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

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.


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

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.


54
55
56
57
# File 'lib/puppet/resource/type_collection.rb', line 54

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.


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

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.


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

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.


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

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.


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

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.


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

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.


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

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.


110
111
112
113
114
# File 'lib/puppet/resource/type_collection.rb', line 110

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.


170
171
172
# File 'lib/puppet/resource/type_collection.rb', line 170

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.


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

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.


159
160
161
# File 'lib/puppet/resource/type_collection.rb', line 159

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.


190
191
192
# File 'lib/puppet/resource/type_collection.rb', line 190

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.


186
187
188
# File 'lib/puppet/resource/type_collection.rb', line 186

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.


182
183
184
# File 'lib/puppet/resource/type_collection.rb', line 182

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.


174
175
176
# File 'lib/puppet/resource/type_collection.rb', line 174

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.


178
179
180
# File 'lib/puppet/resource/type_collection.rb', line 178

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.


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

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.


98
99
100
# File 'lib/puppet/resource/type_collection.rb', line 98

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.


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

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.


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

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.


120
121
122
# File 'lib/puppet/resource/type_collection.rb', line 120

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.


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

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.


139
140
141
# File 'lib/puppet/resource/type_collection.rb', line 139

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.


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

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.


203
204
205
# File 'lib/puppet/resource/type_collection.rb', line 203

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.


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

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.


116
117
118
# File 'lib/puppet/resource/type_collection.rb', line 116

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.


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

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