diff options
author | Stig Sandbeck Mathisen <ssm@debian.org> | 2014-09-07 10:14:36 +0200 |
---|---|---|
committer | Stig Sandbeck Mathisen <ssm@debian.org> | 2014-09-07 10:14:36 +0200 |
commit | d4b83be375ac1dead058e091191ee7c7b7c24c8a (patch) | |
tree | dc825687392ae3068de5b764be60c53122d9e02a /lib/puppet/parser/compiler.rb | |
parent | 229cbb976fe0f70f5f30548b83517b415840f9bb (diff) | |
parent | 1681684857c6e39d60d87b0b3520d8783977ceff (diff) | |
download | puppet-upstream/3.7.0.tar.gz |
Imported Upstream version 3.7.0upstream/3.7.0
Diffstat (limited to 'lib/puppet/parser/compiler.rb')
-rw-r--r-- | lib/puppet/parser/compiler.rb | 104 |
1 files changed, 66 insertions, 38 deletions
diff --git a/lib/puppet/parser/compiler.rb b/lib/puppet/parser/compiler.rb index 7f4e82298..5df2916fc 100644 --- a/lib/puppet/parser/compiler.rb +++ b/lib/puppet/parser/compiler.rb @@ -20,6 +20,17 @@ class Puppet::Parser::Compiler $env_module_directories = nil node.environment.check_for_reparse + if node.environment.conflicting_manifest_settings? + errmsg = [ + "The 'disable_per_environment_manifest' setting is true, and this '#{node.environment}'", + "has an environment.conf manifest that conflicts with the 'default_manifest' setting.", + "Compilation has been halted in order to avoid running a catalog which may be using", + "unexpected manifests. For more information, see", + "http://docs.puppetlabs.com/puppet/latest/reference/environments.html", + ] + raise(Puppet::Error, errmsg.join(' ')) + end + new(node).compile.to_resource rescue => detail message = "#{detail} on node #{node.name}" @@ -107,25 +118,25 @@ class Puppet::Parser::Compiler @catalog.environment_instance = environment # Set the client's parameters into the top scope. - Puppet::Util::Profiler.profile("Compile: Set node parameters") { set_node_parameters } + Puppet::Util::Profiler.profile("Compile: Set node parameters", [:compiler, :set_node_params]) { set_node_parameters } - Puppet::Util::Profiler.profile("Compile: Created settings scope") { create_settings_scope } + Puppet::Util::Profiler.profile("Compile: Created settings scope", [:compiler, :create_settings_scope]) { create_settings_scope } if is_binder_active? # create injector, if not already created - this is for 3x that does not trigger # lazy loading of injector via context - Puppet::Util::Profiler.profile("Compile: Created injector") { injector } + Puppet::Util::Profiler.profile("Compile: Created injector", [:compiler, :create_injector]) { injector } end - Puppet::Util::Profiler.profile("Compile: Evaluated main") { evaluate_main } + Puppet::Util::Profiler.profile("Compile: Evaluated main", [:compiler, :evaluate_main]) { evaluate_main } - Puppet::Util::Profiler.profile("Compile: Evaluated AST node") { evaluate_ast_node } + Puppet::Util::Profiler.profile("Compile: Evaluated AST node", [:compiler, :evaluate_ast_node]) { evaluate_ast_node } - Puppet::Util::Profiler.profile("Compile: Evaluated node classes") { evaluate_node_classes } + Puppet::Util::Profiler.profile("Compile: Evaluated node classes", [:compiler, :evaluate_node_classes]) { evaluate_node_classes } - Puppet::Util::Profiler.profile("Compile: Evaluated generators") { evaluate_generators } + Puppet::Util::Profiler.profile("Compile: Evaluated generators", [:compiler, :evaluate_generators]) { evaluate_generators } - Puppet::Util::Profiler.profile("Compile: Finished catalog") { finish } + Puppet::Util::Profiler.profile("Compile: Finished catalog", [:compiler, :finish_catalog]) { finish } fail_on_unevaluated @@ -154,9 +165,6 @@ class Puppet::Parser::Compiler # Return the node's environment. def environment - unless node.environment.is_a? Puppet::Node::Environment - raise Puppet::DevError, "node #{node} has an invalid environment!" - end node.environment end @@ -204,25 +212,25 @@ class Puppet::Parser::Compiler class_parameters = classes classes = classes.keys end - classes.each do |name| - # If we can find the class, then make a resource that will evaluate it. - if klass = scope.find_hostclass(name, :assume_fqname => fqname) - - # If parameters are passed, then attempt to create a duplicate resource - # so the appropriate error is thrown. - if class_parameters - resource = klass.ensure_in_catalog(scope, class_parameters[name] || {}) - else - next if scope.class_scope(klass) - resource = klass.ensure_in_catalog(scope) - end - # If they've disabled lazy evaluation (which the :include function does), - # then evaluate our resource immediately. - resource.evaluate unless lazy_evaluate - else - raise Puppet::Error, "Could not find class #{name} for #{node.name}" + hostclasses = classes.collect do |name| + scope.find_hostclass(name, :assume_fqname => fqname) or raise Puppet::Error, "Could not find class #{name} for #{node.name}" + end + + if class_parameters + resources = ensure_classes_with_parameters(scope, hostclasses, class_parameters) + if !lazy_evaluate + resources.each(&:evaluate) end + + resources + else + already_included, newly_included = ensure_classes_without_parameters(scope, hostclasses) + if !lazy_evaluate + newly_included.each(&:evaluate) + end + + already_included + newly_included end end @@ -299,6 +307,27 @@ class Puppet::Parser::Compiler private + def ensure_classes_with_parameters(scope, hostclasses, parameters) + hostclasses.collect do |klass| + klass.ensure_in_catalog(scope, parameters[klass.name] || {}) + end + end + + def ensure_classes_without_parameters(scope, hostclasses) + already_included = [] + newly_included = [] + hostclasses.each do |klass| + class_scope = scope.class_scope(klass) + if class_scope + already_included << class_scope.resource + else + newly_included << klass.ensure_in_catalog(scope) + end + end + + [already_included, newly_included] + end + # If ast nodes are enabled, then see if we can find and evaluate one. def evaluate_ast_node return unless ast_nodes? @@ -331,7 +360,7 @@ class Puppet::Parser::Compiler # We have to iterate over a dup of the array because # collections can delete themselves from the list, which # changes its length and causes some collections to get missed. - Puppet::Util::Profiler.profile("Evaluated collections") do + Puppet::Util::Profiler.profile("Evaluated collections", [:compiler, :evaluate_collections]) do found_something = false @collections.dup.each do |collection| found_something = true if collection.evaluate @@ -346,9 +375,9 @@ class Puppet::Parser::Compiler # evaluate_generators loop. def evaluate_definitions exceptwrap do - Puppet::Util::Profiler.profile("Evaluated definitions") do + Puppet::Util::Profiler.profile("Evaluated definitions", [:compiler, :evaluate_definitions]) do !unevaluated_resources.each do |resource| - Puppet::Util::Profiler.profile("Evaluated resource #{resource}") do + Puppet::Util::Profiler.profile("Evaluated resource #{resource}", [:compiler, :evaluate_resource, resource]) do resource.evaluate end end.empty? @@ -365,7 +394,7 @@ class Puppet::Parser::Compiler loop do done = true - Puppet::Util::Profiler.profile("Iterated (#{count + 1}) on generators") do + Puppet::Util::Profiler.profile("Iterated (#{count + 1}) on generators", [:compiler, :iterate_on_generators]) do # Call collections first, then definitions. done = false if evaluate_collections done = false if evaluate_definitions @@ -553,10 +582,8 @@ class Puppet::Parser::Compiler end def create_settings_scope - unless settings_type = environment.known_resource_types.hostclass("settings") - settings_type = Puppet::Resource::Type.new :hostclass, "settings" - environment.known_resource_types.add(settings_type) - end + settings_type = Puppet::Resource::Type.new :hostclass, "settings" + environment.known_resource_types.add(settings_type) settings_resource = Puppet::Parser::Resource.new("class", "settings", :scope => @topscope) @@ -566,9 +593,10 @@ class Puppet::Parser::Compiler scope = @topscope.class_scope(settings_type) + env = environment Puppet.settings.each do |name, setting| - next if name.to_s == "name" - scope[name.to_s] = environment[name] + next if name == :name + scope[name.to_s] = env[name] end end |