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, 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
  result = 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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

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.



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

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

def node(name)
  name = munge_name(name)

  if node = @nodes[name]
    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)


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

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)


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

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)


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

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.



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

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]).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