Class: Puppet::Node::Environment
- Defined in:
- lib/puppet/node/environment.rb
Overview
Puppet::Node::Environment acts as a container for all configuration that is expected to vary between environments.
## The root environment
In addition to normal environments that are defined by the user,there is a special ‘root’ environment. It is defined as an instance variable on the Puppet::Node::Environment metaclass. The environment name is ‘root` and can be accessed by looking up the `:root_environment` using Puppet.lookup.
The primary purpose of the root environment is to contain parser functions that are not bound to a specific environment. The main case for this is for logging functions. Logging functions are attached to the ‘root’ environment when Parser::Functions.reset is called.
Defined Under Namespace
Constant Summary collapse
- NO_MANIFEST =
:no_manifest
Instance Attribute Summary collapse
-
#config_version ⇒ Object
readonly
Returns the value of attribute config_version.
-
#loaders ⇒ Object
private
Cached loaders - management of value handled by Puppet::Pops::Loaders.
-
#manifest ⇒ Object
readonly
Returns the value of attribute manifest.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
Class Method Summary collapse
-
.create(name, modulepath, manifest = NO_MANIFEST, config_version = nil) ⇒ Puppet::Node::Environment
Create a new environment with the given name.
-
.remote(name) ⇒ Object
A “reference” to a remote environment.
- .split_path(path_string) ⇒ Object
-
.valid_name?(name) ⇒ Boolean
True if name is valid.
Instance Method Summary collapse
- #==(other) ⇒ Object (also: #eql?)
-
#[](param) ⇒ Object
Return an environment-specific Puppet setting.
-
#check_for_reparse ⇒ Object
Checks if a reparse is required (cache of files is stale).
-
#configuration ⇒ Puppet::Settings::EnvironmentConf
private
Return the environment configuration.
-
#conflicting_manifest_settings? ⇒ Boolean
private
Checks to make sure that this environment did not have a manifest set in its original environment.conf if Puppet is configured with
disable_per_environment_manifest
set true. -
#each_plugin_directory {|String| ... } ⇒ Object
Yields each modules’ plugin directory if the plugin directory (modulename/lib) is present on the filesystem.
-
#full_modulepath ⇒ Array<String>
All directories in the modulepath (even if they are not present on disk).
- #hash ⇒ Object
-
#initialize(name, modulepath, manifest, config_version) ⇒ Environment
constructor
Instantiate a new environment.
- #inspect ⇒ Object
-
#known_resource_types ⇒ Puppet::Resource::TypeCollection
The current global TypeCollection.
-
#module(name) ⇒ Puppet::Module?
Locate a module instance by the module name alone.
-
#module_by_forge_name(forge_name) ⇒ Puppet::Module?
Locate a module instance by the full forge name (EG authorname/module).
-
#module_requirements ⇒ Hash<String, Array<Hash<String, String>>>
All module requirements for all modules in the environment modulepath.
-
#modulepath ⇒ Array<String>
All directories present on disk in the modulepath.
-
#modules ⇒ Array<Puppet::Module>
Return all modules for this environment in the order they appear in the modulepath.
-
#modules_by_path ⇒ Hash<String, Array<Puppet::Module>>
Modules broken out by directory in the modulepath.
-
#modules_strict_semver=(flag) ⇒ Object
A SemanticPuppet::VersionRange version >= 1.0.0 will not include versions with pre-release identifiers unless that is explicitly declared.
-
#modules_strict_semver? ⇒ Boolean
The current value of the modules_strict_semver flag.
-
#override_from_commandline(settings) ⇒ Puppet::Node::Environment
Creates a new Puppet::Node::Environment instance, overriding :manifest, :modulepath, or :config_version from the passed settings if they were originally set from the commandline, or returns self if there is nothing to override.
-
#override_with(env_params) ⇒ Puppet::Node::Environment
Creates a new Puppet::Node::Environment instance, overriding any of the passed parameters.
-
#rich_data? ⇒ Boolean
private
Checks if this environment permits use of rich data types in the catalog.
- #static_catalogs? ⇒ Boolean private
-
#to_s ⇒ String
The stringified value of the ‘name` instance variable.
-
#to_sym ⇒ Symbol
The ‘name` value, cast to a string, then cast to a symbol.
-
#to_yaml ⇒ String
Return the name of the environment as a string interpretation of the object.
-
#validation_errors ⇒ Array<String>
Checks the environment and settings for any conflicts.
-
#warn_about_mistaken_path(path, name) ⇒ Object
private
Generate a warning if the given directory in a module path entry is named ‘lib`.
Constructor Details
#initialize(name, modulepath, manifest, config_version) ⇒ Environment
new is private for historical reasons, as previously it had been overridden to return memoized objects and was replaced with create, so this will not be invoked with the normal Ruby initialization semantics.
Instantiate a new environment
83 84 85 86 87 88 89 |
# File 'lib/puppet/node/environment.rb', line 83 def initialize(name, modulepath, manifest, config_version) @name = name @modulepath = modulepath @manifest = manifest @config_version = config_version @modules_strict_semver = false end |
Instance Attribute Details
#config_version ⇒ Object (readonly)
Returns the value of attribute config_version.
168 169 170 |
# File 'lib/puppet/node/environment.rb', line 168 def config_version @config_version end |
#loaders ⇒ 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.
Cached loaders - management of value handled by Puppet::Pops::Loaders
172 173 174 |
# File 'lib/puppet/node/environment.rb', line 172 def loaders @loaders end |
#manifest ⇒ Object (readonly)
Returns the value of attribute manifest.
162 163 164 |
# File 'lib/puppet/node/environment.rb', line 162 def manifest @manifest end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
143 144 145 |
# File 'lib/puppet/node/environment.rb', line 143 def name @name end |
Class Method Details
.create(name, modulepath, manifest = NO_MANIFEST, config_version = nil) ⇒ Puppet::Node::Environment
Create a new environment with the given name
46 47 48 49 50 51 52 53 54 |
# File 'lib/puppet/node/environment.rb', line 46 def self.create(name, modulepath, manifest = NO_MANIFEST, config_version = nil) obj = self.allocate obj.send(:initialize, name.intern, (extralibs() + modulepath), manifest == NO_MANIFEST ? manifest : Puppet::FileSystem.(manifest), config_version) obj end |
.remote(name) ⇒ Object
This does not provide access to the information of the remote
A “reference” to a remote environment. The created environment instance isn’t expected to exist on the local system, but is instead a reference to environment information on a remote system. For instance when a catalog is being applied, this will be used on the agent.
environment’s modules, manifest, or anything else. It is simply a value object to pass around and use as an environment.
71 72 73 |
# File 'lib/puppet/node/environment.rb', line 71 def self.remote(name) Remote.create(name, [], NO_MANIFEST) end |
.split_path(path_string) ⇒ Object
473 474 475 |
# File 'lib/puppet/node/environment.rb', line 473 def self.split_path(path_string) path_string.split(File::PATH_SEPARATOR) end |
.valid_name?(name) ⇒ Boolean
Returns true if name is valid.
135 136 137 |
# File 'lib/puppet/node/environment.rb', line 135 def self.valid_name?(name) !!name.match(/\A\w+\Z/) end |
Instance Method Details
#==(other) ⇒ Object Also known as: eql?
477 478 479 480 481 482 |
# File 'lib/puppet/node/environment.rb', line 477 def ==(other) return true if other.kind_of?(Puppet::Node::Environment) && self.name == other.name && self.full_modulepath == other.full_modulepath && self.manifest == other.manifest end |
#[](param) ⇒ Object
Return an environment-specific Puppet setting.
239 240 241 |
# File 'lib/puppet/node/environment.rb', line 239 def [](param) Puppet.settings.value(param, self.name) end |
#check_for_reparse ⇒ Object
Checks if a reparse is required (cache of files is stale).
438 439 440 441 442 443 |
# File 'lib/puppet/node/environment.rb', line 438 def check_for_reparse if (Puppet[:code] != @parsed_code || @known_resource_types.parse_failed?) @parsed_code = nil @known_resource_types = nil end end |
#configuration ⇒ Puppet::Settings::EnvironmentConf
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.
Return the environment configuration
207 208 209 |
# File 'lib/puppet/node/environment.rb', line 207 def configuration Puppet.lookup(:environments).get_conf(name) end |
#conflicting_manifest_settings? ⇒ 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.
Checks to make sure that this environment did not have a manifest set in its original environment.conf if Puppet is configured with disable_per_environment_manifest
set true. If it did, the environment’s modules may not function as intended by the original authors, and we may seek to halt a puppet compilation for a node in this environment.
The only exception to this would be if the environment.conf manifest is an exact, uninterpolated match for the current default_manifest
setting.
188 189 190 191 192 |
# File 'lib/puppet/node/environment.rb', line 188 def conflicting_manifest_settings? return false if !Puppet[:disable_per_environment_manifest] original_manifest = configuration.raw_setting(:manifest) !original_manifest.nil? && !original_manifest.empty? && original_manifest != Puppet[:default_manifest] end |
#each_plugin_directory {|String| ... } ⇒ Object
Yields each modules’ plugin directory if the plugin directory (modulename/lib) is present on the filesystem.
274 275 276 277 278 279 |
# File 'lib/puppet/node/environment.rb', line 274 def each_plugin_directory(&block) modules.map(&:plugin_directory).each do |lib| lib = Puppet::Util::Autoload.cleanpath(lib) yield lib if File.directory?(lib) end end |
#full_modulepath ⇒ Array<String>
Returns All directories in the modulepath (even if they are not present on disk).
155 156 157 |
# File 'lib/puppet/node/environment.rb', line 155 def full_modulepath @modulepath end |
#hash ⇒ Object
486 487 488 |
# File 'lib/puppet/node/environment.rb', line 486 def hash [self.class, name, full_modulepath, manifest].hash end |
#inspect ⇒ Object
458 459 460 |
# File 'lib/puppet/node/environment.rb', line 458 def inspect %Q{<#{self.class}:#{self.object_id} @name="#{name}" @manifest="#{manifest}" @modulepath="#{full_modulepath.join(":")}" >} end |
#known_resource_types ⇒ Puppet::Resource::TypeCollection
Returns The current global TypeCollection.
261 262 263 264 265 266 267 |
# File 'lib/puppet/node/environment.rb', line 261 def known_resource_types if @known_resource_types.nil? @known_resource_types = Puppet::Resource::TypeCollection.new(self) @known_resource_types.import_ast(perform_initial_import(), '') end @known_resource_types end |
#module(name) ⇒ Puppet::Module?
Locate a module instance by the module name alone.
287 288 289 |
# File 'lib/puppet/node/environment.rb', line 287 def module(name) modules.find {|mod| mod.name == name} end |
#module_by_forge_name(forge_name) ⇒ Puppet::Module?
Locate a module instance by the full forge name (EG authorname/module)
297 298 299 300 301 302 303 |
# File 'lib/puppet/node/environment.rb', line 297 def module_by_forge_name(forge_name) , modname = forge_name.split('/') found_mod = self.module(modname) found_mod and found_mod.forge_name == forge_name ? found_mod : nil end |
#module_requirements ⇒ Hash<String, Array<Hash<String, String>>>
All module requirements for all modules in the environment modulepath
412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
# File 'lib/puppet/node/environment.rb', line 412 def module_requirements deps = {} modules.each do |mod| next unless mod.forge_name deps[mod.forge_name] ||= [] mod.dependencies and mod.dependencies.each do |mod_dep| dep_name = mod_dep['name'].tr('-', '/') (deps[dep_name] ||= []) << { 'name' => mod.forge_name, 'version' => mod.version, 'version_requirement' => mod_dep['version_requirement'] } end end deps.each do |mod, mod_deps| deps[mod] = mod_deps.sort_by { |d| d['name'] } end deps end |
#modulepath ⇒ Array<String>
Returns All directories present on disk in the modulepath.
147 148 149 150 151 |
# File 'lib/puppet/node/environment.rb', line 147 def modulepath @modulepath.find_all do |p| Puppet::FileSystem.directory?(p) end end |
#modules ⇒ Array<Puppet::Module>
If multiple modules with the same name are present they will both be added, but methods like #module and #module_by_forge_name will return the first matching entry in this list.
This value is cached so that the filesystem doesn’t have to be re-enumerated every time this method is invoked, since that enumeration could be a costly operation and this method is called frequently. The cache expiry is determined by ‘Puppet`.
Return all modules for this environment in the order they appear in the modulepath.
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 |
# File 'lib/puppet/node/environment.rb', line 316 def modules if @modules.nil? module_references = [] seen_modules = {} modulepath.each do |path| Dir.entries(path).each do |name| next unless Puppet::Module.is_module_directory?(name, path) warn_about_mistaken_path(path, name) if not seen_modules[name] module_references << {:name => name, :path => File.join(path, name)} seen_modules[name] = true end end end @modules = module_references.collect do |reference| begin Puppet::Module.new(reference[:name], reference[:path], self, modules_strict_semver?) rescue Puppet::Module::Error => e Puppet.log_exception(e) nil end end.compact end @modules end |
#modules_by_path ⇒ Hash<String, Array<Puppet::Module>>
This method changes the current working directory while enumerating the modules. This seems rather dangerous.
Modules broken out by directory in the modulepath
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 |
# File 'lib/puppet/node/environment.rb', line 366 def modules_by_path modules_by_path = {} modulepath.each do |path| if Puppet::FileSystem.exist?(path) Dir.chdir(path) do module_names = Dir.entries(path).select do |name| Puppet::Module.is_module_directory?(name, path) end modules_by_path[path] = module_names.sort.map do |name| Puppet::Module.new(name, File.join(path, name), self, modules_strict_semver?) end end else modules_by_path[path] = [] end end modules_by_path end |
#modules_strict_semver=(flag) ⇒ Object
A SemanticPuppet::VersionRange version >= 1.0.0 will not include versions with pre-release identifiers unless that is explicitly declared. This may cause backward compatibility issues when resolving module dependencies and the flag is therefore set to ‘false` by default.
249 250 251 |
# File 'lib/puppet/node/environment.rb', line 249 def modules_strict_semver=(flag) @modules_strict_semver = flag end |
#modules_strict_semver? ⇒ Boolean
Returns the current value of the modules_strict_semver flag.
255 256 257 |
# File 'lib/puppet/node/environment.rb', line 255 def modules_strict_semver? @modules_strict_semver end |
#override_from_commandline(settings) ⇒ Puppet::Node::Environment
Creates a new Puppet::Node::Environment instance, overriding :manifest, :modulepath, or :config_version from the passed settings if they were originally set from the commandline, or returns self if there is nothing to override.
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/puppet/node/environment.rb', line 112 def override_from_commandline(settings) overrides = {} if settings.set_by_cli?(:modulepath) overrides[:modulepath] = self.class.split_path(settings.value(:modulepath)) end if settings.set_by_cli?(:config_version) overrides[:config_version] = settings.value(:config_version) end if settings.set_by_cli?(:manifest) overrides[:manifest] = settings.value(:manifest) end overrides.empty? ? self : self.override_with(overrides) end |
#override_with(env_params) ⇒ Puppet::Node::Environment
Creates a new Puppet::Node::Environment instance, overriding any of the passed parameters.
97 98 99 100 101 102 |
# File 'lib/puppet/node/environment.rb', line 97 def override_with(env_params) return self.class.create(name, env_params[:modulepath] || modulepath, env_params[:manifest] || manifest, env_params[:config_version] || config_version) end |
#rich_data? ⇒ 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.
Checks if this environment permits use of rich data types in the catalog
225 226 227 228 229 230 231 |
# File 'lib/puppet/node/environment.rb', line 225 def rich_data? if @rich_data.nil? environment_conf = Puppet.lookup(:environments).get_conf(name) @rich_data = (environment_conf.nil? ? Puppet[:rich_data] : environment_conf.rich_data) end @rich_data end |
#static_catalogs? ⇒ 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.
195 196 197 198 199 200 201 |
# File 'lib/puppet/node/environment.rb', line 195 def static_catalogs? if @static_catalogs.nil? environment_conf = Puppet.lookup(:environments).get_conf(name) @static_catalogs = (environment_conf.nil? ? Puppet[:static_catalogs] : environment_conf.static_catalogs) end @static_catalogs end |
#to_s ⇒ String
Returns The stringified value of the ‘name` instance variable.
453 454 455 |
# File 'lib/puppet/node/environment.rb', line 453 def to_s name.to_s end |
#to_sym ⇒ Symbol
the ‘name` instance variable is a Symbol, but this casts the value to a String and then converts it back into a Symbol which will needlessly create an object that needs to be garbage collected
Returns The ‘name` value, cast to a string, then cast to a symbol.
469 470 471 |
# File 'lib/puppet/node/environment.rb', line 469 def to_sym to_s.to_sym end |
#to_yaml ⇒ String
Return the name of the environment as a string interpretation of the object
447 448 449 |
# File 'lib/puppet/node/environment.rb', line 447 def to_yaml to_s.to_yaml end |
#validation_errors ⇒ Array<String>
Checks the environment and settings for any conflicts
214 215 216 217 218 219 220 |
# File 'lib/puppet/node/environment.rb', line 214 def validation_errors errors = [] if conflicting_manifest_settings? errors << _("The 'disable_per_environment_manifest' setting is true, and the '%{env_name}' environment has an environment.conf manifest that conflicts with the 'default_manifest' setting.") % { env_name: name } end errors end |
#warn_about_mistaken_path(path, 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.
Generate a warning if the given directory in a module path entry is named ‘lib`.
349 350 351 352 353 354 355 |
# File 'lib/puppet/node/environment.rb', line 349 def warn_about_mistaken_path(path, name) if name == "lib" Puppet.debug("Warning: Found directory named 'lib' in module path ('#{path}/lib'); unless " + "you are expecting to load a module named 'lib', your module path may be set " + "incorrectly.") end end |